理解ROS:时间和定时器

本文介绍了ROS中的时间管理和定时器使用方法。详细说明了ros::Time和ros::Duration类的功能及应用,包括时间的加减操作和休眠的实现方式。此外,还深入探讨了ros::Timer的创建和回调函数的设置,以及如何调整定时器的周期。
摘要由CSDN通过智能技术生成

理解

时间和定时器都属于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;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值