ORB_SLAM2源码阅读记录(1):单目初始化
最近开始学习下ORB_SLAM2源码,边阅读边记录下自己的理解,首先来一个大致初始化流程图,阅读从mono_euroc.cc开始。
Tracking::MonocularInitialization();
1.第一帧刚来,未构造初始化器,则构造
(如果是单目初始器mpInitializer为空,即第一次进行初始化,并且特征点数>100,得到用于初始化的第一帧:)
2.第二帧(当前帧),如果当前(第二帧)帧特征点太少,删除之前构造的初始器,将mpInitializer置空,返回需要重新初始化(如果当前帧特征点数大于100,则得到用于单目初始化的第二帧:)
3.否则,第二帧特征点数大于100,就开始找匹配,在mInitialFrame与mCurrentFrame中找匹配的特征点对
4.检查如果初始化的两帧之间的匹配点太少,小于100,则重新初始化
5.初始化开始Initializer::Initialize函数,根据匹配点,通过H模型或F模型进行单目初始化,得到两帧间相对位姿、初始MapPoints:mvIniP3D,初始化地图
5.mpInitializer->Initialize (mCurrentFrame, mvIniMatches, Rcw, tcw, mvIniP3D, vbTriangulated) 根据当前帧和匹配点对,启动线程并行计算基本矩阵和单应矩阵,计算分数比,根据给出评价函数打分的方式自动选择求解运动的方法。ReconstructH函数或ReconstructF函数 |
5.1.删除那些无法进行三角化的匹配点;
5.2.将初始化的第一帧作为世界坐标系,因此第一帧变换矩阵为单位矩阵,当前帧的位姿:由世界系到当前帧的变换矩阵;
5.3.Tracking::CreateInitialMapMonocular函数,将三角化得到的3D点mvIniP3D包装成MapPoints,初始化地图,将地图点和关键帧加入地图Map中;
5.3.CreateInitialMapMonocular(); 将三角化得到的3D点mvIniP3D包装成MapPoints,将3D点包装成MapPoint类型存入KeyFrame和Map中 1).将初始帧,当前帧创建均为关键帧 2).向地图中添加初始和当前关键帧 3).创建地图点并与关键帧关联。将3D点包装成MapPoints地图点 4).更新关键帧间的连接关系(以共视地图点的数量作为权重) |
欢迎交流和学习,如有理解不对的地方请指出。