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时间
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删