ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate、ros::WallTime

这篇具有很好参考价值的文章主要介绍了ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate、ros::WallTime。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. ros时间格式说明

        有时刻持续时长(可以是负数),分为纳秒,换算关系:1sec=1e9nsec。Time指的是某个时刻,而Duration指的是某个时段。

int32 sec
int32 nsec

2. ros::Time::now()

        记录当前时刻

3. ros::Duration

        代表持续的一段时间

4.  toSec()

        将“1 ros时间格式说明”中所示的格式转为秒

double secs1=at_some_time1.toSec();  //将 Time 转为 double 型时间
double secs2=one_hour.toSec();       //将 Duration 转为 double 型时间

ROS_INFO("secs1 is:%.20d", secs1.toSec()); //打印

5.头文件 #include <ros/ros.h>

6.函数原型

//Time原型,重载,_sec表示秒,_nsec表示纳秒
ros::Time::Time(uint32_t _sec, uint32_t _nsec)
ros::Time::Time(double t)

//Duration原型,重载
ros::Duration::Duration(uint32_t _sec, uint32_t _nsec)
ros::Duration::Duration(double t)


ros::Time at_some_time1(5,200000000); // 5.2s
ros::Time at_some_time2(5.2) // 5.2s

ros::Duration d(2, 500000000); // 2.5s
ros::Duration d(2.5); // 2.5s

7.基本用法

//获取当前时刻
ros::Time begin=ros::Time::now();

//Time加减Duration返回Time
ros::Time t1=ros::Time::now()-ros::Duration(5.5);//t1是5.5s前的时刻
ros::Time t2=ros::Time::now()+ros::Duration(3.3);//t2是当前时刻往后推3.3s的时刻

//两个Time相减返回Duration类型
ros::Duration d1=t2-t1;//从t1到t2的时长

//两个Duration相减,返回Duration
ros::Duration d2=d1-ros::Duration(0,300);

        注意 没有Time+Time的运算,需要说明的是,ROS并不是实时系统,所以定时器并不能确保精确定时。精确的执行时间以及理论上应该执行的时间可以在回调函数的ros::TimerEvent结构中得到。

8.slee()函数

        通常在任务执行中可能有需要等待的场景,这时就要用到 sleep 功能。

// 函数原型 ros::Duration::sleep()
// 使用方法:
ros::Duration(2.5).sleep(); 

9.ros::Rate 循环

        Rate 的功能是设定一个频率,让循环按照这个频率执行,然后通过睡眠度过一个循环中剩下的时间,来达到该设定频率,如果能够达到该设定频率则返回true,不能则返回false。计时的起点是上一次睡眠的时间、构造函数被调用、或者调用void ros::Rate::reset()函数重置时间。因为没有TimerEvent,所以相对于Timer而言,Rate的精确度会有所下降。与之类似的是 ROS 中的定时器 Timer,它是通过设定回调函数和触发时间来实现某些动作的循环执行。创建方法和 topic 中的 subscriber 很像:

ros::Rate r(10); // 10Hz
while(ros::ok())
{
	...
	bool met = r.sleep();
}

        工作原理,从上一次sleep结束后到下一次sleep开始时,如果经过的时间没有超过指定的频率时间,就通过sleep到指定频率时间。比如指定Rate为10Hz(100ms),程序一次循环只用了10ms,那么sleep就会休眠90ms,然后进入下一次循环。因此如果循环程序运行的时间大于指定Rate,那么这个Rate就失效了。 

10.ros::Timer

        ros::Timer是比Rate更灵活的计时循环器,通过类似subscriber+callback的方式进行:

ros::NodeHandle nh;
nh.createTimer(ros::Duration(2.5), timerCallback);  //定时2.5s

void timerCallback(const ros::TimerEvent& e);

例子

#include <ros/ros.h>
#include "learning_topic/Person.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;
     ros::Timer timer1=n.createTimer(ros::Duration(0.1),callback1);//timer1每0.1s触发一次callback1函数 
     ros::Timer timer2=n.createTimer(ros::Duration(1.0),callback2);//timer2每1.0s触发一次callback2函数
     ros::spin();//千万别忘了spin,只有spin了才能真正去触发回调函数
     return 0;
}

ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate、ros::WallTime

11.ros::WallTime

int main(int argc, char **argv)
{
    ros::WallTime start = ros::WallTime::now();

    for(int i = 0; i<1000; i++){
        ROS_INFO("Subcribe Info......");
    }

    ros::WallDuration t_diff = ros::WallTime::now() - start;
    ROS_WARN("WallTime t_diff: %.10f\n", t_diff.toSec());

    return 0;
}

ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate、ros::WallTime文章来源地址https://www.toymoban.com/news/detail-473030.html

到了这里,关于ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate、ros::WallTime的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM-32:TIM定时中断—定时器定时中断/定时器外部时钟

    定时器可以对输入的时钟进行计数,并在达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等

    2024年02月09日
    浏览(54)
  • 【Qt】定时器处理——定时器事件类QTimerEvent和定时器类QTimer使用

    Qt的定时器只能通过纯代码实现,定时器顾名思义,主要作用是定时特定的时间。 Qt提供了定时器事件类 QQTimerEvent 和定时器类 QTimer 实现定时器操作。 Qt提供了更高层次的定时器编程接口** QTimer **类,可以使用信号和槽,还可以设置定时一次。比较常用的方法有: QTimer::set

    2024年02月05日
    浏览(45)
  • JMeter定时器之同步定时器

      在实际生活中大家肯定遇到过一种场景,就是在某一时间或某一时刻,某件商品进行抢购,相当于秒杀;但是用JMeter进行测试的时候,如何模拟这种场景?用一种组件就可以实现,定时器中的“同步定时器”。 了解t同步定时器的基础功能;熟悉同步定时器的使用场景。

    2024年01月16日
    浏览(44)
  • STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(39)
  • STM32定时器-定时器中断功能详解

    STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括: 通用与基本定时器(2~7)位于低速的APB1总线上 高级定时器(1、8)位于高速的APB2总线上 自动装载计

    2024年02月08日
    浏览(50)
  • 【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中断服务函数 参考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定时器定时中断.rar 10-定时器外部时钟.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年02月03日
    浏览(51)
  • STM32中TIM定时器定时功能详解(适用基本,通用,高级定时器)

    定时器有高级定时器、通用定时器、基本定时器三种类型。具体功能如下。 上面是每种定时器所具有的功能。 我们可以看到每种定时器都有一个定时功能,(可能是名字的由来吧)。当然,每个定时器都可以来使用定时功能,但是我们往往在基本定时器和通用定时器上面使用

    2024年01月19日
    浏览(59)
  • 51单片机定时器/计数器(定时器中断)

    实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1、51单片机定时器原理 定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到定数器满时,再输入一个脉冲就使定时器回零

    2024年02月06日
    浏览(52)
  • STM32 MCU 定时器详解(1)--基本定时器

    定时器是一种电子组件,主要用于定时控制,具备精确计时的能力。它可以在设定的时间间隔内触发特定的操作,如发送数据、采集传感器信息、检测输入信号或产生规律性输出波形。这种灵活性使定时器在多个行业中得到广泛应用,支持各种复杂功能的实现,是现代电子系

    2024年02月22日
    浏览(49)
  • STM32 MCU 定时器详解(3)--高级定时器

    16位递增、递减、中心对齐计数器(计数值:0~65535) 16位预分频器(分频系数:1~65536) 可用于触发DAC、ADC 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式 使用外部信号控制定时器且可实

    2024年04月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包