这个系列是对SLAM的基本介绍。分为8+1个部分,其中视觉里程计的部分被单独拆分为小专题的形式。

第一部分是综述,主要介绍SLAM的基本概念。

1. 什么是SLAM

同步定位与地图构建SLAMSimultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。

2. 经典视觉SLAM框架

视觉SLAM分为以下几步:

  1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。
  2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动, 以及局部地图的样子。VO 又称为前端(Front End)。
  3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。
  4. 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果 检测到回环,它会把信息提供给后端进行处理。
  5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图

2.1 视觉里程计

视觉里程计关心相邻图像之间的相机运动,而和再往前的信息没有关联。换句话说,里程计记录的是相对差值而不是绝对值。我们可以通过将相邻时刻的运动起来,构成最终的运动轨迹。

仅通过视觉里程计来估计轨迹,将不可避免地出现累计漂移(Accumulating Drift)。这是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成的。每次估计都带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻,导致经过一段时间之后,估计的轨迹将不再准确。因此我们还需要后端优化和回环检测。

2.2 后端优化

后端优化主要指处理 SLAM 过程中噪声的问题。

后端优化要考虑的问题, 就是如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为最大后验概率估计(Maximum-a-Posteriori,MAP)。

在视觉 SLAM 中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。

2.3 回环检测

回环检测,又称闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题。实现的途径就是让机器人具有识别曾到达过的场景的能力,比如识别二维码、环境特征等等。

在检测到回环之后,我们会把“A 与 B 是同一个点”这样的信息告诉后端优化算法。 然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样就可以消除累积误差,得到全局一致的轨迹地图。

2.4 建图

建图(Mapping)是指构建地图的过程。地图是对环境的描述,但这个描述并不是固定的,需要视 SLAM 的应用而定。

地图可分为度量地图(Metric Map)和 拓扑地图(Topological Map)

  • 度量地图强调精确地表示地图中物体的位置关系,通常我们用稀疏(Sparse)稠密 (Dense)对它们进行分类。
    • 稀疏地图进行了一定程度的抽象,并不需要表达所有的物体。例如,我们选择一部分具有代表意义的东西,称之为路标(Landmark),那么一张稀疏地图就是由路标组成的地图,而不是路标的部分就可以忽略掉,一般适用于定位
    • 稠密地图通常按照某种分辨率,由许 多个小块组成,一个小块含有占据、空闲、未知三种状态,以表达该格内是否有物体。一般适用于导航
  • 拓扑地图则更强调地图元素之间的关系。拓扑地图是一个(Graph),由节点组成,只考虑节点间的连通性。它放松了地图对精确位置的需要,去掉地图的细节问题, 是一种更为紧凑的表达方式

3. SLAM的数学表达

假设将时间变为离散 $t=1,2,…,K$,然后我们用$x$表示机器人的位置 $x_1,…,x_k$,而每个时刻,传感器会测量到一部分路标点,得到它们的观测数据。不妨设路标点一共有$N$个,用 $y_1,…,y_N$表示它们。 那么机器人携带传感器在环境中的运动就可以描述为:

  1. 什么是运动?我们要考虑从 $k−1$ 时刻到 $k$ 时刻,机器人的位置 $x$ 是如何变化的。
  2. 什么是观测?假设机器人在 $k$ 时刻,于 $x_k$ 处探测到了某一个路标 $y_j$,我们要考虑这件事情是如何用数学语言来描述的。

运动方程$xk$和观测方程$z{k,j}$可以分别抽象为如下数学表达式:

$\omegak$和$v{k,j}$为噪声,$uk$为运动测量读数,$y_j$为路标点,$z{k,j}$为传感器读数。

因此问题就转化为:知道运动测量的读数 $u$,以及传感器的读数 $z$ 时如何求解定位问题(估计 $x$)和建图问题(估计 $y$)