ROS中use_sim_time参数的作用是什么?尤其涉及rosbag录制播放场景
ROS的use_sim_time参数作用及相关现象解释
核心作用
use_sim_time是ROS节点侧的模拟时间启用开关,仅作用于设置了该参数的节点本身,核心逻辑如下:
- 当
use_sim_time = false(默认值)时,节点调用ros::Time::now()接口获取的是服务器当前的物理时间(墙上时间) - 当
use_sim_time = true时,节点会自动订阅/clock话题,调用ros::Time::now()返回的是/clock话题发布的模拟时间,不再跟随物理时间变化
rosbag录制播放场景下的作用
这个参数的核心价值是保证离线回放场景下所有节点的时间线完全对齐rosbag内的录制时间,正常回放需要两个条件配合:
- 回放时添加
--clock参数执行rosbag play xxx.bag --clock,此时rosbag播放节点会作为模拟时间源,向/clock话题发布rosbag内的时间戳 - 所有需要和rosbag时间对齐的节点(比如定位、感知、规划算法节点)都提前将
use_sim_time参数设置为true
这种配置下,不管你是暂停播放、倍速播放、还是播放过程出现卡顿,所有节点获取到的时间都会和rosbag内录制的消息时间戳完全匹配,不会出现因为物理时间流逝导致的算法超时、时间戳匹配错误等问题。
测试现象解释
1. 为什么use_sim_time参数对/clock话题发布无影响?
/clock话题的发布行为完全由模拟时间源(rosbag播放节点、Gazebo仿真器等)控制,和其他节点的use_sim_time设置无关。其他节点设置use_sim_time = true只是让自身主动订阅/clock话题获取时间,不会对时间源的发布逻辑产生任何影响,因此你测试时会观察到该参数不改变/clock的发布状态。
2. 为什么rostopic echo /clock会出现大量重复时间值?
rosbag播放节点发布/clock的逻辑是:每处理完一组当前时间点的bag消息,就发布一次对应时间的/clock消息。如果你的rosbag内存在多条同一时间戳采集的传感器数据(比如同一时刻的图像、IMU、激光雷达数据),rosbag播放到该时间点时就会多次发布相同的/clock值,避免节点时间跳变。此外倍速低于1x播放、播放卡顿的场景下,也会重复发布当前时间的/clock值,通知所有节点模拟时间暂时没有推进。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

