< >
Home » ROS与Python入门教程 » ROS与Python入门教程-时间

ROS与Python入门教程-时间

ROS与Python入门教程-时间

说明

  • 本节介绍时间和持续时间

Time and Duration(时间和持续时间)

  • ROS具有内置的时间和持续的原始类型

  • 在rospy由rospy.Time和rospy.Duration实现

  • Time是一个特定的时刻(如“今天下午”)而Duration是持续一段时间(如5小时)。持续时间可以是负的。

  • 时间和持续时间有相同的表现形式:

    int32 secs
    int32 nsecs

  • ROS有能力为节点设置一个模拟时钟。不必使用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(24
    60*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()关闭。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与python入门教程