正文
一、地图类型
1、按地图类型分类
a、栅格图(grid maps):将地图分为m*n的栅格,每个栅格内的数值代表是否被占用(参考ROS官网上的costmap:http://wiki.ros.org/costmap_2d)。
b、地标图(landmark-based maps):基于地标建图,已知某些标志物在地图中的确定位置,比如视觉导航时添加的二维码等。
2、按建图原理分类
a、占用图(occupancy maps):对于每个栅格单元,代表是否被占用;
b、反射图(reflection maps):对于每个单元,表示传感器束反射的概率。
详细说明:
在某空旷区域建图,当使用占用图(a)方法时,只要传感器没有接收到返回信号,就认为前方是未被占用的;
当使用反射图(b)方法时,在没有接收到返回信号时,依旧认为前方是未知区域,只有接受到传感器信号后,才更新被占用区(障碍物位置)、未被占用区(机器人与障碍物之间)。
占用栅格图(a)
反射图(b)
对比两幅地图,反射图呈现出较多灰度值,这是由于其原理导致这些点被更新的次数较少。如果希望地图更加清晰明了,可以让机器人在这些灰度点附近多往复运动,提高更新次数。
可见,反射图较占用图建立地图的效率低一些,但是它也有自己的优势:地图信息更可信、可以检测到玻璃(图b中红色区域)。目前,室内导航基本使用反射图。
二、构建地图
1、建图原理:
根据运动模型获取机器人的移动路径;根据传感器模型获取移动路径上周边环境的信息,两者匹配起来得到完成地图。
2、SLAM难点:
由于机器人的移动路径与周边环境的信息都是未知的,且移动路径的误差随着机器人的移动而不断累积;当环境信息是之前已经检测到并构建到地图中时,将该信息作为地标来修正机器人的移动路径信息,使机器人的移动路径的误差收敛。
3、算法流程(基于扩展卡尔曼滤波EKF):
a、预测机器人状态:基于运功动模型,预测机器人当前位置状态;
b、预测测量量:基于a得到的预测位置,预测应该得到哪些测量量;
c、测量:测量当前真实环境信息;
d、数据融合:利用EKF将b、c中的信息融合;
e、更新机器人状态:根据d的结果,更新机器人位置状态,收敛误差;
f、更新地图:根据d、e,更新地图数据。
4、算法介绍
a、建图开始时,将机器人当前位置设为已知的起始点,此时建立一个3x1的向量Xk,一个3x3的矩阵Ck。Xk代表已知点,Ck代表已知点之间的关系;
b、随着机器人的移动及环境信息的输入,将更新的地标信息m1、m2、...添加到Xk、Ck中。
(此处为方便表述,用XR代表初始状态xk、yk、θk)
矩阵Ck中,对角线Cr、Cm1、Cm2、...Cmn代表不同的地标信息,其他元素代表对应行、列上地标信息的位置关系。比如Cm1m2代表Cm1地标与Cm2地标的位置关系。
c、闭环检测
当机器人又回到已经识别的区域时,通过重新审视已经映射的区域,可以减少机器人和地标估计的不确定性。
其中一种方法是,当环境信息真实测量值与原有测量值的差小于某一设定阈值,认为这两点是重合的,并据此重新更新机器人当前位置;当该差值大于设定阈值,认为是新的地图信息并添加到地图中。
在上述Ck矩阵中,当机器人再次检测到Cm2地标,则会根据新的测量值修正Ck矩阵的中Cm2所在的行、列元素的值,代表Cm2与其他所有地标的相对位置关系发生了变化。
三、其他SLAM
SLAM算法按类型可分为online-slam与full-slam;
online-slam:每检测到环境信息就进行计算与更新,例如gmapping、fast-slam;
full-slam:检测到一定的环境信息才进行计算与更新,又称lazy-slam,例如graph-slam。
此外,还有开源的MRPT与google的cartographer。
当然也欢迎大家添加EAI的微信公众号进行讨论。