时钟与定时器

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;
}

results matching ""

    No results matching ""

    results matching ""

      No results matching ""