ORB SLAM2中的mlNewKeyFrames用法

在orbslam文件LocalMapping.h的LocalMapping类中,有这样一个list类型的成员函数,它的作用是存放还未处理的关键帧,也就是说它是一个临时存放关键帧的地方。

 std::list<KeyFrame*> mlNewKeyFrames;

1. 第一步.关键帧的插入(list的输入)

初始化后的mlNewKeyFrames应该是空的,
首先是在

SLAM.TrackRGBD(imRGB,imD,tframe);

中通过SLAM的成员变量
Tracking* mpTracker;
调用了属于Tracking类的函数
GrabImageRGBD();
又在这个函数中调用了同属于一个Tracking类的
Track();
在这个函数里会判断当前帧是否加入关键帧,每次图像都会进入SLAM.TrackRGBD(imRGB,imD,tframe);每次都会判断是否加入关键帧,如果需要加入关键帧,就调用函数
void Tracking::CreateNewKeyFrame();
使用LocalMapping* mpTrackermpLocalMapper变量调用属于类LocalMapping的函数
mpLocalMapper->InsertKeyFrame(pKF);
把关键帧存入
mlNewKeyFrames.push_back(pKF);
这样关键帧就存放到了链表mlNewKeyFrames

2.关键帧的处理(list的传出和判断)
在线程 LOCAL MAPPING中,回调函数是LocalMapping::Run();在执行这个函数时,如果检查到mlNewKeyFrames是非空的说明有关键帧等待处理,那么执行函数ProcessNewKeyFrame(),具体内容如下

mpCurrentKeyFrame = mlNewKeyFrames.front();
mlNewKeyFrames.pop_front();

把第一个元素(也就是最先检测到的未处理的关键帧)赋值给mpCurrentKeyFrame,然后删除掉

就这样,当mlNewKeyFrames里面有元素时,说明有选择进来的关键帧等待系统处理,当它为空即mlNewKeyFrames.empty()为真,说明没有关键帧等待处理

猜你喜欢

转载自blog.csdn.net/qq_34122731/article/details/90731517
ORB