SLAM框架流程自查手册
SLAM全流程介绍
总体Review
SLAM(Simultaneous Localization and Mapping,同时定位与建图)是机器人学、无人驾驶和增强现实等领域的关键技术,用于在未知环境中同时构建环境的地图,并通过地图进行自身定位。SLAM的典型框架包括一系列传感器数据处理、地图构建和定位的核心模块。以下是SLAM完整框架的详细流程:
1. 传感器输入
SLAM系统需要从多个传感器获取环境信息,这些传感器包括:
激光雷达(LiDAR):用于获取环境的深度和距离信息,通常用于构建2D或3D点云。
相机:单目、双目或RGB-D相机用于捕捉场景的图像或深度信息,视觉SLAM基于此展开定位与建图。
惯性测量单元(IMU):提供机器人的加速度、角速度等运动信息。
轮速计(Odometry):跟踪机器人的位移与速度变化,通常与IMU结合用于推测位姿。
传感器输入是SLAM的起点,不同的SLAM算法可能只使用其中一种或多种传感器结合进行操作。
2. 前端处理(Front-end Processing)
前端处理主要负责从传感器数据中提取有用的特征,并建立机器人与环境之间的初步关系。
2.1. 数据预处理
从传感器获取的原始数据需要进行预处理,如去噪、图像畸变矫正等,以便后续特征提取和数据融合。比如对于视觉SLAM,需要对相机图像进行去畸变、灰度化等操作;对于LiDAR,需要将点云数据投影到平面或其他合适的表示方式。
2.2. 特征提取与匹配
特征提取是SLAM前端的重要步骤,系统会在传感器数据中提取环境中的关键特征点,以便后续跟踪和匹配。常见的特征提取方法包括:
视觉特征:如SIFT、ORB、FAST等关键点检测算法,在图像中提取出角点或其他稳定的局部特征。
点云特征:如通过点云处理算法提取几何形状(如平面、线条等)。
接下来,系统会进行特征匹配,找到前后帧中的相同特征点,这些匹配特征可以用于推断机器人在两帧之间的运动。
2.3. 位姿估计(Odometry)
通过前后帧的特征点匹配,SLAM系统可以估计机器人在环境中的相对运动(即位姿变化)。位姿估计可以通过:
视觉里程计(Visual Odometry, VO):从图像特征匹配中推断位姿变化。
激光雷达里程计(LiDAR Odometry):通过匹配不同帧之间的点云数据计算位姿。
IMU融合:惯性测量单元(IMU)的数据可以辅助位姿估计,尤其是在高动态运动场景下。
位姿估计给出的是一个局部的、短期内的位移信息,帮助机器人了解自己从一个位置移动到另一个位置的相对变化。
3. 后端处理(Back-end Processing)
SLAM的后端负责更全局的优化任务,确保系统在长期运行时能够精确地进行定位和地图构建。后端的主要功能是通过全局优化来解决累计误差的问题。
3.1. 图优化(Graph-based Optimization)
后端会将机器人在不同时间的位姿作为图的节点,将传感器的相对位姿变化作为边。通过优化该图结构,系统可以减少里程计估计中的累计误差,从而使机器人的位姿和地图更准确。常用的图优化算法包括:
非线性优化:如g2o(General Graph Optimization)或Ceres Solver,用来优化位姿图的整体结构。
因子图(Factor Graphs):通过加入不同类型的边(如回环检测的约束、IMU测量的约束),进一步优化地图和位姿。
3.2. 回环检测(Loop Closure Detection)
SLAM中一个常见问题是“漂移”,即由于误差积累导致位姿估计越来越不准确。为了解决这一问题,SLAM系统会在运行过程中进行回环检测,即检测到机器人经过了一个已知的区域。
回环约束:当系统检测到机器人回到一个已经探索过的地方时,它会施加一个约束,使当前的位姿与过去的位置关联,从而校正路径。
闭环优化:回环检测后,系统会对整个位姿图进行全局优化,减少因漂移引起的误差,确保地图的精度。
4. 地图构建(Mapping)
地图构建是SLAM的另一个关键任务,目标是生成一个能够准确表示环境的地图。常见的地图表示方式包括:
稀疏地图:主要由特征点组成,常见于视觉SLAM中。稀疏地图可以提供相对简单的位姿关系,但对场景细节捕捉较少。
稠密地图:由点云、体素(voxel)或网格组成,能够捕捉更详细的环境信息,适用于需要高精度场景描述的应用。LiDAR SLAM常用于生成稠密点云地图。ps, 前一篇3D-GS处理的就是这一个方面的任务。
语义地图:在地图中添加语义标签,如物体类别、道路、障碍物等,有助于机器人理解环境。
5. 定位(Localization)
SLAM不仅仅是建图,还需要机器人在地图中实时知道自己的位置。定位通过以下步骤实现:
局部定位:结合里程计信息和当前环境特征,推测当前位姿。
全局定位:通过全局优化,确保机器人在全局地图中的位置是准确的,尤其是在回环检测后进行修正。
6. 数据融合
SLAM系统通常会融合来自不同传感器的数据,以增强精度和鲁棒性。数据融合方法包括:
卡尔曼滤波(Kalman Filter):用于融合连续传感器数据,特别是在传感器噪声较小时适用。
扩展卡尔曼滤波(Extended Kalman Filter, EKF):用于处理非线性系统中的数据融合。
粒子滤波(Particle Filter):特别适用于高噪声或多模态数据的融合。
IMU数据融合:IMU的高频率运动数据可以帮助SLAM系统在快速运动或短时间内丢失视觉信息时保持位姿估计的准确性。
7. 结果输出
SLAM的最终输出包括两个关键部分:
机器人的位姿轨迹:SLAM系统能够生成机器人的整个运动轨迹,帮助后续的路径规划与导航。
环境地图:根据需求,输出稀疏或稠密地图,为自动驾驶、机器人路径规划、AR/VR等应用提供支持。
总结
SLAM框架的完整流程可以概括为从传感器数据采集开始,经过前端特征提取、位姿估计、后端图优化、回环检测、地图构建和定位等步骤,最终生成机器人在环境中的位姿和地图。这一过程涉及了大量的传感器数据处理、几何计算和全局优化技术,广泛应用于无人驾驶、机器人、AR/VR等领域。
环境搭建
暂时可参考以下链接,其余踩坑记录再继续更新(已搭建完毕,基本上无问题)。
视觉SLAM十四讲环境搭建(测试环境Ubuntu20.04) - Methodologist的文章 - 知乎
C++数据库使用介绍
Eigen
核心是一个矩阵运算的库,可以声明矩阵和向量。比较出名的是其中的块操作。
这边直接上链接给别人整理好的参考资料。
参考资料:Eigen库学习教程
Pangolin
Pangolin是一个基于OpenGL的轻量级开源绘图库,在许多开源SLAM算法(例如ORB-SLAM)中都会用来进行可视化操作。
不过没什么官方教程,这里再给一个车票:
Sophus
李群李代数是描述位姿比较常用的一种表达形式。但是,在Eigen中并不提供对它的支持,一个较好的李群和李代数的库是Sophus库,它很好的支持了SO3、so3、SE3、se3。
OpenCV
计算机视觉常用库,基本不用介绍,回头补充(随时记录)一些常用的函数
Ceres
Ceres是由Google开发的开源C++通用非线性优化库,与g2o并列为目前视觉SLAM中应用最广泛的优化算法库。
g2o
DBoW3
DBoW3是DBoW2的增强版,这是一个开源的C++库,用于给图像特征排序,并将图像转化成视觉词袋表示。它采用层级树状结构将相近的图像特征在物理存储上聚集在一起,创建一个视觉词典。DBoW3还生成一个图像数据库,带有顺序索引和逆序索引,可以使图像特征的检索和对比非常快。
PCL
PCL(Point Cloud Library) 是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。
octomap
octomap是一种基于八叉树的三维地图创建工具, 可以显示包含无障碍区域及未映射区域的完整3D图形, 而且基于占有率栅格的传感器数据可以在多次测量中实现融合和更新; 地图可提供多种分辨率, 数据可压缩, 存储紧凑. 事实上, octomap的代码主要包含两个模块: 三维地图创建工具octomap和可视化工具octovis
ROS
ROS的核心还是在于代码通讯和仿真生态。
先贴一个入门的博客:ROS简介-从零开始讲解ROS(适合超零基础阅读)