orbslam2初始化流程

这里总结一下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值