ROS時間概念總結:ros::Time、ros::Duration、定時器ros::Timer&ros::Rate

0. 寫於最前面

但願你們收藏:html

本文持續更新地址:https://haoqchen.site/2018/11/08/ROS-time/api

本文總結了一些ROS中經常使用到的時間相關的一些類、定時器、概念等。app

做者會長期更新本身學到的一些知識,有什麼錯誤但願你們可以一塊兒探討,一塊兒進步。喜歡的話點個讚唄。函數

左側專欄還在更新其餘ROS實用技巧哦,關注一波?ui

1. 概述

roslib給用戶提供了ros::Time and ros::Duration兩個類來描述時刻以及時間間隔兩個概念,其中Duration能夠是負數。Time和Duration擁有同樣的成員:
int32 sec
int32 nsecthis

通常狀況下,這裏的時間都是跟平臺(即系統)的時間相關聯的,但ROS提供了一種模擬時鐘即ROS時鐘時間,當進行了相應設置時,這裏的時間就是ROS時鐘時間。spa

2. 時間與時間間隔的基本使用

2.1 得到當前時間

ros::Time begin = ros::Time::now();
注:若是使用的是模擬時間,now在/clock話題接收到第一個消息以前都會返回0ssr


2.2 定義類對象

ros::Time::Time(uint32_t _sec, uint32_t _nsec)
ros::Time::Time(double t)code

ros::Duration::Duration(uint32_t _sec, uint32_t _nsec)
ros::Duration::Duration(double t)htm

_sec是秒,_nsec是納秒
故ros::Time a_little_after_the_beginning(0, 1000000);等價於ros::Time a_little_after_the_beginning(0.001);

2.3 相互轉化、比較

Time繼承自
template<class T, class D>
class ros::TimeBase< T, D >

Duration繼承自
template<class T>
class ros::DurationBase< T >

兩個基類都實現了>、<、!=等比較符。而且二者都實現了
uint64_t     toNSec () const
double     toSec () const
咱們能夠經過這兩個函數來進行Time和Duration的轉化

2.4 運算符

兩個基類都重載了+、-、+=、-=運算符:

1 hour + 1 hour = 2 hours (duration + duration = duration)

2 hours - 1 hour = 1 hour (duration - duration = duration)

Today + 1 day = tomorrow (time + duration = time)

Today - tomorrow = -1 day (time - time = duration)

Today + tomorrow = error (time + time is undefined)

3. 延時與循環

bool ros::Duration::sleep()
ros::Duration(0.5).sleep(); // sleep for half a second

4. 定時器

ros::Timer

首先須要說明的是,ROS並非實時系統,因此定時器並不能確保精肯定時。精確的執行時間以及理論上應該執行的時間能夠在回調函數的ros::TimerEvent結構中獲得。

ros::Timer ros::NodeHandle::createTimer(ros::Duration period, <callback>, bool oneshot = false);
ros::Timer timer = n.createTimer(ros::Duration(0.1), timerCallback);//定時0.1s
void timerCallback(const ros::TimerEvent& e);

其中oneshot是定義是否只定時一次,默認連續定時。這裏也不必定要回調函數,也能夠傳函數對象等,這裏不細述。

其中TimerEvent結構體定義以下:

struct TimerEvent
{
  Time last_expected;                     ///< In a perfect world, this is when the last callback should have happened
  Time last_real;                         ///< When the last callback actually happened

  Time current_expected;                  ///< In a perfect world, this is when the current callback should be happening
  Time current_real;                      ///< This is when the current callback was actually called (Time::now() as of the beginning of the callback)

  struct
  {
    WallDuration last_duration;           ///< How long the last callback ran for, always in wall-clock time
  } profile;
};

ros::Rate

ros::Rate r(10); // 10 hz
while (ros::ok())
{
//... do some work ...
    bool met = r.sleep();
}

它的功能就是先設定一個頻率,而後經過睡眠度過一個循環中剩下的時間,來達到該設定頻率。若是可以達到該設定頻率則返回true,不能則返回false。

計時的起點是上一次睡眠的時間、構造函數被調用、或者調用void ros::Rate::reset()函數重置時間。

由於沒有TimerEvent,因此相對於Timer而言,Rate的精確度會有所降低。

參考

http://wiki.ros.org/roscpp/Overview/Time

http://wiki.ros.org/roscpp_tutorials/Tutorials/Timers

http://docs.ros.org/diamondback/api/rostime/html/classros_1_1Rate.html

相關文章
相關標籤/搜索