ROS::Time[/Duration/Rate]:ROS时间——来源可以被认为修改如加速/减速/暂停。
ROS::WallTime[WallDuration/WallRate]:ROS绝对时间——不可修改的"真实"时间。
所有的ros::node在启动时如果有设置[ros::param] \use_sim_time = true则节点的ROS::Time从/clock中获取,否则其值和ROS::WallTime一致。
在ROS_INFO输出的时间戳中可以观察到两者的差异。首先我们设置rosparam set /use_sim_time true 然后启动如下代码 :
ROS_INFO("%lf,%lf",(double)(ros::WallTime::now().toSec()), (double)(ros::Time::now().toSec()));1.2.

输入:rostopic pub /clock rosgraph_msgs/Clock "clock: secs: 1 nsecs: 0" 再运行上面代码

输入:rosparam delete /use_sim_time 重新运行代码

ROS时间和时间戳stamp对有些rosnode来说至关重要:
比如rviz和tf会将 msg 的header/stamp与rosnode当前时间对比来抛弃无效数据(OLD_DATA)。
ActionClient会自动添加当前时间到stamp中发送给ActionServer,而ActionSerer会对比新的msg与历史msg的stamp来决定是否是合法数据。
在录制rosbag的时候msg/header/stamp时间戳是录制时刻的值。可能导致当前ROS时间 和时间戳不匹配导致:抛出异常,更有甚者直接功能不正常。
我们可以设置use_sim_time再启动节点,改变ROS时间源。并通过对rosbag ... --clock参数让rosbag发布/clock驱动ROS时间
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删