1. 视觉SLAM 系统概述
SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建” 。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉SLAM”。
视觉SLAM流程分为以下几步
- 传感器信息读取。在视觉SLAM 中主要为相机图像信息的读取和预处理。
- 视觉里程计。视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。
- 后端优化。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。
- 回环检测。回环检测判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
- 建图。它根据估计的轨迹,建立与任务要求对应的地图。
2. 前端视觉里程计
视觉里程计根据相邻图像的信息,估计出粗略的相机运动,给后端提供较好的初始值。视觉里程计的算法主要分为两个大类:特征点法和直接法。基于特征点法的前端,长久以来(直到现在)被认为是视觉里程计的主流方法。它运行稳定,对光照、动态物体不敏感,是目前比较成熟的解决方案。
核心问题:如何根据图像估计相机运动。
2.1. 特征点法
特征点:由关键点和描述子两部分组成。关键点是指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。描述子是按照“外观相似的特征应该有相似的描述子”的原则设计的。
特征匹配:视觉SLAM 中极为关键的一步,特征匹配解决了SLAM 中的数据关联问题,即确定当前看到的路标与之前看到的路标之间的对应关系。通过对图像与图像,或者图像与地图之间的描述子进行准确的匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担。匹配方法:暴力匹配等。
当相机为单目时,我们只知道2D 的像素坐标,因而问题是根据两组2D 点估计运动。该问题用对极几何来解决。
当相机为双目、RGB-D 时,或者我们通过某种方法得到了距离信息,那问题就是根据两组3D 点估计运动。该问题通常用ICP 来解决。
如果我们有3D 点和它们在相机的投影位置,也能估计相机的运动。该问题通过PnP求解。
2.1.1. 2D-2D: 对极几何
假设我们从两张图像中,得到了一对配对好的特征点,如果我们有若干对这样的匹配点,就可以通过这些二维图像点的对应关系,恢复出在两帧之间摄像机的运动。
八点法+奇异值分解即可求得旋转矩阵R和位移向量t。
2.1.2. 三角测量
在得到运动之后,下一步我们需要用相机的运动估计特征点的空间位置。在单目SLAM 中,仅通过单张图像无法获得像素的深度信息,我们需要通过三角测量(Triangulation)(或三角化)的方法来估计地图点的深度。
2.1.3. 3D-2D: PnP
PnP(Perspective-n-Point)是求解3D 到2D 点对运动的方法。它描述了当我们知道n 个3D 空间点以及它们的投影位置时,如何估计相机所在的位姿
如果两张图像中,其中一张特征点的3D 位置已知,那么最少只需三个点对(需要至少一个额外点验证结果)就可以估计相机运动
在双目或RGB-D 的视觉里程计中,我们可以直接使用PnP 估计相机运动。而在单目视觉里程计中,必须先进行初始化,然后才能使用PnP
PnP 问题有很多种求解方法,例如用三对点估计位姿的P3P,直接线性变换(DLT),非线性优化构建最小二乘问题并迭代求解
2.1.4. 3D-3D: ICP
假设一组配对好的3D 点(比如对两个RGB-D 图像