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