ROS Indigo learning_tf-01 坐标系变换(tf)广播员 (Python版)

我使用的虚拟机软件:VMware Workstation 11

使用的Ubuntu系统:Ubuntu 14.04.4 LTS

ROS 版本:ROS Indigo


1. 什么是 tf

tf : 坐标系变换。

想要确定一个物体在什么位置,最好的方法是找一个坐标系,我们就可以得到这个物体的坐标,所以就确定了这个物体的空间位置。tf 库就是为这个而生的。

你可能还是没有明白究竟是什么意思,下面我们来写个程序,看看 tf 这个库到底是干什么的:

2. 我们下面编写一个程序:

程序的功能:

(我们先启动一个小海龟节点) 当这个小海龟在小海龟窗口中的 posepose:姿态,包括平移和旋转)发生了改变的时候,我们发布这个小海龟在这个小海龟窗口中的pose信息。

这就是我们下面这个程序要做的事情,简单的说就是编写一个:当小海龟坐标改变时,向外界广播 ( broadcast ) 小海龟的坐标(pose )的程序。(将坐标换成 pose 更为准确。)

2.1. 好,我们先创建一个程序包:learning_tf,用来学习 tf 的。

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf tf roscpp rospy turtlesim
$ cd ~/catkin_ws
$ catkin_make

2.2. 在刚刚创建的 learning_tf 程序包中,新建一个 nodes 文件夹,再在这里面新建 turtle_tf_broadcaster.py 文件: (注 : 因为第一次使用 roscd 打开新建的程序包, Tab 键不好使。所以需要你手动全输入)

$ roscd learning_tf
$ mkdir nodes
$ gedit nodes/turtle_tf_broadcaster.py

2.3. 添加下面的代码:

#!/usr/bin/env python 

import roslib
roslib.load_manifest('learning_tf')
import rospy
import tf
import turtlesim.msg def handle_turtle_pose(msg, turtlename):
br = tf.TransformBroadcaster()
br.sendTransform((msg.x, msg.y, 0),
tf.transformations.quaternion_from_euler(0, 0, msg.theta),
rospy.Time.now(),
turtlename,
"world") if __name__ == '__main__':
rospy.init_node('turtle_tf_broadcaster')
turtlename = rospy.get_param('~turtle')
rospy.Subscriber('/%s/pose' % turtlename,
turtlesim.msg.Pose,
handle_turtle_pose,
turtlename)
rospy.spin()

2.4. 代码讲解:

2.5. 最后一步,给这个 turtle_tf_broadcaster.py 文件加上可执行权限:

$ chmod +x nodes/turtle_tf_broadcaster.py

大功告成,我们下面开运行这个程序,看看效果:

3. 运行程序:

我们如何才能看出上面这个程序的运行效果呢, 下面跟我一步一步的做:

我们直接运行上面程序是运行不了的,我们必须要将上面那个程序写在一个 启动脚本程序 中,然后运行这个启动脚本。(为什么不能直接运行: turtle_tf_broadcaster.py 。 因为它需要传入一个参数,使用终端输入的命令的方式,无法传入这个参数,所以,我们只能使用,编写启动脚本程序的方式,来启动这个 turtle_tf_broadcaster.py 程序)

3.1. 下面编写一个 launch 启动文件:

在这 learning_tf 软件包中新建一个 launch 文件夹,然后在里面创建一个 start_demo.launch 文件:

$ roscd learning_tf
$ mkdir launch
$ gedit launch/start_demo.launch

3.2. 添加下面的代码:

 <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>
</launch>

3.3. 讲解代码:

3.4. 运行这个启动文件:

$ roslaunch learning_tf start_demo.launch

现在你可以在当前终端中使用 方向键 来控制屏幕中的小海龟。

3.5. 现在我们来检测一下 turtle_tf_broadcaster.py 程序运行的效果:(新开一个终端)

$ rosrun tf tf_echo /world /turtle1

运行后,该终端在实时刷新小海龟 /turtle1 相对于 世界坐标系 /world 的姿态(pose) 信息。

tf_echo 关键字 : 打印出 源坐标系目标坐标系 之间的特定转换信息。

