转载:http://blog.sina.com.cn/s/blog_8a2281f70102xwc0.html
1. 前提:
本文讨论的是在已有地图的情况下,进行导航的情形。
2. 坐标系出现的原因:
为了实现机器人在环境中的自主定位而设定的。要让机器人实现自主定位,机器人就需要有一个先验的地图,可以经过前期使用slam_gmapping功能实现。
3. map坐标系:
有了地图,如何表达自己的位置你呢?在创建地图之后,会根据地图设置了一个map坐标系,其位置一般在与地图相匹配的配置文件yaml中的origin项指定。origin制定了像素左下一个像素点在map坐标系下的坐标,所以给出这个值后,map坐标系的位置也就确定了。
在构建地图时,机器人构建地图的起点位置就是map坐标系的位置。在导航节点,当加载地图时,map坐标系就确定了,其实是包含的地图属性中的,例如上面所说的origin属性。
map坐标系一旦固定,就不会再变。
4. base_link坐标系:
base_link坐标系是用于表示机器人本身位姿的坐标系,其始终与机器人本体保持一致。机器人的定位问题最本质的就是求出base_link在map坐标系下的坐标和姿态。
5. odom坐标系:
由于器件、结构等方面的原因,通过运动反馈获得的里程信息会出现误差累计的问题,为消除累计误差,引入了odom坐标系。
运动反馈一直更新的是odom-->base_link,即base_link在odom坐标系下的坐标,至于误差累计则是通过定位模块amcl纠正,也就是修改map-->odom,odom在map坐标系下的坐标,以此达到消除累计误差。
6. amcl定位模块:
amcl使用粒子算法,通过激光点与地图匹配,首先求出map-->laser,laser在map下的位姿,然后根据已知的base_link-->laser,odom--> base_link,计算出map-->odom。