< >
Home » ROS与Python入门教程 » ROS与Python入门教程-TF-了解tf和时间

ROS与Python入门教程-TF-了解tf和时间

ROS与Python入门教程-TF-了解tf和时间

说明

  • 介绍使用waitForTransform函数去等待变换在tf树中生效。
  • 介绍获取特定时间的变换。

tf and Time(TF和时间)

  • TF会保持更新TF的参考系的树结构,这个结构会随时间而改变。
  • TF会存放长达10秒的各种变换的时间快照。
  • 利用lookupTransform() 获取最新的变换,而不知道什么时候变换被记录的
  • 编辑nodes/turtle_tf_listener.py,改变调用方式。
try:
    now = rospy.Time.now()
    (trans,rot) = listener.lookupTransform("/turtle2", "/carrot1", now)
except (tf.LookupException, tf.ConnectivityException):
  • 运行会失败,提示如:
Traceback (most recent call last):
  File "~/ros/pkgs/wg-ros-pkg-trunk/sandbox/learning_tf/nodes/turtle_tf_listener.py", line 25, in <module>
    (trans,rot) = listener.lookupTransform('/turtle2', '/carrot1', now)
tf.ExtrapolationException: Extrapolation Too Far in the future: target_time is 1253830476.460, but the closest tf  data is at 1253830476.435 which is 0.024 seconds away.Extrapolation Too Far in the future: target_time is 1253830476.460, but the closest tf  data is at 1253830476.459 which is 0.001 seconds away.Extrapolation Too Far from single value: target_time is 1253830476.460, but the closest tf  data is at 1253830476.459 which is 0.001 seconds away. See http://pr.willowgarage.com/pr-docs/ros-packages/tf/html/faq.html for more info. When trying to transform between /carrot1 and /turtle2. See http://www.ros.org/wiki/tf#Frequently_Asked_Questions
  • 如果是electric版本,提示:
Traceback (most recent call last):
  File "/home/rosGreat/ROS_tutorial/learning_tf/nodes/turtle_tf_listener.py", line 28, in <module>
    (trans,rot) = listener.lookupTransform('/turtle2', '/carrot1', now)
tf.ExtrapolationException: Lookup would require extrapolation into the future.  Requested time 1319591145.491288900 but the latest data is at time 1319591145.490932941, when looking up transform from frame [/carrot1] to frame [/turtle2]
  • 那是为什么?每个监听器有一个缓冲区,它存储所有的坐标转换来自不同的广播电台。当一个广播器发出一个变换,它需要一段时间才转换进入缓冲区(通常是几毫秒)。因此,当你请求一个坐标变换“now”的时候,你应该等待几毫秒直到信息到达。

Wait for transforms(等待变换)

  • 示例代码:
listener.waitForTransform("/turtle2", "/carrot1", rospy.Time(), rospy.Duration(4.0))
while not rospy.is_shutdown():
    try:
        now = rospy.Time.now()
        listener.waitForTransform("/turtle2", "/carrot1", now, rospy.Duration(4.0))
        (trans,rot) = listener.lookupTransform("/turtle2", "/carrot1", now)
  • waitForTransform()有四个参数:

    • /turtle2,等待父坐标系广播
    • /carrot1,到子坐标系的变换
    • rospy.Time(),这个时间的变换
    • rospy.Duration(4.0),等待最长的时间段
  • waitForTransform() 实际上会阻塞,直到两个坐标系变换开始。(通常是几毫秒)

  • 为什么调用两次? 一开始产生turtle2时候 ,在第一次调用waitForTransform()前,TF可能还没有更新。第一次调用waitForTransform()就会等待,直到/turtle2坐标系开始广播。第二次调用waitForTransform()用Now参数才能获取到值。

检查结果

  • 现在,你应该能够简单地用箭头键驱动第一只乌龟(确保你的终端窗口是活动的,而不是你的模拟器窗口),你会看到第二只海龟跟随第一只乌龟!

  • 所以,你注意到在海龟的行为上没有明显的区别。这是因为实际的时序差异只有几毫秒。但为什么我们从时间使这种变化Time(0)到now()?只是教你关于缓冲区和与它相关的时间延迟。对于真正的使用时间的情况下,它往往是使用Time(0)。

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

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


标签: ros与python入门教程