ORB_SLAM2源码阅读记录(1):单目初始化

最近开始学习下ORB_SLAM2源码,边阅读边记录下自己的理解,首先来一个大致初始化流程图,阅读从mono_euroc.cc开始。

ORB_SLAM2源码阅读记录(1):单目初始化_第1张图片

Tracking::MonocularInitialization();

1.第一帧刚来未构造初始化器则构造

如果是单目初始器mpInitializer为空即第一次进行初始化并且特征点数>100得到用于初始化的第一帧:)

2.第二帧(当前帧),如果当前(第二帧)帧特征点太少,删除之前构造的初始器,将mpInitializer置空,返回需要重新初始化(如果当前帧特征点数大于100,则得到用于单目初始化的第二帧:)

3.否则,第二帧特征点数大于100,就开始找匹配,在mInitialFramemCurrentFrame中找匹配的特征点对

4.检查如果初始化的两帧之间的匹配点太少,小于100,则重新初始化

5.初始化开始Initializer::Initialize函数,根据匹配点,通过H模型或F模型进行单目初始化,得到两帧间相对位姿、初始MapPointsmvIniP3D,初始化地图

5.mpInitializer->Initialize (mCurrentFrame, mvIniMatches, Rcw, tcw, mvIniP3D, vbTriangulated)

根据当前帧和匹配点对,启动线程并行计算基本矩阵和单应矩阵,计算分数比,根据给出评价函数打分的方式自动选择求解运动的方法。ReconstructH函数或ReconstructF函数

5.1.删除那些无法进行三角化的匹配点;
5.2.将初始化的第一帧作为世界坐标系,因此第一帧变换矩阵为单位矩阵,当前帧的位姿:由世界系到当前帧的变换矩阵;
5.3.Tracking::CreateInitialMapMonocular函数,将三角化得到的3DmvIniP3D包装成MapPoints,初始化地图,将地图点和关键帧加入地图Map中;

5.3.CreateInitialMapMonocular();

将三角化得到的3DmvIniP3D包装成MapPoints3D点包装成MapPoint类型存入KeyFrameMap

1).将初始帧,当前帧创建均为关键帧

2).向地图中添加初始和当前关键帧

3).创建地图点并与关键帧关联。将3D点包装成MapPoints地图点

4).更新关键帧间的连接关系(以共视地图点的数量作为权重)
5).BA优化,对这两帧姿态进行全局优化重投影误差(LM
6).需要更新局部地图,局部关键帧和局部地图点;并且更新LastFrameLastKeyFrame,以及当前帧的ReferenceKF

欢迎交流和学习,如有理解不对的地方请指出。

你可能感兴趣的:(视觉SLAM)