[创新实践] SLAM简介

此篇是东拼西凑来的一篇简介,课程实验所用,仅供自己学习,想认真了解的可以去高博的博客看看.
实验上跟着别人的步子实现了一个开源的的DSO(即Direct Sparse Odometry,采用直接法实现建图的程序),然后简单了解一下 SLAM 还有直接法和间接法的区别,看了下原理代码,好难啊囧

SLAM 技术随着最近几年机器人、VR、AR 的火爆而为人所知,在传感器、算法、软件、硬件等方向都有不同的进展。那么什么是 SLAM?
SLAM,全称叫做 Simultaneous Localization and Mapping,中文叫做同时定位与建图。希望机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。他解决了两个问题:
1. Where am I?
2. What can I do right here?
这是移动机器人的基础,因为只有知道当前环境及自身状态,机器人才可以进行下一步的任务计划,执行等操作。定位和建图两个问题相互依赖,准确的定位依赖于正确的地图,而构建正确的地图又需要准确的定位,这是一个迭代的过程。

在SLAM理论中,非常强调未知的环境,因此我们主要谈论如何用相机在位置的环境中解决定位和建图问题。

传感器

首先从传感器入手,视觉传感器主要分为三种:
1. 单目摄像头(Monocular Camera)
2. 双目摄像头(Binocular Camera)
3. 深度摄像头(RGB-D Camera)
深度摄像头可以直接获得图像及对应的深度信息,优点在于方便获得深度数据,缺点在于成本高,体积大,室外环境基本报废。
双目摄像头可以通过三角方法计算出深度信息,市面上有一些深度摄像头也是直接基于双摄像头来做的。然而双目摄像头在目标距离较远的时候会退化成单目。因此近年来大量的研究都是围绕单目进行的。
单目SLAM可以通过临近图像匹配计算出摄像头位姿的变换,在两个视角上进行三角测距又可以得出对应点的深度信息。通过这样迭代的过程可以实现定位及建图。

原理听起来很直观,然而现实环境中大量的测量噪声,计算误差造成了SLAM问题的无限复杂。于是解决不确定性问题(后端优化)成为SLAM的核心之一。

定位问题

利用合适的传感器得到每个点的位置之后,根据两帧图像间的差别计算摄像头的位移和相机相对姿态估计。经典的算法是 ICP(Iterative Closest Point,迭代最近点)。这个算法要求知道这两个图像间的一组匹配点,说的通俗点,就是前一帧图像哪些点和当前帧是一样的。这里涉及到两个知识点:
特征点的提取和匹配.
特征点的提取有许多方法,常见的有SIFT, SURF之类,还有效率好一点的FAST方法.FAST的原理非常简单, 具体就是查看点p周围的点的像素值与该点灰度的差别是否够大(灰度值大于某个阈值),如果个数足够大,则认为该候选点位一个特征点。

得到了一组匹配点后,我们就可以计算两个图像间的转换关系, 得到了一组匹配点后,我们就可以计算两个图像间的转换关系,也叫PnP问题。

这里写图片描述

R为相机的姿态,C为相机的标定矩阵。R是不断运动的,而C则是随着相机做死的。ICP的模型稍有不同,但原理上也是计算相机的姿态矩阵。原则上,只要有四组匹配点,就可以算这个矩阵。

代码实际运行时,可以调用openCV提供的算法,来可以很好地找到匹配点。以下是一个结果的示例。

这里写图片描述

只要我们引入一个关键帧的结构(发现位移超过一个固定值时,定义成一个关键帧)。然后,把新的图像与关键帧比较就行了而不需要新的图像与之前帧比较。至于建图,就是把这些关键帧的点云拼起来.

SLAM端优化理论

在建图的过程中,最麻烦的问题,就是“噪声”。这种渐近式的匹配方式,和那些惯性测量设备一样,存在着累积噪声。因为我们在不断地更新关键帧,把新图像与最近的关键帧比较,从而获得机器人的位移信息。如果有一个关键帧出现了偏移,那么剩下的位移估计都会多出一个误差。这个误差还会累积,因为后面的估计都基于前面的机器人位置……

前端的工作称为视觉里程计,它可以给出一个增量式的地图,但由于不可避免的误差累计,这个地图在长时间内是不准确的。而SLAM致力于构建一个长生命周期的可靠的解决方案,因此只有前端是远远不够的。当地图增长到一定程度后,累计误差会使后来的数据越来越不准确。这时我们需要把所有地图数据放到一起做一次完整的优化,从而降低各部分的误差。
后端优化有很多种方案,过去采用以扩展卡尔曼滤波(Extended Kalman Filter,EKF)为主的滤波器方案,现在大多都采用非线性优化方案。EKF由于假设了马尔可夫性质,只利用前一状态来估计当前状态的值,这有点像视觉里程计中只考虑相邻两帧的关系一样,很难做到全局的优化。而现在常用的非线性优化方法,则是把所有数据都考虑进来,放在一起优化,虽然会增大计算量,但效果好得多。

