🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 6.6 时钟 ## 6.6.1 Time 与 Duration ROS里经常用到的一个功能就是时钟,比如计算机器人移动距离、设定一些程序的等待时间、设定计时器等等。roscpp同样给我们提供了时钟方面的操作。 具体来说,roscpp里有两种时间的表示方法,一种是时刻(ros::Time),一种是时长(ros::Duration)。无论是Time还是Duration都具有相同的表示方法: ··· int32 sec int32 nsec ··· Time/Duration都由秒和纳秒组成。 要使用Time和Duration,需要`#include <ros/time.h>`和`#include <ros/duration.h>` ```cpp ros::Time begin = ros::Time::now(); //获取当前时间 ros::Time at_some_time1(5,20000000); //5.2s ros::Time at_some_time2(5.2) //同上,重载了float类型和两个uint类型的构造函数 ros::Duration one_hour(60*60,0); //1h double secs1 = at_some_time1.toSec();//将Time转为double型时间 double secs2 = one_hour.toSec();//将Duration转为double型时间 ``` Time和Duration表示的概念并不相同,Time指的是某个时刻,而Duration指的是某个时段,尽管他们的数据结构都相同,但是用在不同的场景下。 ROS为我们重载了Time、Duration类型之间的加减运算,比如: ```cpp ros::Time t1 = ros::Time::now() - ros::Duration(5.5); //t1是5.5s前的时刻,Time加减Duration返回都是Time ros::Time t2 = ros::Time::now() + ros::Duration(3.3);//t2是当前时刻往后推3.3s的时刻 ros::Duration d1 = t2 - t1;//从t1到t2的时长,两个Time相减返回Duration类型 ros::Duration d2 = d1 -ros::Duration(0,300);//两个Duration相减,还是Duration ``` 以上是Time、Duration之间的加减运算,要注意没有Time+Time的做法。 ## 6.6.2 sleep 通常在机器人任务执行中可能有需要等待的场景,这时就要用到sleep功能,roscpp中提供了两种sleep的方法: ```cpp ros::Duration(0.5).sleep(); //用Duration对象的sleep方法休眠 ros::Rate r(10); //10HZ while(ros::ok()) { r.sleep(); //定义好sleep的频率,Rate对象会自动让整个循环以10hz休眠,即使有任务执行占用了时间 } ``` ## 6.6.3 Timer Rate的功能是指定一个频率,让某些动作按照这个频率来循环执行。与之类似的是ROS中的定时器Timer,它是通过设定回调函数和触发时间来实现某些动作的反复执行,创建方法和topic中的subscriber很像。 ```cpp void callback1(const ros::TimerEvent&) { ROS_INFO("Callback 1 triggered"); } void callback2(const ros::TimerEvent&) { ROS_INFO("Callback 2 triggered"); } int main(int argc, char **argv) { ros::init(argc, argv, "talker"); ros::NodeHandle n; ros::Timer timer1 = n.createTimer(ros::Duration(0.1), callback1); //timer1每0.1s触发一次callback1函数 ros::Timer timer2 = n.createTimer(ros::Duration(1.0), callback2); //timer2每1.0s触发一次callback2函数 ros::spin(); //千万别忘了spin,只有spin了才能真正去触发回调函数 return 0; } ```