ORB-SLAM3 Tracking类源码分析(五)

2021SC@SDUSC 

关键帧选取策略 NeedNewKeyFrame( )

其中需要考虑以下几个因素:

1.程序运行的模式是否是纯定位的、LocalMapping线程的状态如何等,这些限制了是否不能插入关键帧。

2.imu模式存在固定的最长插入间隔,距离上一次插入关键帧的时间是多少。

3.跟踪的好坏。如果跟踪的不好则需要快点插入KeyFrame。

4.传感器的类型。其中单目插入关键帧是最为频繁的。

bool Tracking::NeedNewKeyFrame()
{
    //如果是imu模式,没初始化之前每隔0.25s就要插入关键帧
    if(((mSensor == System::IMU_MONOCULAR) || (mSensor == System::IMU_STEREO)) && !mpAtlas->GetCurrentMap()->isImuInitialized())
    {
        if (mSensor == System::IMU_MONOCULAR && (mCurrentFrame.mTimeStamp-mpLastKeyFrame->mTimeStamp)>=0.25)
            return true;
        else if (mSensor == System::IMU_STEREO && (mCurrentFrame.mTimeStamp-mpLastKeyFrame->mTimeStamp)>=0.25)
            return true;
        else
            return false;
    }
    //而如果是纯定位模式则不插入关键帧
    if(mbOnlyTracking)
        return false;
    // If Local Mapping is freezed by a Loop Closure do not insert keyframes
    //如果Local Mapping被Loop Closure请求停止,就不插入关键帧
    if(mpLocalMapper->isStopped() || mpLocalMapper->stopRequested())
    {
        return false;
    }
    if (mpLocalMapper->IsInitializing())
        return false;
    const int nKFs = mpAtlas->KeyFramesInMap();

    // 如果上次重新定位后传递的帧不足,不插入关键帧    if(mCurrentFrame.mnId<mnLastRelocFrameId+mMaxFrames && nKFs>mMaxFrames)
    {
        return false;
    }
    //在参考关键帧中跟踪地图点
    int nMinObs = 3;
    if(nKFs<=2)
        nMinObs=2;
   //参考关键帧的地图点中,大于等于最小观测数目的地图点个数,即这些地图点被追踪到了
    int nRefMatches = mpReferenceKF->TrackedMapPoints(nMinObs);
    bool bLocalMappingIdle = mpLocalMapper->AcceptKeyFrames();
    //统计近点中被跟踪到的个数和未跟踪到的个数
    int nNonTrackedClose = 0;
    int nTrackedClose= 0;
    if(mSensor!=System::MONOCULAR && mSensor!=System::IMU_MONOCULAR)
    {
        //变量N为特征点的个数
        int N = (mCurrentFrame.Nleft == -1) ? mCurrentFrame.N : mCurrentFrame.Nleft;
        for(int i =0; i<N; i++)
        {   //特征点的深度大于0小于远近点阈值
            if(mCurrentFrame.mvDepth[i]>0 && mCurrentFrame.mvDepth[i]<mThDepth)
            {
                if(mCurrentFrame.mvpMapPoints[i] && !mCurrentFrame.mvbOutlier[i])
                    nTrackedClose++;//该点不是外点,则追踪到的近点+1
                else
                    nNonTrackedClose++;//是外点,则未追踪到的近点+1
            }
        }
    }
    bool bNeedToInsertClose;//跟踪到的近点不多,但未跟踪到的近点很多,说明跟踪的不好
    bNeedToInsertClose = (nTrackedClose<100) && (nNonTrackedClose>70);
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值