理解
时间和定时器都属于roscpp库
时间
ROS提供了ros::Time(时间点)和ros::Duration(时间段)类
ros :: WallTime,ros :: WallDuration和ros :: WallRate,它们具有相同的接口ros :: Time,ros :: Duration和ros :: Rate。
可以进行加减法:单位是秒:
- ros::Duration two_hours = ros::Duration(60*60) + ros::Duration(60*60);
- ros::Duration one_hour = ros::Duration(2*60*60) - ros::Duration(60*60);
- ros::Time tomorrow = ros::Time::now() + ros::Duration(24*60*60);
- ros::Duration negative_one_day = ros::Time::now() - tomorrow;
休眠的两种形式
//方法一:
ros::Duration(0.5).sleep();//休眠0.5秒
//方法二:
ros::Rate r(10); // 10 hz
while (ros::ok())
{
... do some work ...
r.sleep();
}
时间代码举例
#include<ros/ros.h>
#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_test_1");
ros::NodeHandle n;
ros::Time begin = ros::Time::now();//现在的时间点,好像是自从1970年开始算?
double secs = begin.toSec();//转换成秒
ros::Duration(5).sleep();//先休眠一下,不会运行下面的程序
ros::Time now = ros::Time::now();
ros::Duration dur(5);
dur = now - begin;
secs = dur.toSec();//转换成秒,
cout<<dur<<endl;
cout<<secs<<endl;
//ros::spin();
return 0;
}
定时器
Timers能让你以一定的频率来执行。
他们是比ros::Rate更加灵活和有用的形式,ros::Rate在编写简单发布节点和订阅节点用到。
注意:定时器不是实时的线程/内核替换,也不能保证它们的准确度,因为系统负载/功能会有很大的变化。
- 创建定时器
ros::Timer timer = nh.createTimer(ros::Duration(0.1), timerCallback);
一般创建定时器用法:
ros::Timer ros::NodeHandle::createTimer(ros::Duration period, <callback>, bool oneshot = false);
- period :这是调用定时器回调函数时间间隔。例如,ros::Duration(0.1),即每十分之一秒执行一次
- < callback >:回调函数,可以是函数,类方法,函数对象。
- oneshot :表示是否只执行一次,如果已经执行过,还可以通过stop()、setPeriod(ros::Duration)和start()来规划再执行一次。
定时器代码:
#include "ros/ros.h"
#include<iostream>
using namespace std;
void callback1(const ros::TimerEvent& time_e)
{
ROS_INFO("Callback 1 triggered");
//cout<<time_e.current_real<<endl;//当前触发的时间,参考上面的解释
}
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);//0.1s运行一次callback1
ros::Timer timer2 = n.createTimer(ros::Duration(1.0), callback2);//1s运行一次callback2
ros::spin();
return 0;
}