引言
ROS 里經(jīng)常用到的一個(gè)變量就是時(shí)間样勃,比如基于時(shí)間和控制量計(jì)算機(jī)器人的移動(dòng)距離绽淘、設(shè)定程序的等待時(shí)間/循環(huán)時(shí)間箕别、設(shè)定計(jì)時(shí)器等躯舔。本文總結(jié)了 roscpp
給我們提供的時(shí)間相關(guān)的操作凳枝。
具體來說抄沮,roscpp
里有兩種時(shí)間表示方法:時(shí)刻 (ros::Time)
和時(shí)長(zhǎng)(ros::Duration)
。
基本用法
要使用 Time
和 Duration
岖瑰,需要分別 #include<ros/time.h>
和 #include <ros/duration.h>
叛买。
常用函數(shù)如下:
ros::Time begin=ros::Time::now(); //獲取當(dāng)前時(shí)間
ros::Time at_some_time1(5,20000000); //逗號(hào)之前表示 second,逗號(hào)之后表示 nanosecond
ros::Time at_some_time2(5.2) //同上,重載了float類型和兩個(gè)uint類型的構(gòu)造函數(shù)
ros::Duration one_hour(60*60,0); //1h
double secs1=at_some_time1.toSec();//將 Time 轉(zhuǎn)為 double 型時(shí)間
double secs2=one_hour.toSec();//將 Duration 轉(zhuǎn)為 double 型時(shí)間
Time
和 Duration
表示的概念并不相同蹋订,Time
指的是某個(gè)時(shí)刻率挣,而 Duration
指的是某個(gè)時(shí)段,盡管他們的數(shù)據(jù)結(jié)構(gòu)都相同辅辩,但是應(yīng)該用在不同的場(chǎng)景下难礼。ROS為我們重載了 Time
、Duration
類型之間的加減運(yùn)算玫锋,避免了轉(zhuǎn)換的麻煩蛾茉。
例如:
ros::Time t1=ros::Time::now()-ros::Duration(5.5);//t1是5.5s前的時(shí)刻,Time加減Duration返回Time
ros::Time t2=ros::Time::now()+ros::Duration(3.3);//t2是當(dāng)前時(shí)刻往后推3.3s的時(shí)刻
ros::Duration d1=t2-t1;//從t1到t2的時(shí)長(zhǎng),兩個(gè)Time相減返回Duration類型
ros::Duration d2=d1-ros::Duration(0,300);//兩個(gè)Duration相減撩鹿,返回Duration
以上是 Time
谦炬、Duration
之間的加減運(yùn)算,要注意 沒有Time+Time的運(yùn)算节沦。
sleep
通常在機(jī)器人任務(wù)執(zhí)行中可能有需要等待的場(chǎng)景键思,這時(shí)就要用到 sleep 功能。roscpp中提供了兩種 sleep 的方法:
ros::Duration(0.5).sleep();//一是用Duration對(duì)象的sleep方法休眠
ros::Rate r(10);//10HZ
while(ros::ok())
{
r.sleep(); //二是用 Rate 對(duì)象調(diào)整休眠時(shí)間甫贯,考慮循環(huán)中其他任務(wù)占用的時(shí)間吼鳞,確保讓整個(gè)循環(huán)的頻率是 10hz
}
Timer
Rate
的功能是指定一個(gè)頻率,讓循環(huán)按照這個(gè)頻率執(zhí)行叫搁。與之類似的是 ROS 中的定時(shí)器 Timer
赔桌,它是通過設(shè)定回調(diào)函數(shù)和觸發(fā)時(shí)間來實(shí)現(xiàn)某些動(dòng)作的循環(huán)執(zhí)行供炎。創(chuàng)建方法和 topic
中的 subscriber
很像:
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觸發(fā)一次callback1函數(shù)
ros::Timer timer2=n.createTimer(ros::Duration(1.0),callback2);//timer2每1.0s觸發(fā)一次callback2函數(shù)
ros::spin();//千萬別忘了spin,只有spin了才能真正去觸發(fā)回調(diào)函數(shù)
return 0;
}
Written by SH
Revised by QP