Slam初探:基础背景了解

本文为学习<<视觉Slam十四讲>>的简述性笔记,更多内容请查阅书籍进行深入了解.

初识Slam:

Slam功能技术主要用于机器人,无人机,自动驾驶汽车以及一些增强现实,三维重建与环境恢复等应用方向,本文介绍其在小萝卜机器人上的应用.

小萝卜为了完成在房间内的自由活动,需要完成两件事(这两件事情也是Slam的本质所在):

1. 自我定位,知道自己目前的位置;

2. 熟悉周围环境,构建周围的环境地图.

(一)

为了能够很好地自我定位和熟悉周围环境,小萝卜需要像人类一样具有一些感知外界的器官(传感器),这些传感器包括相机,激光传感器,惯性测量单元(IMU),轮式编码器等,机器人需要这些装备来感知外界,并通过感知数据以间接的方式来推断自己的位置,这种方式使得小萝卜具有独立认知外界未知环境,而不必依赖于环境需要具备某些条件.

(二)单目相机

只使用一个摄像头进行Slam的做法,称为单目Slam(Monocular SLAM),这种传感器结构简单,因此,目前的单目Slam非常受研究者关注.单目相机所拍摄的照片,本质上是现实的三维场景在相机的成像平面上留下的一个投影,以二维的形式反映了三维世界,然而,此投影过程中,却丢失了场景的深度信息,即场景中每个像素到相机的距离.而这个深度信息却是小萝卜自我定位与探索周围环境的必要需求.

为了能够估计场景中物体的远近与大小(可称为结构),我们根据常识,就是我们移动相机时,镜头中的物体也会朝着另一方向移动,并且,近处的物体移动地更快一些,于是,这些不同远近的物体在图像的运动就会形成相应的视差,通过视差,可以定量地判断物体的远近.

然而,尽管我们通过视差知道了物体的远近,但它却是一个相对值.直观地说,如果将相机的运动的与场景的大小同时放大一个尺度,单目相机所看到的像是一样的,因此,单目Slam估计的轨迹与地图与真实的轨迹与地图是相差一个尺度因子的,由于单目Slam无法仅凭图像确定这个这是尺度,因此又称为尺度不确定性.

(三)双目相机

双目相机由两个单目相机组成,两个相机之间的距离称为基线(Baseline)是已知,我们可以通过此基线来估计每个像素的空间位置,这相似于我们的双眼,可以根据左右眼图像的差异来判断物体的远近(基线相当于一把尺子,可以计算出绝对的远近).

相比于我们人类,小萝卜的双目相机需要大量的计算才能估计(不太可靠地)出每一个像素点的深度,并且,双目相机测量到的深度范围是与基线相关的,基线距离越远,能够测量的距离就越远.然而,双目相机的缺点是其配置与标定均较为复杂,需要使用GPU或者FPGA等加速设备加速,因此,计算消耗是双目Slam的主要问题之一.

(四)深度相机(RGB-D)

深度相机大约是从2010年开始兴起,其最大的特点是可以通过红外结构光或者TIme-of-Flight(ToF)原理,像激光传感器那样,通过主动xiang发射光并接受返回来的光,来测量物体与相机之间的距离,相比于双目相机,可以节约大量的计算量,目前常用的相机主要包括Kinect/Kinect V2,Xtion Pro Live,RealSense等,不过,现有的RGB-D相机还存在范围窄,噪声大,视野小,易受光照干扰,无法测量透射材质等诸多问题.在Slam方面,其主要用于室内小场景.

经典的视觉Slam框架

Slam初探:基础背景了解_第1张图片

视觉里程计:

视觉里程计(VIsual Odometry)的主要任务是估算相邻图像间相机的运动,以及局部地图的样子,VO又称为前端.那么问题来了,计算机又如何能够根据相邻图像帧确定相机的运动呢?为了能够理解计算机的处理方法,我们需要就先了解相机与空间点的几何关系.

