< >
Home » ROS与Python入门教程 » ROS与Python入门教程-TF-增加参考系

ROS与Python入门教程-TF-增加参考系

ROS与Python入门教程-TF-增加参考系

说明

  • 介绍增加额外的固定参考系到TF

为什么添加参考系

  • 很多的任务作为本地参考系来思考会更加容易。
  • 比如:激光的参考系是位于激光扫描仪的中心。
  • TF允许你在你系统里让每种传感器或link作为本地参考系,TF会处理这些参考系间的关系

添加参考系到那里

  • TF建立一个参考系的树结构。
  • 它不允许在框架结构中的一个闭环。
  • 这意味着一个框架只有一个单一的父,但它可以有多个子。
  • 目前我们的TF树包含三帧:世界,turtle1和turtle2。
  • 这两个乌龟是世界的子。
  • 如果我们要添加一个新的帧到一个新的框架,其中一个现有的三个帧需要是父帧,新的帧将成为一个子帧。
  • 图示:

请输入图片描述

怎样添加参考系

  • 在我们的海龟的例子中,我们将添加一个新的框架到第一个海龟。
  • 这个框架将是第二个海龟的“胡萝卜”。
  • 创建文件,nodes/fixed_tf_broadcaster.py
$ roscd learning_tf
$ touch nodes/fixed_tf_broadcaster.py
$ chmod +x nodes/fixed_tf_broadcaster.py
$ rosed nodes/fixed_tf_broadcaster.py
  • 手工输入代码:
#!/usr/bin/env python  
import roslib
roslib.load_manifest('learning_tf')

import rospy
import tf

if __name__ == '__main__':
    rospy.init_node('my_tf_broadcaster')
    br = tf.TransformBroadcaster()
    rate = rospy.Rate(10.0)
    while not rospy.is_shutdown():
        br.sendTransform((0.0, 2.0, 0.0),
                         (0.0, 0.0, 0.0, 1.0),
                         rospy.Time.now(),
                         "carrot1",
                         "turtle1")
        rate.sleep()

代码分析:

  • 代码:
br.sendTransform((0.0, 2.0, 0.0),
                         (0.0, 0.0, 0.0, 1.0),
                         rospy.Time.now(),
                         "carrot1",
                         "turtle1")
  • 分析:
    • 这里我们创建一个新的变换,从父”turtle1“新子”carrot1”。carrot1从turtle1偏移2米。

运行

  • 修改start_demo.launch

  • 添加

<launch>
    ...
    <node pkg="learning_tf" type="fixed_tf_broadcaster.py"
          name="broadcaster_fixed" />
</launch>
  • 启动
$ roslaunch learning_tf start_demo.launch

检查结果

  • 因此,如果你驾驶的第一个海龟,你注意到,行为并没有改变,从以前的教程,即使我们增加了一个新的参考系。这是因为添加一个额外的帧不影响其他的参考系,我们的侦听器仍然使用先前定义的参考系。所以,让我们改变监听器的行为。

  • 修改nodes/turtle_tf_listener.py,替换成如下:

(trans,rot) = listener.lookupTransform("/turtle2", "/carrot1", rospy.Time(0))
  • 刚刚重新启动的海龟演示,你会看到第二只乌龟跟随carrot ,而不是第一只乌龟胡萝卜!记住,胡萝卜是在turtle1左边2米。没有显示胡萝卜,但你应该看到第二只乌龟移动到这一点。

  • 启动

    $ roslaunch learning_tf start_demo.launch

广播移动的参考系

  • 我们在本教程中发布的额外的参考系是一个固定的参考系,不随时间的变化而改变父。然而,如果你想发布一个移动的参考系,你可以随时间改变变换。让我们让carrot1参考系随着turtle1变化。

  • 新建my_tf_broadcaster.py

$ roscd learning_tf
$ touch nodes/my_tf_broadcaster.py
$ chmod +x nodes/my_tf_broadcaster.py
$ rosed nodes/my_tf_broadcaster.py
  • 手工输入代码:
#!/usr/bin/env python  
import roslib
roslib.load_manifest('learning_tf')

import rospy
import tf
import math

if __name__ == '__main__':
    rospy.init_node('my_tf_broadcaster')
    br = tf.TransformBroadcaster()
    rate = rospy.Rate(10.0)
    while not rospy.is_shutdown():
        t = rospy.Time.now().to_sec() * math.pi
        br.sendTransform((2.0 * math.sin(t), 2.0 * math.cos(t), 0.0),
                         (0.0, 0.0, 0.0, 1.0),
                         rospy.Time.now(),
                         "carrot1",
                         "turtle1")
        rate.sleep()

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

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


标签: ros与python入门教程