日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ROS学习(十三):time 和 Timer

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS学习(十三):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);

參考:

http://wiki.ros.org/roscpp/Overview/Time
http://wiki.ros.org/roscpp/Overview/Timers
http://wiki.ros.org/roscpp_tutorials/Tutorials/Timers

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的ROS学习(十三):time 和 Timer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。