ROS中的时间

ROS中的时间

一、ros::Time::now()解释

ros::Time t1 = ros::Time::now();
double t_cur = t1.toSec();//获取的是自1970年一月一日到现在时刻的秒数
printf("The time is: %16f\n",t_cur);//打印,%16f表示的是16位宽度的float类型的数字;
//注:%.2f是保留两位小数的意思
//若发布点云时,没有为每一帧点云打上时间戳,那么t_cur默认为0
void GridMap::cloudCallback(const sensor_msgs::PointCloud2ConstPtr &img)
{
  double t_cur = img->header.stamp.toSec();
  printf("cloudCallback_time: %16f\n",t_cur);
}

二、调用C++11 std::chrono时间库

在代码中可以用来打高精度时间戳

#include 

	auto t1 = std::chrono::high_resolution_clock::now();
	auto t2 = std::chrono::high_resolution_clock::now();
	auto elased_time = std::chrono::duration_cast<std::chrono::nanoseconds>(t2-t1).count()/1.0e9;//纳秒级别
	std::cout<<"Consumed Time(s): "<< elased_time <<std::endl;//输出的单位是秒

三、c++中sleep, usleep, ros中的ros::Duration

sleep(0.5) = sleep(0)//sleep()只接受整数
/* sleep.c:9:15: warning: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Wliteral-conversion]
sleep(0.5); */
usleep(0.5*1000000)//usleep表示睡眠微秒,利用该函数可以实现延迟0.5s
ros::Duration(0.5).sleep()//该函数也可以实现延迟0.5s

四、ros::Rate

 ros::Rate loop_rate(10);
 while(!have_odom){
    loop_rate.sleep();
    ros::spinOnce();
 }

五、ros::WallTime::now()解释

官方解释:Wall-clock time, or wall time, is the human perception of the passage of time from the start to the completion of a task. In the context of a task being performed on a computer, wall-clock time is a measure of the real time that elapses from start to end, including time that passes due to programmed (artificial) delays or waiting for resources to become available. In other words, it is the difference between the time at which a task finishes and the time at which the task started.
挂钟时间,或称挂钟时间,是人类对一项任务从开始到完成的时间流逝的感知。在计算机上执行任务的过程中,挂钟时间是对从开始到结束所经过的实时时间的度量,包括由于编程(人为)延迟或等待资源可用而经过的时间。换句话说,它是任务完成时间和任务开始时间之间的差异。

谈及时间,有一个很重要的概念是ROS Time和Wall Time,两者是有区别的。它们两个的接口完全一样,数据类型也一样,但是ROS Time表示的是ROS网络中的时间。

ROS网络中的时间是指,如果当时在非仿真环境里运行,那它就是当前的时间。但是假设去回放当时的情况,那就需要把当时的时间录下来。以控制为例,很多的数据处理需要知道当时某一个时刻发生了什么。Wall Time可以理解为墙上时间,墙上挂着的时间没有人改变的了,永远在往前走;ROS Time可以被人为修改,你可以暂停它,可以加速,可以减速,但是Wall Time不可以。

在开启一个Node之前,当把use_sim_time设置为true时,这个节点会从clock Topic获得时间。所以操作这个clock的发布者,可以实现一个让Node中得到ROS Time暂停、加速、减速的效果。同时下面这些方面都是跟Node透明的,所以非常适合离线的调试方式。当把ROSbag记下来以后重新play出来时,加两个横杠,–clock,它就会发布出这个消息。

Wall Time(挂钟时间)

如果你想获得实际的挂钟时间即使运行在模拟。
roslib提供所有时间版本构建:ros::WallTime, ros::WallDuration, 和ros::WallRate
也分别有相同的接口:ros::Time, ros::Duration, and ros::Rate

播放rosbag时,若参数/use_sim_time 为true,则此时

ros::WallTime::now()为当前的真实时间,也就是墙上的挂钟时间,一直在走。
ros::Time::now()为rosbag当时的时间,是由bag中/clock获取的。是仿真时间。

参考:
[1]https://blog.csdn.net/sru_alo/article/details/102893536
[2]https://www.ncnynl.com/archives/201702/1301.html
[3]https://blog.csdn.net/heroacool/article/details/106210623

你可能感兴趣的:(ROS)