理解ROS:时间和定时器

理解

创客参考
wiki参考_Timer
wiki参考_Time

时间和定时器都属于roscpp库

时间

提供了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;
}

猜你喜欢

转载自blog.csdn.net/QLeelq/article/details/111060608