ORB-SLAM2从理论到代码实现(一):整体框架

本人邮箱 [email protected],欢迎交流。

一、总述

      ORB-SLAM是由Raul Mur-Artal,J. M. M. Montiel和Juan D. Tardos在2015年提出。它是一个基于特征识别的单目slam系统,可以实时运行,适用于各种场合,室内的或者室外的,大场景或小场景。系统具有很强的鲁棒性,可以很好地处理剧烈运动图像、可以有比较大的余地*处理闭环控制、重定位、甚至全自动位置初始化。该系统具有三个线程:分别是跟踪(Tracking)建图(LocalMapping)闭环检测(LoopClosing)。以后我会结合ORB-SLAM2代码,写相关的多视图集合,数学优化,Bundle Adjustment等博客。

     本讲主要介绍ORB-SLAM2框架,以及代码结构。

1.ORB-SLAM框架

      先上一个ORB-SLAM三线程图片。在下图中我们很清楚的看到传入Frame是怎么变成Map的(如果不清楚也不要紧,下面的博客会讲每一个线程是怎么运作的)

ORB-SLAM2从理论到代码实现(一):整体框架

追踪(Tracking):ORB特征提取;初始姿态估计(速度估计);姿态优化(Track local map,利用邻近的地图点寻找更多的特征匹配,优化姿态);选取关键帧。

局部建图(Local Mapping):加入关键帧(更新各种图);验证最近加入的地图点(去除Outlier);生成新的地图点(三角法);局部Bundle adjustment(该关键帧和邻近关键帧,去除Outlier);验证关键帧(去除重复帧)。

闭环检测(Loop Closing):选取相似帧(使用词袋bag of words);检测闭环(计算相似变换(3D-3D,RANSAC计算内点数,剔除outier);融合三维点,更新各种图;图优化(传导变换矩阵),更新地图所有点。

    再上一个更明显的图(引至http://blog.csdn.net/u010128736/

ORB-SLAM2从理论到代码实现(一):整体框架

2. 代码结构

   ORB-SLAM2代码写的很整洁。打开ORB-SLAM2的文件夹,你会看到以下文件夹:

  • Examples文件夹:存放的分别是基于单目、双目、RGBD的实例程序
  • include文件夹:存放的是头文件,ORB-SLAM2可以被当作一个库来使用,很多函数都可以直接调用
  • src文件夹:存放的是和include对应的源文件,要讲的代码在该文件夹下
  • Thirdparty文件夹:存放的是用到的第三方库,优化库g2o在该文件夹下
  • Vocabulary文件夹:存放的是回环检测中BoW用到的视觉词典名为ORBvoc.txt
  • build.sh:配置文件

    打开资源文件夹src,有很多.cc文件,我们根据文件的名字能大概知道每个.cc文件实现的功能。下面上一个程序的整体结构图。

ORB-SLAM2从理论到代码实现(一):整体框架

这个是ORB-SLAM2最简要的流程图,我们先拿来看看,先有个整体的印象。这个系统的过程可以简述如下:

  • 首先使用LoadImages加载图片目录和时间戳文件 
  • 创建ORB_SLAM2::System对象 
  • 循环读取图片数据 :读取图片 ,读取时间戳 ,将图片传给SLAM系统 
  • 关闭SLAM系统 
  • 保存相机划过的轨迹

当然具体的系统会比这复杂得多,我们以后会很详细的讲。如果你是新手,欢迎入坑!