rosbag 数据录制与回放:离线复现现场问题
机器人在现场偶尔出现定位漂移、传感器跳变等问题,但回到开发环境后可能无法再次出现。这时可以用 ros2 bag 把现场话题数据录下来,再离线回放给算法节点,重复分析同一次问题。
简单理解:
-
录制:把 ROS 2 话题保存到文件。
-
回放:把文件中的话题重新发布出来。
第二至第五部分先使用 ROS 2 自带的示例节点演示通用操作,不依赖具体机器人;第六部分再以幻尔科技 ROSPider 的导航过程为例进行实战。
一、 使用环境
| 项目 | 版本或要求 |
|---|---|
| 适用设备 | 通用 ROS 2 设备或开发电脑,不要求连接机器人 |
| 操作系统 | Ubuntu 22.04 |
| ROS 版本 | ROS 2 Humble |
| 通用示例节点 | demo_nodes_cpp talker |
| 示例话题 | /chatter |
| 硬件与接线 | 不需要额外硬件或接线 |
开始前,在 ROS 2 终端中确认 rosbag 工具可以使用:
echo $ROS_DISTRO
ros2 bag --help
正常情况下,第一条命令输出 humble,第二条命令能够看到 record、info 和 play 等功能。
如果提示找不到 ros2 bag,执行:
sudo apt update
sudo apt install ros-humble-rosbag2
如果提示找不到 demo_nodes_cpp,安装通用示例节点:
sudo apt install ros-humble-demo-nodes-cpp
二、第一步:启动通用节点并确认话题
打开一个 ROS 2 终端,启动发布字符串消息的示例节点:
ros2 run demo_nodes_cpp talker

