记不清第一次读《SLAM十四讲》是什么感受了(那会是第一次接触SLAM这个东西),可能似懂非懂,也可能不懂装懂,总之就是没懂。

这次,时隔两年(我滴个乖,你这两年就这样荒废啦?你都学了个啥😠)重新来读,一点一点,一步一步读懂、理解透,之前可能广度优先浅尝则止了,这次是深度优先刨根问底!

视觉SLAM概览

视觉SLAM研究和解决的到底是一个什么问题呢?

一种感性的理解

视觉SLAM所应用的场景是通过图像数据来完成 SLAM(Simultaneous Localization and Mapping) 同时定位与建图任务。而图像是将三维空间的世界和场景“拍扁”成了一张二维平面,因此三维空间中的距离感(深度信息)在二维图像中就消失了,而且这是一种在自然情况不可逆的过程,即不通过其他手段是无法直接从图像中恢复出原有的深度信息。因此SLAM想要实现对自身的定位和对周围环境的建图,那么首先要做的就是得到图像的深度信息。

对于图像的深度信息,根据相机软硬件的区别有不同的获取策略,通过硬件设备直接测量当然是最准的,比如RGB-D相机,具体有飞行时间原理(Time of Flight,TOF)和结构光原理(Structured Light)两种,不不过这也会有误差。

而只有图像的情况,如果是已知相对位置关系的两张图像或者多张图像,那么问题还好些,是双目或者多目的立体匹配问题,涉及到多视图几何的知识(Multiple View Geometry,这本书已买,要读起来了!);如果只是单张图像的话,想要恢复深度就会复杂很多,首先得是多张图像,也就是让相机动起来去模拟两个或者多个相机的情况,比如水平移动或者竖直移动,如果是随意的移动,那问题就更复杂了,因为还得知道相机运动的每一个位置之间的相对关系,这又涉及到后面要提到的问题:视觉里程计(Visual Odometry, VO),用来估计相邻图像所对应相机的运动,并且如果没有绝对物理尺寸作为参考,这种相对的比例放大或者缩小都不会对结果产生实际性的影响,因此这里的尺度(Scale)是不确定的。这里做一个引子,下一篇学习用来介绍如何通过图像估计出深度

假设现在能够获取到图像的深度,从图像像素位置能够恢复出其在空间中的三维坐标,这里需要用到相机模型和投影关系的知识,这也需要在后面的学习中补充。

SLAM想要做的同时定位和建图,这两者都需要知道自身是怎么运动,也就是相机的位置变换是怎么样的,这时候就需要用到视觉里程计的理论:**相邻图像中如果确定同一个点(从像素点对应到三维空间的一点),然后这个点对应的空间点与相机之间的几何关系,从这个几何关系中估计相邻图像对应相机的位置变换。**这一块也是后面学习的重点。

假设能够实现相邻图像间位置变换关系的计算了,下一步是将一系列这样的相邻对一起计算,得到一个完整的位姿(位置和姿态)序列,由于传感器的噪声也是很难完全去除的,估计的误差也就不可避免,两个两个进行简单计算时可能误差很小,但是这些很小的误差累积起来就会让结果偏差很大,因此只是完成了单纯的视觉里程计还不够,还需要能够把偏差纠正回来。

**完整的SLAM还需要对位姿估计进行优化,降低系统噪声的影响,同时对于累积的误差可能产生的质变差异,也就是累积漂移(Accumulating Drift),比如实际是起点终点一致,但估计出来终点和起点直接劈叉了,这就需要通过“回环检测”的策论纠正过来。**两者具体实现起来都比较复杂,这也是后面学习需要突破的。

简单小结一下:

