用 ros2 bag 回放数据做算法调试时,经常遇到回放出来的话题时间戳和实际不一致,节点行为也和录制时不一样。排查下来,十有八九是 use_sim_time 没对齐。说说我的检查清单。
1. 回放前确认所有节点都开了 use_sim_time
ros2 bag play 默认会发布 /clock,但只有参数 use_sim_time 设为 true 的节点才会用仿真时间。漏掉一个节点,它就用系统时间,其他节点用仿真时间,两个时间基准混跑,tf、消息同步全乱套。
2. 启动顺序有讲究
先启动 use_sim_time 的节点,再开始回放。反过来,节点启动瞬间没收到 /clock,会用系统时间初始化一部分状态,后面再切仿真时间会出现跳变。我的 launch 文件里现在固定先起节点、等一秒再起 bag play。
3. /clock 发布频率要够
bag play 的 /clock 发布频率默认跟随录制数据,话题稀疏时 /clock 也稀疏,依赖时间的节点(比如控制器)会算出异常的 dt。必要时用 --clock-publish-interval 或者单独起一个 clock 发布节点。
4. 录制时就要把 /clock 一起录进去
有些调试场景需要多次回放同一段数据,如果录制时没录 /clock,回放时的时间基准就依赖 bag play 的实时发布,重复性变差。录制命令里加上 /clock 话题是个好习惯。
5. 时间戳用 header.stamp 还是接收时间,要统一
消息头里的时间戳和节点收到消息的时间是两回事。做同步(message_filters)时统一用 header.stamp,否则回放和实机表现不一致,调试结论可能完全跑偏。
你们用 ros2 bag 调试时还踩过哪些时间相关的坑?