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里的代码:
#!/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)
,指定秒和纳秒()
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
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)
,第一个参数是时长,第二个参数是回调函数。
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
上次回调所用的时间(结束-开始)