如果将SLAM按照“外在表现”和“内在服务”这种思路来划分,视觉里程计可以归为“前端”,并且其中所涉及的理论主要与计算机视觉相关。而对于提取的空间点和估计的位姿进行的优化则可以归为后端,因为这些需要优化的数据涉及各种复杂的几何关系,本身就不是线性的,所以后端常用的是一些滤波和非线性优化的算法(……写到这,其实对于滤波在干啥竟然没有直观的感觉,说明此前的学习真的很拉垮!)最后的回环检测同样也会涉及到计算机视觉的理论,比如图像的相似性,由于回环检测的结果会使得整个位姿估计的结果发生整体的纠正,因此可以看作是SLAM前后端之间的纽带。(……好吧,其实写到这,对于怎么进行回环的,也是一脑子懵逼。。。)

最后的一部分是建图,SLAM讲究的建图需要从两方面来看。

  1. 同时定位的目的是为了构建出地图,根据需要可以构建不同类型的地图,且这个地图能在之后被使用,比如导航,路径规划,重定位等;
  2. 建图的本质是通过相机的位姿将相机看到的场景再“拼接”成一个完整的空间,这时如果只选取场景中的代表特征,比如角点、边缘,一般称之为路标(Landmark),那么构建就是一种稀疏的地图;而如果是将整张图像的每一个点(都知道相应的深度)都拿来建图,那么就会得到一个较为稠密的地图,这种地图一般也为点云地图。

到此,SLAM到底是在干啥算了有一个初步的感性认识了,下面还有内容一些需要补充说明。

关于稠密与稀疏的讨论

这里对地图的稀疏和稠密程度,是一种相对而言的概念,有这样一个观点:

你看点云地图,即使它再稠密,将这个点云放大来看,那么点与点之间也是有空隙的,这算稠密嘛?

在讨论点云地图是否稠密时,我们通常不是指点与点之间完全没有空隙,而是相对于感知系统的分辨率和所需的应用精度来说,数据点的密度足够高。

稠密地图在SLAM和机器视觉中通常是相对定义的。例如,对于某些应用,如导航或障碍物避让,一个地图可能不需要细致到毫米级别的每一个细节,只要能够较为准确地表示出环境的主要结构和障碍物位置,这样的地图就可以被视为是“稠密”的。

然而,如果应用需要更高精度的环境建模,例如在精密工业应用中,那么即使是通常意义上的稠密点云地图也可能被视为不够稠密。这是因为在放大观察时,点与点之间的空隙可能导致精度不足,这个时候可能就需要网格化(meshing)的操作。

补充知识

以下为本次学习中发散思维想到的一些知识点的理解和补充。

SLAM地图的类型及其适用场景

  1. 稀疏地图
  • 特点:包含关键的特征点或路标。
  • 应用场景:适用于需要快速、实时响应的场合,如在资源受限的设备上进行基本导航和避障。
  1. 稠密地图
  • 特点:提供环境的详尽几何描述。
  • 应用场景:用于需要高度精确的任务,如在复杂环境中进行精细操作的机器人,或者那些需要高精度视觉信息来进行详细分析的应用。
  1. 语义地图
  • 特点:不仅记录物理形状,还标注物体的类别信息(如椅子、桌子、门等)。
  • 应用场景:适用于高级交互、辅助机器人和增强现实应用。例如,辅助机器人利用语义地图识别并与特定物体交互,如抓取物品或开关门。
  1. 2D地图和3D地图
  • 2D地图:主要用于平面环境,如家庭或仓库中的地面机器人导航。
  • 3D地图:提供环境的三维结构,适用于复杂或多层环境,如多层建筑内的导航或飞行机器人。

点云网格化

网格化是一种将散乱的点云数据转化为连续三维表面的技术。通过这种方式,可以用三角形网格来近似表示物体的表面,从而提高模型的视觉和计算效果。这不仅可以填补点与点之间的空隙,还能提供更平滑、更详细的表面模型,有助于进行更精确的计算和可视化。

