Files
flyLink/skylink_ros2/FRAMERATE_FIX_CHECKLIST.md
flowerstonezl d90a98cd9d fpslow1
2026-01-19 21:24:59 +08:00

2.7 KiB
Raw Blame History

帧率低问题排查清单

🔍 问题症状

  • ros2 topic hz /camera/image_raw 显示0.356 fps预期 30 fps
  • 最大延迟快速增长0.032s → 68.640s
  • UDP 发送节点日志显示 FPS: 0

🎯 根本原因

每次发送 UDP 分片前都有 100 微秒的睡眠,且这个睡眠累加到数百毫秒级别,导致应用层严重阻塞

已完成的修复

1. 删除致命的睡眠指令

文件src/udp_sender_node.cpp 第 345 行

- std::this_thread::sleep_for(std::chrono::microseconds(100));

预期效果:帧率提升 80-85 倍 (0.35 fps → 28-30 fps)

2. 📦 增加消息队列深度

文件src/udp_sender_node.cpp 第 98-107 行

rclcpp::QoS qos_profile = rclcpp::SensorDataQoS();
qos_profile.keep_last(10);  // 保留 10 条消息

效果:防止相机消息丢弃

3. 📊 修复 FPS 统计

文件src/udp_sender_node.cpp report_stats() 函数 改动:使用周期统计而非累计统计 效果:准确显示实时帧率

4. 🎬 优化相机格式

文件config/params.yaml

pixel_format: "mjpeg"  # 从 raw_mjpeg 改为 mjpeg

5. ⚙️ 新增性能参数

文件config/params.yaml

qos_keep_last: 10
enable_batch_send: true
send_interval_ms: 0

🚀 后续测试步骤

Step 1: 重新编译

cd ~/code/camera/flyLink/skylink_ros2
colcon build --packages-select skylink_bridge
source install/setup.bash

Step 2: 运行 launch

ros2 launch skylink_bridge bridge.launch.py

Step 3: 新终端测试帧率

ros2 topic hz /camera/image_raw

预期输出

average rate: 29.8
    min: 0.032s max: 0.036s std dev: 0.002s window: 100

Step 4: 检查日志

注意以下日志输出:

📊 统计 - FPS: 29, 速率: XXX KB/s, ...

(之前显示 FPS: 0

📋 检查清单

  • 代码已修改3 处修改)
  • 参数配置已更新
  • 项目已重新编译
  • 测试运行无编译错误
  • 帧率恢复到 25-30 fps
  • 日志显示正确的 FPS 统计

如果仍有问题

问题 1: 帧率仍低

  • 检查 CPU 使用率 (top 命令)
  • 检查网络拥塞 (netstat -i)
  • 检查是否有其他进程占用 USB 摄像头

问题 2: 丢帧严重

  • 增加 qos_keep_last 参数值
  • 减少 JPEG 质量(jpeg_quality: 70 → 60
  • 检查网络带宽

问题 3: 消息未到达

  • 检查 GPS Topic 是否存在:ros2 topic list | grep mavros
  • 如果 GPS 不可用,设置 enable_gps: false

📚 相关文件

  • 详细分析报告:PERFORMANCE_OPTIMIZATION.md
  • 配置文件:config/params.yaml
  • 源代码:src/udp_sender_node.cpp
  • 头文件:include/skylink_bridge/udp_sender_node.h