ORB-SLAM2源码中文详解.pdf

preview
需积分: 0 7 下载量 113 浏览量 更新于2021-01-20 收藏 879KB PDF 举报
### ORB-SLAM2 源码中文详解 #### 一、概述 ORB-SLAM2是一款基于视觉里程计的SLAM系统,它能够实时地进行环境建模与定位,支持单目、双目以及RGB-D摄像头。本文将深入探讨ORB-SLAM2的核心组成部分及其工作原理。 #### 二、代码主要结构 根据提供的文档信息,ORB-SLAM2的代码组织十分清晰,主要包括以下几个关键文件: - **Tracking.cpp**:负责跟踪任务,包括初始化、位姿估计等。 - **LocalMapping.cpp**:负责局部地图的构建与优化。 - **LoopClosing.cpp**:负责闭环检测,消除累积误差。 - **Viewer.cpp**:负责显示系统状态,如关键帧、地图点等。 #### 三、变量命名规则 - **“p”** 表示指针数据类型。 - **"n"** 表示整型(int)数据类型。 - **“b”** 表示布尔型(bool)数据类型。 - **"s"** 表示集合(set)数据类型。 - **“v”** 表示向量(vector)数据类型。 - **"l"** 表示列表(list)数据类型。 - **“m”** 表示类成员变量。 这些命名规则有助于开发者快速理解代码逻辑和变量用途。 #### 四、系统入口 系统的主要入口函数是处理图像输入,根据不同的输入类型调用不同的函数: - **双目输入**:`GrabImageStereo(imRectLeft, imRectRight)` - **RGB-D输入**:`GrabImageRGBD(imRectLeft, imRectRight)` - **单目输入**:`GrabImageMonocular(im)` 这些函数首先将输入图像转换为灰度图像,并根据输入类型构造相应的`Frame`对象。例如,双目输入会调用: ```cpp Frame(mImGray, imGrayRight, mpORBextractorLeft, mpORBextractorRight) ``` 这里`mpORBextractorLeft`和`mpORBextractorRight`分别用于从左右两幅图像中提取特征点。 #### 五、Tracking线程 **初始化阶段**: - 双目初始化:`StereoInitialization()` - 单目初始化:`MonocularInitialization()` **跟踪阶段**: - 如果`mbOnlyTracking`设置为`false`,则进行同时跟踪与定位,并且可以插入关键帧;如果设置为`true`,则仅进行跟踪,不插入关键帧。 跟踪过程包括: - **运动模型跟踪**:`TrackWithMotionModel()` - **参考关键帧跟踪**:`TrackReferenceKeyFrame()` - **重定位**:`Relocalization()` - **更新局部地图**:`UpdateLocalMap()` - **搜索局部地图点**:`SearchLocalPoints()` —— 获得局部地图与当前帧的匹配 - **位姿优化**:`PoseOptimization()` —— 最小化投影误差优化位姿 - **更新局部关键帧**:`UpdateLocalKeyFrames()` - **更新局部地图点**:`UpdateLocalPoints()` #### 六、LocalMapping线程 **主要职责**: - 检查新关键帧队列:`mlNewKeyFrames` - 对新关键帧进行处理:`ProcessNewKeyFrame()` - 局部BA优化:对新关键帧及其相关联的地图点进行局部BA优化 - 更新地图点与关键帧的关联:`UpdateConnections()` - 剔除低质量的地图点: - `IncreaseFound/IncreaseVisible < 25%` - 观测到该点的关键帧数量过少 - 通过三角化恢复新的地图点 #### 七、LoopClosing线程(闭环检测) **主要职责**: - 从队列中取出关键帧:`mlpLoopKeyFrameQueue` - 判断距离上一次闭环检测是否超过10帧 - 计算当前帧与相连关键帧之间的BoW最低得分 - 检测闭环候选帧 - 检测候选帧的连续性 - 识别与当前帧有足够的共视关系的关键帧 - 闭环修正:一旦发现闭环,系统会更新地图以修正累积的漂移 #### 八、总结 通过以上分析可以看出,ORB-SLAM2是一个高度模块化的系统,各个部分紧密协作,共同完成SLAM任务。从输入图像的处理、特征点的提取,到跟踪、局部地图构建、闭环检测等,每个环节都经过精心设计。开发者可以根据实际需求调整参数或者扩展功能,使其适应更多应用场景。