点云网格化的常见方法

  1. Delaunay 三角剖分

    • 这是一种常用的方法,可以生成三角网格,通常用于2D和3D空间中。它尝试保证在三角形网格的每个三角形的圆周上没有其他点存在,这有助于最大化最小角,从而避免生成细长的三角形。
  2. 泊松表面重建

    • 泊松方法是一种流行的3D重建技术,用于从点云中推导出一个平滑的曲面。它基于假设一个隐式表面可以通过点云定位,然后通过求解一个泊松方程来找到最佳的表面。
  3. Marching Cubes 算法

    • 这是一个用于提取等值面并创建三角网格的算法。在医学成像和科学可视化中尤其常见。它通过逐个检查数据体积的立方体(或“体素”)的网格,根据边界上的点来构造表面。
  4. Greedy Projection Triangulation

    • 这种方法适用于较大的点集,它依赖于贪婪策略来逐步构建三角网格。它通常从一个点开始,逐步向外扩展,直到覆盖所有点。

SLAM的数学表达

从数学的角度来理解SLAM问题,可以归结为机器人的“运动”和机器人对路标(Landmark)的“观测”。

SLAM(Simultaneous Localization and Mapping)是一个核心问题,在机器人学和自动导航系统中非常关键。它涉及到机器人在未知环境中同时进行自我定位和环境地图构建的过程。理解SLAM的基本问题涉及到几个关键方面:运动方程、观测方程、已知的数据、需要估计的变量、噪声模型以及求解这些问题的方法。

运动方程

运动方程描述了机器人状态的时间演化,基于其运动模型。在最基本的形式中,这可以表示为:

$$ x_{t} = f(x_{t-1}, u_t, w_t) $$

  • $ x_{t-1} $:上一个时间步的机器人状态(位置和方向)。
  • $ u_t $:控制输入(如速度和方向变化)。
  • $ w_t $:过程噪声,模拟由于机器人动力系统的不精确性和环境因素带来的不确定性,通常假设为高斯分布。

观测方程

观测方程描述了机器人如何通过其传感器从环境中获取信息,以及这些信息如何依赖于当前的机器人状态和地图:

$$ z_t = h(x_t, m, v_t) $$

  • $ z_t $:在时间 $ t $ 的传感器观测。
  • $ x_t $:当前机器人状态。
  • $ m $:地图中的特征。
  • $ v_t $:观测噪声,代表传感器误差和其他测量不确定性,通常假设为高斯分布。

已知和未知变量

  • 已知变量
    • 控制输入 $ u_t $:例如从机器人的驱动系统获得。
    • 观测数据 $ z_t $:来自机器人的传感器。
  • 未知变量
    • 机器人的状态 $ x_t $:需要实时估计。
    • 地图 $ m $:需要逐步构建和更新。

噪声的存在

  • 过程噪声 $ w_t $:存在于运动方程中,反映了控制输入到实际运动之间的不精确转换。
  • 观测噪声 $ v_t $:存在于观测方程中,反映了传感器本身的不精确性和环境导致的误差。

求解方法

求解SLAM问题通常采用以下几种方法:

  1. 扩展卡尔曼滤波器(EKF):通过线性化非线性模型处理较小的不确定性和噪声,适用于线性高斯模型。
  2. 粒子滤波器(特别是FastSLAM):使用大量随机样本(粒子)来代表可能的机器人状态和地图配置,适合处理非线性和非高斯问题。
  3. 图优化方法:将整个SLAM过程建模为一个优化问题,节点代表状态,边代表运动或观测的约束,通过优化这些约束来精确地估计机器人的轨迹和地图。

理论依据

SLAM的理论基础建立在概率论和估计理论之上,允许系统在存在噪声和不确定性的情况下有效地估计机器人的状态和构建环境地图。这些方法不仅能够提供对当前状态的最佳估计,还可以预测未来状态并修正过去的误差,从而实现对环境的连续

学习和适应。

通过这些核心组成部分和方法,SLAM技术可以有效地支持机器人在复杂且未知的环境中进行导航和任务执行。