终端持续输出 Publishing: 'Hello World: n',表示节点正在发布消息。保持该终端运行。
新开一个 ROS 2 终端,查看当前话题:
ros2 topic list
确认 /chatter 话题存在:
ros2 topic info /chatter
还可以短暂查看数据,确认话题正在更新:
ros2 topic echo /chatter
看到连续的 Hello World 消息后,按 Ctrl+C 退出查看,talker 节点保持运行。
在实际项目中,将本文的 /chatter 替换为需要排查的传感器、定位或控制话题,并先用 ros2 topic list 确认实际名称。
三、第二步:录制现场数据
创建用于保存 bag 的目录:
mkdir -p ~/bag_files
cd ~/bag_files
录制 /chatter 话题:
ros2 bag record -o chatter_demo /chatter
参数说明:
-
-o chatter_demo:将本次数据命名为chatter_demo。 -
/chatter:只录制这个通用示例话题。
命令运行后,终端应显示已经订阅 /chatter。保持录制约 10 秒,然后按 Ctrl+C 停止;在实际项目中,应在录制期间完成能够触发问题的现场操作。
当前目录会生成:
chatter_demo/
├─ metadata.yaml
└─ chatter_demo_0.db3
文件名可能因 rosbag2 版本略有不同,但目录中应包含 metadata.yaml 和数据文件。
不建议直接使用 ros2 bag record -a 录制所有话题。相机、雷达和点云数据量较大,可能很快占满磁盘。
四、 第三步:检查录制结果
执行:
ros2 bag info chatter_demo
重点查看以下内容:
-
Duration:录制持续时间。 -
Messages:消息总数,应该大于 0。 -
Topic information:应包含/chatter。 -
Count:/chatter的消息数量应该大于 0。
如果话题存在但 Count 为 0,说明数据没有真正录进去,需要检查话题发布者或 QoS 设置。
五、第四步:离线回放
先在 talker 终端按 Ctrl+C 停止实时发布,避免实时消息和回放消息混在一起。
进入 bag 所在目录:
cd ~/bag_files
回放数据:
ros2 bag play chatter_demo
在另一个终端查看回放的话题:
ros2 topic echo /chatter
如果可以再次看到 Hello World 消息,说明回放成功。
需要慢速观察问题时,可以使用半速回放:
ros2 bag play chatter_demo --rate 0.5
只回放指定话题:
ros2 bag play chatter_demo --topics /chatter
如果 bag 中包含 /cmd_vel、舵机或机械臂控制话题,不要直接回放到已经上电的真实机器人。应在离线环境中回放,或通过 --topics 只播放传感器话题。
六、示例:录制并复现一段导航
下面以 ROSPider 的点到点导航为例。机器人先从当前位置导航到前方目标点,同时录制导航数据;录制结束后,在 RViz 中回放并查看刚才的行驶过程。
本节使用 ROSPider Jetson Orin Nano 版、Ubuntu 22.04 和 ROS 2 Humble,机器人保持出厂标准接线,无需为 rosbag 增加接线。
1. 启动导航
在机器人端启动导航,map_01 替换为实际地图名:
~/.stop_ros.sh
ros2 launch navigation navigation.launch.py map:=map_01
新开一个终端启动 RViz:
ros2 launch navigation rviz_navigation.launch.py
在 RViz 中先使用 2D Pose Estimate 设置机器人初始位置,但暂时不要发送目标点。
2. 开始录制
在机器人端新开终端:
cd ~/bag_files
ros2 bag record -o navigation_demo \
/map \
/scan \
/odom_raw \
/amcl_pose \
/robot_description \
/joint_states \
/tf \
/tf_static \
/cmd_vel
这些话题分别记录地图、雷达、里程计、坐标变换、ROSpider 的 URDF 模型、定位结果和速度指令。不同软件版本的话题名可能不同,录制前应先用 ros2 topic list 确认。
3. 随便导航一小段
(1) 回到 RViz,点击 2D Goal Pose。
(2) 在机器人前方约 1~2 米的空旷位置点击并拖动,设置目标位置和朝向。
(3) 等待机器人到达目标点。
(4) 回到录制终端,按 Ctrl+C 停止录制。
检查数据:
ros2 bag info navigation_demo
确认录制时长和消息总数不为 0,并且能够看到刚才选择的话题。
4. 在 RViz 中复现
先停止真实机器人的导航程序,避免回放数据与实时数据混在一起。建议在开发电脑或隔离环境中操作。
启动 RViz:
ros2 launch navigation rviz_navigation.launch.py
新开终端,回放本次导航:
cd ~/bag_files
ros2 bag play navigation_demo --clock
正常情况下,RViz 中可以再次看到机器人位姿、雷达数据和 TF 随时间变化,相当于重新观看刚才的导航过程。
需要慢速观察时执行:
ros2 bag play navigation_demo --clock --rate 0.5
这个例子复现的是 RViz 中的导航数据和运动过程,并不是让真实机器人再次自动走一遍。若要让导航算法重新计算路径,还需要使用相同地图、参数文件,并避免回放 /cmd_vel 等算法输出。
不要把 navigation_demo 直接回放到已经上电并允许运动的机器人,因为其中包含 /cmd_vel。如只需查看传感器数据,请使用:
ros2 bag play navigation_demo \
--topics /map /scan /odom_raw /tf /tf_static /amcl_pose \
--clock
七、 验证结果
通用示例应确认:
-
ros2 bag info chatter_demo中/chatter的消息数大于 0。 -
回放时执行
ros2 topic echo /chatter能再次看到Hello World消息。
ROSpider 导航示例还应确认 navigation_demo 包含所选导航话题,并且回放时 RViz 能显示已录制的地图、雷达、位姿和 TF 数据。若要验证异常复现,还需确认对应算法节点能够接收回放数据并再次出现同一问题。
八、 常见问题
1. 提示 ros2: command not found
当前终端没有加载 ROS 2 环境,执行:
source /opt/ros/humble/setup.bash
2. 录制后消息数量为 0
依次检查:
ros2 topic list
ros2 topic info /chatter
ros2 topic echo /chatter
确保话题存在、有发布者并且能够输出数据。
3. 回放时提示缺少消息类型
先加载 ROS 2 和产品工作空间:
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
4. bag 异常关闭后无法读取
先备份原文件,再尝试重建索引:
ros2 bag reindex chatter_demo
ros2 bag info chatter_demo
5. 回放了数据,但问题没有复现
可能遗漏了 /tf、/tf_static、雷达、相机或参数文件。重新分析故障依赖的数据,再补充录制相关话题。
九、 适用边界
第二至第五部分适用于 Ubuntu 22.04 和 ROS 2 Humble,可在不连接机器人的开发电脑上运行。将 /chatter 替换为实际话题后,也适用于其他 ROS 2 设备。
第六部分的导航示例适用于 ROSPider Jetson Orin Nano 版。ROSpider 的 Jetson Nano、Jetson Orin NX、Raspberry Pi 5 版本,以及幻尔其他 ROS 2 产品,可以使用相同思路,但系统镜像、话题名称和启动命令应以对应版本资料及实机输出为准。
本文不适用于 ROS 1。ROS 1 使用 rosbag record、rosbag info 和 rosbag play,不要与本文的 ros2 bag 命令混用。
参考资料:










