ROS探索总结(十二)——坐标系统

ubuntu 14.04  indigo版本

转摘自:http://www.guyuehome.com/265

一、tf简介

1、安装turtle包

1 rosdep install turtle_tf rviz
2 rosmake turtle_tf rviz

2、运行demo

 roslaunch turtle_tf turtle_tf_demo.launch 

程序带turtlesim仿真,直接在终端进行键盘控制,可以看到两只小乌龟运行了。

3、demo分析

上例中使用tf建立了三个参考系:a world frame,a turtle1 frame, aturtle2 frame.

然后,使用tf broadcaster发布乌龟的参考系,使用tf listener计算乌龟参考系之间的差异,使用第二只乌龟跟随第一只乌龟。

使用tf工具来具体研究:

rosrun tf view_frames

 

可以看到生成了一个frames.pdf文件:

该文件描述了参考系之间的关系,三个节点分别是三个参考系,而/word是其他两个乌龟参考系的父参考系。还包含一些调试需要的发送频率、最近时间等信息。

tf提供了一个tf_echo工具来查看两个广播参考系之间的关系。第二只乌龟坐标如何根据第一只乌龟得出来。

rosrun tf tf_echo turtle1 turtle2  

控制一只乌龟,在终端中会看到第二只乌龟的坐标转换关系

我们也可以通过rviz的图形界面更加形象的看到这三者之间的关系。

rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz  

移动乌龟,可以看到在rviz中的坐标会跟随变化。其中左下角的是/world,其他两个是乌龟的参考系。

二、Writing a tf broadcaster

1、创建一个包

在catkin_ws/src下,创建一个learning_tf包

1 cd ~/catkin_ws/src
2 catkin_create_pkg learning_tf tf roscpp roscp turtlesim
3 cd ..
4 catkin_make

2、broadcast transforms

首先看下如何把参考系发布到tf。代码文件:

/nodes/turtle_tf_broadcaster.py

  

 1 #!/usr/bin/env python
 2 import roslib
 3 roslib.load_manifest('learning_tf')
 4 import rospy
 5
 6
 7 import tf
 8 import turtlesim.msg
 9
10
11 def handle_turtle_pose(msg, turtlename):
12     br = tf.TransformBroadcaster()
13     br.sendTransform((msg.x, msg.y, 0),
14                      tf.transformations.quaternion_from_euler(0, 0, msg.theta),
15                      rospy.Time.now(),
16                      turtlename,
17                      "world")  #发布乌龟的平移和翻转
18
19
20 if __name__ == '__main__':
21     rospy.init_node('turtle_tf_broadcaster')
22     turtlename = rospy.get_param('~turtle')   #获取海龟的名字(turtle1,turtle2)
23     rospy.Subscriber('/%s/pose' % turtlename,
24                      turtlesim.msg.Pose,
25                      handle_turtle_pose,
26                      turtlename)   #订阅 topic "turtleX/pose"
27     rospy.spin()

创建launch文件start_demo.launch

 1 <launch>
 2     <!-- Turtlesim Node-->
 3     <node pkg="turtlesim" type="turtlesim_node" name="sim"/>
 4     <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
 5
 6
 7     <node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
 8       <param name="turtle" type="string" value="turtle1" />
 9     </node>
10     <node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
11       <param name="turtle" type="string" value="turtle2" />
12     </node>
13
14
15   </launch>

运行start_demo.launch文件:

roslaunch learning_tf start_demo.launch

可以看到界面中只有移植乌龟了,打开tf_echo的信息窗口:

rosrun tf tf_echo /world /turtle1

注意,/world 与 /turtle1中间有空格。

world参考系的原点在最下角,对于turtle1的转换关系,其实就是turtle1在world参考系中所在的坐标位置以及旋转角度。

三、Writing a tf listener

如何使用tf进行参考系转换。

先建一个listener(turtle_tf_listener.py)

 1 #!/usr/bin/env python
 2 import roslib
 3 roslib.load_manifest('learning_tf')
 4 import rospy
 5 import math
 6 import tf
 7 import turtlesim.msg
 8 import turtlesim.srv
 9
10 if __name__ == '__main__':
11     rospy.init_node('tf_turtle')
12
13     listener = tf.TransformListener() #TransformListener创建后就开始接受tf广播信息,最多可以缓存10s
14
15     rospy.wait_for_service('spawn')
16     spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)
17     spawner(4, 2, 0, 'turtle2')
18
19     turtle_vel = rospy.Publisher('turtle2/command_velocity', turtlesim.msg.Velocity)
20
21     rate = rospy.Rate(10.0)
22     while not rospy.is_shutdown():
23         try:
24             (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))
25         except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
26             continue
27
28         angular = 4 * math.atan2(trans[1], trans[0])
29         linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)
30         turtle_vel.publish(turtlesim.msg.Velocity(linear, angular))
31
32         rate.sleep()

在launch文件中添加下面的节点:

1 <launch>
2     ...
3     <node pkg="learning_tf" type="turtle_tf_listener.py"
4           name="listener" />
5 </launch>

然后在运行,就可以看到两只turtle了,见到跟随效果。

四、Adding a frame

在一个world参考系下,一个激光扫描点,tf可以帮助将激光的信息坐标转换成全局坐标。

1、tf消息结构

tf中的信息是一个树状的结构,world参考系是最顶端的父参考系,其他的参考系都需要向下延伸。如果我们在上文的基础上添加一个参考系,就需要让这个新的参考系成为已有三个参考系中的一个的子参考系。

2、建立固定参考系(fixed frame)

