rosbag数据录制与回放

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

image2

终端持续输出 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

七、 验证结果

通用示例应确认:

  1. ros2 bag info chatter_demo 中 /chatter 的消息数大于 0。

  2. 回放时执行 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 命令混用。

参考资料:

1 个赞