2.7 KiB
2.7 KiB
帧率低问题排查清单
🔍 问题症状
- ✅
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