我们以turtle1作为父参考系,建立一个新的参考系“carrot1”。代码如下:fixed_tf_broadcaster.py

 1 #!/usr/bin/env python
 2 import roslib
 3 roslib.load_manifest('learning_tf')
 4
 5 import rospy
 6 import tf
 7
 8 if __name__ == '__main__':
 9     rospy.init_node('my_tf_broadcaster')
10     br = tf.TransformBroadcaster()
11     rate = rospy.Rate(10.0)
12     while not rospy.is_shutdown():
13         br.sendTransform((0.0, 2.0, 0.0),
14                          (0.0, 0.0, 0.0, 1.0),
15                          rospy.Time.now(),
16                          "carrot1",
17                          "turtle1") #建立一个新的参考系,父参考系为turtle1,并且距离父参考系2米
18         rate.sleep()

在launch文件中添加节点:

1 <launch>
2   ...
3   <node pkg="learning_tf" type="fixed_tf_broadcaster.py"
4         name="broadcaster_fixed" />
5 </launch>

3、建立移动参考系(moving frame)

我们建立的新参考系是一个固定的参考系,在仿真过程中不会改变,如果我们要把carrot1参考系和turtle1参考系之间的关系设置可变的,可以修改代码如下:

 1 #!/usr/bin/env python
 2 import roslib
 3 roslib.load_manifest('learning_tf')
 4
 5 import rospy
 6 import tf
 7 import math
 8
 9 if __name__ == '__main__':
10     rospy.init_node('my_tf_broadcaster')
11     br = tf.TransformBroadcaster()
12     rate = rospy.Rate(10.0)
13     while not rospy.is_shutdown():
14         t = rospy.Time.now().to_sec() * math.pi
15         br.sendTransform((2.0 * math.sin(t), 2.0 * math.cos(t), 0.0),
16                          (0.0, 0.0, 0.0, 1.0),
17                          rospy.Time.now(),
18                          "carrot1",
19                          "turtle1")
20         rate.sleep()<font size="3"><br></font>

posted on 2017-05-23 18:15 林先森_007 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/LQLin168/p/6895381.html

ROS探索总结(十二)——坐标系统相关推荐

  1. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  2. ROS探索总结(二)——ROS总体框架

    一.  总体结构 根据ROS系统代码的维护者和分布来标示,主要有两大部分: (1)main:核心部分,主要由Willow Garage公司和一些开发者设计.提供以及维护.它提供了一些分布式计算的基本工 ...

  3. ROS学习总结十二:给自己的机器人添加传感器

    在上一章中我们创建了一个自己的机器人,同时这个机器人也能在gazebo中运动,这里我们继续给这个机器人添加一些传感器信息. 1.camera 首先我们来添加一个传感器信息,我们建立一个xacro文件, ...

  4. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

  5. ROS学习(十二):ROS URDF-model_state

    描述某一时刻机器人模型的状态. 只能在仿真中使用,描述关节空间的配置,也可在 srdf 文件中定义. < model_state> element 描述对应的 URDF 模型的基本状态 示 ...

  6. ROS探索总结(一)(二)(三):ROS总体框架 ROS总体框架 ROS新手教程

    ROS探索总结(一)--ROS简介 一.历史 随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求.2010年Willow Garage公 ...

  7. ROS探索总结(十)(十一)(十二)——语音控制 机器视觉 坐标系统

    ROS探索总结(十)--语音控制 如今语音识别在PC机和智能手机上炒的火热,ROS走在技术的最前沿当然也不会错过这么帅的技术.ROS中使用了CMU Sphinx和Festival开源项目中的代码,发布 ...

  8. ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能

    ROS探索总结(十六)--HRMRP机器人的设计 1. HRMRP简介         HRMRP(Hybrid Real-time Mobile Robot Platform,混合实时移动机器人平台 ...

  9. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)

    ROS探索总结(十三)--导航与定位框架 导航与定位是机器人研究中的重要部分.         一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建 ...

最新文章

  1. 了解GAN背后的设计,训练,损失函数和算法
  2. 关于CMMI级别阶梯式前进路线图的对话
  3. python自定义函数画图_4.1-5 自定义函数
  4. sql server中的存储过程调试
  5. 3D人脸识别预处理,3D face recognition preprocess
  6. python离线安装国内镜像OpenCV
  7. java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
  8. python创建数据库表空间_7.自动化监控多个Oracle表空间
  9. mysql中基本的DDL语句(关注一下,以后会继续更新喔!)
  10. Linq Group By 注意点
  11. Linux iptables 配置详解
  12. linux开机脚本文件下载,linux 开机启动脚本
  13. [递归][重心] Luogu P4886 快递员
  14. NIOS II 常见问题总结FAQ - xiangyuqxq的专栏 - CSDN博客
  15. 自己电脑当linux服务器,在Linux下轻松搭建自己的DNS服务器
  16. Visio 2007 序列号
  17. FastFDS 分布式文件系统
  18. 记录一下jadx的误报
  19. 怎样理解心藏神,肝藏魂,脾藏意,肺藏魄,肾藏精志?
  20. opencv中meanshift和camshift函数的使用

热门文章

  1. transient关键字的作用_ArrayList Vector (transient关键字)--JAVA成长之路
  2. java学习_java学习原理篇|java程序运行套路
  3. kubernetes学习笔记之七:Ingress-nginx部署使用
  4. Python Demo 02 蒙特卡罗方法输出e
  5. spark之1:快速入门
  6. 如何计算Java对象所占内存的大小
  7. spark学习:java版JavaRDD与JavaPairRDD的互相转换
  8. Android 6.0 超级简单的权限申请2 (Permission)
  9. JS 内置对象 String对象
  10. lua 初接触 --- The first time use Lua for programing