【ROS基础】map、odom、base_link、laser 的理解 及其 tf 树的理解

  • Post author:
  • Post category:其他




一、题目各个坐标系的含义

背景:

本文以 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)

    了。

在这里插入图片描述

过程总结:

base_link + 里程计

odom

接近 map 坐标系下的定位结果

校正



四、tf 树是怎么回事

布拉布拉



版权声明:本文为weixin_42915934原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。