SLAM技术已经蓬勃发展起来,这里综述性地介绍下SLAM的主体知识。SLAM的主体技术不多,难点在于细节。来源是:
前世
人类惆怅近千年的问题不是:我是谁,我要做什么,我要去哪里!而是:定位、定向、测速、授时!
定位是说物体在地球上的方位,定向是物体前进的方向,测速是物体的运行速度,授时是运动经历的时长。而定位和定向就是我们要讨论的话题。
古代智慧的中国人们提出了夜观天象,基于遥远恒星的方位推断自身所处的位置,进而演变出一门博大精深的学科“牵星术”。
直到1964年,美国人彻底打破了大家的游戏规则,建立了全球定位系统GPS。多说几句,GPS是给出物体相对于地心坐标系的经纬度以及相对于水平面的高度(三维信息),且GPS是狭义相对论的应用实例(卫星和地面的时间同步)。
GPS军用的P码可以达到1-2米级精度,开放给大众使用的CA码也能够实现5-10米级的精度。至此已基本上解决了室外的定位和定姿问题,但是室内怎么办?室外怎么优化位姿?
SALM是什么
SLAM的全称是Simultaneous Localization and Mapping,即定位与制图。SLAM和SFM有这千丝万缕的联系。
SFM(Structure From Motion),称之为传统三维重建,这是一门计算机视觉学科的分支,特点是把数据采集回来,离线慢慢处理。常见应用就是重建某建筑物的3d地图,比较炫的成果可见Building Rome in a day (—天重建罗马城)。
SLAM是自动化控制学科的分支,提起SLAM就要提到ROS,网上开源的SLAM技术一般也都是和ROS集成在一起的。ROS是机器人操作系统,用一堆各式各样的传感器组装好一套硬件,采集各个传感器的数据,传送给ROS的处理节点(软件节点)。ROS会并行调度这些节点,这些节点有接受处理某类传感器信号的,有重合处理各项数据的,有展示结果/执行策略的。
所以学习SLAM就要简单了解下ROS,推荐找本入门书翻翻,一天就差不多啦。SLAM要做到的是实时!要做到的是低运算量!
总结便是:二者的数学理论相似,所属学科不同,应用侧重点不同。更直接点,现在的状况是:SFM提供了理论支撑,SLAM真正融入了人们生活。
另一个问题是:SLAM和图像算法是什么关系?
SLAM同步构建周围世界的3d地图,并确定robot所在的位置和方向。16年ICCV大会最后总结致辞:
SLAM是和ConvNets和Deep Learning互补的算法。SLAM专注于几何问题, Deep Learning主要解决感知与识别。
如果想让机器人走到冰箱而不撞墙,你需要SLAM;如果要识别冰箱内的物体,你需要卷积网络。
当然,深度学习的兴起,也会给SLAM/SFM提供新的养料。
SLAM的分支
首先明确三个问题:
- SLAM可以使用大量不同的硬件
- SALM是一个概念不是算法
- SLAM包含多步,每个模块都有多种算法
所以,SLAM有一堆分支。但是整个SLAM框架可以分为前端和后端。根据不同的前端配置采用不同的后端策略,后端也提出了众多的算法理论。
前端:涉及传感器的选择以及传感器数据处理。比如里程计时间戳和Lidar点云时间戳的对齐等。按传感器功能,机器人的两个主要模块:
- 移动系统:里程计、GPS、IMU惯导等
- 测量系统:Laser、sonar、vision等
移动系统中的传感器可以选择一种或多重,甚至“没有”(参考视觉里程计VO,根据图片三维重建,反推摄像机位置,但是计算量大),一般SLAM硬件都会有一两种。
测量系统中,Laser激光精度高,就是价格昂贵,32线程一个30万左右,而且有些场景不适合。声呐雷达价格便宜,技术成熟,就是精度差,水下等特殊场景广泛采用。摄像机信息量丰富直观,但处理量大,对光照敏感。vision又分单目双目等,可见前端方案组合的多样性。
后端:综合前端信息,优化位姿。涉及数学知识较多。
常见的slam算法:vslam、rgbd-salm、monoslam、orb-slam等
SLAM的一般过程
由于运动估计传感器(移动系统)得到的位姿通常具有较大的误差,因而我们希望使用测量系统得到的周围环境信息来优化位姿。
一个完整的处理过程如下:
- 机器人使用观测系统测量地标相对于机器人的距离和角度。
- 运动一段距离后,达到新的位置,机器人通过运动方程预测新位置。
- 在新的位置,通过观测系统重新测量各个地标的距离和角度。
- 如此反复
R表示机器人,五角星表示地标。地标的选择是一个研究方向,简单的有特征点(静止点),更鲁棒更高级的是线段,平面都可以作为地标。路标还会涉及到路标的更新。
利用预测值和观测值计算系统状态——卡尔曼滤波。
线性KF方程
u和z是硬件可以提供的,上述中x为系统状态:表示robot的位置,表示robot的姿态(四元组或者3个角度值),为地标的位置
u表示速度/加速度/角加速度等值。z表示测量系统得到的地标相对机器人的距离、角度。w和v表示噪声。
由此,可以根据上一时刻状态和当前时刻观测量更新得到当前时刻状态。这也是卡尔曼滤波所擅长的。
EKF
KF滤波是线性方程,但是距离等显然不是线性的,因此,SLAM中其实用的最多的是EKF(Extended Kalman Filter)。
EKF实质是把差值认为是线性的,思想还是用线性系统代替非线性系统。计算可以参考《An Introduction to the Kalman Filter》。
目前,也有一些slam采用了粒子滤波PF,PF是基于马尔科夫蒙特卡洛方法的抽样滤波,适用非线性系统。PF中要维持所有的可能状态,对资源消耗大。
上述渐进式的匹配方式,存在累计误差。如果有一帧错误,后续又基于这个错误的位置,后果不堪设想。所以最好和前面多帧进行对比(预测方程基于前面多个时刻)。
后端Graph-based SLAM
SLAM借鉴SFM中的捆集优化思想,21世纪走向了图优化的道路。
优化方法和滤波器方法有根本上的不同。它并不是一个迭代的过程,而是考虑过去所有帧中的信息。通过优化,把误差平均分到每一次观测当中。
Graph-based SLAM是无法计算的,图的联结数目巨大,但是其实这是一个稀疏的,正是这个稀疏性,使得优化思路成为了现实。这里要感谢稀疏代数的发展,网上有很多优化库可解上述目标函数。
闭环检测
新来一帧数据,如何判断它在已有序列中是否出现过。
- 新帧的位置,如果回到历史位置附近;
- 帧的特征和历史关键帧特征相似(常用)。
不用第一种:科学家认为前一种依靠有噪声的位置来减少位置的噪声,有点循环论证的意思。第二种就是:帧帧匹配。
在没有闭环的情况下,[k,k+t]这一段数据进行图优化,如果闭环出现(如绿色),就要把历史数据也考虑进来,入册可以显著减少累计误差。
注意:闭环检测的引入是为了减少误差的,很多场景很难出现闭环这种情况,但是人们有意设计了这种状况,比如扫机器人开启前期,走一段路就绕回来,为得便是制造闭环。
SLAM的应用
- 扫地机器人,这简直就是SLAM的代言人,除了定位+制图,还需要引入路径规划。
- 室内移动机器人
- 无人机
- 无人驾驶
等等,I am anywhere! SLAM也即将开启超体时代。Google的cartographer也给SLAM添了一把火。
参考
《SLAM for Dummies》