ORB-SLAM2源代码分析
Taylor Guo, 2016年4月14日-18:33 --2016年5月18日-22:05
摘要:
尽管可以用于立体视觉,ORB-SLAM2主要是单目SLAM系统,也就是只有一个相机(摄像头)的系统,主要用于特征识别,自主导航。ORB-SLAM2的硬件传感器也就是这一种,当然也可以加入其它传感器,比如IMU,激光雷达,超声波等。它应用于机器人,无人驾驶,无人机,增强现实AR,这样的产品中。基本来说,ORB-SLAM2还是属于计算机视觉的一个类别。
然而,由相机拍出的照片进行分析用于导航,并不简单,单纯对于以单目RGB相机为传感器的系统来说,需要从平面图像中恢复3D场景,同时既然用于导航地图的构建又比不可少,最后还要评估前述工作的一系列结果。这并不是单一程序或算法能够完成的工作,SLAM更像是一系列软件系统的集成,中间涉及到各种方法和步骤。
完整地理解SLAM及相关开源代码,需要具备如下知识: 传感器(Camera, IMU,激光,等),图像特征提取和匹配(《数字图像处理》),《多视图几何》,误差矫正和优化(《概率论》,《矩阵分析》,最小二乘优化,求Jacobian等)。其中,《多视图几何》涵盖了SLAM大部分核心内容,对它的理解程度至关重要。
根据我的SLAM学习经验,如果是工科本科起点,可以先从图像处理开始,数学工具其实可以用比较简单和适用的语言来表达和理解,我并不做研究,只是希望都简单地运用这些算法。
关于《多视图几何》的学习,可以参考知乎:http://www.zhihu.com/question/35186064/answer/61864341
当然,学习本来就不是一帆风顺,长期坚持,必有所成。
一 ORB-SLAM2 软件简述:
ORB-SLAM是基于特征识别的单目slam系统,可以实时运行。主要功能:追踪,地图构建,重定位和闭环控制。采用ORB特征,应用于实时图像系统中,具有很好的旋转不变特性。地图重构的方法采用云点和关键帧技术。Essential Graph基于位置优化的实时闭环控制,通过生成树构建,由系统、闭环控制链接和视图内容关联强边缘进行维护
二 ORB-SLAM2 系统说明:
ORB_SLAM采用相同的特征,构建地图、追踪、位置识别、基于图像帧的重定位和闭环回路检测。系统整合了三个并行的线程:追踪、局部地图构建和闭环回路控制。
A. 概要介绍
ORB_SLAM2是一个实时单目/立体/RGBD 相机SLAM库,可以计算相机轨迹和稀疏3D重构。它能检测回环,实时重定位相机。ORB_SLAM2可以在SLAM模式和定位模式之间切换,SLAM模式为默认模式,系统同步运行3个线程:跟踪,局部地图构建和回环检测。系统定位相机,构建新地图,然后闭合回环。定位模式用于已知构建好的地图,在这个模式下,只使用局部地图构建和回路闭合。系统在地图中定位相机,地图并不更新,如果有必要,采用重定位。
B. 系统构成
命名空间 (ORB_SLAM2)
命名空间为了避免变量或函数重命名的问题。多个工程师进行开发,有可能会出现全局变量或函数重名的现象;而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会引起问题。名字空间名称相同,成员名字不同,那么他们会自动合并为一个名字空间,可以理解为追加。
DBoW2
DBoW2是增强版DBoW库,开源C++库,用于将图像排序和转换成词袋模型表示。它采用层级结构的树,图像特征空间上相似的作为邻居,创建了一个视觉词典。DBoW2还采用图像数据库,采用逆序排列图像,文件快速检索和特征比较。
DBoW不要OpenCV(除非是demo),但它们是完全兼容的。测试实例:室外道路1755张图像用词袋表示,实时检查匹配情况。Intel四核CPU@2.82GHz,从1300张图像中提取95个单词构建字典,用了3分钟(不包括特征提取)。每新加一幅图像平均耗时约1.9ms,检索数据库平均7.2ms。
DBoW2 会自动安装DLib到系统里。DBoW2还需要安装OpenCV 和 Boost::dynamic_bitset class 以使用 BRIEF 。可以用以下命令安装Boost: $ sudo apt-get install libboost-dev 。
DLib
DLib是C++类集,用于提供更多功能使用OpenCV数据,处理计算机视觉问题。DLib主要有3个库各有不同的作用。
• DUtils: 几种通用C++类库。包括:
o BinaryFile: reads/writes binary files
o LineFile: reads/writes text files by lines
o ConfigFile: reads/writes text files with the format key = value
o FileFunctions: mkdir, rmdir, dir... functionality
o Math: math functions
o Random: pseudo-random number functions
o STL: functions for STL containers
o StringFunctions: functions to manipulae strings
o Timestamp: operates with timestamps
o TimeManager: manages collections of timestamps
o Profiler: measures execution time of portions of code
o DebugFunctions: functions to measure memory consumption
• DUtilsCV: utility functions for OpenCV data types. Classes included:
o Drawing: functions to draw keypoints, data, axes...
o GUI: shows images in windows and allows some user input
o IO: I/O functions for storage and printing
o Mat: functions to remove rows from matrices
o Transformations: functions to deal with spatial transformations
o Types: functions to convert between OpenCV data types
• DVision: functions to solve computer vision tasks. Classes included:
o BRIEF: implementation of the BRIEF descriptor
o FSolver: implementation of the RANSAC + 8-point algorithm to compute fundamental matrices between images
o HSolver: implementation of the RANSAC + DLT algorithm to compute homographies between images
o ImageFunctions: functions to get patches from images
o SurfSet: manages SURF keypoints (keeping the laplacian sign) and descriptors
o BundleCamera: reads/writes camera files created by the Bundle software
o PMVSCamera, PatchFile, PLYFile: read/write data created by the PMVS software
o PixelPointFile, Matches: read/write multi-purpose pixel and 3D data files
C. 关键算法和策略
三 ORB-SLAM2 系统结构设计:
四 ORB-SLAM2 各模块的设计和实现:
⑯Tracking::更新局部云点;
⑰Tracking::更新局部关键帧;
地图云点构成关键帧
含有地图云点关键帧构成局部地图
将部分没有准备好的、与已经准备好的关键帧邻近的关键帧也包含进去,限制关键帧数量
⑱Tracking::重定位;
计算词袋向量
跟踪丢失时,查找关键帧数据库搜索候选关键帧用于重定位
执行ORB匹配,如果有足够多的匹配,执行PnP
或者执行P4P迭代,知道有足够的有效数据计算相机位姿。
⑲Tracking::重置;
⑳Tracking::更改标定参数;
⑳Tracking::传递“只跟踪“信息;