ROS与Navigation之0--TF基础知识

ROS navigation 包学习 navigation架构: 机器人只需要发布必要的传感器信息和导航的目标位置,ROS即可完成导航功能。在该框架中,move_base功能包提供导航的主要运行、交互接口。为了保障导航路径的准确性,机器人还要对自己所处的位置进行精确定位,这部分功能由amcl功能包实现。 首先,导航功能包需要采集机器人的传感器信息,以达到实时避障的效果。这就要求机器人通过ROS发布sensor_msgs/LaserScan或者sensor_msgs/PointCloud格式的消息,也就是二维激光信息或者三维点云信息。 其次, 阅读详情

如下图所示,在机器人身上各关节,转轮中心都有一个坐标系,在机器人外部应该还会有其他的坐标系,如地图坐标系,全局坐标系。tf库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标。

          为了达到这个目的,就需要确定各个坐标系之间的关系,也就是获得任一坐标系在其他任一个坐标系下的描述。
假设有n个坐标系,那么他们之间的组合关系有c(n,2)个,如果n=4,那就是6种,如果n=100,那就是4950个,好多呀。不过,世界没那么复杂,我们可以给这些坐标系之间构建一个结构,比如单叉树或者单层多叉树,那么100个坐标系之间的关系,就可以用99个树杈搞定。tf里的选择则是多层多叉树。
        维护一颗树,需要先设计一个树的结构,也就是一定要在树被风吹来吹去变换的时候,让小树杈找个大树杈依附,让大树杈找个树干依附,让树干有个根固定(所谓变换,就是找到俩树枝变换之间的通路,这个通路很可能要先找到根,再从根找到目标树枝)。(如果打算用tf解决你的坐标变换问题,请一定要先清晰的画出这棵树的结构,再开始写程序;因为这个结构是维护和使用的基础)。
        那么该如何使用这棵树呢?如,坐标系a到坐标系b的变换是什么呢?很简单,用tf的tflisener监听某一个指定的从一个a frame到b frame的变换即可,当然前提是树上的树杈们能把a,b联通,并已经准备好。再重复一次,这个变换是a frame到b frame的变换,也表示了b frame在a frame的描述,也代表了把一个点在b frame里的坐标变换成在a frame里的坐标的坐标变换。有了这个变换,你就可以尽情的变换了。
        这个结构的建立和维护靠的是tf提供的tfbroadcastor类的sendtransform接口。在tb第一次发布一个从已有的parent frame到新的child frame的坐标系变换时,这棵树就会添加一个树枝,之后就是维护。这里,提醒一下,在用tf时,一定要细心照料整棵大树,时刻保持这棵大树能够描述整个外部世界里的关系,不能有断裂。这样才能保证在风吹时,整个树都摆来摆去还保持稳定。

        TF的实现的基本原理是,tb的类(broadcastor)里有个publisher,tl的类(listener)里有个subscriber,前者发布名为/tf的topic,后者订阅该topic,传送的消息tfmessage里包含了parent frameid和child frameid的信息。这个机制意味着,所有的tb会发布某一特定的parent到child的变换,而所有tl会收到所有的这些变换,然后tl利用一个tfbuffercore的数据结构维护一个完整的树结构及其状态。也就是说每一个tb都会广播一个变换,而tl会接收到所有这些变换,而每接收到一个,就要更新自己维护的这个树。基于此,tl在使用这棵树时,会用lookuptransform或waitfortransform来获得任意坐标系之间的变换。非常简单,对吧,但粗暴的也非常显然。那就是只要是一个tl,就要跟所有tb建立连接,就要收取所有的/tf消息,来维护一棵完整的树,并且,还要负责搜索这棵树,找到一条变换的路径,然后乘呀乘,并且每次都要如此。


        上图例子描述了三个参考系之间的联系。三个节点分别是三个参考系,而/world是其他两个乌龟参考系的父参考系。还包含一些调试需要的发送频率、最近时间等信息。tf提供了一个tf_echo工具来查看两个广播参考系之间的关系。我们可以看一下第二只乌龟坐标在第一只乌龟坐标系的关系:

上图是在前一个图的基础上增加了一个坐标系,这个坐标系是在turtle1下面的,也就是说,carrot1坐标系是建立在turtle1坐标系基础上的,或者说tb发布的是一个turtle1坐标系到carrot1坐标系的变换。
tf库的优点,能用且易上手,主要如下:
a、各种数值计算的细节,你不用考虑,tf库可以帮你;
b、接口很简洁,会广播和监听就ok;
c、问题找的很准,那就是需要维护坐标系之间的关系;
d、提供了很多工具程序;
e、考虑了与时间相关的变换;
f、支持tf-prefix,可以在多机器人上用

