ORBSLAM源码结构解析
1.initilizer类
VO初始化目的是为了获得准确的帧间相对位姿,并通过三角化恢复出初始地图点。初始化方法要求适用于不同的场景(特别是平面场景),并且不要进行人为的干涉,例如选取视差大(large parallax)的场景(视差大代表相机移动会带来明显的图像变化,通常距离相机距离越远,距离相机光轴越近,视差越小)。ORB-SLAM中并行计算了适用于平面场景的单应性矩阵H和一般场景下的基础矩阵F,然后通过打分选取合适的。ORB-SLAM的初始化要求是比较高的,只有在确定初始化安全的情况下,才会去初始化。
2.构造函数ORBextractor()
该类中主要调用OpenCV中的函数,提取图像中特征点(关键点及其描述,描述子,以及图像金字塔)。
FAST特征点和ORB描述子本身不具有尺度信息,ORBextractor通过构建金字塔来得到特征点尺度信息,将输入图片逐级缩放得到图像金子塔,金字塔层级越高,图像分辨率越低,ORB特征点越大。
特征点响应值/描述子的区别:
响应值描述该特征点的区分度大小,响应值越大越应该被留用做特征点。
描述子是特征点的一个哈希运算,其大小无意义,仅用来在数据库中快速找回某特征点。
2.LocalMapping类
LocalMapping作用是将Tracking中送来的关键帧放在mlNewKeyFrame列表中;处理新关键帧,地图点检查剔除,生成新地图点,Local BA,关键帧剔除。主要工作在于维护局部地图,也就是SLAM中的Mapping。
或理解为LocalMapping的工作是通过不断的加入新KeyFrame和新地图点,剔除冗余KeyFrame和冗余地图点,来维护一个稳定的KeyFrame集合,从而可以进行后面的LoopClosing操作。所以这个线程只是维护地图,没有进行全局优化。
3.Map类
Map类管理整个地图,因此其具有的属性是所有的地图点和关建帧,即普通的帧是不管的,另外还有一些帧编号之类的东西,该类具有添加、删除关键帧的方法和添加、删除地图点的方法,另外就是一个返回属性的函数。
5.ORBmatcher类
该类负责特征点与特征点之间,地图点与特征点之间通过投影关系、词袋模型或者Sim3位姿匹配。用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop closing,因此比较重要。