3、录制你的第一个ROS2 Bag:使用ros2 bag record录制话题数据、录制指定话题、录制所有话题
说实话,第一次接触ROS2 Bag的时候,我脑子里想的是——这不就是个高级版的录屏工具吗?只不过它录的不是画面,而是机器人脑子里想的东西。嗯,这个比喻虽然糙了点,但道理是通的。
今天我们就来亲手录一个Bag。别怕,命令就几个,但背后的门道不少。我当年第一次录Bag的时候,录了半小时才发现忘了开某个关键话题,那叫一个尴尬。
3.1 Bag到底是什么?
Bag文件,说白了就是一个时间戳容器。它把ROS2里所有话题上跑的数据,按时间顺序存下来。你想想看,机器人跑起来的时候,激光雷达在发数据、摄像头在传图像、电机在报转速……这些数据转瞬即逝。有了Bag,你就可以像回放录像一样,把当时的场景原封不动地重现。
我个人习惯把Bag叫做「时间胶囊」。你录下的是那一刻机器人所有的「感知」和「状态」。
3.2 准备工作:先看看有哪些话题
在录之前,你得知道当前系统里有哪些话题在跑。就像拍视频前,你得先看看镜头对着哪儿。
打开终端,先启动一个模拟器或者你的机器人。然后运行:
ros2 topic list
你会看到类似这样的输出:
/chatter
/clock
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/pose
这就是当前所有活跃的话题。每个话题都有自己的数据类型,你可以用下面这条命令查看:
ros2 topic info /turtle1/pose
它会告诉你这个话题用的是 turtlesim/msg/Pose 这个消息类型。嗯,这个信息后面会用到。
3.3 录制所有话题:最简单粗暴的方式
如果你想一股脑把所有话题都录下来,就用这条命令:
ros2 bag record -a
-a 就是 all 的意思。它会录制当前所有话题的数据。我刚开始做项目时经常这么干,因为省事。但后来发现,录出来的Bag文件动不动就几个G,里面很多话题其实根本用不上。
录制过程中,终端会实时显示录制的进度和文件大小。按 Ctrl+C 就可以停止录制。录好的文件默认保存在当前目录下,名字是 rosbag2_YYYY_MM_DD-HH_MM_SS 这样的格式。
3.4 录制指定话题:精准打击
大多数时候,我们只需要录几个关键话题。比如在调试导航算法时,我只关心 /odom(里程计)和 /cmd_vel(速度指令)。
命令是这样的:
ros2 bag record /turtle1/cmd_vel /turtle1/pose
多个话题之间用空格隔开。这样录出来的Bag文件小得多,而且后续回放时也更清晰——你只关注你关心的数据。
我记得有一次,客户反馈机器人在某个路段老是走偏。我回放Bag时发现,当时录了十几个话题,但真正有用的就是 /odom 和 /imu 两个。从那以后,我录Bag前都会先想清楚:这次到底要查什么问题?然后只录相关的话题。
3.5 给Bag起个名字
默认的文件名又长又难记。你可以用 -o 参数指定输出文件名:
ros2 bag record -o my_first_bag /turtle1/cmd_vel /turtle1/pose
这样录出来的文件就叫 my_first_bag。我个人习惯在文件名里加上日期和场景描述,比如 nav_test_2024_01_15。半年后你再翻这些文件,一眼就能知道当时在干嘛。
3.6 录制时的几个小技巧
这里分享几个我踩过的坑:
- 先确认话题在发数据:录之前用
ros2 topic echo /你的话题看一眼,确保有数据在跑。我曾经录了半天,回放时才发现那个话题根本没发数据。 - 注意磁盘空间:录Bag前用
df -h看看还剩多少空间。尤其是录激光雷达或相机数据时,空间消耗很快。 - 录完立刻验证:录完后马上用
ros2 bag info查看Bag信息,确认话题数量和消息数量都对得上。
3.7 查看Bag信息
录完之后,用这条命令看看Bag里到底有什么:
ros2 bag info my_first_bag
输出会告诉你:
- Bag的时长
- 包含哪些话题
- 每个话题有多少条消息
- 总消息数
这就像你拍完视频后,看看素材列表一样。如果发现某个话题的消息数为0,那说明录制时它就没发数据——赶紧回去检查你的节点吧。
3.8 本章知识结构图
下面这张图帮你理清录制Bag的完整流程:
3.9 避坑指南
最后,分享几个我亲身踩过的坑:
- 录完发现没数据? 检查一下你的
ROS_DOMAIN_ID是否一致。不同域里的节点互相看不见。 - 文件太大打不开? 可以用
--split参数按大小分割文件,比如每500MB切一个文件。 - 录到一半磁盘满了? 提前用
--max-cache-size限制缓存大小,防止内存爆掉。
核心要点:
- 录制所有话题:
ros2 bag record -a - 录制指定话题:
ros2 bag record /topic1 /topic2 - 自定义文件名:
ros2 bag record -o my_bag /topic1 - 查看Bag信息:
ros2 bag info my_bag
好了,现在你可以去录自己的第一个Bag了。记住,录完一定要验证一下。我当年就是太自信,录完直接删了原始数据,结果回放时发现Bag是坏的……嗯,那种感觉,你懂的。
可可精品资料库