ROS学习笔记4 ——定时器的使用

1. 说明

roscpp定时器允许用户安排一个回调发生周期性。

  • Timers能让你以一定的频率来执行
  • 他们是比ros::Rate更加灵活和有用的形式
ros::Rate loop_rate(10);
/*
解释:
		指定发布消息的频率,这里指10Hz,也即每秒10次
		通过 Rate::sleep()来处理睡眠的时间来控制对应的发布频率。
*/

loop_rate.sleep();
/*
解释:
		根据之前ros::Rate loop_rate(10)的定义来控制发布话题的频率。定义10即为每秒10次
*/
  • 注意:定时器不是实时的线程/内核替换,也不能保证它们的准确度,因为系统负载/功能会有很大的变化1

2. 使用定时器1

创建定时器象创建订阅一样,通过ros::NodeHandle::createTimer()方法创建:

ros::Timer timer = n.createTimer(ros::Duration(0.1), timerCallback);

一般用法:

ros::Timer ros::NodeHandle::createTimer(ros::Duration period, , bool oneshot = false);
  • period ,这是调用定时器回调函数时间间隔。例如,ros::Duration(0.1),即每十分之一秒执行一次,回调函数,可以是函数,类方法,函数对象。
  • oneshot ,表示是否只执行一次,如果已经执行过,还可以通过stop()、setPeriod(ros::Duration)和start()来规划再执行一次。

回调函数:

void timerCallback(const ros::TimerEvent& e);
  • 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时间。

Wall-clock Timers

  • ros::Timer使用ROS Clock
  • 如果想要定时器使用wall-clock时间,可以替代Timer为WallTimer
    void callback(const ros::WallTimerEvent& event)
    {
      ...
    }
    
    ...
    ros::WallTimer timer = nh.createWallTimer(ros::WallDuration(0.1), callback);
    

3. 定时器回调函数的实现类型

  • roscpp 支持所有boost::bind类型的回调:
    • functions函数
    • class methods
    • functor objects(包含boost::function)

3.1 functions函数

void callback(const ros::TimerEvent& event)
{
...
}

...
ros::Timer timer = nh.createTimer(ros::Duration(0.1), callback);

3.2 class methods

void Foo::callback(const ros::TimerEvent& event)
{
...
}

...
Foo foo_object;
ros::Timer timer = nh.createTimer(ros::Duration(0.1), &Foo::callback, &foo_object);

3.3 functor objects(包含boost::function)

class Foo
{
public:
  void operator()(const ros::TimerEvent& event)
  {
    ...
  }
};

...
ros::Timer timer = nh.createTimer(ros::Duration(0.1), Foo());

4. 例子1

#include "ros/ros.h"

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;

  //定时器1每100ms执行一次
  ros::Timer timer1 = n.createTimer(ros::Duration(0.1), callback1);
  
  //定时器2每1秒执行一次
  ros::Timer timer2 = n.createTimer(ros::Duration(1.0), callback2);

  ros::spin();

  return 0;
}

  1. https://www.ncnynl.com/archives/201701/1284.html ↩︎ ↩︎ ↩︎

你可能感兴趣的:(▶,机器人操作系统ROS/ROS2)