ORB-SLAM2阅读笔记

ORB-SLAM2系统包括预处理、跟踪、局部建图和闭环检测四个部分。预处理涉及特征点提取和匹配;跟踪通过不同运动模型估计相机位姿;局部建图涉及关键帧插入、地图点剔除和局部BA;闭环检测则用于检测和纠正系统中的闭环错误,优化全局位姿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


    从RGB-D相机获取帧,对输入的图片进行预处理,寻找特征点, 进行特征匹配用BA来做最小化重投影误差,进行跟踪和定位每帧的相机(即算出R t)。运用局部BA算法设置局部地图并优化(当前帧与地图中的3D路标点进行匹配来估计相机位姿),
一、预处理:
    从RGB相机提取出ORB特征(具有尺度旋转不变性),生成立体坐标,得到特征点。
    ORB特征: FAST关键点,例如FAST-9 FAST-12,只需要比较一个像素与邻域像素的灰度差别大不大。但是原始的FAST角点经常会出现“扎堆”现象,所以在第一遍检查后要进行非极大值抑制,在一定区域内仅仅保留响应极大值的角点。在ORB中对FAST进行改进,指定最终提取的角点数量N,对原始角点算Harris值后选取前N个角点最为最终角点集合。另外,构建图像金字塔并在每一层上面检测角点(分辨率越高角点数量越多)来保持尺度不变性,用灰度质心法来描述旋转。提取了Oriented FAST关键点后,对每个点用改进的BRIEF描述子计算,使得描述子具有平移、旋转和缩放的变换下仍然具有良好的表现。然后用“汉明距离“描述子距离描述两个特征点之间的相似程度,特征点数量很大,因此用FLANN快速近似最近邻算法匹配。
    补充1:用改进的ORB做特征点匹配后,得到不同帧之间的特征点对,用RANSAC五点法求取本质矩阵F,进而得到相机的位姿R t。五点法的具体思想是:如果采用最小二乘法,难免因为一些误匹配而导致会有较大的偏差,RANSAC的思想就是先随机选取5个点,计算出本质矩阵F,然后检测其他的点是否满足本质矩阵,得到满足该本质矩阵的个数(内点),进而进行迭代,得到内点最多的那个本质矩阵即为所求。五点算法不受点集共面的影响。

二、跟踪:
    主要思路是在当前帧和局部地图之间找出更多的对应关系,以此来优化当前帧的位姿。
    跟踪里面的三种运动模型解释,这三种模型都是用来得到当前帧的位姿T的。
    (1)MotionModel
        恒速运动模型,假设运动是匀速的,根据上一帧的跟踪结果得到一个运动速度,v*t就可以估算当前帧的位姿
    (2)RefrenceModel
        根据匹配后两帧之间的约束关系来求解位姿估计
    (3)RelocalizationModel
        在跟丢了以后,把当前帧放到local map中去,找到在database中与当前帧最相似的那一帧(类似于loop closing)。先选出一些候选关键帧,然后将候选关键帧一个个与当前帧的BoW去匹配,不行就抛弃,最后用PnP去求解当前帧与关键帧的位姿,并优化,优化不行的也抛弃。
        局部地图跟踪:前面已经得到了对位姿的估计,通过投影可以得到更多的对应关系,与current frame 有共同点的局部地图中关键帧序列为K1,在covisibility graph中与K1相邻的称为k2。loacl map 中有一个帧(属于K1),它和current frame共同观测到的点最多。针对k1  k2可见的每一个地图点云,通过如下步骤,在current frame中搜索:
        a.将 地图点投影到当前帧上,如果超出图像范围,就将其舍弃;
       b. 计算当前视线方向向量v与地图点云平均视线方向向量n的夹角,舍弃n·v < cos(60°)的点云; 
        c. 计算地图点到相机中心的距离d,认为[dmin, dmax]是尺度不变的区域,若d不在这个区域,就将其舍弃; 
        d. 计算图像的尺度因子,为d/dmin;
        e . 将地图点的特征描述子D与还未匹配上的ORB特征进行比较,根据前面的尺度因子,找到最佳匹配。
        关键帧的选择,可以根据时间间隔或者特征点数目的阈值来判断是否插入新的关键帧。
        关键帧的标准:
              a.
