ORB-slam2源码分析(1)- 整体框架
前言
非科班出身,也非擅长业务,仅用来学习记录,扩展知识。主要熟悉的是激光slam,但vslam与激光slam整体框架理论基本相同,但是具体技术细节差距较大,希望从中获取更多知识点,可取长补短。从技术角度看,相结合是趋势;从实际出发,需具体看产品定位;
vslam包含许多视觉相关知识点,相对于laser,知识点及其理论都较为复杂,基于学习目的和精力有限,文档仅分析整个框架和记录部分核心功能源码。
整体框架
ORB-slam2整个算法框架及其流程较容易理解,如上图所示(paper截取)。整个系统框架主要包含三个线程,分别为tracking(跟踪器即前端里程计)、local mapping(局部建图)、loop closing(闭环处理,所谓的后端)。同时包含了特征点构建的全局稀疏点云图和重定位功能;
orb-slam2可支持单目,双目,rgbd三种摄像头的vslam。
注:双目未测试,采用realsense的D435进行实际测试,单目和rgbd均可实现实时slam,但旋转时极容易跟踪丢失(估计采用广角相机,如鱼眼相机效果会有提升),但是基于强大的重定位功能,也较容易重新找回,但是需要摄像头移动给一定配合。目前与常见开源激光slam效果相比,还有一定差距。
Tracking
tracking是整个slam的开始,本质上可认为是slam系统中所谓的前端,即里程计的实现。orb-slam2主要采用的是从一帧帧连续图片中提取ORB特征点,然后将特征点进行匹配,从而获取帧间相对位姿。其作用与激光slam中的前端基本完全一致。
由于图像所含信息量较为丰富,但信息隐含较深(如深度信息无法直接提取),因此tracking相对于激光slam的前端相比,更加复杂。同时在tracking部分增加了词袋提取和存储,可用于后续的快速闭环检测和重定位功能,和激光slam相比具有明显优势。注:激光slam无法提取像orb一样特有信息。
orb-slam2与常见的开源slam系统一样,均采用关键帧keyframe用于记录和后端闭环,因此tracking主要功能就是记录和输出关键序列帧,并同时记录orb特征点构成的词典用于后续的闭环和充定位;
Local mapping
局部建图实际上是采用tracking中输出的部分关键帧及其对应的地图点构建局部地图。其目的与cartographer中的submap有些类似,单纯的帧间匹配会导致累计误差快速放大。因此orbslam采用多帧具有共视(激光可用滑窗)的关键帧构建localmap。local mapping采用local BA技术可对关键帧pose及其mappoint进行优化,从而增加准确的mappoint并且删除不准确的mappoint或关键帧,以此可进一步使得整个前端里程计更加准确。
Loop closing
通过离线训练出来的词典作为索引,将tracking过程中的关键帧形成词袋进行搜索查询历史数据中是否存在相同的词袋,即闭环。通过闭环匹配,获得约束,进然后行全局BA,从而修正获取更加准确的关键帧pose和mappoint(特征点对应的空间pose)。注:激光的闭环,简单来讲就是暴力匹配,各种优化基本都是加速匹配的速度。而orbslam的闭环相当于提前存储了一个词典,里面记录了历史轨迹中的特有标示,如此可认为简单查表即可判断是否存在闭环。
总结
orb-slam2整体框架结构十分清晰,与常见开源激光slam结构和功能基本一致。其中基于词袋用于重定位和闭环检测,相比于常见的激光重定位较有明显优势。