VO能够通过相邻图像帧估计相机运动,并恢复场景的空间结构,称之为里程计,是因为其类似于实际中的里程计,只计算相邻时刻的运动,而不关心过去未来的信息,具有短时记忆,更愿意活在当下时刻.

在通过VO获得了不同时刻相机的运动,我们只要把相机的不同相邻时刻运动串接起来,就构成了机器人的运动轨迹估计整体 ,从而解决了定位问题(知道机器人在环境的运动轨迹),另外,根据每个时刻相机的位置,通过计算各像素对应空间点的位置,就可以获得周围的地图.

然而,仅通过视觉里程计来估计轨迹,将不可避免地出现累计漂移(Accumulating Drift),这是由于视觉里程计只估计相邻两个图像间的运动造成的.由于每个时刻的运动估计都存在一定的误差,而由于里程计的工作方式,先前时刻的误差会传递到下一时刻,导致一段时间后,估计的轨迹不再准确,因此此种漂移需要回环检测与全局校正来修正.这里用到两种技术:后端优化与回环检测.

后端优化:

后端优化可以说是Slam的研究重点所在,主要解决处理Slam过程中噪声的问题.由于传感器存在着噪声误差,在解决"如何从图像估计运动"问题之外,我们还需要关心这个这个估计带有多大的噪声,这些噪声是如何从上一时刻传递到下一时刻的,我们对这些噪声有多大的自信,因此,后端优化要解决的问题,就是如何从这些带有噪声的数据中估计整个系统的准确状态,以及这个状态估计的不确定性有多大,这称为最大后验概率估计.这里的状态包括机器人自身的轨迹与地图.

前端给后端提供待优化的数据以及初始值,后端负责整体优化,只关心数据,而不关心这些数据的来源.在视觉Slam中,前端与计算机视觉更相关,如图像的特征提取与匹配,后端主要是滤波与非线性优化算法.

早期的Slam问题是一个状态估计问题,正是后端要解决的问题,早期的论文中也称它为"空间状态不确定性的估计",起反映了Slam的本质:对运动主体自身和周围环境空间不确定性的估计.为了解决slam问题,我们需要状态估计理论,将定位和建图的不确定性表达出来,然后采用滤波器或者非线性优化,估计状态的均值与方差(不确定性).

回环检测:

回环检测又称为闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题.地图存在的意义就是让机器人知道自己到过的地方,为了实现回环检测,我们需要机器人具有识别到过的场景的能力,这里,可以通过图像的相似性来确定是否是到过的位置来完成回环检测,如果回环检测成功,可以辅助地减小累计误差.具体方式就是: 当检测到回环时,将此信息告知后面的优化算法,后端根据这些信息,会把轨迹和地图调整到符合回环检测结果的样子,进而消除误差累计.

建图:

建图就是根据观测构建地图的过程,地图是对环境的描述.根据slam的应用场合,大体可分为度量地图与拓扑地图.

度量地图强调精确地表示地图中物体的位置关系,通常用稀疏与稠密对其分类.稀疏地图进行了一定的抽象,不需要表达所有的物体,可选择一部分具有代表意义的东西,称之为路标,这样,一张稀疏图就是由路标组成的地图.对于定位来说,稀疏地图就足够了.

稠密地图,通常用于导航等精确的任务,地图通常由许多的方格或者方块组成,一个方格存在占据,空闲,未知三种状态,用于表达该格内是否存在物体.这种地图需要存储每一个格点的状态,会耗费大量的存储空间,而且很多的空间细节部分是无用的.

相比于度量地图,拓扑地图更强调地图元素之间的关系,其主要由节点和边组成,是一个图结构,只考虑节点之间的连通性.它放松了地图对精确位置的需要,去除了地图的细节问题,是一种更为紧凑的表达方式.然而其不擅长表达具有复杂结构的地图.

好了,Slam初探到这里就结束了,内容基本就是书中的内容,写在这里的目的主要是用于增加自己的理解,并做一个记录以便后续复习使用.如果能方便到观众,当然更是受宠若惊了.

你可能感兴趣的:(SLAM)