<think>嗯,用户让我介绍一下ORB-SLAM2的学习笔记。我需要先回忆一下ORB-SLAM2的基本框架和核心部分。ORB-SLAM2是一个比较经典的视觉SLAM系统,分为几个主要模块:特征提取、跟踪、局部建图、回环检测和地图管理。首先,我应该从系统架构开始介绍,说明各个模块的作用和相互关系。 接下来,用户可能需要了解ORB特征的相关内容。ORB特征结合了FAST关键点检测和BRIEF描述子,具有旋转不变性和一定的尺度不变性。这部分需要详细解释ORB特征的提取过程,包括如何构建图像金字塔,计算方向,生成描述子等步骤。 然后是跟踪线程,也就是Tracking部分。这里需要说明如何通过帧间匹配、运动模型或重定位来估计相机位姿。可能需要提到初始化的过程,比如使用单应矩阵或基础矩阵来恢复运动,以及如何三角化初始地图点。 局部建图模块负责处理新的关键帧,剔除冗余点,进行局部BA优化。这部分需要解释BA(Bundle Adjustment)的概念,以及如何优化相机位姿和地图点。同时,还要提到关键帧的选择策略,比如根据共视点数量或时间间隔来决定是否插入新的关键帧。 回环检测和地图融合部分也是重点。这里需要讲DBoW2的词袋模型,如何通过视觉词典检测回环,然后进行Sim3优化来校正漂移。此外,还要说明全局BA优化在回环校正后的作用,以及如何优化整个地图的一致性。 ORB-SLAM2支持单目、双目和RGB-D相机,需要比较不同传感器下的系统表现。比如单目初始化困难,存在尺度不确定性,而双目和RGB-D可以直接获取深度信息,初始化更简单。 在优缺点分析方面,优点包括实时性高、支持多传感器、具备回环检测和重定位能力。缺点可能有对动态环境敏感,单目模式下尺度问题,以及特征提取在纹理缺失区域效果差。可以提到后续的ORB-SLAM3在IMU融合和多地图系统上的改进。 最后,学习建议部分应该推荐一些资源,比如论文、代码库、书籍和课程。同时建议从基础开始,动手实践,并参与社区讨论。 需要注意的是,用户可能希望了解实际应用中的问题,比如如何调整参数,处理特定场景的挑战,或者如何扩展ORB-SLAM2的功能。不过根据用户的问题,主要是介绍学习笔记,所以需要结构清晰,分点说明,确保覆盖主要模块和关键点。 可能还需要检查LaTeX格式是否正确,比如公式是否用$或$$包裹,变量是否正确。例如,提到BA优化时,可以写目标函数是$$\min \sum \| \pi(X, T) - x \|^2$$,其中$T$是位姿,$X$是地图点。确保这些公式的格式正确。 总之,我需要按照系统架构、特征提取、跟踪、局部建图、回环检测、多传感器支持、优缺点、学习建议的结构来组织内容,使用清晰的中文,正确插入公式,并确保技术细节准确。</think>以下为ORB-SLAM2学习笔记的整理,按模块分阶段说明: --- ### 一、系统架构 $$ \text{ORB-SLAM2} = \text{Tracking} + \text{Local Mapping} + \text{Loop Closing} + \text{Map} $$ 三大线程并行运行: 1. **Tracking线程**:实时估计相机位姿($T_{cw} \in SE(3)$) 2. **Local Mapping线程**:局部BA优化与地图点维护 3. **Loop Closing线程**:回环检测与全局优化 --- ### 二、ORB特征提取 - **FAST关键点检测**:阈值化像素差异($|I_p - I_{center}| > \delta$) - **BRIEF描述子**:二进制编码(256-bit,汉明距离匹配) - **改进特性**: - 图像金字塔实现尺度不变性($n$层缩放,比例因子$s=1.2$) - 灰度质心法计算方向($m_{10}=\sum xI(x,y), m_{01}=\sum yI(x,y)$) --- ### 三、跟踪线程(Tracking) 1. **初始位姿估计**: - 通过上一帧运动模型预测:$T_{k} = T_{k-1} \cdot T_{k-1}^{k}$ - 或通过特征匹配与PnP求解:$\min_T \sum \| \pi(T \cdot X_i) - x_i \|^2$ 2. **关键帧判定**: - 跟踪质量下降(匹配点 < 阈值) - 距离上一关键帧超过20帧 --- ### 四、局部建图(Local Mapping) 1. **局部BA优化**: $$ \min_{T_i, X_j} \sum \| \pi(T_i \cdot X_j) - x_{ij} \|^2 + \rho(\| T_i^{-1}T_j \|) $$ - 仅优化当前关键帧及其共视关键帧 2. **地图点剔除**: - 观测次数 < 2- 重投影误差 > $\chi^2$阈值($\chi^2_{0.95}=5.991$) --- ### 五、回环检测(Loop Closing) 1. **词袋模型(DBoW2)**: - 离线训练视觉词典(k-means树结构) - 计算相似性得分:$s = \frac{\langle v_q, v_t \rangle}{\|v_q\| \|v_t\|}$ 2. **Sim3优化**: $$ \min_{S} \sum \| \pi(S \cdot X_i) - x_i \|^2 + \| \pi(S^{-1} \cdot X_j') - x_j' \|^2 $$ - 解决尺度漂移问题($S \in Sim(3)$) --- ### 六、多传感器支持 | 传感器类型 | 初始化方式 | 深度获取方法 | |------------|---------------------|-----------------------| | 单目 | 分解H/F矩阵 | 三角化(需运动) | | 双目/RGB-D | 直接构造深度图 | 视差/深度传感器 | --- ### 七、优缺点分析 - **优点**: - 实时性(30fps,GTX 1070) - 支持重定位与动态场景处理 - **缺点**: - 依赖特征匹配(纹理缺失易失效) - 单目模式需10秒以上初始化 --- ### 八、学习建议 1. **必读文献**: - 原论文《ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras》 - 《Multiple View Geometry in Computer Vision》 2. **代码实践**: ```bash git clone https://github.com/raulmur/ORB_SLAM2 cd ORB_SLAM2 && chmod +x build.sh && ./build.sh ``` 3. **调试工具**: - 使用g2o_viewer可视化优化结果 - 分析`KeyFrame::EraseMapPointMatch()`等关键函数 --- 以上内容需结合代码阅读(推荐使用CLion或VSCode调试),重点关注`Tracking.cc`和`Optimizer.cc`模块。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值