ORB SLAM2中的mlNewKeyFrames用法

本文详细解析了ORB-SLAM视觉里程计系统中关键帧的管理过程,包括关键帧的创建、存储及处理。关键帧首先被插入到LocalMapping类的mlNewKeyFrames链表中暂存,随后在LocalMapping线程中被逐个取出并进一步处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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()为真,说明没有关键帧等待处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值