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,里面很多话题其实根本用不上。

⚠️ 注意: 录制所有话题时,如果你的系统里有图像话题(比如 /camera/image_raw),文件大小会暴涨。我曾经录了10分钟,生成了8个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信息,确认话题数量和消息数量都对得上。
💡 小提示: 如果你在调试一个间歇性出现的bug,建议录的时间长一点。我有个同事曾经录了3秒的Bag,结果bug在第5秒才出现……嗯,他又重新跑了一遍。

3.7 查看Bag信息

录完之后,用这条命令看看Bag里到底有什么:

ros2 bag info my_first_bag

输出会告诉你:

  • Bag的时长
  • 包含哪些话题
  • 每个话题有多少条消息
  • 总消息数

这就像你拍完视频后,看看素材列表一样。如果发现某个话题的消息数为0,那说明录制时它就没发数据——赶紧回去检查你的节点吧。

3.8 本章知识结构图

下面这张图帮你理清录制Bag的完整流程:

ROS2 Bag 录制流程 1. 查看话题 ros2 topic list 2. 选择策略 全部 or 指定话题 3. 执行录制 ros2 bag record 录制所有话题 ros2 bag record -a 录制指定话题 ros2 bag record /topic1 /topic2 自定义文件名 ros2 bag record -o name 4. 验证Bag文件 ros2 bag info <bag_name> ✅ 录制完成,准备回放

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是坏的……嗯,那种感觉,你懂的。

可可精品资料库