常用的Bundle Adjustment的非线性优化方法,同时提供了一个通用的开发包:g2o, 总之,只要把观测和运动信息丢到求解器里,优化器会为我们求出机器人的轨迹和路标位置.(就是一个可以偷懒的开发包)

闭环检测

上面提到,仅用帧间匹配最大的问题在于误差累积,图优化的方法可以有效地减少累计误差。
然而,如果把所有测量都丢进g2o,计算量过大.
如果机器人到达了之前到过的地方,那么我们直接与那时候采集的关键帧做比较即可,这种方法叫做闭环检测.
闭环检测是说,新来一张图像时,如何判断它以前是否在图像序列中出现过?有两种思路:一是根据我们估计的机器人位置,看是否与以前某个位置邻近;二是根据图像的外观,看它是否和以前关键帧相似。
目前主流方法是后一种, 本质上是个模式识别问题.


实验上用的DSO,采用的是直接法

直接法与特征点法的比较

直接法是视觉里程计另一主要分支,它与特征点法有很大不同.
特征点的缺点:
① 关键点的提取与描述子的计算非常耗时。
② 使用特征点时,忽略了除特征点以外的所有信息。一张图像有几十万个像素,而特征点只有几百个。只使用特征点丢弃了大部分可能有用的图像信息。
③ 相机有时会运动到特征缺失的地方,往往这些地方都没有什么明显的纹理信息。例如,有时我们会面对一堵白墙,或者一个空荡荡的走廓。这些场景下特征点数量会明显减少,我们可能找不到足够的匹配点来计算相机运动

使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,在SLAM端优化中通过最小化重投影误差(Reprojection error)来优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们为何要对特征进行匹配或跟踪的理由。而在直接法中,我们最小化的不再是重投影误差,而是测量误差(Phometric error)。

直接法的优点:
直接法根据像素来直接计算相机运动,既避免了特征的计算时间,也避免了特征缺失的情况。只要场景中存在明暗变化(可以是渐变,不形成局部的图像特征),直接法就能工作。根据使用像素的数量,直接法分为稀疏、稠密和半稠密三种,具有恢复稠密结构的能力。相比于特征点法通常只能重构稀疏特征点,直接法和稠密重建有更紧密的联系。

直接法的使用:
若点P来自于稀疏特征点,我们称之为稀疏直接法。通常我们使用数百个特征点,,假设它周围像素也是不变的。这种稀疏直接法速度不必计算描述子,并且只使用数百个像素,因此速度最快,但只能计算稀疏的重构。
P来自部分像素。这称之为半稠密(Semi-Dense)的直接法,可以重构一个半稠密结构。
P为所有像素,称为稠密直接法。稠密重构需要计算所有像素(一般几十万至几百万个),因此多数不能在现有的 CPU上实时计算,需要GPU的加速。
可以看到,从稀疏到稠密重构,都可以用直接法来计算。它们的计算量是逐渐增长的。稀疏方法可以快速地求解相机位姿,而稠密方法可以建立完整地图。
直接法的光度误差:
直接法基于灰度不变假设.灰度不变假设,即同一个空间点的像素灰度,在各个图像中是固定不变的。事实上,由于物体的材质不同,像素会出现高光和阴影部分;有时,相机会自动调整曝光参数,使得图像整体变亮或变暗。这些时候灰度不变假设都是不成立的,因此直接法的结果也不一定可靠。

直接法与特征点法比较:

直接法的优点:
① 可以省去计算特征点。
② 可以在特征缺失的场合下使用。比较极端的例子是只有渐变的一张图像。它可能无法提取角点类特征,但可以用直接法估计它的运动。
③ 可以构建半稠密乃至稠密的地图,这是特征点法无法做到的。

另一方面,它的缺点也很明显:
① 非凸性——直接法完全依靠梯度搜索,降低目标函数来计算相机位姿。其目标函数中需要取像素点的灰度值,而图像是强烈非凸的函数。这使得优化算法容易进入极小,只在运动很小时直接法才能成功,在实践中也能感受到。
② 单个像素没有区分度。于是只能计算图像块,或是计算像素间复杂的相关性。由于每个像素对改变相机运动的“意见”不一致。只能少数服从多数,以数量代替质量。
③ 灰度值不变是很强的假设。如果相机是自动曝光的,当它调整曝光参数时,会使得图像整体变亮或变暗。光照变化时亦会出现这种情况。特征点法对光照具有一定的容忍性,而直接法由于计算灰度间的差异,整体灰度变化会破坏灰度不变假设,使算法失败。

参考资料:
http://fengbing.net/
http://www.cnblogs.com/gaoxiang12/
http://36kr.com/p/5049190.html
http://blog.csdn.net/broadview2006/article/details/71158633
http://blog.csdn.net/xuelabizp/article/details/50327393

展开阅读全文

没有更多推荐了,返回首页