ORB-SLAM2代码阅读

本文详细解析ORB-SLAM2系统,包括System.cc中的系统初始化,rgb_tum.cc中的图像加载,Tracking.cc的跟踪模块,LocalMapping.cc的局部建图以及LoopClosing.cc的闭环检测。内容涵盖关键帧跟踪、位姿求解、关键帧插入条件、局部地图更新和回环检测等核心功能。

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

    • Examples里面存放的分别是基于单目、双目、RGBD的实例程序
    • include文件夹存放的是头文件,ORB-SLAM2可以被当作一个库来使用,很多函数都可以直接调用
    • src文件夹存放的是和include对应的源文件
    • Thirdparty存放的是用到的第三方库
    • Vocabulary存放的是回环检测中BoW用到的视觉词典
    • build.sh,只要配置好了本地环境,运行一下build.sh就行了

System.cc

构造函数system()对SLAM系统初始化,传入ORB字典文件路径、配置文件路径、传感器类型。

1. 首先判断传感器类型是单目、双目还是RGB-D。
2. 然后通过cv::FileStorage fsSetting()传入配置文件路径的读取配置文件,并由isOpened()判断文件是否存在。
3. 若存在,则通过ORBVocabulary()加载ORB字典到mpVocabulary变量,然后通过loadFromTextFile()判断加载是否成功。
4. 接着创建地图Map(),创建视图FrameDrawer()用来显示创建的地图,创建画图器MapDrawer()。
5. 初始化三个线程Tracking()、LocalMapping()、LoopClosing()。并通过thread()开启local mapping和loop closing线程。同时初始化显示线程Viewer()并启动该线程。 
6. 最后通过setLocalMapper()等方法设置线程之间的指针。

TrackStereo()、TrackRGBD()、TrackMonocular()方法:首先判断输入传感器类型是否对应正确的方法,然后检查模型,如果是mbActivateLocalizationMode则休眠1000ms直到停止局部建图。如果是mbDeactivateLocalizationMode则重新开启局部建图的线程。然后分别通过GrabImageStereo(imRectLeft,imRectRight)、GrabImageRGBD(im,depthmap)、GrabImageMonocular(im)开启对应的tracking线程。

SaveTrajectoryTUM()方法求数据集中每一帧的位姿:GetAllKeyFrames()获得所有关键帧vpKFs——sort()对关键帧排序——vpKFs[0]->GetPoseInverse()获得第一帧相对于世界坐标系的位姿——遍历所有帧的位姿和参考帧【如果当前帧追踪失败则丢弃,继续追踪下一帧——追踪成功则将当前参考帧设为关键帧——追踪成功但是关键帧不好,则获取当前关键帧相对于上一帧的位姿,并将上一帧设为关键帧,依次不断的判断关键帧的质量,直到选取合适的关键帧——将关键帧的位姿乘第一帧相对于世界坐标的位姿得到关键帧相对于世界坐标的位姿——在将关键帧相对于世界坐标的位姿乘当前帧相对于关键帧的位姿得到当前帧相对于世界坐标的位姿——取当前帧相对于世界坐标位姿的R和t——转换为四元数——存入文件中】——关闭文件

SaveKeyFrameTrajectoryTUM()方法求数据集中每一关键帧的位姿。

rgb_tum.cc

1. LoadImages()加载图像——判断rgb图是否存在——判断rgb图与depth图数量是否对应相同。
2. ORB_SLAM2::System SLAM()初始化,创建SLAM系统,并初始化各个线程。
3. 遍历每一对RGB图和depth图【读取RGB图和depth图,读取时间戳(vTimestamps存储了时间戳,实际上就是存储了数据文件的每一幅图像的采集时间)——判断文件是否读取成功——SLAM.TrackRGB()将图片转给system处理,在这里从主线程进入tracking线程
### 关于 ORB-SLAM1 的代码解读与学习笔记 尽管当前主流的研究和应用更多集中在 ORB-SLAM2ORB-SLAM3 上,但 ORB-SLAM1 是其系列算法的基础版本,具有重要的研究价值。以下是关于 ORB-SLAM1 代码的解读与学习笔记: #### 1. **ORB-SLAM1 的核心模块** ORB-SLAM1 主要由三个线程组成:跟踪(Tracking)、局部建图(Local Mapping)以及回环检测(Loop Closing)。这些模块的功能如下[^4]: - **跟踪模块**:负责实时估计相机的姿态并追踪场景中的特征点。 - **局部建图模块**:构建地图的关键部分,优化关键帧及其对应的三维点位置。 - **回环检测模块**:通过词袋模型识别相似的关键帧,消除累计误差。 #### 2. **关键数据结构** ORB-SLAM1 中定义了许多重要数据结构用于存储和管理信息。例如: - `KeyFrame` 类表示关键帧,包含了图像、姿态、特征点等信息。 - `MapPoint` 类表示三维点,记录了该点的世界坐标及相关观测信息。 - 向量型成员变量以 `mv` 开头,列表型成员变量以 `ml` 开头,分别用于存储不同类型的数值集合。 #### 3. **特征提取与匹配** ORB-SLAM1 使用 ORB 特征作为主要描述子。它具备快速性和旋转不变性的特点,在实际应用中表现出良好的性能[^2]。具体实现流程包括: - 提取每帧图像上的 ORB 特征点。 - 利用 Hamming 距离计算特征点之间的相似度,并完成初始匹配。 - 应用 RANSAC 方法剔除误匹配点,进一步提高精度。 #### 4. **几何约束与位姿估计** 为了获得更精确的相机位姿,ORB-SLAM1 借助单应矩阵或基础矩阵来建立几何关系[^3]。随后通过分解本质矩阵得到相对旋转和平移向量 \( \mathbf{R}, \mathbf{t} \),最终完成全局优化过程。 #### 5. **代码阅读建议** 对于初学者来说,可以从以下几个方面入手深入理解 ORB-SLAM1 的源码逻辑: - 阅读官方文档及配套论文,熟悉理论背景和技术细节。 - 结合调试工具逐步剖析各函数调用链路。 - 参考社区资源如 优快云 博客文章或其他开发者分享的学习经验[^1]。 ```cpp // 示例代码片段展示如何初始化 ORB 参数 cv::Ptr<cv::FeatureDetector> orb = cv::ORB::create( 500, // 默认最大特征数 1.2f, // 尺度金字塔倍增因子 8 // 层数 ); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值