Files
flyLink/skylink_ros2/FRAMERATE_FIX_CHECKLIST.md

111 lines
2.7 KiB
Markdown
Raw Normal View History

2026-01-19 21:24:59 +08:00
# 帧率低问题排查清单
## 🔍 问题症状
-`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`