摘自:ros基础必看之各个frame的理解_黑猫爱小鹿的博客-CSDN博客
文章目录
ros中常见的坐标系
1-1
现在小车进行移动
1-2
如图(1-2),在原点插一面小旗子,并控制小车行驶一段距离,这个时候我们能得到三个位置信息
- 使用测量工具测量小车相对旗子的位置,在X轴正方向距原点3个单位,在Y轴正方向距原点2个单位
- 小车安装里程计,记录自己前进3个单位,并向左平移了2个单位
- 小车使用激光雷达数据与已有地图进行匹配,并结合里程计数据,将数据融合得到小车的位置在X轴正方向3个单位,在Y轴正方向2个单位
在上面的例子中,三个坐标值都相同。但真实情况下,三个坐标值由于测量误差或者其他原因导致坐标值并不相同,然而这三个坐标都用来表示小车中心在空间中的位置,这就引出了不同坐标系
1 )对于第一种测量,称之为真实坐标系,这是一个理想的坐标系,即我们拥有一种绝对准确的测量方式获得小车相对于地图原点的坐标,但这种坐标系在真实情况下是不存在的
2)对于第二种测量,称之为里程计坐标系,在这个坐标系中得到的测量值通常是基于轮速里程计,视觉里程计或者惯性单元得到的。在这个坐标系中,新坐标值通常是根据前一个时刻坐标得到的,一般使用odom来表示。
- 优点: 坐标值是连续的并且以平稳的方式演变,没有离散的跳跃。
- 缺点: 测量产生的误差会累计。
- 适合: 短时程相对定位
3)对于第三种测量,称之为地图坐标系,在这个坐标系中得到坐标值通常是通过传感器的数据重新计算或测量得到的,一般使用map来表示。
- 优点:由于每次得到的坐标点都是重新测量计算得到的,累计误差影响较小
- 缺点: 坐标数据会有跳变。
- 适合: 长时程绝对定位
假设对于上面描述的三种测量是以下结果
- 真实坐标系:坐标值为(3, 2)
- 里程计坐标系:坐标值(3, 1)
- 地图坐标系:坐标值(3.5, 2.5)
转载
常见的坐标系
在使用ROS进行定位导航等操作时,我们经常会遇到各种坐标系。每种坐标系都有明确的含义。理论上坐标系的名称可以是随意的,但是为了方便不同的软件间共享坐标信息,ROS定义了几个常见的坐标系。
1.base_link
base_link
坐标系和机器人的底盘直接连接。其具体位置和方向都是任意的。对于不同的机器人平台,底盘上会有不同的参考点。不过ROS也给了推荐的坐标系取法。
x 轴指向机器人前方
y 轴指向机器人左方
z 轴指向机器人上方
2.odom
odom
是一个固定在环境中的坐标系也就是world-fixed。它的原点和方向不会随着机器人运动而改变。但是odom的位置可以随着机器人的运动漂移。漂移导致odom
不是一个很有用的长期的全局坐标。然而机器人的odom
坐标必须保证是连续变化的。也就是在odom
坐标系下机器人的位置必须是连续变化的,不能有突变和跳跃。
在一般使用中odom
坐标系是通过里程计信息计算出来的。比如轮子的编码器或者视觉里程计算法或者陀螺仪和加速度计。odom
是一个短期的局域的精确坐标系。但是却是一个比较差的长期大范围坐标。
3.map
map
和odom
一样是一个固定在环境中的世界坐标系。map
的z轴是向上的。机器人在map
坐标系下的坐标不应该随着时间漂移。但是map
坐标系下的坐标并不需要保证连续性。也就是说在map坐标系下机器人的坐标可以在任何时间发生跳跃变化。
一般来说map
坐标系的坐标是通过传感器的信息不断的计算更新而来。比如激光雷达,视觉定位等等。因此能够有效的减少累积误差,但是也导致每次坐标更新可能会产生跳跃。map
坐标系是一个很有用的长期全局坐标系。但是由于坐标会跳跃改变,这是一个比较差的局部坐标系(不适合用于避障和局部操作)。
坐标系的约定
在非结构化的环境中(比如开放环境),如果我们要定义一个全球坐标系
- 默认的方向要采用 x轴向东,y轴向北,z轴向上
- 如果没有特殊说明的话z轴为零的地方应该在WGS84椭球上(WGS84椭球是一个全球定位坐标。大致上也就是z代表水平面高度)
如果在开发中这个约定不能完全保证,也要求尽量满足。比如对于没有GPS,指南针等传感器的机器人,仍然可以保证坐标系z轴向上的约定。如果有指南针传感器,这样就能保证x和y轴的初始化方向。
在结构化的环境中(比如室内),在定义坐标系时和环境保持对应更有用。比如对于有平面图的建筑,坐标系可以和平面图对应。类似的对于室内环境地图可以和建筑物的层相对应。对于有多层结构的建筑物,对每一层单独有一个坐标系也是合理的。
4.earth
这个坐标系是为了多个机器人相互交互而设计的。当有多个机器人的时候,每个机器人都有自己的map
坐标系,他们之间的map
坐标系并不相同。如果想要在不同的机器人间共享数据,则需要这个坐标系来进行转化。
如果map
坐标系是一个全局坐标系,那么map
到earth
坐标系的变化可以是一个静态变换。如果不是的话,就要每次计算map
坐标系的原点和方向。
在刚启动的时候map
坐标系的全局位置可能是不知道的。这时候可以先不发布到earth
的变换,直到有了比较精确的全局位置。
坐标系之间的关系
坐标系之间的关系可以用树图的方式表示。每一个坐标系只能有一个父坐标系和任意多个子坐标系。
earth -> map -> odom -> base_link
按照之前的说明,odom
和map
都应该连接到base_link
坐标系。但是这样是不允许的,因为每一个坐标系只能有一个父坐标系。
额外的中间坐标系
这个图只表示了最少的坐标系。在保证基本的结构不变的情况下可以在其中加入中间的坐标系以提供额外的功能。
多机器人坐标系的例子
-
earth --> map_1 --> odom_1 --> base_link1
-
`earth --> map_2 --> odom_2 --> base_link2
坐标系变换的计算
odom
到base_link
的变换由里程计数据源中的一个发布
map
到base_link
通过定位组件计算得出。但是定位组件并不发布从map
到base_link
的变换。它首先获取odom
到base_link
的变换然后利用定位信息计算出map
到odom
的变换。
earth
到map
的变换是根据map
坐标系选取所发布的一个静态变换。如果没有设置,那么就会使用机器人的初始位置作为坐标原点。
Map之间的切换
如果机器人的运动范围很大,那么极有可能是要切换地图的。在室内环境下,在不同的建筑物中,和不同的楼层地图都会不同。
在不同的地图间切换的时候,定位组件要恰当的把odom
的parent
替换成新的地图。主要是map
到base_link
之间的变换要选取恰当的地图,然后在转换成map
到odom
之间的变换。
odom坐标系的连续性
在切换地图的时候,odom坐标系不应该受到影响。odom坐标系要保证连续性。可能影响连续性的情况包括进出电梯,机器人自身没有运动,但是周围环境发生很大的变化。还有可能由于运动距离太远,造成数据溢出。这些都要特殊进行处理。