企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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 上次回调所用的时间(结束-开始) ```