# 6.6 時鐘
## 6.6.1 Time 與 Duration
ROS里經常用到的一個功能就是時鐘,比如計算機器人移動距離、設定一些程序的等待時間、設定計時器等等。roscpp同樣給我們提供了時鐘方面的操作。
具體來說,roscpp里有兩種時間的表示方法,一種是時刻(ros::Time),一種是時長(ros::Duration)。無論是Time還是Duration都具有相同的表示方法:
···
int32 sec
int32 nsec
···
Time/Duration都由秒和納秒組成。
要使用Time和Duration,需要`#include <ros/time.h>`和`#include <ros/duration.h>`
```cpp
ros::Time begin = ros::Time::now(); //獲取當前時間
ros::Time at_some_time1(5,20000000); //5.2s
ros::Time at_some_time2(5.2) //同上,重載了float類型和兩個uint類型的構造函數
ros::Duration one_hour(60*60,0); //1h
double secs1 = at_some_time1.toSec();//將Time轉為double型時間
double secs2 = one_hour.toSec();//將Duration轉為double型時間
```
Time和Duration表示的概念并不相同,Time指的是某個時刻,而Duration指的是某個時段,盡管他們的數據結構都相同,但是用在不同的場景下。
ROS為我們重載了Time、Duration類型之間的加減運算,比如:
```cpp
ros::Time t1 = ros::Time::now() - ros::Duration(5.5); //t1是5.5s前的時刻,Time加減Duration返回都是Time
ros::Time t2 = ros::Time::now() + ros::Duration(3.3);//t2是當前時刻往后推3.3s的時刻
ros::Duration d1 = t2 - t1;//從t1到t2的時長,兩個Time相減返回Duration類型
ros::Duration d2 = d1 -ros::Duration(0,300);//兩個Duration相減,還是Duration
```
以上是Time、Duration之間的加減運算,要注意沒有Time+Time的做法。
## 6.6.2 sleep
通常在機器人任務執行中可能有需要等待的場景,這時就要用到sleep功能,roscpp中提供了兩種sleep的方法:
```cpp
ros::Duration(0.5).sleep(); //用Duration對象的sleep方法休眠
ros::Rate r(10); //10HZ
while(ros::ok())
{
r.sleep();
//定義好sleep的頻率,Rate對象會自動讓整個循環以10hz休眠,即使有任務執行占用了時間
}
```
## 6.6.3 Timer
Rate的功能是指定一個頻率,讓某些動作按照這個頻率來循環執行。與之類似的是ROS中的定時器Timer,它是通過設定回調函數和觸發時間來實現某些動作的反復執行,創建方法和topic中的subscriber很像。
```cpp
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觸發一次callback1函數
ros::Timer timer2 = n.createTimer(ros::Duration(1.0), callback2); //timer2每1.0s觸發一次callback2函數
ros::spin(); //千萬別忘了spin,只有spin了才能真正去觸發回調函數
return 0;
}
```
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery