如何实现两个rosbag文件的播放节奏同步?
双rosbag同步播放实现方案
前置准备(生成结果rosbag时的要求)
这是保证后续同步播放的基础:
- 从原rosbag提取消息处理生成新bag时,必须保留原消息的
header.stamp时间戳,不要替换为处理时的系统时间,确保两个bag的时间轴完全对齐 - 结果rosbag的时间跨度尽量和原rosbag保持一致,不要额外添加超出原bag时间范围的消息
同步播放实现方法
方案1:内置参数直接播放(最常用)
直接用rosbag play自带的同步参数即可,单条命令就能实现:
rosbag play --clock --sync --wait-for-subscribers original.bag result.bag
各参数作用说明:
--clock:rosbag会统一发布/clock话题作为全局仿真时间基准,两个bag的播放节奏都基于该时间,不受系统时间波动影响--sync:开启多bag同步模式,自动对齐所有输入bag的起始时间,保证相同时间戳的消息同时输出--wait-for-subscribers:等待所有话题的订阅者连接完成后再开始播放,避免开头部分的消息丢失或不同步
如果需要调整播放速率,可追加-r 速率值参数,比如-r 0.5就是以0.5倍速同步播放两个bag。
方案2:锁步播放(适合高精度同步场景)
如果需要逐帧对齐、精准控制播放进度,比如做算法结果和真值的对比测试,可使用锁步模式:
- 先启动roscore
- 第一个终端启动带锁步模式的rosbag播放命令:
rosbag play --clock --pause --lockstep original.bag result.bag - 启动完成后可通过空格键控制播放/暂停,或调用
/play_next服务实现逐帧播放,全程两个bag的消息输出完全对齐。
常见问题排查
- 播放前可先执行
rosbag info 包名分别查看两个bag的起止时间,确认时间范围重合,重合范围外的内容会单独播放,无法同步 - 播放时避免同时运行高负载进程,防止CPU资源不足导致消息发布延迟出现偏差
- 如果结果rosbag的消息时间戳已被修改,需要先做时间偏移校准,将所有消息的时间戳调整到和原bag一致的时间区间后再播放。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

