视觉SLAM-基本原理

以视觉传感器作为感知方式的SLAM称为视觉SLAM。按照建图稀疏程度来分,视觉SLAM技术可以分为稀疏SLAM,半稠密SLAM和稠密SLAM。虽然同为SLAM系统,但它们的侧重点并不完全一样。SLAM 系统最初的设想是为机器人提供在未知环境中探索时的定位和导航能力,其核心在于实时定位。以定位为目的,需要建立周围环境的路标点地图,进而确定机器人相对路标点的位置,这里的路标点地图即稀疏地图,地图服务于定位。但随着算法和算力的进步,SLAM逐渐被用于对环境的重建,也即把所有看到的部分都完整的重建出来。视觉SLAM中常用的传感器是相机,根据相机的工作工作方式不同,可以分为三类:单目相机(Monocular)、双目相机(Stereo)、深度相机(RGB-D)。

单目SLAM只用一个摄像头就可以完成SLAM。最大的优点是传感器简单且成本低,但同时也有个大问题,就是不能通过单张图片得到深度信息(距离),存在尺寸不确定的现象,比如丢失深度信息的相片中,我们能见到“手捏太阳”、“借位拍照”这样的现象。单目相机无法依靠一张图像获得图像中物体离自己的相对距离,为了估计相对深度,利用相机移动形成的图像,进行三角化,测量像素的距离。即是说,它的轨迹和地图,只有在相机运动之后才能收敛,如果相机不进行运动时,就无法得知像素的位置。同时,相机运动还不能是纯粹的旋转,这就给单目SLAM的应用带来了一些麻烦。单目相机结构简单,成本较低。本质上是拍照时的场景在相机的成像平面上留下一个投影,以二维的形式记录了三维的世界。单目SLAM估计的轨迹和地图,与真实的轨迹地图,相差一个因子,也就是所谓的尺度。由于单目SLAM无法仅凭图像确定这个真实尺寸,所以又称为尺度不确定性。本质原因是通过单张图像无法确定深度,为了得到这个深度,人们开始使用双目相机和深度相机。

双目SLAM利用左右目的视差计算像素的距离,从而实现自身的定位。立体视觉既可以在运动时估计深度,亦可在静止时估计,消除了单目视觉的无法得到深度信息的麻烦。不过通过双目图像计算像素距离,计算量大,而且在特征少的白墙或暗光环境易丢失目标。双目相机由两个单目相机组成,但这两个相机之间的距离(称为基线)是已知的。我们通过这个基线来估计每个像素的空间位置,基线距离越大,能够测量到的就越远,双目与多目的缺点是配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨率的限制,而且视觉计算非常消耗计算资源,需要使用GPU和FPGA设备加速后,才能实时输出整张图像的距离信息。因此在现有的条件下,计算量是双目的主要问题之一。

深度相机又称RGB-D相机,它最大的特点是可以通过红外结构光或Time-of-Flight(ToF)原理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。因此,它比传统相机能够提供更丰富的信息,也不必像单目或双目那样费时费力地计算深度。目前常用的RGB-D相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,在SLAM方面,主要用于室内。

