草庐IT

【ROS】中级操作学习整理-TF坐标变换

K.Fire好好睡觉 2023-08-11 原文

系列文章目录 

·【ROS】中级操作学习整理-gazebo机器人仿真

·【ROS】中级操作学习整理-TF坐标变换

·【ROS】中级操作学习整理-传感器建模

·【ROS】中级操作学习整理-激光SLAM

文章目录

目录

目录

系列文章目录

文章目录

前言

一、ROS中的TF

1.监听TF变换

2.广播TF变换

二、TF常用组件

1.tf_monitor

2.tf_echo

3.view_frames

4.roswtf

5.Rviz

6.robot_state_publisher

三、SLAM中的TF

总结


前言

TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换,坐标变换是机器人学中的概念。

在机器人学中,无论一个机器人多么复杂,我们都可以将它的组成抽象成两部分-连杆和关节,最典型的机器人是串联型机械臂,它的每条臂就是一个比较规整的关节,中间连接的电机就是它的关节,关节分为转动关节和移动关节,比如下图中比较经典的PUMA机械臂,可以抽象成很规整的连杆和关节的组成。

在将机器人抽象成关节之后,我们就可以使用DH法或改进DH法,为各个关节和连杆建立坐标系,而坐标变换就是用来描述我们建立的各个坐标系之间的关系,以方便人们表达机器人各个关节之间的位置关系。

一、ROS中的TF

虽然我们可以将机器人进行抽象和简化,抛去它所有复杂的结构,将它抽象成一个个的坐标系,但是一个机器人可能有几十上百个关节,如下图所示,如果我们要自己去计算任意两个坐标系之间的变换关系,也是非常非常繁杂的。

于是ROS为我们提供了一个用来方便TF计算的工具-TF树,TF树用来维护ROS系统中的机器人以及周围环境的所有TF变换关系,只要你的TF树是连通的,你就可以提取任意两个坐标系之间的坐标变换关系,掌控任何坐标系的位置,ROS中的TF树考虑到存储容量问题,只维护最近5秒的TF变换数据。

1.监听TF变换

监听TF变换就是获取TF树中的坐标变换关系,这是通过TF类中的TransformListener类实现的,下面以古月居的代码为例进行说明。

 通过这一顿操作,就可以将两只海龟的坐标变换读取出来,存到我们创建的transform类中,方便我们进行其他操作。

2.广播TF变换

广播TF变换是用来更新TF树的,有时我们控制了机器人进行了位置移动,那么ROS怎么知道它新的位置呢?这就需要通过TF广播器,将最新的机器人位置发布到TF树中,仍然以古月居的代码进行说明。

 我们传入一个参数(乌龟节点名字),就可以发布这只乌龟相对于世界的坐标变换,当我们知道了两只乌龟相对于世界的坐标变换,那么也可以根据公式推出他们之间的坐标变换,因为它们是连通的,两只乌龟之间的坐标变换,只要乌龟1左乘乌龟2相对于世界变换矩阵的逆即可。

launch文件的编写

 然后就可以运行launch文件,查看效果

roslaunch turtle_tf turtle_tf_demo.launch

二、TF常用组件

无论是使用乌龟,还是我们在仿真环境中创建了一个自己的机器人,ROS为我们提供了各种各样的工具方便我们查看其中的TF变换,而不需要我们像上面的例子一样,自己去编写TF坐标变换的监听和广播器,下面我以mbot小车为例,展现一下较为复杂的TF坐标变换关系和常用工具使用。

先打开一个gazebo仿真环境

1.tf_monitor

作用:将当前的坐标系转换关系打印到终端控制台

rosrun tf tf_monitor

 这样就可以在终端输出任意两个坐标系之间的坐标变换,当然也可以查看特定两个坐标系之间的坐标变换,只需要给它传入参数

rosrun tf tf_monitor base_link odom

2.tf_echo <source_frame> <target_frame>

作用:把特定的坐标系之间的平移旋转关系,打印到终端控制台

rosrun tf tf_echo base_link odom

3.view_frames

作用:输出当前的tf关系以pdf的形式输出到当前目录下

rosrun tf view_frames

 这个工具是非常方便且常用的

4.roswtf

作用:帮助你找到tf中的错误

roswtf

5.Rviz

 当然你也可以通过最牛逼的可视化工具Rviz显示所有的TF坐标变换,打开一个Rviz,选择TF即可

6.robot_state_publisher

 robot_state_publisher是机器人的状态发布器,使用参数 robots_description 指定的URDF和来自主题关节状态的关节位置来计算机器人的正向运动学并通过tf发布结果。

它订阅关节状态发布器(joint_state_publisher)节点发布的关节状态主题( sensor_msgs/JointState )将机器人各个关节的tf变换发布到tf树上,这就不需要我们自己去编写关节状态更新的节点,而只需要在launch文件中,一并启动这个ROS为我们提供的节点即可。

<!-- 运行robot_state_publisher节点,发布tf  -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"  output="screen" >
        <param name="publish_frequency" type="double" value="50.0" />
    </node>

它的参数如下:

参数意义
robot_descriptionurdf 机器人描述
tf_prefix为命名空间感知的转换发布设置tf前缀
publish_frequency状态发布器的发布频率(默认:50)
ignore_timestamp如果为真,则忽略 publish_frequency 和joint_states 的时间戳,并为每个接收到的joint_states 发布一个tf(默认:false)
use_tf_static设置是否使用 /tf_static 锁存的静态变换广播器(默认:true)

三、SLAM中的TF

SLAM中的TF最重要的有两部分:(1)机器人底盘坐标系(base_frame)与里程计坐标系(odom_frame)之间的变换关系 和 (2)里程计坐标系(odom_frame)与地图坐标系(map_frame)之间的变换关系

(1)的变换关系主要是由机器人自带的里程计(如:编码器、IMU、laser)提供,采用的方法叫里程计位姿估计(Odometry),这一部分的主要作用是让我们知道了机器人从初始位置(odom_frame)到现在位置(base_frame)的关系,但是这一部分是相对的,我们不知道环境信息时,没法绝对的确定机器人位置,而且单纯的使用里程计定位,会产生累计漂移误差,这就需要使用某些方法确定机器人和环境之间的位置关系。

机器人和环境之间的坐标变换关系可以由很多方式给出,比如AMCL(自适应蒙特卡洛定位)专门用来机器人定位的算法、或者SLAM的方法(如激光雷达的算法gmapping),但是TF数的结构决定了一个坐标系只能有一个父坐标系(一个人只能认一个爹),base到odom的坐标变换中,base已经当做父坐标系了,因此这些定位方法往往给出里程计坐标系(odom_frame)与地图坐标系(map_frame)之间的变换关系,即(2),这样相当于间接给出了base与map之间的关系,也可以确定机器人的位置,如下图所示

 这样也补偿了里程计的漂移误差


总结

本文介绍了TF坐标变换的基本概念以及TF在ROS中的表示形式(TF树),通过古月居的乌龟跟随的例子,分析了TF树的广播器和监听器最基本的书写形式,从中展示了如何提取和应用TF变换的信息,并介绍了5种最常用的TF树及TF信息的提取工具,最后简要说明了SLAM中最为重要的两种TF坐标变换。

接下来将介绍ROS中的一些常用的传感器及

有关【ROS】中级操作学习整理-TF坐标变换的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  5. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  6. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  9. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