时钟与定时器
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>
Time和Duration表示的概念不相同,Time指的是某个时刻、时间点;而Duration指的是某个时段,尽管他们的数据结构都相同,但是用在不同的场景。 ROS为我们重载了Time、Duration类型之间的加减运算,比如:
ros::Time begin = ros::Time::now(); //获取当前时间
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的做法。
sleep
通常在机器人任务执行中可能有需要等待的场景,这时就要用到sleep功能。roscpp中提供了两种sleep的方法:
ros::Duration(0.5).sleep(); //用Duration对象的sleep方法休眠
ros::Rate r(10); //10HZ
while(ros::ok())
{
r.sleep();
//定义好sleep的频率,Rate对象会自动让整个循环以10hz休眠,即使有任务执行占用了时间
}
Timer
Rate的功能是指定一个频率,让某些动作按照这个频率来循环执行。与之类似的是ROS中的定时器Timer,它是通过设定回调函数和触发时间来实现某些动作的反复执行,创建方法和topic中的subscriber很像。
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;
}