g、基本能用,且不需要深入理解,死搬硬套就能用起来。


tf库的缺点还是那句话,简单粗暴!

a、树的结构很简单,但有时候很笨拙。举个例子吧。有部电影叫手机,葛优扮演的叫石头,范伟演的叫砖头,两个人是叔伯兄弟,从小到大的小伙伴,应该很熟悉,关系也很明确,但要放到树的结构下,就需要从下到上找共同先辈,然后从这个先辈再往下找,进而确定二者的关系,这个比较笨拙(这是因为tb广播的一般都是一个父坐标系和子坐标系的关系)。于是有了范伟坐在门槛上的一句台词:恁这是弄啥勒,恁奶不是俺奶?!
b、每个tl都要维护同一颗树,这样的开销太大,主要是网络传输的负荷比较大。这一点,tf的设计者是完全承认的。举个例子吧,北方的有些地方的农村过年时要拜年,拜年要磕头,磕头的对象是写有逝去的先辈名字的树状图,一个同姓大家族里有很多小家庭,每个家里都有那么一张图,挨家拜年,街上人来人往,每个人都磕了很多头,磕的其实是同一张。如果有个祠堂,集中处理,维护一张图,就不用看到早早起床、满街跑的情况,效率也会高多了。
c、很难满足实时性的要求,这一点比较显然。要不tf也不会每个变换存10秒钟的数据,不过源码里好像是开了一个存100个消息的队列。

d、还有很多细节不易理解。比如,now()和time(0);比如,技术文档里的一些术语名词;比如,采用了机器人里的习惯,与飞行器,惯导,车辆里的习惯区别较大,使用时不能想当然。

参考来源:

http://blog.youkuaiyun.com/hcx25909/article/details/9255001

http://blog.exbot.net/archives/1686

https://www.ncnynl.com/archives/201708/1881.html

http://blog.youkuaiyun.com/start_from_scratch/article/details/50762293

https://www.cnblogs.com/xialuobo/p/6097806.html

http://www.sohu.com/a/201994780_715754(重要)

ros添加障碍物_ROS与navigation-设置机器人使用TF 许多ROS包需要使用tf软件库发布机器人的变换树。在抽象层,变换树根据不同坐标系之间的平移和旋转来定义偏移量。为了使这更具体,考虑一个简单的机器人的例子,它具有安装在其顶部的单个激光器的移动基座。我们定义两个坐标系:一个对应于机器人底座的中心点,一个坐标系安装在基座顶部的激光中心点:“base_link”坐标系(对于导航,它重要的是将其放置在机器人的旋转中心)与“base_laser... 阅读详情

相关推荐

ROS导航包(Navigation Stack)不工作?先检查你的Odometry和TF配置对了没

本文深入解析ROS导航包(Navigation Stack)常见故障,重点探讨Odometry与TF配置错误的排查方法。通过实际案例和工具链演示,指导开发者诊断地图漂移、路径规划失败等问题,并提供坐标系命名、时间戳同步、单位制统一等解决方案,帮助优化机器人导航系统性能。

weixin_38170853的博客 503

ROS学习7:ROS机器人导航仿真

ROS学习7:ROS机器人导航仿真

qq_42994487的博客 3554

ROS核心函数库实战指南:从Robot Model到navigation的工程落地

ROS核心函数库是连接基础通信与真实机器人交付的关键技术层,涵盖Robot Model(URDF解析与TF坐标系构建)、Visualization(rviz调试闭环与数据时空一致性验证)、actionlib(长期任务状态管理)、pluginlib(算法热插拔与运行时替换)、nodelets(零拷贝高性能数据流)、navigation(自主导航全栈集成)及ROS-Industrial(工业确定性通信与安全接口)。这些模块共同构成ROS工程化能力底座,支撑移动抓取、AGV调度、协作装配等典型场景。理解其设计原理

diaogan4202的博客 480

ROS Navigation-----TF配置

transform配置

倔强不倒翁的博客 4112

Navigation框架简介和ROS1基础

本文详细介绍了ROS1基础和Navigation框架

BigDavid123的博客 6809

2 利用ITK实现多帧Dicom读取,VTK实现数据显示

