概念
视觉SLAM(Simultaneous Localization and Mapping)系统中,整个过程通常分为 前端 和 后端 两个主要部分。前端处理的是从传感器数据(如相机图像、激光雷达等)中提取和处理信息,用于实时定位和建图,而后端则负责全局优化、地图生成和精确化。
SLAM前端
前端的核心任务是处理传感器数据(如图像、IMU等)并生成与位姿相关的局部信息。主要包括 特征提取、匹配、位姿估计 和 局部优化。
前端 有时被称为 视觉里程计(Visual Odometry,VO)。在 视觉SLAM 系统中,前端的任务通常包括 从相机图像中估计相机的相对运动,这正是视觉里程计的核心任务。
1.1 视觉里程计(VO):
视觉里程计是指通过连续的图像序列来估计相机的 相对运动(即位移和旋转)。它只关注相机的运动估计,而不依赖于全局地图或回环检测,通常用于短期、局部的运动估计。是前端的一部分,负责估计相机的相对运动。
前端除了执行视觉里程计(估计相机相对运动)外,还会进行一些其他任务,例如:特征提取与匹配、位姿估计(通过方法如PNP等)、局部地图构建(局部优化),滑动窗口优化等。
步骤
- 传感器数据预处理
点云滤波:点云数据通常包含噪声和离群点,需要通过滤波方法进行清理。常见的滤波方法包括统计滤波(Statistical Outlier Removal)、体素滤波(Voxel Grid Filter)、直通滤波(Pass-through Filter)等。滤波之后还会进行点云平滑(冲裁样)
图像预处理:对于视觉SLAM,图像的预处理包括去畸变、灰度化、降噪等操作。
利用图像生成点云的代码:可以看我这篇文章 点云滤波与重采样可以看这篇文章
1.1 特征提取
关键点检测:从图像中提取关键点(如角点、边缘、特征点等),常见的算法包括 SIFT、SURF、ORB、FAST、BRIEF 等。
特征描述符生成:为每个关键点生成描述符(特征向量),描述符用于匹配不同视角下的相同物理点。常见的描述符有 ORB、BRIEF 等。
1.2 特征匹配
局部匹配(粗匹配):通过描述符,在不同时间的图像中找到相同或相似的特征点。例如,通过 暴力匹配(Brute-Force) 或 FLANN(Fast Library for Approximate Nearest Neighbors) 来匹配特征点。
精匹配:如ICP
外点剔除:使用 RANSAC 算法去除错误匹配点(外点),确保匹配点的准确性。
1.3 位姿估计
PnP (Perspective-n-Point):根据已知的3D点和其在图像中的投影,估计相机的旋转和位移,进而求得相机的 位姿(位置与朝向)。常用的方法包括 EPnP、UPnP。
光流法(Optical Flow):通过估计像素点在连续图像帧之间的运动,来计算相机的相对位姿。
1.4 局部地图构建
将多帧点云数据融合到一个统一的坐标系中,形成完整的环境地图。
局部优化:根据前端估计的相机位姿,进行局部地图的更新。通过 局部地图(如特征点、深度图、关键帧等)来帮助改进定位精度。
1.5 滑动窗口优化(Sliding Window Optimization)
滑动窗口:为了保持实时性,通常只处理一小部分最近的帧(例如,前几帧或一段时间的帧)。滑动窗口优化能够减少计算负担,同时保证定位精度。
局部一致性:前端会维持一个 滑动窗口,随着新帧的加入,窗口中只保留当前的几帧,这样能够在局部范围内进行优化,使得前端的估计更加精确。
SLAM后端
后端主要负责全局优化,包括 回环检测、全局图优化 和 地图精细化。它主要是处理前端产生的数据,通过全局优化来纠正位姿的漂移和误差。
2.0 多传感器融合
IMU与视觉数据融合:通过时间戳对齐和姿态对齐(如四元数插值)将IMU数据与视觉数据融合,以提高定位精度
2.1 回环检测(Loop Closure Detection)
回环检测:当机器人回到已知的位置时,后端需要检测到这个回环(即,识别该位置已经被之前的帧访问过)。这有助于减少累积误差,恢复全局一致性。
方法:常用的回环检测算法包括基于 Bag of Words 的方法、 FabMap、 ORB-SLAM 的回环检测等。
2.2 图优化(Graph Optimization)
图模型:后端通过构建 图优化模型,将机器人位姿和地标视为图的节点,而它们之间的相对约束(如运动约束、观测约束)则是图中的边。图的边通常对应前端得到的相对位姿、地标观测等约束。
非线性优化:使用 非线性最小二乘法 或 Levenberg-Marquardt 算法来优化图中节点的位置,最小化边约束的误差。常见的优化框架包括 g2o、Ceres Solver。
2.3 地图优化
地图更新:后端根据优化后的位姿和地图信息来更新全局地图。随着回环检测的成功,地图会得到纠正和优化。
图优化:地图的精细化不仅包括位姿优化,还包括 地标位置 的优化和重定位,确保整个地图的一致性和精确度。 如Bundle Adjustment 方法,见文章中的代码部分
2.4 姿态修正与全局一致性
姿态校正:由于前端的累积误差,后端的全局优化会对机器人的姿态进行修正,确保地图和轨迹的准确性。
全局一致性:图优化后的结果不仅能修正回环检测引入的误差,还能确保地图在全球范围内的一致性。
2.5 地图构建与精细化
地图生成:通过前端和后端的共同工作,最终生成的地图包含了机器人的位姿轨迹以及环境中的特征点或地标。
稀疏/密集地图:根据所使用的算法和传感器类型,地图可以是 稀疏地图(由特征点组成)或 密集地图(如通过深度图或语义分割得到的更丰富的地图数据)。
前端与后端的协同工作
前端的作用:实时获取传感器数据,估计局部的位姿变化,并不断更新局部地图。前端通常依赖于滑动窗口优化、特征匹配和位姿估计,保证实时性和定位精度。
后端的作用:对前端的输出进行全局优化,确保全局轨迹的一致性和精确性,尤其是在回环检测和图优化过程中,解决长期累积的误差问题。
视觉SLAM的典型系统架构
ORB-SLAM:一个经典的视觉SLAM系统,使用 ORB 特征进行匹配,支持回环检测和图优化,适用于大规模的环境。
LSD-SLAM:密集SLAM系统,基于直接法(不依赖特征提取和匹配),直接使用图像的像素强度进行位姿估计和地图构建。
VINS-Mono:一个基于单目相机和IMU的视觉惯性SLAM系统,结合了视觉和惯性传感器的数据进行位姿估计。