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()
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号