# 帧率低问题排查清单 ## 🔍 问题症状 - ✅ `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 行 ```diff - 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 行 ```cpp 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` ```yaml pixel_format: "mjpeg" # 从 raw_mjpeg 改为 mjpeg ``` ### 5. ⚙️ 新增性能参数 **文件**:`config/params.yaml` ```yaml qos_keep_last: 10 enable_batch_send: true send_interval_ms: 0 ``` ## 🚀 后续测试步骤 ### Step 1: 重新编译 ```bash cd ~/code/camera/flyLink/skylink_ros2 colcon build --packages-select skylink_bridge source install/setup.bash ``` ### Step 2: 运行 launch ```bash ros2 launch skylink_bridge bridge.launch.py ``` ### Step 3: 新终端测试帧率 ```bash 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`