ROS Learning-019 learning_tf-03(编程) 添加额外的坐标系 (Python版)
ROS Indigo learning_tf-03 添加额外的坐标系 (Python版)
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo
前言
这一节要做的事情:添加额外的坐标系。为什么要添加额外的坐标系:
对于许多任务很容易想到内嵌一个局部的坐标系。例如,将激光扫描仪的中心作为坐标系原点的激光扫描的结果更容易被理解。 TF 允许您为每个传感器、连杆等系统定义局部坐标系。
还是在 learning_tf 软件包中的 nodes 文件夹中创建一个 fixed_tf_broadcaster.py 文件:
$ roscd learning_tf
$ gedit nodes/fixed_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()
代码讲解:
最后一步,给这个 fixed_tf_broadcaster.py 文件加上可执行权限:
$ chmod +x fixed_tf_broadcaster.py
和前几节一样,上面的程序是一个节点,我们需要编写一个启动脚本文件,将几个节点同时运行,才能看到效果:
$ roscd learning_tf/launch
$ gedit start_demo3.launch
所以,在 start_demo2.launch 文件的 <launch> 便签里面添加下面这句,另存为:start_demo3.launch :
<node pkg="learning_tf" type="fixed_tf_broadcaster.py" name="broadcaster_fixed" />
完整的 start_demo3.launch :
<launch>
<!-- Turtlesim Node -->
<node pkg="turtlesim" type="turtlesim_node" name="sim" />
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen" />
<node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
<param name="turtle" type="string" value="turtle1" />
</node>
<node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
<param name="turtle" type="string" value="turtle2" />
</node>
<node pkg="learning_tf" type="turtle_tf_listener.py" name="listener" />
<node pkg="learning_tf" type="fixed_tf_broadcaster.py" name="broadcaster_fixed" />
</launch>
运行 start_demo3.launch 启动脚本文件:
$ roslaunch learning_tf start_demo3.launch
程序运行的效果,和上一节的是一样的。这是为什么?
因为我们没有启动名字叫 ” carrot1 ” 的节点。我们现在可以使用 rosnode list 将当前运行的节点都列出来:
$ rosnode list
/broadcaster_fixed
/listener
/rosout
/sim
/teleop
/turtle1_tf_broadcaster
/turtle2_tf_broadcaster
里面没有 “ carrot1 ” 这个节点。但是,我们将当前的 tf 树型关系图: ( tf 关系树) (新的命令)
$ rosrun rqt_tf_tree rqt_tf_tree
我们现在可以使用 rosrun tf tf_echo /turtle1 /carrot1 命令来将 carrot1 的 tf 信息打印到终端上:
$ rosrun tf tf_echo /turtle1 /carrot1
在之前的博客里面,我们讲过:
tf_echo关键字 : 打印出 源坐标系 和 目标坐标系 之间的特定转换信息。$ rosrun tf tf_echo [源坐标系(父类)] [目标坐标系(子类)]
输出的信息:
这个结果是正确的,因为‘carrot1’ 绕着 ‘turtle1‘做半径为2的圆周运动。(上面打印出来的 ’ carrot1 ’ 的tf信息 是以 ’ turtle1 ’ 为坐标原点 做参考的。)
我们上面编程的fixed_tf_broadcaster.py程序它做了什么你知道吗?
它只是将 carrot1 的 tf 信息广播了出来,并没有给 /carrot1/cmd_vel 这个话题发布消息,并且我们也没有再生( spawn )一个 ” carrot1 ” 小海龟。所以,结果就是现在这个样子。
By The Way :
上面出现的 tf 关系树,下面我做以解释:
Tf 建立了一个坐标系的关系树型图。一个坐标系节点只能有一个父类,可以有多个子类。
现在你要添加一个坐标系( carrot1 )到这个树型关系图中, 就必须选择一个已有的坐标系(turtle1、turtle2、world)作为父类,而这个新的坐标系( carrot1 )就是子类。 如图:
总结:
其实这一节想要讲的内容已经讲完了:就是如何新建一个 tf 坐标系。
ok , 这一节,就已经介绍完了。因为这一节,我们还有没有看到小海龟窗口中小海龟什么新的动作。
所以,下一节我们在写一个新的监听坐标系变化的程序,希望看到的运行效果是: turtle2 海龟围绕着 ’ turtle1 ’ 海龟转圈。(因为:’ turtle2 ’ 小海龟设置在 ’ carrot1 ’ 这个坐标系节点上,而 carrot 坐标系节点围绕这个 turtle1 坐标系节点做画圆的变化。)
ROS Learning-019 learning_tf-03(编程) 添加额外的坐标系 (Python版)的更多相关文章
- 【Spark机器学习速成宝典】模型篇03线性回归【LR】(Python版)
目录 线性回归原理 线性回归代码(Spark Python) 线性回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7873083.html 返回目录 线性回归代码( ...
- 【Spark机器学习速成宝典】基础篇03数据读取与保存(Python版)
目录 保存为文本文件:saveAsTextFile 保存为json:saveAsTextFile 保存为SequenceFile:saveAsSequenceFile 读取hive 保存为文本文件:s ...
- ROS Learning-020 learning_tf-04(编程)让turtle2 海龟跟随turtle1海龟,并绕着 turtle1海龟转圈 (Python版)
ROS Indigo learning_tf-04 (编程)让 turtle2 海龟跟随 turtle1 海龟,并绕着 turtle1 海龟转圈 (Python版) 我使用的虚拟机软件:VMware ...
- ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)
ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 1 ...
- ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)
ROS Indigo learning_tf-01 坐标系变换(tf)广播员 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...
- ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数
ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) - waitForTransformFull() 函数 我使用的虚拟机软件:VMware Workstatio ...
- ROS Learning-021 learning_tf-05(编程) now() 和 Time(0) 的区别 (Python版)
ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) - waitForTransform() 函数 我使用的虚拟机软件:VMware Work ...
- ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)
ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...
- Bootstrap 表单和图片 (内联表单,表单合组,水平排列,复选框和单选框,下拉列表,校验状态,添加额外的图标,控制尺寸,图片)
一.表单 基本格式 注:只有正确设置了输入框的 type 类型,才能被赋予正确的样式. 支持的输入框控件 包括:text.password.datetime.datetime-local.date.m ...
随机推荐
- LVM MBR分区(装载)
必须有至少一个主分区(P),主分区个数+扩展分区个数<= 4个. 创建完主分区,可以创建扩展分区(E),扩展分区可以有1个,或者没有(扩展分区). 主分区(Primary Partion)可以 ...
- SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】
项目中调用微信公众平台的接口时,因为获取到的accessToken及jsapiTicket有效时长只有两个小时,需要不断更新. 所以做了个定时任务,记录一下. .SpringTask实现有两种方式,一 ...
- [转载]java操作word(一)
一. 需求背景 在做项目的过程中,经常会遇到要把数据库数据导出到Word文件中的需求,因为很多情况下,我们需要将数据导出到WORD中进行打印.此需求可以通过用程序填充数据到word模板中来实现.所谓模 ...
- 计算机_软件技巧_01_优雅地再word中插入代码
二.参考资料 1.如何优雅的在 Microsoft word中插入代码
- canvas基础学习(一)
一.概述 canvas它和其它的HTML5标签的使用基本一致,但是它相当于在浏览器中建立一个画布,可以再这个画布上画图.创建动画甚至是3D游戏.由于canvas要适配不同终端的分辨率,所以尽可能的在标 ...
- 使用jsonp跨域调用百度js实现搜索框智能提示(转)
http://www.cnblogs.com/oppoic/p/baidu_auto_complete.html 项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好 ...
- UVA - 1601 The Morning after Halloween (BFS/双向BFS/A*)
题目链接 挺有意思但是代码巨恶心的一道最短路搜索题. 因为图中的结点太多,应当首先考虑把隐式图转化成显式图,即对地图中可以相互连通的点之间连边,建立一个新图(由于每步不需要每个鬼都移动,所以每个点需要 ...
- H国的身份证号码(搜索)
个人心得:巧妙利用数字进行维护就好了,深搜还是有点心得的: #1558 : H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位 ...
- [Luogu3852][TJOI2007]小朋友
luogu 题意 求弦图的最大独立集. sol 按照完美消除序列一个个贪心选即可. code #include<cstdio> #include<algorithm> #inc ...
- 前端跨域问题,以及ajax,jsonp,json的区别
看了很多网上的资料,小七感觉都没有完全解决我的疑惑以及问题,所以特意拿出通俗易懂的话讲解跨域问题,以及ajax,jsonp,json的区别.首先先说跨域问题什么时候需要跨域?[1]域名不同(即网址不同 ...