SLAM分为定位和建图两个问题。
定位问题
定位问题是通过传感器观测数据直接或间接求解位置和姿态。
通常可以分为两类:基于已知地图的定位和基于未知地图的定位。
基于已知地图的定位
利用预先构建的地图,结合传感器数据进行全局定位。SLAM中的全局定位是指在地图参考系下的定位,而全局地图只是在较大范围内完整的环境地图,所以本质上还是局部相对定位。
基于未知地图的定位
传感器分为两类:一种是安装在机器人本体上的,如轮式编码器、IMU、相机、激光传感器等;另一种是安装在环境中的,如导轨、二维码路标、UWB、GPS等。环境中的传感器通常能够直接测量机器人的位置信息,提供简单有效的定位解决方案。然而,由于需要在环境中进行设置,限制了机器人的使用范围。相反,安装在机器人本体上的传感器测量的通常是间接的物理量而不是直接的位置数据,需要通过间接方法推算位置,但其优点是不对环境提出特定要求。
引入SLAM的主要目的如下:
1)建图。在传感器性能良好的环境下,使用SLAM技术可以构建高精度的全局地图。这些构建的地图将为后续的定位、导航等功能提供支持。
2)定位。在视觉SLAM中,通过帧间特征点匹配可以计算出相机的相对变换,对应地推算出机器人的位姿信息。然而,这种计算方法会引入累积误差。利用SLAM构建的全局地图,通过相机采集的环境信息与地图进行匹配,可以实现重定位,从而消除累积误差的影响,获得更加精确的机器人位姿。
3)导航。如果我们建立的地图中包含了可通行区域和不可通行区域的信息,那么可以利用这些信息实现机器人的路径规划和路径跟踪,从而使机器人能够在地图中从起点到达终点,并能够对地图中的静态障碍物进行避障。导航所用地图要求是稠密地图。
建图问题
建图问题是利用传感器位姿和观测数据求解被观测物体的位置。
通常可以分为两类:全局建图和局部建图。全局建图涉及在较大范围内生成完整的环境地图,而局部建图则关注于在特定区域内生成详细的地图信息。建图过程中可能需要对环境进行多次扫描和数据融合,以提高地图的精度和一致性。
经典视觉SLAM框架
整个视觉 SLAM 流程包括以下步骤。
- 传感器标定、数据采集。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。
- 视觉里程计(Visual Odometry,VO)。视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端(Front End)。
- 后端优化(Optimization)。后端接收不同时刻视觉里程计测量的相机位姿,对它们进行批量式优化,减轻累积误差,此外接收回环检测的信息,消除累积误差,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。
- 回环检测(Loop Closing)。回环检测判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
- 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。
需要注意的是,前端包括后端优化得到的运动信息始终包含累积误差,该累积误差在SLAM中只能通过回环检测或者与预先建立好的具有较高精度的全局地图匹配来消除。
视觉SLAM方案可按照传感器的不同(单目、双目、RGBD、与IMU的组合等)、前端方法的不同(主要分为直接法和特征点法)、后端优化方案的不同(滤波或者非线性优化)、生成地图形式的不同(稀疏地图、稠密地图等)具有不同的划分。
SLAM 问题的本质:对运动主体自身和周围环境空间不确定性的估计。为了解决SLAM问题,我们需要状态估计理论,把定位和建图的不确定性表达出来,然后采用滤波器或非线性优化,估计状态的均值和不确定性(方差)。
SLAM 问题的数学表述
- 什么是运动?我们要考察从 k − 1 k-1 k−1时刻到 k k k时刻,机器人的位置 x x x是如何变化的。
- 什么是观测?假设机器人在 k k k时刻于 x k x_{k} xk 处探测到了某一个路标 y j y_{j} yj。
其中 O \mathcal{O} O是一个集合,记录着在哪个时刻观察到了哪个路标(通常不是每个路标在每个时刻都能看到的——我们在单个时刻很可能只看到一小部分)。这两个方程描述了最基本的 SLAM 问题:当知道运动测量的读数 u u u,以及传感器的读数 z z z时,如何求解定位问题(估计 x x x)和建图问题(估计 y y y)?这时,我们就把SLAM问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
状态估计问题的求解,与两个方程的具体形式,以及噪声服从哪种分布有关。按照运动和观测方程是否为线性,噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。