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),指定秒和纳秒(1ns=109s1ns = 10^{-9}s)

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
    上次回调所用的时间(结束-开始)

results matching ""

    No results matching ""