ORB-SLAM3 Tracking类源码分析(五)
程序员文章站
2022-03-09 13:40:37
...
关键帧选取策略 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);
下一篇: .net core 下的分布式事务锁
推荐阅读
-
Java源码___AbstractStringBuilder类(五)
-
通过JDK源码角度分析Long类详解
-
Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)
-
Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
-
并发编程(五)——AbstractQueuedSynchronizer 之 ReentrantLock源码分析
-
[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的
-
CI框架安全类Security.php源码分析
-
element-ui Tag、Dialog组件源码分析整理笔记(五)
-
别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
-
netty中的发动机--EventLoop及其实现类NioEventLoop的源码分析