<think>我们被要求解释视觉SLAM基本原理。根据引用材料,视觉SLAM(vSLAM)是指仅使用相机作为外部传感器的SLAM系统。它通常包含前端视觉里程计、后端优化、闭环检测和建图四个主要部分[^2][^5]。下面我将逐步解释视觉SLAM基本原理。 1. **传感器数据预处理(Sensor Data Processing)**: - 视觉SLAM系统从相机获取连续的图像帧。这些图像可能需要进行预处理,比如去畸变、灰度化、降噪等,以便后续处理。 2. **前端视觉里程计(Visual Odometry, VO)**: - 视觉里程计的目标是从连续的图像帧中估计相机的运动。它通过提取和匹配特征点(如SIFT、ORB、FAST等)来实现。 - 假设我们有两帧图像$I_k$和$I_{k+1}$,我们提取特征点并匹配它们,得到一组匹配点对$(p_i, p_i')$,其中$p_i$是$I_k$中的点,$p_i'$是$I_{k+1}$中的对应点。 - 然后,通过求解对极几何约束(Epipolar Constraint)来估计相机运动。对极约束可以表示为: $$ p_i'^T F p_i = 0 $$ 其中$F$是基础矩阵(Fundamental Matrix)。通过分解$F$可以得到相机从$I_k$到$I_{k+1}$的相对位姿变换(旋转矩阵$R$和平移向量$t$)。 - 另一种方法是直接法(如光流法),它最小化图像块之间的光度误差(Photometric Error)来求解相机运动。 3. **后端优化(Backend Optimization)**: - 后端优化主要处理SLAM过程中的噪声问题。视觉里程计的估计会累积误差,导致轨迹漂移。后端优化通过考虑多个帧之间的约束来优化整个轨迹和地图。 - 后端优化通常采用非线性优化方法(如Bundle Adjustment)或滤波器方法(如扩展卡尔曼滤波器EKF)。目前主流的是基于图优化的方法。 - 图优化将SLAM问题建模为一个图(Graph),其中节点(Nodes)表示相机的位姿(如$T_1, T_2, \dots, T_n$)和地图点(Landmarks)的位置,边(Edges)表示位姿之间或位姿与地图点之间的观测约束。 - 优化问题可以表示为最小化重投影误差(Reprojection Error): $$ \min_{T_k, X_i} \sum_{k,i} \| \pi(T_k \cdot X_i) - x_{k,i} \|^2 $$ 其中$T_k$是第$k$帧的相机位姿(变换矩阵),$X_i$是第$i$个地图点的3D坐标,$\pi$是投影函数(将3D点投影到图像平面),$x_{k,i}$是$X_i$在图像$k$中的观测(图像坐标)。 - 通过求解这个非线性最小二乘问题,我们可以得到优化的位姿和地图点位置[^4]。 4. **闭环检测(Loop Closure Detection)**: - 当相机重新访问之前到过的场景时,闭环检测模块能够识别出这种“回环”,并提供额外的约束给后端优化。 - 闭环检测通常使用词袋模型(Bag of Words)或深度学习方法来比较当前帧与过去关键帧的相似性。 - 一旦检测到闭环,系统会将当前帧与历史帧进行匹配,并添加一个位姿约束(即当前位姿应该与历史位姿一致),然后重新进行优化,从而消除累积误差。 5. **建图(Mapping)**: - 建图模块根据优化后的相机位姿和地图点构建环境地图。地图可以是稀疏的(仅包含特征点)、半稠密的(包含一些平面结构)或稠密的(包含所有像素的深度信息)。 - 对于视觉SLAM,通常首先构建稀疏地图,然后根据需要构建更稠密的地图。 综上所述,视觉SLAM基本原理是通过相机连续采集图像,利用前端视觉里程计估计相机运动,后端优化来校正运动轨迹和地图,闭环检测来消除累积误差,最终构建出环境地图并同时定位相机自身的位置[^3][^5]。 §§相关问题§§ 1. 视觉SLAM中常用的特征点提取和匹配算法有哪些? 2. 后端优化中图优化与滤波器方法有何区别? 3. 闭环检测中的词袋模型是如何工作的? 4. 如何评估视觉SLAM系统的性能?</think>### 视觉SLAM基本原理详解 视觉SLAM(Simultaneous Localization and Mapping)是一种仅依赖相机实现**实时定位与建图**的技术。其核心原理是通过连续图像帧推测相机运动轨迹并构建环境地图,主要流程分为五个模块(引用[5]的流程框架): --- #### 一、传感器数据预处理(Sensor Data Processing) - **输入**:相机连续帧$I_1, I_2, ..., I_k$(单目/双目/RGB-D) - **关键操作**: 1. 图像去畸变:校正镜头畸变,确保几何准确性 2. 特征提取:检测关键点(如ORB、SIFT特征)与边缘信息 3. 帧间关联:匹配相邻帧的特征点,建立数据关联 - **数学表达**: 设特征点集为$P_k = \{p_1, p_2, ..., p_n\}$,匹配约束为: $$ p_i^k \leftrightarrow p_j^{k+1} \quad (\forall i,j \in \text{匹配对}) $$ 此步骤为后续运动估计提供基础观测数据[^3][^5]。 --- #### 二、视觉里程计(Visual Odometry, VO) - **目标**:通过相邻帧特征点估计相机运动 - **核心算法**: 1. **对极几何**:利用基础矩阵$F$求解位姿变换 $$ p_2^T F p_1 = 0 \quad \text{(对极约束)} $$ 2. **PnP问题**:已知3D地图点与2D投影时,求解相机位姿$T_k \in SE(3)$: $$ T_k = \arg\min \sum \| \pi(T \cdot X_i) - x_i \|^2 $$ 其中$\pi$为投影函数,$X_i$为3D点坐标[^3] - **输出**:相机位姿变化量$\Delta T_{k,k+1}$(含累积误差) --- #### 三、后端优化(Backend Optimization) - **目标**:消除VO累积误差,优化轨迹与地图 - **方法**: 1. **滤波法**(如EKF):维护状态向量$\mathbf{x} = [\text{位姿}, \text{地图点}]$的置信分布 2. **图优化法**(主流):构建位姿-路标约束图 - 顶点:相机位姿$T_k$与地图点$X_i$ - 边:VO观测约束与闭环约束 3. **优化问题**:最大后验概率估计(MAP) $$ \mathbf{x}^* = \arg\max P(\mathbf{x} | \mathbf{z}) $$ 等价于最小化非线性最小二乘: $$ \min \sum_k \| e_k(\mathbf{x}) \|_{\Sigma_k}^2 $$ 其中$e_k$为残差项,$\Sigma_k$为协方差矩阵[^4] --- #### 四、闭环检测(Loop Closure Detection) - **目标**:识别重返场景,消除长期漂移 - **流程**: 1. **场景识别**:用词袋模型(Bag-of-Words)比对当前帧与历史关键帧 2. **几何验证**:通过RANSAC算法检验匹配一致性 3. **添加约束**:向优化图添加闭环边$T_i \leftrightarrow T_j$ - **作用**:将全局误差从米级降至厘米级[^4][^5] --- #### 五、建图(Mapping) - **地图类型**: | 地图形式 | 存储内容 | 应用场景 | |--------------|-------------------------|----------------| | **稀疏地图** | 关键点云($X_i \in \mathbb{R}^3$) | 定位导航 | | **稠密地图** | 表面网格/体素 | 避障、重建 | | **语义地图** | 带标签的物体/平面 | 高层决策 | - **构建方法**: - 三角化:从多视角观测恢复3D点坐标 - 深度滤波:融合RGB-D数据或双目视差 - 表面重建:用TSDF或Poisson重建算法[^3] --- ### 技术特点总结 1. **硬件依赖低**:仅需相机(vs 激光雷达数万元成本)[^1] 2. **信息丰富**:纹理、颜色等视觉信息增强场景理解 3. **挑战**: - 动态物体干扰 → 多模型跟踪 - 光照变化 → 自适应特征提取 - 计算复杂度 → GPU加速优化[^2][^4] > **案例**:扫地机器人通过视觉SLAM构建家庭地图: > 1. 摄像头提取墙角/家具特征点 → VO估计移动轨迹 > 2. 检测到重复场景(如客厅入口) → 闭环校正轨迹 > 3. 最终输出2D栅格地图供路径规划[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值