time 和 Timer
介绍 ROS 中的时刻、时间间隔、定时器的定义和应用。
一、Time
1、时刻和间隔
ROS 中有 time 和 duration 两种类型,相应的有 ros::Time 和 ros::Duration 类。
- time 表示的是时刻
- duration 表示的是时间间隔
其统一表示形式为:
int32 sec
int32 nsec
ROS 可以给节点提供一个模拟始时钟。不同于平台时间,你可以利用 roscpp 的时间例程来得到当前的时间,此时间能够和模拟时间、wall-clock 时间进行无缝连接。
1.1 获得当前时间
ros::Time::now()
ros::Time begin = ros::Time::now();
时间计算起点
使用模拟时间时,当 /clock
节点接受到第一条消息时,now() 返回时刻 0,此时客户端还不知道时钟时间。
1.2 创建时间和间隔
浮点数形式
ros::Time a_little_after_the_beginning(0.001);
ros::Duration five_seconds(5.0);
用两个整数表示
ros::Time a_little_after_the_beginning(0, 1000000);
ros::Duration five_seconds(5, 0);
1.3 时间与间隔的转化
double secs =ros::Time::now().toSec();ros::Duration d(0.5);
secs = d.toSec();
1.4 时间与间隔的四则运算
时间和时刻的四则运算实例如下:
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;
2、Sleeping and Rates
bool ros::Duration::sleep()
睡眠 0.5s:
ros::Duration(0.5).sleep(); // sleep for half a second
ros::Rate
频率 10Hz:
ros::Rate r(10); // 10 hz
while (ros::ok())
{... do some work ...r.sleep();
}
Rate 和 Timer 的作用一样,最好用 Timer 来定时。
3、Wall Time
在模拟时,如果想要进入实际运行 wall-clock time ,可以用 ros::WallTime, ros::WallDuration, 和ros::WallRate,类似于 ros::Time, ros::Duration, 和 ros::Rate
二、Timer
定时器不能代替实时线程/内核,它们仅对没有硬实时要求的事物有用。
1、定义定时器
方法: ros::NodeHandle::createTimer()
ros::Timer timer = nh.createTimer(ros::Duration(0.1), timerCallback);
完整定义:
ros::Timer ros::NodeHandle::createTimer(ros::Duration period, <callback>, bool oneshot = false);
period:定时器回调函数之间的时间间隔
:定时器回调,函数、类方法或者函数子对象
oneshot:是否只定时一次。false,就是连续定时。
2、回调特征
void callback(const ros::TimerEvent&);
struct TimerEvent{Time last_expected; ///< 上一回调函数应该发生的时刻Time last_real; ///< 上一回调函数实际发生的时刻Time current_expected; ///< 当前回调函数应该发生的时刻Time current_real; ///< 当前回调函数实际发生的时刻struct{WallDuration last_duration; ///<包含上一回调的时间间隔(结束时间-开始时间),它始终在 `wall-clock time`} profile;};
3、回调类型
functions
class methods
functor objects (including 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
class Foo
{
public:void operator()(const ros::TimerEvent& event){...}
};...
ros::Timer timer = nh.createTimer(ros::Duration(0.1), Foo());
3.4 Wall-clock Timers
在仿真是利用 ROS Clock。
void callback(const ros::WallTimerEvent& event)
{...
}...
ros::WallTimer timer = nh.createWallTimer(ros::WallDuration(0.1), callback);
time 和 Timer相关推荐
- Timer定时器开发
Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...
- Timer 的简单介绍
1 Timer timer=new Timer(); (个人建议使用的时候不要直接就new一个,原因是,还没使用呢就先分配一个空间, 我们使用private Timer timer: 然后在使用前 ...
- nordic 51822 sdk. timer 的使用
它的源代码和头文件分别为app_timer.c/app_timer.h.这是Nordic为我们提供的虚拟定时器,这个定时器不同于硬件上的TIMER,而是基于RTC1实现的一种虚拟定时器,其将定时功能作 ...
- Standup Timer的MVC模式及项目结构分析
前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的 ...
- C# Timer使用方法示例
实例化一个timer: // 每5分钟执行一次,每次执行的间隔毫秒时长 System.Timers.Timer timer = new System.Timers.Timer(5*60*1000); ...
- C#中Timer组件用法
Timer组件是也是一个WinForm组件了,和其他的WinForm组件的最大区别是:Timer组件是不可见的,而其他大部分的组件都是都是可见的,可以设计的.Timer组件也被封装在名称空间Syste ...
- Android Timer的使用
1:服务端使用PHP <?phpecho date('Y-m-d H:i:s'); ?> 2:activity_main.xml <RelativeLayout xmlns:andr ...
- Linux内核中关于定时器Timer的应用
2019独角兽企业重金招聘Python工程师标准>>> 在Touchscreen驱动中 1 声明 Ad7877.c (\linux-2.6.30.4\drivers\input\t ...
- silverlight、wpf中 dispatcher和timer区别
相同点:都是定时执行任务的计时器,都可以使用. 不同点:Timer运行在非UI 线程,如果Timer需要更新UI的时候,需要调用 Invoke或者 BeginInvoke DispatcherTime ...
- java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
在Java中,实现定时任务有多种方式.本文介绍4种.Timer和TimerTask.Spring.QuartZ.Linux Cron. 以上4种实现定时任务的方式.Timer是最简单的.不须要不论什么 ...
最新文章
- struts2.2.1关于sitemesh和freemarker整合的细节
- c语言双循环计算n的阶乘,用C语言用循环实现N的阶乘
- 01. Node js Hello world
- 怎么圆角变直角_衣柜设计个圆角有什么用?效果好看又实用,会这样装的都是老木工...
- web前端(12)—— 页面布局2
- Mysql报错130_mysql 突然报错,连接不上
- html是纯文本语言吗,记事本是纯文本文件吗
- 2021年品牌CDP与营销数字化转型报告:从自建数据资产到消费者深度运营
- 扩展欧几里得算法(双六游戏)
- win8 性能测试软件,win8系统优化软件评测
- 量子计算机epr,从EPR到量子信息[转] - 物理 - 小木虫 - 学术 科研 互动社区
- alios是安卓吗_鸿蒙OS系统被质疑,谷歌也有新布局!阿里云OS事件会再现吗?
- 2022 lineCTF WEB复现WriteUp
- Linux学习笔记(3)- 网络编程以及范例程序
- 温州大学c语言期末试卷,2016年温州大学物理与电子信息工程学院综合卷之C语言程序设计复试笔试最后押题五套卷...
- 【游戏技术】SourceMod 用法说明
- 艾赛克科技《RFID智能仓库管理系统》
- orange one plus 全志H6教程
- 2021年全球闪存峰会在杭州盛大开幕
- 2015年8月淡季成都到稻城亚丁自驾游自己的攻略