这里总结一下orbslam2的初始化过程,和之前vins的视觉初始化比较看看有什么不同
程序入口
orbslam2单目的程序入口为
// Pass the image to the SLAM system
SLAM.TrackMonocular(im,tframe);
我们都知道orbslam2分成三个线程并行,初始化部分是在tracking线程中进行的
void Tracking::Track()
{
// track包含两部分:估计运动、跟踪局部地图
// mState为tracking的状态机
// SYSTME_NOT_READY, NO_IMAGE_YET, NOT_INITIALIZED, OK, LOST
// 如果图像复位过、或者第一次运行,则为NO_IMAGE_YET状态
if(mState==NO_IMAGES_YET)
{
mState = NOT_INITIALIZED;
}
// mLastProcessedState存储了Tracking最新的状态,用于FrameDrawer中的绘制
mLastProcessedState=mState;
// Get Map Mutex -> Map cannot be changed 互斥锁详解见https://blog.csdn.net/fengbingchun/article/details/78638138?locationNum=2&fps=1 lishuwei 2018.11.24
unique_lock<mutex> lock(mpMap->mMutexMapUpdate); //当有效时,lock锁管理模板类管理锁对象,周期结束后自动解锁 ,意思为锁住地图更新 lishuwei 2018.11.24
// 步骤1:初始化
if(mState==NOT_INITIALIZED)
{
if(mSensor==System::STEREO || mSensor==System::RGBD)
StereoInitialization();
else
MonocularInitialization();
mpFrameDrawer->Update(this);
if(mState!=OK)
return;
}
else// 步骤2:跟踪
MonocularInitialization()
在这个函数里主要进行单目的初始化
/**
* @brief 单目的地图初始化 主要是对极几何
*
* 并行地计算基础矩阵和单应性矩阵,选取其中一个模型,恢复出最开始两帧之间的相对姿态以及点云
* 得到初始两帧的匹配、相对运动、初始MapPoints
*/
void Tracking::MonocularInitialization()
{
// 如果单目初始器还没有被创建,则创建单目初始器
if(!mpInitializer)
{
// Set Reference Frame
// 单目初始帧的特征点数必须大于100
if(mCurrentFrame.mvKeys.size()>100)
{
// 步骤1:得到用于初始化的第一帧,初始化需要两帧
mInitialFrame = Frame(mCurrentFrame);
// 记录最近的一帧
mLastFrame = Frame(mCurrentFrame);
// mvbPrevMatched最大的情况就是所有特征点都被跟踪上
mvbPrevMatched.resize(mCurrentFrame.mvKeysUn.size());
for(size_t i=0; i<mCurrentFrame.mvKeysUn.size(); i++)
mvbPrevMatched[i]=mCurrentFrame.mvKeysUn[i].pt;
//空的时候不进去,直接跳过到下面,生成一个指针,然后就能去else了
//最前面的if得是mpInitializer为空才进来,那么到这里mpInitializer肯定是空的,这个if进不去
// 这两句是多余的
if(mpInitializer)
delete mpInitializer;
// 由当前帧构造初始器 sigma:1.0 iterati