< >
Home » ROS与Python入门教程 » ROS与Python入门教程-TF-Time travel(时间穿梭)

ROS与Python入门教程-TF-Time travel(时间穿梭)

ROS与Python入门教程-TF-Time travel(时间穿梭)

说明

  • 介绍TF的高级特性Time travel,这是TF最有用的技巧。

Time travel(时空穿梭)

  • 修改nodes/turtle_tf_listener.py,跟随第一只乌龟不再使用now()参数而是用5秒前。
try:
    now = rospy.Time.now() - rospy.Duration(5.0)
    listener.waitForTransform("/turtle2", "/carrot1", now, rospy.Duration(1.0))
    (trans, rot) = listener.lookupTransform("/turtle2", "/carrot1", now)
except (tf.Exception, tf.LookupException, tf.ConnectivityException):
  • 现在,如果你想运行这个,你会期待看到什么?肯定在头5秒,第二只乌龟不知道去哪里,因为我们还没有一个5秒的历史的第一只乌龟。但这5秒后呢?让我们只是给它一个尝试:
$ make  or  catkin_make
$ roslaunch learning_tf start_demo.launch
  • 效果:

请输入图片描述

  • 像上图,乌龟不收控制,那么到底发生了什么呢?
    • 我们问TF,“/turtle1 5秒前的姿势是什么,相对于/turtle2 5秒前?” 这意味着我们控制的第二只乌龟,它是5秒前,以及第一只乌龟是5秒前。
    • 我们真正想问的是,“/turtle1 5秒前的姿势是什么,相对的/turtle2当前位置吗?”。

lookupTransform的高级API

  • 我们如何才能问这样的问题呢?这个API给我们的明确说明。
  • 示例代码:
try:
    now = rospy.Time.now()
    past = now - rospy.Duration(5.0)
    listener.waitForTransformFull("/turtle2", now,
        "/turtle1", past,
        "/world", rospy.Duration(1.0))
    (trans, rot) = listener.lookupTransformFull("/turtle2", now,
        "/turtle1", past,
        "/world")
  • lookupTransform()高级APIlookupTransformFull()有6个方面:

    • /turtle2,父坐标系
    • now,当前时间
    • /turtle1,子坐标系
    • past,过去的某时间
    • /world,指定不随时间改变的坐标系,这里使用/world
    • (trans, rot),存放结果的变量
  • 注意:waitForTransform() 同样有类似的高级API waitForTransformFull()

  • 图示效果:

请输入图片描述

  • 这个图显示TF在后台做了什么。
  • 在过去,TF计算从第一只乌龟到世界的变换,在世界坐标系,TF时空穿梭,从过去到现在。
  • 现在TF计算世界到第二只乌龟的变换。

检查结果

  • 运行:
 $ roslaunch learning_tf start_demo.launch
  • 效果: 应该是,第二只乌龟直接到第一只乌龟5秒前的位置

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

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


标签: ros与python入门教程