197 lines
4.3 KiB
Markdown
197 lines
4.3 KiB
Markdown
# 20 · ros2 bag 录制与回放 完全指南
|
|
|
|
> **目标**: 掌握 ros2 bag 命令行,能录制 topic、回放、调试、训练数据采集。
|
|
|
|
---
|
|
|
|
## 目录
|
|
|
|
- [1. 是什么](#1-是什么)
|
|
- [2. 录制 topic](#2-录制-topic)
|
|
- [3. 回放 topic](#3-回放-topic)
|
|
- [4. 查看包信息](#4-查看包信息)
|
|
- [5. 转换格式](#5-转换格式)
|
|
- [6. QoS 与 bag](#6-qos-与-bag)
|
|
- [7. VLA 训练数据采集](#7-vla-训练数据采集)
|
|
- [8. 推荐阅读](#8-推荐阅读)
|
|
|
|
---
|
|
|
|
## 1. 是什么
|
|
|
|
**ros2 bag** = ROS2 自带的 topic 录制 / 回放工具,生成 `.db3` (SQLite) 文件 + `metadata.yaml`。
|
|
|
|
用途:
|
|
- 调试:录一段数据,反复回放调试算法
|
|
- 测试:用录的数据做单元测试
|
|
- 训练:VLA / 机器学习数据采集
|
|
- 回归:确保算法在新数据上仍 work
|
|
|
|
## 2. 录制 topic
|
|
|
|
```bash
|
|
# 录制所有 topic
|
|
ros2 bag record -a -o my_bag
|
|
|
|
# 录制指定 topic
|
|
ros2 bag record /chatter /tf /joint_states -o my_bag
|
|
|
|
# 指定压缩格式
|
|
ros2 bag record /chatter -o my_bag --compression-mode file --compression-format zstd
|
|
|
|
# 限制时长
|
|
ros2 bag record /chatter -o my_bag --duration 30 # 30 秒
|
|
|
|
# 限制大小
|
|
ros2 bag record /chatter -o my_bag --max-bag-size 100000000 # 100 MB
|
|
|
|
# 排除 topic
|
|
ros2 bag record -a -o my_bag --exclude "/_.*"
|
|
```
|
|
|
|
输出:
|
|
|
|
```
|
|
my_bag/
|
|
├── metadata.yaml
|
|
└── my_bag_0.db3
|
|
```
|
|
|
|
## 3. 回放 topic
|
|
|
|
```bash
|
|
# 回放(需要原始节点还在,否则消息无 subscriber)
|
|
ros2 bag play my_bag
|
|
|
|
# 循环回放
|
|
ros2 bag play my_bag --loop
|
|
|
|
# 调整速率(2 倍速)
|
|
ros2 bag play my_bag --rate 2.0
|
|
|
|
# 从中间开始
|
|
ros2 bag play my_bag --start-offset 10 # 10 秒处开始
|
|
|
|
# 延迟发布
|
|
ros2 bag play my_bag --delay 1.0 # 每条消息延迟 1 秒
|
|
```
|
|
|
|
## 4. 查看包信息
|
|
|
|
```bash
|
|
# 概览
|
|
ros2 bag info my_bag
|
|
|
|
# YAML 格式详情
|
|
ros2 bag info my_bag --yaml
|
|
|
|
# 单个 topic 详情
|
|
ros2 bag info my_bag -t /chatter
|
|
```
|
|
|
|
输出:
|
|
|
|
```
|
|
Files: my_bag_0.db3
|
|
Bag size: 1.2 MiB
|
|
Storage id: sqlite3
|
|
Duration: 10.05s
|
|
Start: Aug 4 2026 14:00:00.123
|
|
End: Aug 4 2026 14:00:10.123
|
|
Messages: 100
|
|
Topic information: MessageType Count
|
|
std_msgs/String 100
|
|
```
|
|
|
|
## 5. 转换格式
|
|
|
|
### 导出 CSV
|
|
|
|
```bash
|
|
ros2 bag info my_bag --yaml > my_bag_info.yaml
|
|
```
|
|
|
|
### 用 rosbags 库(Python)
|
|
|
|
```python
|
|
from rosbags.rosbag2 import Reader
|
|
|
|
with Reader('my_bag') as reader:
|
|
for msg in reader.messages():
|
|
topic = msg.topic
|
|
timestamp = msg.timestamp
|
|
data = msg.message
|
|
...
|
|
```
|
|
|
|
## 6. QoS 与 bag
|
|
|
|
**关键**: 回放时 subscriber 的 QoS 必须 **兼容** publisher 的 QoS(录制时的 QoS)。
|
|
|
|
```bash
|
|
# 默认 bag 会用 RELIABLE 录制,如果你用 BEST_EFFORT subscriber,会报错
|
|
# 解决:用 --qos-profile-overrides 覆盖回放 QoS
|
|
ros2 bag play my_bag --qos-profile-overrides-path qos_override.yaml
|
|
```
|
|
|
|
`qos_override.yaml`:
|
|
|
|
```yaml
|
|
/chatter:
|
|
reliability: best_effort
|
|
history: keep_last
|
|
depth: 1
|
|
```
|
|
|
|
## 7. VLA 训练数据采集
|
|
|
|
OpenVLA / π0 等模型需要大量 (image, instruction, action) 三元组。ROS2 bag 录制:
|
|
|
|
```bash
|
|
# 录制图像 + 关节 + 指令
|
|
ros2 bag record \
|
|
/camera/color/image_raw \
|
|
/camera/depth/color/points \
|
|
/joint_states \
|
|
/ee_pose \
|
|
/task_instruction \
|
|
-o vla_episode_001
|
|
```
|
|
|
|
回放 + 转 VLA 训练格式:
|
|
|
|
```python
|
|
from rosbags.rosbag2 import Reader
|
|
from cv_bridge import CvBridge
|
|
import numpy as np
|
|
|
|
bridge = CvBridge()
|
|
samples = []
|
|
|
|
with Reader('vla_episode_001') as reader:
|
|
for msg in reader.messages():
|
|
if msg.topic == '/camera/color/image_raw':
|
|
image = bridge.imgmsg_to_cv2(msg.message, 'bgr8')
|
|
samples.append({'image': image, 'timestamp': msg.timestamp})
|
|
```
|
|
|
|
## 8. 推荐阅读
|
|
|
|
- [ROS2 bag 命令行](https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Recording-And-Playing-Back-Data.html)
|
|
- [rosbags Python 库](https://github.com/idx-lab/rosbags)
|
|
- [Foxglove Studio(可视化 bag)](https://studio.foxglove.dev/)
|
|
|
|
---
|
|
|
|
---
|
|
|
|
## 📖 阅读路径导航
|
|
|
|
> 💡 这是仓库 `doc/` 下所有文档的推荐阅读顺序。[返回 README 总导航](../README.md#-23-篇文档怎么读)
|
|
>
|
|
> ⏱ **本文预计阅读时间**: 20 分钟
|
|
> 📍 **当前位置**: 第 12 / 24 篇
|
|
|
|
- ⏮ **上一篇**: [Topic pub/sub 深度](../20-topics.md)
|
|
- ⏭ **下一篇**: [DDS 配置 + colcon overlay](../21-overlay-dds.md)
|