ROS学习(十三):time 和 Timer
介紹 ROS 中的時刻、時間間隔、定時器的定義和應用。
一、Time
1、時刻和間隔
ROS 中有 time 和 duration 兩種類型,相應的有 ros::Time 和 ros::Duration 類。
- time 表示的是時刻
- duration 表示的是時間間隔
其統一表示形式為:
int32 sec int32 nsecROS 可以給節點提供一個模擬始時鐘。不同于平臺時間,你可以利用 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 secondros::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);參考:
http://wiki.ros.org/roscpp/Overview/Time
http://wiki.ros.org/roscpp/Overview/Timers
http://wiki.ros.org/roscpp_tutorials/Tutorials/Timers
總結
以上是生活随笔為你收集整理的ROS学习(十三):time 和 Timer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS 总结(三):Moveit!配置助
- 下一篇: ROS学习(十四):ROS Spinni