ORB-SLAM3 Sim3Solver.cc相关代码分析与理解
2021SC@SDUSC
前言
这一篇主要是Sim3Solver剩余一些函数的分析一、MapPoints初始化的相关内容
1.初始化阶段的创建
在Track()函数中调用了各类初始化函数,如双目初始化函数StereoInitialization()、单目初始化函数MonocularInitialization()。以双目初始化为例。对于双目初始化而言,首先就会将当前的普通帧Frame类对象mCurrentFrame变成初始化关键帧KeyFrame类对象pKFini。然后,将初始关键帧插入地图集中。对于常规的相机模型,我们逐个遍历Frame类的mCurrentFrame对象中的N个特征点,根据条件判断是否将其添加为地图点。
2.Tracking阶段的创建
在Tracking阶段,一般使用的两个函数是TrackWithMotionModel()和TrackReferenceKeyFrame()。还有一个TrackLocalMap()函数用于对Tracking结果进行进一步优化。
二、代码分析
1、迭代函数
cv::Mat Sim3Solver::iterate(int nIterations, bool &bNoMore, vector<bool> &vbInliers, int &nInliers)
{
bNoMore = false; // 现在还没有达到最好的效果
vbInliers = vector<bool>(mN1,false); // 的确和最初传递给这个解算器的地图点向量是保持一致
nInliers=0; // 存储迭代过程中得到的内点个数
// Step 1 如果匹配点比要求的最少内点数还少,不满足Sim3 求解条件,返回空
// mRansacMinInliers 表示RANSAC所需要的最少内点数目
if(N<mRansacMinInliers)
{
bNoMore = true; // 表示求解失败