$ rosrun tf tf_echo [源坐标系(父类)] [目标坐标系(子类)]

在终端中不断刷屏:



总结:

现在,你还没有看到 tf 强大的一面,上面的程序,只是想让你了解 tf 。下一节,我编写一个 程序:使用上面程序广播的小海龟坐标信息,来让另一个小海龟跟随这只小海龟。

ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)的更多相关文章

  1. ROS Learning-021 learning_tf-05(编程) now() 和 Time(0) 的区别 (Python版)

    ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) - waitForTransform() 函数 我使用的虚拟机软件:VMware Work ...

  2. ROS Learning-019 learning_tf-03(编程) 添加额外的坐标系 (Python版)

    ROS Indigo learning_tf-03 添加额外的坐标系 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...

  3. ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)

    ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 1 ...

  4. ROS Learning-020 learning_tf-04(编程)让turtle2 海龟跟随turtle1海龟,并绕着 turtle1海龟转圈 (Python版)

    ROS Indigo learning_tf-04 (编程)让 turtle2 海龟跟随 turtle1 海龟,并绕着 turtle1 海龟转圈 (Python版) 我使用的虚拟机软件:VMware ...

  5. ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数

    ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) - waitForTransformFull() 函数 我使用的虚拟机软件:VMware Workstatio ...

  6. 【转】QPainter中坐标系变换问题

    转自:http://blog.sina.com.cn/s/blog_67cf08270100ww0p.html 一.坐标系简介. Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平 ...

  7. 5. svg学习笔记-坐标系变换

    之前我们编写图形元素的时候,编写好了位置大小就是固定的,通过坐标系变换,可以移动缩放,旋转图形,但必须声明的是,进行变换时是图形相对于坐标系的变化,就是图形是不发生变化的,而是坐标系发生了变化,比如缩 ...

  8. BZOJ3210: 花神的浇花集会(坐标系变换)

    题面 传送门 题解 坐标系变换把切比雪夫距离转化为曼哈顿距离 那么对于所有的\(x\)坐标中,肯定是中位数最优了,\(y\)坐标同理 然而有可能这个新的点不合法,也就是说不存在\((x+y,x-y)\ ...

  9. OSG数学基础:坐标系变换

    三维实体对象需要经过一系列的坐标变换才能正确.真实地显示在屏幕上.在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的. 坐标系变换通常包括:世界坐标系-物体坐标系变换. ...

随机推荐

  1. application.yml配置log日志

    #日志文件的配置logging: pattern: console: "%d - %msg%n" file: /var/log/sell.log 注解@Slf4j

  2. [转载]java读写word文档,完美解决方案

    做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出. 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介 ...

  3. Codeforces Round #281 (Div. 2) A. Vasya and Football(模拟)

    简单题,却犯了两个错误导致WA了多次. 第一是程序容错性不好,没有考虑到输入数据中可能给实际已经罚下场的人再来牌,这种情况在system测试数据里是有的... 二是chronologically这个词 ...

  4. HDU - 5306: Gorgeous Sequence (势能线段树)

    There is a sequence aa of length nn. We use aiai to denote the ii-th element in this sequence. You s ...

  5. HihoCoder1181欧拉路(Fleury算法求欧拉路径)

    描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张 ...

  6. [独孤九剑]Oracle知识点梳理(一)表空间、用户

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  7. 异步通信rabbitmq——消息重试

    目标: 利用RabbitMQ实现消息重试和失败处理,实现可靠的消费消费.在消息消费异常时,自动延时将消息重试,当重试超过一定次数后,则列为异常消息,等待后续特殊处理. 准备: TTL:Time-To- ...

  8. 异常:java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlType

    这个是jdK版本的问题的. 本地编译的jar包是1.8的,但是跑jar包的环境jdk版本是1.9的. 升级1.9之后由于jdk当方面的取消了几个jar,所以导致编译起不来. 明天研究一下如何添加jar ...

  9. (转)C#程序开发中经常遇到的10条实用的代码

    原文地址:http://www.cnblogs.com/JamesLi2015/p/3147986.html 1 读取操作系统和CLR的版本 OperatingSystem os = System.E ...

  10. 反射ORM 三层(for sql server/mysql)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...