# 7.4 param與time
## 7.4.1 param_demo
相比roscpp中有兩套對param操作的API,rospy關于param的函數就顯得簡單多了,包括了增刪查改等用法:
`rospy.get_param()`,`rospy.set_param()`,`rospy.has_param()`,`rospy.delete_param()`,`rospy.search_param()`,`rospy.get_param_names()`。
下面我們來看看param_demo里的代碼:
```python
#!/usr/bin/env python
# coding:utf-8
import rospy
def param_demo():
rospy.init_node("param_demo")
rate = rospy.Rate(1)
while(not rospy.is_shutdown()):
#get param
parameter1 = rospy.get_param("/param1")
parameter2 = rospy.get_param("/param2", default=222)
rospy.loginfo('Get param1 = %d', parameter1)
rospy.loginfo('Get param2 = %d', parameter2)
#delete param
rospy.delete_param('/param2')
#set param
rospy.set_param('/param2',2)
#check param
ifparam3 = rospy.has_param('/param3')
if(ifparam3):
rospy.loginfo('/param3 exists')
else:
rospy.loginfo('/param3 does not exist')
#get all param names
params = rospy.get_param_names()
rospy.loginfo('param list: %s', params)
rate.sleep()
if __name__=="__main__":
param_demo()
```
## 7.4.2 time_demo
#### 時鐘
rospy中的關于時鐘的操作和roscpp是一致的,都有Time、Duration和Rate三個類。
首先,Time和Duration前者標識的是某個時刻(例如今天22:00),而Duration表示的是時長(例如一周)。但他們具有相同的結構(秒和納秒):
```
int32 secs
int32 secs
```
#### 創建Time和Duration:
rospy中的Time和Duration的構造函數類似,都是`_init_(self,secs=0, nsecs=0)`,指定秒和納秒($$1ns = 10^{-9}s$$)
```python
time_now1 = rospy.get_rostime() #當前時刻的Time對象 返回Time對象
time_now2 = rospy.Time.now() #同上
time_now3 = rospy.get_time() #得到當前時間,返回float 4單位秒
time_4 = rospy.Time(5) #創建5s的時刻
duration = rospy.Duration(3*60) #創建3min時長
```
關于Time、Duration之間的加減法和類型轉換,和roscpp中的完全一致,請參考5.6節,此處不再重復。
#### sleep
```python
duration.sleep() #掛起
rospy.sleep(duration) #同上,這兩種方式效果完全一致
loop_rate = Rate(5) #利用Rate來控制循環頻率
while(rospy.is_shutdown()):
loop_rate.sleep() #掛起,會考慮上次loop_rate.sleep的時間
```
關于sleep的方法,Rate類中的sleep主要用來保持一個循環按照固定的頻率,循環中一般都是發布消息、執行周期性任務的操作。這里的sleep會考慮上次sleep的時間,從而使整個循環嚴格按照指定的頻率。
#### 定時器Timer
rospy里的定時器和roscpp中的也類似,只不過不是用句柄來創建,而是直接`rospy.Timer(Duration, callback)`,第一個參數是時長,第二個參數是回調函數。
```python
def my_callback(event):
print 'Timer called at ' + str(event.current_real)
rospy.Timer(rospy.Duration(2), my_callback) #每2s觸發一次callback函數
rospy.spin()
```
同樣不要忘了`rospy.spin()`,只有spin才能觸發回調函數。
回調函數的傳入值是`TimerEvent`類型,該類型包括以下幾個屬性:
```
rospy.TimerEvent
last_expected
理想情況下為上一次回調應該發生的時間
last_real
上次回調實際發生的時間
current_expected
本次回調應該發生的時間
current_real
本次回調實際發生的時間
last_duration
上次回調所用的時間(結束-開始)
```
- 前言
- 第一章 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