# 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