rosbag2 从零跑通 ROS2 录制回放:安装、录制与回放实用指南
rosbag2 从零跑通 ROS2 录制回放:安装、录制与回放实用指南
【免费下载链接】rosbag2项目地址: https://gitcode.com/gh_mirrors/ro/rosbag2
rosbag2 是 ROS2 的官方录制回放工具:它把系统中带时间戳的消息写入磁盘,之后随时把 bag 原样播回给节点。本文带你一步步走完"装好、录上、放得动"的完整流程。
rosbag2 能帮你做什么
rosbag2 的核心就一件事:把运行中的 ROS2 系统"录像"存成 bag 文件,再按原始时间戳"放录像"。典型场景是机器人现场数据回传后复现故障、仿真回放验证算法、离线批量处理传感器数据。录制和回放都通过ros2 bag命令完成,不需要额外安装第三方工具。
环境准备与安装排错
三条路按推荐顺序走,大多数情况第一条就够了。
先确认版本对齐。rosbag2 跟着 ROS2 发行版走,装之前先确认你的ROS_DISTRO:
export ROS_DISTRO=humble任何带-ros-base的安装(-desktop包含在内)已经带上了 rosbag2,所以如果你能跑ros2 run,大概率直接可用:
sudo apt-get install ros-$ROS_DISTRO-rosbag2如果你遇到"命令能跑但参数不识别"或编译报头文件缺失,多半是 rosbag2 版本和 RMW 中间件版本不匹配——比如手动编译过部分包却混用了不同发行版。先检查ros2 bag record --help的输出是否与官方版本一致,再考虑重装。
如果包管理器这条路走不通(定制系统、需要改代码),就走源码编译。我当年在 Jetson 上就吃过"半二进制半源码"的亏,官方明确说了这种混合构建行为未定义,所以要么全装二进制,要么全源码:
git clone https://gitcode.com/gh_mirrors/ro/rosbag2 cd rosbag2 colcon build --symlink-install编译前记得 source 好对应的 ROS2 环境。构建完成source install/setup.bash后,用ros2 bag info随便读一个 bag 验证即可。
3 种常用录制模式
全量话题录制
最省心的起点,录下系统里所有可见话题:
ros2 bag record -a -o my_bag为什么这么配:-a开启话题自动发现,新上线的话题会边录边纳入;如果你的系统话题很杂、内存吃紧,加--no-discovery只录启动时已存在的话题,能明显降低订阅数量与内存占用。
指定话题 + 分段录制
只关心几个话题,并且不想生成一个巨大文件时:
ros2 bag record --topics /scan /odom -d 600 -o my_bag为什么这么配:-d 600让 bag 每 600 秒自动切一个新文件(单位是秒,大小分段用-b,单位是字节),回放和ros2 bag convert处理时都更灵活;话题即使启动时尚未发布,自动发现也会在它们出现时自动跟上。
压缩录制 🚀
磁盘紧张或要长期归档时,把压缩加上:
ros2 bag record -a --compression-mode file --compression-format zstd -o my_bag为什么这么配:官方默认只带zstd压缩器,且--compression-mode和--compression-format必须成对出现——这是最常见的"参数写了却没生效"的坑。file模式按整文件压缩,压缩率高;message模式按单条消息压缩,读单条数据时开销小。另外用 mcap 存储时还可以走存储插件自带的可索引压缩(见 rosbag2_storage_mcap 文档),压缩后仍保留随机访问能力。
| 压缩模式 | 行为 | 适合场景 |
|---|---|---|
file | 整文件压缩 | 归档、传输、长期保存 |
message | 每条消息单独压缩 | 需要频繁随机读取单条消息 |
回放提速与时间戳排查
回放本身一条命令:
ros2 bag play my_bag先确认时间源,再调速率。我排查回放"乱序"时的习惯是:先ros2 topic echo /clock看时钟走没走、跳没跳,确认系统时间稳定后,再决定用--rate调速:
ros2 bag play my_bag --rate 0.5--rate大于 1 是加速,小于 1 是减速,1.0 为原始速度。如果你的下游节点依赖--use-sim-time,回放时加--clock 40让播放器自己发布/clock(默认 40Hz),bag 内的时钟话题会被自动排除,避免两个时钟打架。
回放时间控制的内部逻辑(变速与暂停/跳转如何在 ROS 时间和稳态时间轴之间映射)可以看仓库里的设计图:
如果调了--rate后时间戳仍然对不齐,检查一下 bag 的元数据是否完整:
ros2 bag info my_bag ros2 bag reindex my_bagros2 bag info能正常输出话题和时长,说明文件结构没坏;对旧版本或写入中断的 bag,ros2 bag reindex会重建索引后再试。
高频卡点速查
| 症状 | 可能原因 | 一句话解法 |
|---|---|---|
record 报Output folder 'xxx' already exists | -o指向了已存在的目录 | 换个 bag 目录名,别用已存在的文件夹 |
| 录制丢消息多,甚至进程被杀 | 消息速率高,默认 100MB 缓存双缓冲峰值可达两倍内存 | --no-discovery+ 调小--max-cache-size,再观察events/rosbag2_messages_lost话题 |
bag 没压缩,--compression-format像没生效 | 只给了格式没给模式 | 补上--compression-mode file,两个参数必须成对 |
| 回放明显快/慢于真实时间、时间戳错乱 | 系统时钟跳变或模拟时间没对齐 | 先ros2 topic echo /clock确认时间源,再用--rate微调 |
| 旧 bag 打不开、info 无元数据 | 元数据文件缺失或写入中断 | ros2 bag reindex重建索引后再回放 |
下一步
完整参数清单就在终端里:ros2 bag record --help和ros2 bag play --help,进阶玩法(快照模式、服务远程录制、QoS 覆盖文件)可翻仓库里的 README.md;如果ros2 bag info的输出都贴出来还卡住,带上它去项目 issue 区提问会高效得多。
【免费下载链接】rosbag2项目地址: https://gitcode.com/gh_mirrors/ro/rosbag2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
