当前位置: 代码迷 >> 综合 >> ROS中map、odom、base_link等坐标系关系的理解
  详细解决方案

ROS中map、odom、base_link等坐标系关系的理解

热度:60   发布时间:2024-02-26 10:49:41.0

概述

关于base_link与base_footprint的关系请参考我的:amcl配置需要特别注意的问题这篇文章。

要回答的问题

1、map坐标系在导航中是什么,它与gazebo中世界坐标系又有怎样的联系?

2、map到odom的TF变化的意义是什么?怎样得到的?

3、odom到base_link的TF变化的意义是什么?怎样得到的

4、TF变化对于导航堆栈的意义是什么?有什么注意事项?

回答问题1

地图是建出来的,在建图过程中,以机器人出发的起点作为map坐标系的原点。

从xacro文件在gazebo中生成机器人时,机器人默认放置在gazebo中的世界坐标原点,该世界坐标遵循右手坐标系,其坐标轴朝向固定。其它link的坐标系,如base_link(如果base_link是机器人最顶层坐标系)的坐标轴朝向默认与gazebo世界坐标一致,这个默认的意思如图:
在这里插入图片描述
oringin:表示该坐标系相对于其父坐标系的位置和朝向,六个0默认相同
注意:如果机器人本体的最顶层的坐标系是base_link,这就意味着base_link的父坐标系是gazebo中的世界坐标系。
规范是使用robot_state_publisher发布机器人本体一系列坐标变化,如base_link->laser_link、base_link->wheel_link等等。
注意:gazebo不发布世界坐标系到base_link的变化,这样做的目的是为了更好地使用导航堆栈,因为一个TF节点只能有一个父节点。

加载好gazebo后开始建图,建图的起点将是地图的原点,地图上的其它位置的坐标都是相对这个原点而言的,单位m,与gazebo里面坐标单位一致。这样地图上的每一个点都有了自己的坐标,还有一个坐标原点。在使用gmapping建图中,它会“贴”一个坐标系在它的起点,这就是map坐标系,它在建图过程中保持不动,它会从激光雷达的数据、从TF树计算出的激光雷达到map坐标系的变化来建立有真实坐标的地图。导航时打开地图,记住地图的原点在建图起点,只要导航堆栈知道机器人相对于map坐标系在什么位置就可以导航了。

gazebo的世界坐标系只在gazebo里有效,地图的map坐标系原点始终在建图起点,不管你把它放到gazebo的什么位置开始建图。它们的共同点是:单位都是m,坐标系都是右手坐标系,因此它们可以很好地协同工作。
注意:我们应该将导航堆栈里面给定的的机器人在地图里面的初始位姿,和在gazebo环境下放置机器人的位姿设为一样,这样激光雷达扫到的环境才能与地图贴合。

两个默认:
导航堆栈默认map坐标系在建图的起点,且固定不动。
gazebo默认将机器人放置在其坐标原点。

一般我们按照默认的运行建图导航是没有问题的,但如果你想让机器人不从建图的原点开动,就需要注意上述的设置原则了。

提示:amcl设置机器人在地图中位置的参数是:
~initial_pose_x (double, default: 0.0 meters)
~initial_pose_y (double, default: 0.0 meters)
~initial_pose_a (double, default: 0.0 radians)
最后一个是相对于Z轴的旋转角度(弧度,逆时针为正)
ROS中的单位都是统一的!

回答问题2

map到odom的坐标变化一般来说是由amcl包估计出来的
在这里插入图片描述
amcl并不是必须,为什么?
因为我们真正要的是map到odom的变换关系,即知道机器人在哪里,所以如果你有其它好办法知道机器人从建图起点(map坐标原点)开始行走之后的每一时间的真实位置,就完成了机器人的定位,导航是没有问题的。但是实际情况往往没有那么乐观。

在这里插入图片描述

通常情况下,我们自己计算的机器人相对于其出发点的坐标变换不够精准,但通常也不会偏得离谱,这个我们称为odom->base_link的变换,注意几点:odom坐标系不在机器人上!!!;odom->base_link只是一个单纯的TF变化,odom没有固定在机器人起点(只是以起点坐标为参考做计算),除map外其它一切坐标系都不是固定的,它只是单纯计算了从开始到现在自己走了多远、旋转了多少度,而对自己估计是否正确一无所知。所以上述“相对于其出发点”的描述是不合适的,会造成odom是真实的那个出发点的错误认知。
还有odom坐标系与/odom话题是两码事,其存在的关联与区别请参考我其它博客。

odom->base_link一般来说会告诉amcl机器人从“起点”开始“大概走到哪里了”,然后amcl根据激光雷达数据估计机器人实际是到达哪里了,即它算出了map到base_link的变换,但是由于有一个odom->base_link的变换在发布了,根据一个子坐标系只能有一个父坐标系的原则,amcl就只能发布map->odom的变化,即所谓的估计“里程计的漂移”。

回答问题3

odom->base_link的变化对于导航堆栈没有意义,但是对于amcl意义重大,因为知道了机器人大概在哪里,amcl算法就能更快地收敛到机器人真实位置。

回答问题4

导航堆栈必须有map到base_link的变换,有的本地规划器还要求提供/odom
注意机器人的出发点以及ROS里面的单位制。

小结

为什么全用的base_link而不是base_footprint?
请参考我的:amcl配置注意事项

ROS里面无论是gazebo与导航堆栈,真正作为固定的、提供坐标参考的只有gazebo世界坐标系与地图中的map坐标系。
其它坐标系可以看作是为了描述机器人各个link间的关系、机器人位置等所使用的一种“虚拟坐标系”,它的好处是简化和规范了对空间相对位置的描述,不仅有利于编程,更有利于用系统的数学知识去处理它们。