当前位置:网站首页>【ROS基础】map、odom、base_link、laser 的理解 及其 tf 树的理解
【ROS基础】map、odom、base_link、laser 的理解 及其 tf 树的理解
2022-08-02 06:38:00 【贾亚超】
一、题目各个坐标系的含义
背景:
本文以 gmapping 为例,其中 map、odom、base_link、laser 均来自 gmapping 中的坐标系。这里的 gmapping 是指使用laser_scan_matcher包,在仅使用激光雷达、无需里程计的情况下跑 gmapping。
下图是执行rosrun rqt_tf_tree rqt_tf_tree的结果:
- map:可以理解为世界坐标系
- odom:机器人以为的世界坐标系
- base_link:机器人本体坐标系
- laser:激光雷达坐标系
二、对坐标系的理解
- map:地图坐标系,顾名思义,一般设该坐标系为固定坐标系(fixed frame,rviz中的设置项),一般与机器人所在的世界坐标系一致。
- base_link:机器人本体坐标系,与机器人中心重合,原点一般为机器人的旋转中心。当然有些机器人(PR 2)是 base_footprint,其实意思差不多,base_footprint 坐标系原点为 base_link 原点在地面的投影,有些许区别(z值不同)。
- odom:里程计坐标系,这里要区分开odom topic,这是两个概念,一个是坐标系(本文),一个是根据编码器或者视觉等计算的里程计。但是两者也有关系,odom topic 转化的位姿矩阵是odom–>base_link的tf关系。这时可能会有疑问,odom 和 map 坐标系是不是重合的?可以很肯定地说,机器人起始运动位置这两者是重合的。但是,随着时间的推移是不重合的,而出现的偏差就是里程计的累积误差。那 map–>odom 的 tf 怎么得到?就是在一些校正传感器合作校正的 package 比如 amcl 会给出一个位置估计(localization),这可以得到 map–>base_link 的 tf,所以估计位置和里程计位置的偏差也就是 odom 与 map 的坐标系偏差。所以,如果你的 odom 计算没有错误,那么 map–>odom 的 tf 就是 0。
- laser:激光雷达的坐标系,与激光雷达的安装点有关,其与 base_link 的 tf 为固定的。
三、对于 map --> odom 举个例子
- 首先,我们制定机器人路径时,使用的必然是绝对坐标系。要完成这件事,机器人需要先知道自己在哪。它没有GPS,所以只能倒推——通过里程计。这也是为什么“没有偏移的话 odam 应该与 map 重合”,因为 odam 本来就是用来倒推 map 的。
- 假设机器人终点定在了(8,5),初始时刻,map 的(8,5)和 odom 的(8,5)是重合的。
- odom 坐标系视角看运动过程:假设里程计告诉它,自原点启动起,它在 X 方向移动 2 ,Y 方向移动 5 ,运动描述为(+2,+5)。于是它就认为自己在 odom 坐标系下的(2,5)。反馈给 base_link,则 base_link 坐标系下,机器人需要运动(8,5) - (2,5) = (+6,+0)才能到达目标点(8,5)。而此时如果机器人按(+6,+0)运动完后,确实能到达odom下的终点(8,5),并开始以完成任务为由而沾沾自喜,殊不知,它并没有运动到真正的终点终点:map 坐标系下的(8,5)。
- map 坐标系看运动过程:然而实际上,因为里程计累计误差,它其实第一次运动到了(3,4)。但在 odom 中它在(2,5)。它理应运动(8,5)-(3,4) = (+5,+1)到达目标点,但它会运动(+6,+0),因为 odam 反馈给 base_link 后,目标在 base_link 坐标系下的(6,0)。其实到达的是 map 坐标系下的(9,4),并不能达到运动到 map 坐标系下目标点(8,5)的目的。机器人只能自以为是地认为自己运动到了odom 坐标系下的(8,5)就算万事大吉了。
- 而这时,校正传感器又告诉它了,“我觉得你的里程计刚才 X 漏算了 0.999,Y 多算了 1.001”。
于是它把自己所在位置修正为了(2 + 0.999,5 - 1.001)=(2.999,3.999),接下来该移动(8,5)-(2.999,3.999)=(+5.001,+1.001)。就能将偏差校正回来,到达 map 坐标系下的终点(8,5)了。

过程总结:
四、tf 树是怎么回事
布拉布拉
边栏推荐
- 【暑期每日一题】洛谷 P1255 数楼梯
- 数据库概论之MySQL表的增删改查2
- 实例032:反向输出II
- punch day05
- 实验8 VLAN综合实验
- Py's mlxtend: a detailed guide to the introduction, installation, and usage of the mlxtend library
- CAT1 4G+以太网开发板腾讯云手机微信小程序显示温度和下发控制
- 入门opencv,欢笑快乐每一天
- 线程的创建方式
- Resolving C# non-static field, method or property "islandnum.Program.getIslandCount(int[][], int, int)" requires an object reference
猜你喜欢

See the picture to understand | How to choose sales indicators to measure the health of business growth

【CNN回归预测】基于matlab卷积神经网络CNN数据回归预测【含Matlab源码 2003期】

交换--STP协议

Revitalize rural circular economy and digital chain to link agricultural "ecological chain"

HCIP 第一天
![[Dataset][VOC] Male and female dataset voc format 6188 sheets](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
[Dataset][VOC] Male and female dataset voc format 6188 sheets
![(Part of it is not understood, and the notes are not completed) [Graph Theory] Difference Constraints](/img/e0/385579fc8657db8b175318bd739908.gif)
(Part of it is not understood, and the notes are not completed) [Graph Theory] Difference Constraints

typescript 'props' is declared but its value is never read solution

Reverse resolve dns server

海缆探测仪TSS350(二)
随机推荐
入门opencv,欢笑快乐每一天
File upload vulnerability (2)
实例032:反向输出II
MySQL Advanced Statements (1)
Unity Shader学习(七)纹理图像的简单使用
request.getSession(),的故事
yml字符串读取时转成数字了怎么解决
交换部分 VLAN
【机器学习】实验5布置:AAAI会议论文聚类分析
【21天学习挑战赛】顺序查找
FaceBook社媒营销高效转化技巧分享
How does abaqus quickly import the assembly of other cae files?
武汉高性能计算大会2022举办,高性能计算生态发展再添新动力
Leetcode Weekly 304
振兴农村循环经济 和数链串起农业“生态链”
.NET静态代码织入——肉夹馍(Rougamo) 发布1.1.0
HCIP 第二天
HCIP day one
See the picture to understand | How to choose sales indicators to measure the health of business growth
(部分不懂,笔记整理未完成)【图论】差分约束
