apollo学习基础之二[ROS使用C++ 的Timers类定时器]
在学习apollo源码过程中,很多模块都用到ros定时器的使用。比如planning模块中,就用到了,所以我就来学习这知识点。
roscpp定时器,它允许您安排一个回调发生周期性。就是以一定的频率执行你程序或者任务,类似我们之前学习发布、订阅的ros::rate,但是比ros::rate更加的灵活。但是定时器不是实时的线程/内核替换,也不能保证它们的准确度,因为系统负载/功能会有很大的变化。
使用定时器和我们ros学习订阅是类似的,如下:
ros::Timer timer
=
nh.
createTimer
(
ros::Duration
(
0.2
), timer_callback);
回调函数timer_callback定义如下:
void
timer_callback
(
const
ros::TimerEvent
&
ecen);
下面就让我们用一个简单例子来解释吧
#include
"ros/ros.h"
void
timer_cb1
(
const
ros::TimerEvent
&
)
{
ROS_INFO
(
"timer_cb 1 triggered"
);
}
void
timer_cb2
(
const
ros::TimerEvent
&
)
{
ROS_INFO
(
"timer_cb 2 triggered"
);
}
int
main
(
int
argc,
char
**
argv)
{
ros::init
(argc, argv,
"talker"
);
ros::NodeHandle nh;
//增加两个定时器,一个200毫秒执行一次,一个1秒执行一次。
ros::Timer timer1
=
nh.
createTimer
(
ros::Duration
(
0.2
), timer_cb1);
ros::Timer timer2
=
nh.
createTimer
(
ros::Duration
(
1.0
), timer_cb2);
ros::spin
();
return
0
;
}
运行效果如下:
[ INFO]
1251854032.562464000
: timer_cb
1
triggered
[ INFO]
1251854032.662169000
: timer_cb
1
triggered
[ INFO]
1251854032.762649000
: timer_cb
1
triggered
[ INFO]
1251854032.862853000
: timer_cb
1
triggered
[ INFO]
1251854032.962642000
: timer_cb
1
triggered
[ INFO]
1251854033.063118000
: timer_cb
1
triggered
[ INFO]
1251854033.262864000
: timer_cb
2
triggered
[ INFO]
1251854033.362643000
: timer_cb
1
triggered
[ INFO]
1251854033.463158000
: timer_cb
1
triggered
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 上次回调的时间间隔(结束时间-开始时间),是wall-clock时间。