vtk中也有dicom读写类,但是只能完成单帧DICOM数据读取,这对于实际应用是非常不利的。而ITK可以实现dicom多帧读取,通常情况ITK与VTK也会结合使用(ITK处理,VTK显示),所以就一起学习下吧!

buerbuhuitou的博客 1564

ROS Navigation中的TF树与AMCL的关系

ROS Navigation中的TF树与AMCL功能包的关系 一、ROS Navigation中的TF树 base_link:固定在机器人本体上的坐标系,随着机器人的运动而运动。 map:固定的世界坐标系,作为全局参照。 odom:里程计坐标系,是一个world-fixed坐标系,机器人的位姿在里程计坐标系上是没有任何约束的。里程计坐标系的建立通常有一些里程计数据源,例如视觉里程计,轮速计,惯性测量单元等。 详细解释参见链接 根据机器人模型的描述文件,base_link坐标系又有许多分支,根据机器人种类的

weixin_44911075的博客 1377

电力电子技术复习笔记

通常在开关过程前后加入谐振,使开关开通前电压先降到0,关断前电流先降到0,消除开关过程电压、电流的重叠,降低它们的变化率,从而大大减小甚至消除开关损耗。小信号线性化模型的原理:忽略开关频率分量和开关频率谐波分量及其边频分量,建立占空比、输入电压等的低频扰动对变换器中的电压、电流影响的模型。解:可以利用变压器的变比改变输出电压大小,避免控制过程的占空比过小或过大,提高控制精度,同时有利于减轻输出电路中电力电子器件的耐压要求。驱动电路:用于控制功率半导体器件的开关,从而控制电路的电流和电压。

Miracle Fan的博客 1万+

navigation(1) tf坐标变换

               navigation是一个二维导航堆栈,它接收来自里程计、传感器流和目标姿态的信息,并输出发送到移动底盘。而其中各处的坐标变换由tf树来完成。                Tf坐标变换<在robot_setup_tf_tutorial包中>      Base_link 与base_laser会产生两个坐标系 即基于移动基座和基于激光雷达,如下图1所...

KantsWang的博客 1095

MacOS多次踩坑后成功安装Homebrew

来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下

weixin_41847116的博客 1980

宏基因组分析|完整分析流程梳理

今天先从最基础的全流程框架说起,无论是刚接触的萌新,还是想查漏补缺的同行,都能找到有用的信息。

weixin_70911870的博客 3161

ROS中多机器人的命名空间和tf_prefix

ROS的命名空间 ros中节点,话题,服务,参数,以及坐标系等都是有名空间的,这个名空间约束着是它们的范围。 前面带"/" 一般表示全局命名空间,不带则表示相对命名空间。在单个机器人中,“/scan” 和“scan”,表示的是同一个话题,但在多机器人中,每一个机器人都有自己的命名空间,“/scan” 和“scan”表示的就不是同一个话题名称,故在多机器人中节点,话题,服务,参数,以及坐标系的前面不...

qq_36458461的博客 3529

华为OD机试 新系统 双机位C卷 真题题库目录|机考题库 + 算法考点详解

本文整理华为OD机试(机考) 新系统真题题库,提供高频考点精析与详细题目内容,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 和 在线OJ做题练习。华为OD机试新系统真题题库。

qq_45776114的博客 10万+

ROS专题----导航功能包navigation基础汇总

资料来源ROS官网:http://wiki.ros.org/cn/navigation概述概念层面上讲,导航功能包集是相当简单的。 它从里程计和传感器数据流获取信息,并将速度命令发送给移动基站(比如你的机器人)。但是,想要在任意机器人上使用导航功能包集可能有点复杂。使用导航功能包集的先决条件是,机器人必须运行ROS,有一个tf变换树,使用正确的ROS Message types发布传感器数据。而且

zhangrelay的专栏 3万+

一文搞懂数据标注

数据标注即通过分类、画框、标注、注释等,对图片、语音、文本等数据进行处理,标记对象的特征,以作为机器学习基础素材的过程。简言之,就是需要给数据做好标注,这样机器就能知道学习哪些内容。

女王の专属领地 9931

7、CUDA 软件架构与开发工具详解

本文深入探讨了CUDA的软件架构与核心开发工具,涵盖CUDA数组与纹理、表面引用、图形互操作性机制,以及CUDA运行时与驱动程序API的功能对比。详细解析了nvcc编译器的使用方法、编译轨迹与代码生成选项,并结合实际示例说明其应用。文章旨在帮助开发者理解不同技术的选择依据,合理利用CUDA工具链,提升GPU计算性能,适用于从入门到进阶的CUDA开发人员参考。

