定义
rosbag是 ROS 生态中用于记录和回放话题消息的工具集与接口。它把运行中的 ROS 系统里各个话题上发布的消息连同其时间戳一起订阅下来,序列化写入磁盘上的 bag 文件;回放时再按原有话题与原有时间关系把消息重新发布出去,使订阅者看到的行为与录制时接近[2][3]。
bag 文件这一名称来自其 .bag 扩展名,它是 ROS 中存储消息数据的一种文件格式,围绕它形成了一整套用于存储、处理、分析和可视化的工具[4]。rosbag 既可以作为命令行工具使用,也可以通过 C++、Python 的程序接口在代码中读写 bag 文件[5]。
原理
从运行结构上看,录制时的 rosbag 相当于一个订阅节点,它订阅一个或多个 ROS 话题,把收到的消息直接落盘;回放时的 rosbag 相当于一个发布节点,从磁盘读取消息并发布到话题上。由于消息以 ROS 网络传输层所使用的同一种表示形式保存,记录与回放两端的开销都较低[6][4]。
bag 格式在版本行之后按记录依次排列,每条记录由 4 字节的头部长度、头部字段序列、4 字节的数据长度和数据本体构成,头部用「长度+字段名=字段值」的形式描述该记录的类型、话题名、消息类型的校验值和接收时刻的秒与纳秒[7]。文件中的头部按作用分为消息定义、消息数据、文件头与索引数据等类型,索引数据用于记录各话题消息在文件中的位置,从而支持快速定位与截取[8]。
回放的时间对齐依赖录制时记录的全局时间戳,多个 bag 文件可以叠加播放,其消息按时间戳交错排列。若播放时不希望等待真实时间,可选择尽快放出全部消息;播放过程中还可以暂停并逐条步进[9]。涉及带时间戳的数据时,可以选用让 rosbag 发布与录制时刻对应的仿真时钟,使节点使用 bag 内的时间而非墙钟时间[10]。
发展历程
bag 格式早期由 ROS 的消息记录与回放需求推动形成,1.2 版本被 ROS 0.5.0 至 1.0.x 的发行版使用,相较 1.1 版本,它把消息元数据组织得更易扩展,并保存每条消息定义的完整文本,而不再只记录类型名与校验值,以便在消息类型被修改、移动或删除后仍能处理旧 bag 文件[8]。ROS 0.11 起,文件头与索引数据这两类可选头部被引入,使 bag 具备可索引的文件级信息[7]。
早期先出现过 rosrecord 等用于读写记录文件的组件,其程序接口可供 C++ 与 Python 包遍历已存储的消息;后续这些工具被统一的 rosbag 收录并沿用[4]。随着 ROS 2 的推进,rosbag 被重写为 rosbag2:存储层改为可插拔的插件式设计,不再是单一固定格式,可写入 SQLite3 或 MCAP,其中 MCAP 自 ROS 2 的 Iron 发行版起成为默认格式[11][1]。原版 rosbag 与 ROS 1 绑定,而 ROS 1 已于 2025 年停止维护,新项目通常转向 rosbag2,同时 rosbag2 也可借助转换工具读取旧的 .bag 数据,构成 ROS 1 向 ROS 2 的迁移路径之一[11]。
应用
记录方面,命令行工具可按话题名录制,也可用 -a 选项录制全部话题,或用正则表达式与排除规则筛选话题;为避免文件过大,还支持按持续时间或文件大小限制录制、在达到上限时切分文件、设置写盘缓冲区大小,以及使用 BZ2 或 LZ4 压缩[9]。查看方面,info 子命令会给出 bag 的起止时间、消息总数以及各话题的类型、消息条数与频率统计[9]。
回放方面,play 子命令可调整发布速率、从指定时刻开始、只播放选定话题、循环播放以及在每条话题公告后等待一段时间,以便订阅者完成连接[9]。除命令行外,图形界面工具 rqt_bag 可以显示消息内容、绘制时间序列曲线、显示图像消息,并把某个时间范围内的消息导出为新的 bag 文件[12]。
这一工具链的典型用途包括:在真实机器人上复现一次故障并录制下来,再在办公环境中反复回放以定位问题;一次录制传感器数据后反复回放,离线开发与测试 SLAM、感知与定位算法;把已知的 bag 输入升级后的软件以做回归测试;从真实机器人数据构建用于机器学习的数据集;以及利用 bag 作为仿真场景中的传感器数据来源。研究者也用 bag 工具链记录数据集,并进行可视化、标注与归档,PR2 机器人曾用它做长期硬件诊断日志[4]。
局限
rosbag 不能完整重现录制时的系统运行过程。以对时序敏感的节点为例,由于录制端与回放端在处理消息时机的微小差异,回放得到的行为会与原始行为存在偏差,因此不应期望对系统行为做到完全一致的模仿[5]。它复制的是消息序列,而不是系统的初始状态,如果回放前没有恢复录制时的初始条件,结果轨迹可能与录制时不同[12]。
回放时若把全部话题都放出,原系统中仍在运行的同名发布者会与 rosbag 同时向同一话题发布消息,可能给订阅该话题的节点带来冲突,因此常需要只播放特定话题[12]。录制高带宽数据时需要留意吞吐能力,官方建议在摄像头所在的同一台机器上运行录制并把输出写到本地磁盘[9]。
bag 文件在未正常关闭时,其索引信息可能损坏,需要用 reindex 子命令重读消息数据并重建索引,该命令也会为每次操作保留 .orig.bag 备份[9]。当消息类型定义发生变更后,旧 bag 可能无法在当前系统中直接播放,需要用 check 判断是否可播放或可迁移,并用 fix 依据迁移规则修复[9]。此外,使用 -a 录制全部话题时,新发布的话题是通过周期性查询 Master 发现的,因此该话题最初发布的消息很可能被漏掉[9]。
参见
参考资料
- rosbag [引用日期2026-10-14]
- rosbag Documentation [引用日期2026-10-14]
- Bags - The Wayback Machine [引用日期2026-10-14]
- Older tools [引用日期2026-10-14]
- ROSBAG [引用日期2026-10-14]
- [ROS常用组件] --- rosbag [引用日期2026-10-14]
- Header format [引用日期2026-10-14]
- Header format [引用日期2026-10-14]
- rosbag/Commandline - The Wayback Machine [引用日期2026-10-14]
- ja/Bags [引用日期2026-10-14]
- rosbag2 [引用日期2026-10-14]
- TUTORIAL T2d: Sensing¶ [引用日期2026-10-14]