这个系列是对SLAM的基本介绍。分为8+1个部分,其中视觉里程计的部分被单独拆分为小专题的形式。
1. 什么是SLAM
同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。
2. 经典视觉SLAM框架
视觉SLAM分为以下几步:
- 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。
- 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动, 以及局部地图的样子。VO 又称为前端(Front End)。
- 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。
- 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果 检测到回环,它会把信息提供给后端进行处理。
- 建图(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$表示它们。 那么机器人携带传感器在环境中的运动就可以描述为:
- 什么是运动?我们要考虑从 $k−1$ 时刻到 $k$ 时刻,机器人的位置 $x$ 是如何变化的。
- 什么是观测?假设机器人在 $k$ 时刻,于 $x_k$ 处探测到了某一个路标 $y_j$,我们要考虑这件事情是如何用数学语言来描述的。
运动方程$xk$和观测方程$z{k,j}$可以分别抽象为如下数学表达式:
$\omegak$和$v{k,j}$为噪声,$uk$为运动测量读数,$y_j$为路标点,$z{k,j}$为传感器读数。
因此问题就转化为:知道运动测量的读数 $u$,以及传感器的读数 $z$ 时,如何求解定位问题(估计 $x$)和建图问题(估计 $y$)?