wiki链接: http://wiki.ros.org/roscpp/Overview/Timers
http://wiki.ros.org/roscpp_tutorials/Tutorials/Timers
关于定时器,在ROS学习之cpp教程(http://blog.csdn.net/shiyue0010/article/details/51925666)的第六部分已经学习过了,这里详细补充几点.
1.创建一个定时器
ros::NodeHandle::createTimer()方法创建定时器对象.createTimer()方法有很多重载方法,通常的原型如下:
ros::Timer ros::NodeHandle::createTimer(ros::Duration period, <callback>, bool oneshot = false);
参数说明:
period:定义了定时器回调函数调用间隔,ros::Duration(0.1)定义了一个匿名类作为period参数,表示每隔0.1s调用一次定时器回调函数
<callback>:定时器回调函数,可以是一般函数,类成员方法,仿函数对象等等
oneshot:确定该定时器是一次性定时还是持续调用
2.回调函数原型
void callback(const ros::TimerEvent&);参数 ros::TimerEvent时间事件结构体
ros::TimerEvent
ros::Time last_expected
上次回调理想发生时间
ros::Time last_real
上次回调实际发生时间
ros::Time current_expected
本次回调理想发生时间
ros::Time current_real
本次回调实际发生时间
ros::WallTime profile.last_duration
上次回调持续时间
3.回调函数的类型
与消息,服务回调函数类似,定时器回调函数也有三种类型,这里就不再赘述了1) 一般函数
2) 类成员方法
3) 仿函数对象
4.壁钟定时器
壁钟时间:相对于cpu时间,是指实际运行程序流逝的时间,包含了在执行程序时,实际发生的状况,比如此时有很多其它程序或者I/O操作等.cpu时间:是指运行程序指令所实际消耗的cpu的时间,不包含其它程序占用cpu时导致实际耗时增加的情况
ros::Timer在可以获得ROS Clock的情况下会使用它(计算流逝时间),而通常,它只会运行在时间模拟情况,这导致定时的不准确.
如果希望定时器一直使用壁钟时间,ros提供了ros::WallTimer,它与ros::Timer使用方法相同,仅仅把Timer改为WallTimer而已