ROS与Python入门教程-时间
ROS与Python入门教程-时间
说明
- 本节介绍时间和持续时间
Time and Duration(时间和持续时间)
ROS具有内置的时间和持续的原始类型
在rospy由rospy.Time和rospy.Duration实现
Time是一个特定的时刻(如“今天下午”)而Duration是持续一段时间(如5小时)。持续时间可以是负的。
时间和持续时间有相同的表现形式:
int32 secs
int32 nsecsROS有能力为节点设置一个模拟时钟。不必使用Python的time.time模块,而是使用ros的时间函数来获取当前时间
获取当前时间
- 获取当前时间:
rospy.Time.now(), rospy.get_rostime()
两个是相同的
now = rospy.get_rostime()
rospy.loginfo("Current time %i %i", now.secs, now.nsecs)
- 获取当前时间:
rospy.get_time()
,获取浮点值的秒数
seconds = rospy.get_time()
时间为0值
- 使用模拟时钟的时间,直到在/clock上收到第一条消息,否则get_rostime() 会得到0值。
- 0值意味客户端还不知道时间,需要区别对待,循环获取get_rostime() 直到非0值。
创建时间实例
- 使用rospy.Time(secs=0, nsecs=0)
epoch = rospy.Time() # secs=nsecs=0
t = rospy.Time(10) # t.secs=10
t = rospy.Time(12345, 6789)
- 使用rospy.Time.from_sec(float_secs)
t = rospy.Time.from_sec(123456.789)
转换时间和持续时间实例
- 时间和持续时间的情况下可以转换为秒以及纳秒,便于非ROS库使用。
t = rospy.Time.from_sec(time.time())
seconds = t.to_sec() #floating point
nanoseconds = t.to_nsec()
d = rospy.Duration.from_sec(60.1) # a minute and change
seconds = d.to_sec() #floating point
nanoseconds = d.to_nsec()
时间和持续时间算术运算
- 像其他原始类型一样,您可以执行时间和持续时间的算术运算。例如:
1 hour + 1 hour = 2 hours (duration + duration = duration)
2 hours - 1 hour = 1 hour (duration - duration = duration)
Today + 1 day = tomorrow (time + duration = time)
Today - tomorrow = -1 day (time - time = duration)
Today + tomorrow = error (time + time is undefined)
与时间和持续时间的实例的算术类似于上面的例子:
two_hours = rospy.Duration(6060) + rospy.Duration(6060)
one_hour = rospy.Duration(26060) - rospy.Duration(6060)
tomorrow = rospy.Time.now() + rospy.Duration(2460*60)
negative_one_day = rospy.Time.now() - tomorrow
Sleeping and Rates(睡眠和速率)
- rospy.sleep(duration),duration可以是rospy.Duration或秒。会睡眠指定的时间。
# sleep for 10 seconds
rospy.sleep(10.)
# sleep for duration
d = rospy.Duration(10, 0)
rospy.sleep(d)
rospy.sleep()如果出现错误,会抛出rospy.ROSInterruptException
rospy.Rate(hz),可以保持一定的速率来进行循环。
r = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
pub.publish("hello")
r.sleep()
- Rate.sleep() 出现错误,抛出rospy.ROSInterruptException
Timer
- 函数定义:
rospy.Timer(period, callback, oneshot=False)
,实现方便定期调用回调函数。 - period,调用回调函数的时间间隔,如rospy.Duration(0.1)即为10分之1秒。
- callback,定义回调函数,会传递TimerEvent实例
- oneshot,定时器,是否执行多次。false即一直执行。
- 实例:
def my_callback(event):
print 'Timer called at ' + str(event.current_real)
rospy.Timer(rospy.Duration(2), my_callback)
例子里,Timer实例会每2秒调用my_callback
TimerEvent实例包含如下字段:
- last_expected,上一个触发回调函数应该发生的时间
- last_real,上一个触发回调函数实际发生的时间
- current_expected,当前触发回调函数应该发生的时间
- current_real,当前触发回调函数实际发生的时间
- last_duration,上一个触发回调函数发生时间间隔(结束时间-开始时间)
调用shutdown()关闭。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号