【视觉SLAM:一、初识SLAM】
视觉SLAM(Simultaneous Localization and Mapping,简称视觉SLAM)是机器人和计算机视觉领域的重要研究方向。它的核心目标是利用摄像头获取的图像数据,在未知环境中实现同时定位(Localization)与建图(Mapping)。视觉SLAM的应用场景广泛,包括自动驾驶、增强现实、无人机导航等。
以下从“易于理解的小萝卜例子”、“经典视觉SLAM框架”、“SLAM问题的数学表述”和“实践基础”四个方面详细介绍视觉SLAM
小萝卜的例子:SLAM的简单理解
-
故事背景: 假设有一个机器人“小萝卜”,它被放置在一个完全未知的房间内。小萝卜的任务是:
- 知道自己当前在房间里的位置(定位)。
- 画出房间的地图(建图)。
-
问题挑战:
- 小萝卜没有现成的地图,也无法直接知道自己的位置。
- 小萝卜只能依靠自己的“眼睛”(摄像头)和传感器来感知环境。
- 随着小萝卜的移动,它需要边定位边更新地图。
-
解决方案:
- 小萝卜利用视觉SLAM技术,在每一步获取图像信息,检测其中的特征点,并通过匹配和优化,估计自己的位姿,同时建立和更新环境的地图。
- 这就形成了视觉SLAM的核心目标:在未知环境中,使用视觉传感器同时完成定位和建图任务。
经典视觉SLAM框架
视觉SLAM系统通常被划分为以下四大模块,每个模块都承担着不同的任务,共同构建完整的SLAM框架:
视觉里程计
- 作用:负责估计机器人当前帧与前一帧之间的相对位姿变化(运动估计)。
- 关键技术:
- 特征点法:通过提取图像中的特征点(如ORB特征),进行匹配,并通过几何关系(如基础矩阵、单应矩阵等)计算相对运动。
- 直接法:利用像素灰度信息直接最小化重投影误差,估计运动。
后端优化
- 作用:通过全局一致性的方式,优化机器人所有关键帧的位姿和地图点的坐标,减小累计误差。
- 关键技术:
- 图优化:将关键帧和地图点建模为图的顶点,运动和观测约束建模为图的边,利用g2o、Ceres等库进行非线性优化。
- 捆绑调整(Bundle Adjustment, BA):在多帧图像上联合优化相机位姿和地图点坐标。
回环检测
- 作用:当机器人经过先前访问过的位置时,识别出这一位置,闭合地图中的“环”以消除漂移误差。
- 关键技术:
- 基于词袋模型的场景匹配:通过对图像特征描述子的离线训练,快速判断新图像与先前关键帧的相似性。
- Sim(3)优化:在单目系统中,通过Sim(3)变换同时优化尺度、旋转和位移。
建图
- 作用:将估计的位姿和地图点信息结合起来,生成稠密或稀疏的地图。
- 关键技术:
- 稀疏建图:仅利用特征点构建地图,计算高效但地图表达较为粗糙。
- 稠密建图:基于深度图或稠密点云生成完整地图,通常使用RGB-D相机。
SLAM问题的数学表述
视觉SLAM本质上是一个优化问题,其数学形式可以描述为:
问题定义
- 输入:
- 图像序列(视觉信息)。
- 可选的其他传感器数据(IMU、激光雷达等)。
- 输出:
- 机器人在环境中的轨迹(位姿序列)。
- 环境地图。
状态表示
- 相机位姿:
- 相机在每个时刻的位姿用 T i ∈ S E ( 3 ) \mathbf{T}_i\in SE(3) Ti∈SE(3),其中 T i \mathbf{T}_i Ti包括旋转和平移。
- 地图点:
- 环境中3D地图点的坐标用 X j ∈ R 3 \mathbf{X}_j\in\mathbb{R}^3 Xj∈R3 表示。
优化目标
SLAM的目标是优化所有位姿 T i \mathbf{T}_i Ti和地图点 X j \mathbf{X}_j Xj,使得以下误差函数最小化: min { T i , X j } ∑ i , j ρ ( ∥ z i j − π ( T i , X j ) ∥ 2 ) \min_{\{\mathbf{T}_{i},\mathbf{X}_{j}\}}\sum_{i,j}\rho\left(\|\mathbf{z}_{ij}-\pi(\mathbf{T}_{i},\mathbf{X}_{j})\|^{2}\right) {Ti,Xj}mini,j∑ρ(∥zij−π(Ti,Xj)∥2)
- z i j z_{ij} zij:相机𝑖i对地图点𝑗的观测。
- π:投影函数,用于将地图点 X j \mathbf{X}_j Xj投影到相机𝑖的像素平面。
- ρ:鲁棒核函数,用于抑制异常观测对优化的影响。
实践:视觉SLAM编程基础
安装Linux操作系统
- 视觉SLAM开发通常在Linux系统下进行(如Ubuntu),因为其支持丰富的开源工具和库。
- 安装步骤:
- 下载Ubuntu ISO镜像文件。
- 制作启动盘并完成安装。
- 参考连接
- win乌班图双系统安装(win11、Ubuntu20.04)及安装后的环境、软件配置
- Ubuntu 20.04.6(一):系统安装(单系统,双系统均可)
使用CMake
- CMake简介:跨平台的项目构建工具,用于管理和构建C++工程。
- 使用方法:
- 编写CMakeLists.txt文件,定义源文件、依赖库、编译选项等。
- 使用命令cmake生成Makefile,并用make进行编译。
- 优点:自动化项目管理、支持跨平台构建、易于与第三方库集成。
- 参考连接
- 视觉惯性SLAM:二、编译及编译工具
使用库
- SLAM开发中需要大量的第三方库,常用的有:
- Eigen:高效的矩阵运算库,用于几何计算。
- OpenCV:计算机视觉库,用于图像处理和特征提取。
- Pangolin:轻量级图形显示库,用于可视化。
- g2o:图优化库,用于SLAM中的后端优化。
使用IDE
- 推荐的C++开发IDE:
- CLion:功能强大的CMake集成IDE,适合中大型项目。
- VSCode:轻量化的文本编辑器,配置C++插件后可用于SLAM开发。
- Qt Creator:支持GUI开发,适合需要界面的SLAM工具。
总结
视觉SLAM是机器人技术和计算机视觉领域的核心课题,其目标是实现定位与建图的同步。通过“小萝卜”的例子,我们理解了SLAM的基本任务;通过“经典视觉SLAM框架”,我们剖析了视觉里程计、后端优化、回环检测和建图模块的核心功能;通过“数学表述”,我们理解了SLAM问题的本质是一个非线性优化问题;最后,通过“编程基础”,我们掌握了SLAM开发所需的操作系统、工具链、库和IDE。理解这些内容是深入学习和开发SLAM系统的重要基础。