ros中时间的概念:ros::Time、ros::Duration、定时器ros::Timerros::Rate

news2024/11/14 12:10:39

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RedisTemplate最常用方法

前言&#xff1a;RedisTemplate常用方法介绍&#xff0c;根据RedisTemplate封装了Redis的一些常用的原生操作RedisUtil工具类。 一、SpringDataRedis简介 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-d…

MinIo-SDK

3.2.5 SDK 3.2.5.1上传文件 MinIO提供多个语言版本SDK的支持&#xff0c;下边找到java版本的文档&#xff1a; 地址&#xff1a;https://docs.min.io/docs/java-client-quickstart-guide.html 最低需求Java 1.8或更高版本: maven依赖如下&#xff1a; XML<dependency&g…

2023爱分析· 云管理服务(MSP)市场厂商评估报告:华创方舟

目录 1. 研究范围定义 2. 云管理服务&#xff08;MSP&#xff09;市场定义 3. 厂商评估&#xff1a;华创方舟 4. 入选证书 1. 研究范围定义 数字化时代&#xff0c;应用成为企业开展各项业务的落脚点。随着业务的快速发展&#xff0c;应用的功能迭代变得越来越…

深度学习常用的优化器整理

常见优化器整理 一、SGD&#xff08;随机梯度下降&#xff09; 公式&#xff1a; 经典的mini-batch SGD使用的很多&#xff0c;效果也比较不错&#xff0c;但是存在一部分问题 选择恰当的初始学习率很困难学习率调整策略受限于预先制定的调整规则相同的学习率被应用于各个参数…

经理与员工工资关系-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-6】经理与员工工资案例&#xff08;利用多态实现&#xff09; 欢迎点赞关注收藏 【案例介绍】 案例描述 某公司的人员分为员工和经理两种&#xff0c;但经理也属于员工中的一种&#xff0c;公司的人员都有自己的姓名和地址&#xff0c;员工和经理都有自己的工号、工…

中国高速公路行业市场规模及未来发展趋势

中国高速公路行业市场规模及未来发展趋势编辑中国高速公路行业市场规模正在迅速增长。随着中国经济的快速发展和城市化的加速&#xff0c;对交通基础设施的需求也在不断增加。高速公路是最有效的交通工具&#xff0c;可以大大缩短交通时间&#xff0c;提高出行效率。因此&#…

志趣相投的人总会相遇——社科院与杜兰大学金融管理硕士项目

志同道合的人&#xff0c;才会喜欢同一片风景&#xff0c;志趣相投的人&#xff0c;总有一天会相遇。社科院与杜兰大学金融管理硕士项目为什么能吸引一大批“上班族”呢&#xff0c;我们一起去了解一下。社科院与杜兰大学中外合作办学硕士项目无需参加全国联考&#xff0c;通过…

springMvc源码解析

入口&#xff1a;找到springboot的自动配置&#xff0c;将DispatcherServlet和DispatcherServletRegistrationBean注入spring容器&#xff08;DispatcherServletRegistrationBean间接实现了ServletContextInitializer接口&#xff0c;最终ServletContextInitializer的onStartup…

Seata-Server分布式事务原理加源码(一) - 微服务之分布式事务原理

概念 基础概念&#xff1a;事务ACID • A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 • C&#xff08;Consistency&#xff09;…

【测试开发】Dubbo接口测试技术,测试开发进阶必备(附源码)

Dubbo 是什么&#xff1f; Dubbo 是阿里巴巴开源的一套 RPC 方案&#xff0c;因为理念很契合微服务&#xff0c;这几年很火&#xff0c;用户里面不凡京东&#xff0c;当当&#xff0c;去哪儿等大公司。 RPC 场景 Dubbo 架构 官网也提供了一个很简单实用的 Demo 来演示 Dubbo …

企业级信息系统开发学习笔记1.4 初探Spring——采用Java配置类管理Bean

文章目录零、本讲学习目标一、课程引入二、采用Java配置类管理Bean&#xff08;一&#xff09;打开项目&#xff08;二&#xff09;创建子包&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;创建Spring配置类&…

电商数据查询平台:母婴行业妈妈用品全网热销,头部品牌格局初现

以往&#xff0c;奶粉、纸尿裤这类产品基本就代表了整体母婴市场中的消费品。而如今&#xff0c;随着母婴行业的高速发展和消费升级&#xff0c;母婴商品的种类日益丰富&#xff0c;需求也不断深入。 在京东平台&#xff0c;母婴大品类中除了包含婴童相关的食品&#xff08;奶粉…

面试个3年自动化测试,测试水平一言难尽。。。。

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。 一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3年工作经验&#xff0c;但…

飞塔Fortinet防火墙SSL VPN双因素身份认证(2FA)方案

作为行业领先的防火墙厂商&#xff0c;飞塔Fortinet结合了高性能 VPN 功能&#xff0c;代表了网络安全的新概念。其中飞塔Fortinet防火墙 SSL VPN 因其突出的安全性能而被广泛应用在远程办公场景中。但在 SSL VPN 登录时用户仅需输入用户名和固定的静态密码&#xff0c;若遭遇账…

AWS S3常用功能总结回顾

本文用于记录与分享工作中遇到的s3的基础使用方法 工具介绍 本文采用s3Browser对s3进行可视化管理 基本元素 端点Endpoint桶Bucket账号AccessKey密码SecreteKey 说明 本文基于JavaSDK进行演示代码&#xff0c;下文的代码都只包含核心部分&#xff0c;异常捕捉、流关闭、…

【图像分类】卷积神经网络之LeNet5网络模型结构详解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 1. 前言 LeNet5算法是LeCun在1998年提出的卷积神经网络模型。大约90年代,由于支持向量机等算法的发现,深度学习…

django项目实战一(django+bootstrap实现增删改查)

目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…

创建虚拟机,安装CentOS

在VMware上面创建虚拟机 文件->新建虚拟机 选定 自定义的高级&#xff0c;下一步 下一步 检查选定稍后安装操作系统 下一步 选择Linux&#xff0c;CentOS 7 64位 创建虚拟机名称&#xff0c;以及在存放该虚拟机的位置 选择处理器的数量和每个处理器的内核数量 …

Linux入门操作指令介绍(配合Windows理解)

&#xff08;1&#xff09;如果不会装虚拟机和Ubuntu&#xff0c;建议跟着韦东山老师的课程来安装&#xff0c;绝大多数事情他都帮你做好了。跟着视频的来即可。韦东山老师视频链接。&#xff08;2&#xff09;跟着视频做可能还是会有很多不懂的&#xff0c;比如什么是Shell &a…

【论文速递】ACL 2021-CLEVE: 事件抽取的对比预训练

【论文速递】ACL 2021-CLEVE: 事件抽取的对比预训练 【论文原文】&#xff1a;CLEVE: Contrastive Pre-training for Event Extraction 【作者信息】&#xff1a;Wang, Ziqi and Wang, Xiaozhi and Han, Xu and Lin, Yankai and Hou, Lei and Liu, Zhiyuan and Li, Peng and …