nnn11的博客 91

ROS 2下navigation 2 stack的构建

系列文章目录 思岚激光雷达rplidar从ROS 1到ROS 2的移植 文章目录系列文章目录前言一. ROS 2的navigation变化二. 本说明的环境配置1.系统2.安装navigation 2三. turtlebot3 navigation simulation1. 运行navigation simulation2. 查看turtlebot3 navigation的msgs及tf frames3. 查看turtlebot3的description4. turtlebot3的navigation pa

weixin_45710350的博客 3208

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1006

基于ROS的slam 地图构建与navigation 自主导航

基于ROS的slam 地图构建与navigation 自主导航 一、slam 地图构建 一、实验原理 1.1 slam算法安装 ros-indigo-slam-gmapping是 ros平台激光 slam算法之一,在使用LIAOKE机器人做地图构建事先要安装该算法。终端输入命令: $ sudo apt-get install ros-indigo-slam-gmapping 进行slam算法安装; 1.2 程序包 程序包位置:/LIAOKE_ws/src/LIAOKE_map。 1.3 节点通信图 二、实

qq_45252077的博客 9438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ROS中坐标关系理解(基于cartographer和navigation)

不管是使用cartographer进行2D建图还是进行3D建图,其坐标转换关系其实是用的一个,而理清并正确的将其表示出来是建图成功的基础 使用一以下命令

Heart_M的博客 3114

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[ROS2 基础] Navigation2 导航系统介绍

注意:下面的解释说明是以来进行的。其对应的版本为。​Nav2具有下列工具:● 加载、提供和存储地图的工具(地图服务器Map Server)● 在地图上定位机器人的工具 (AMCL)● 避开障碍物从A点移动到B点的路径规划工具(Nav2 Planner)● 跟随路径过程中控制机器人的工具(Nav2 Controller)● 将传感器数据转换为机器人世界中的成本地图表达的工具(Nav2 Costmap 2D)● 使用行为树构建复杂机器人行为的工具(Nav2 行为树和BT Navigator)● 发生故障时计算恢

首飞的博客 5383

ROS navigation源码框架解读

Navigation源码包框架解读

m0_62187438的博客 1448

ROS Navigation之nav_core完全详解

0. 写在最前面 本文持续更新地址:https://haoqchen.site/2018/12/29/nav-core-code/ 本文将介绍自己在看ROS的Navigation stack中的nav_core包源代码时的一些理解。作者的ROS版本是indigo,nav_core版本是1.12.13。如有错误,欢迎在评论中指正。 如果觉得写得还不错,就请收藏一下啦~~~也可以找一下我写的其他包的源...

白夜行的狼 6144

ROS:解读ROS的navigation Stack

navigation Stack的总体架构 一、Map servicer(提供地图) ·是一个节点,package ·相关操作 二、AMCL ·纯里程计定位和AMCL定位 三、move_base: ·全局规划(静态)、局部规划(动态)、处理异常行为 四、costmap代价地图 ·与SLAM中的map不一样,map是一个topic,costmap在原来map的基础上加工 ·costma...

weixin_43404836的博客 2162

做一台slam与navigation的ROS小车

本人菜鸡一枚,想做一台slam与navigation的ROS小车作为毕设。写这个文章是想记录一下自己的制作过程以及有哪些踩过的坑,也想留个纪念。如果能给阅读的人提供一些帮助那就再好不过了,避免重复造轮子。我感觉不管做任何项目,首先最重要的一点就是要对整体的框架要有一个清晰的认知,包括要实现哪些功能,不同零件之间如何合作分配,电路结构怎样安排,以及最关键的是经费有多少。

2301_81479809的博客 1692

ROS Navigation之move_base完全详解

0. 写在最前面 建议收藏: 本文持续更新地址:https://haoqchen.site/2018/11/27/move-base-code/ 本文将介绍自己在看ROS的Navigation stack中的move_base包源代码时的一些理解。作者的ROS版本是indigo,move_base版本是1.12.13。如有错误,欢迎在评论中指正。 如果觉得写得还不错,就请收藏一下啦~~~后续想把整...

白夜行的狼 4万+
上一篇: ROS service 和client的测试以及roslaunch的使用
下一篇: 如何在ROS中定义并使用自己的消息类型-以image类型为例
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值