ORB-SLAM3算法和代码学习——跟踪参考关键帧TrackReferenceKeyFrame
创始人
2024-05-10 14:15:46
0

0总述

无论是跟踪恒速运动模型还是跟踪参考关键帧,本质上都是基于帧间匹配跟踪。

跟踪恒速模型是当前帧和上一帧之间的匹配,使用基于恒速模型计算得到的位姿作为优化的初始位姿,基于网格和搜索半径寻找匹配关系。

跟踪参考关键帧是当前帧和参考关键帧之间的匹配,虽然在时序上两个图像帧不连续,但是在空间上参考关键帧和当前帧的视野具有极高的重合度,因此可以作为投影匹配的参与对象,和跟踪恒速运动模型不同的是跟踪参考关键帧使用词袋向量搜索匹配关系,并使用上一帧lastframe的位姿作为当前帧位姿优化的初始位姿。

在得到两帧之间的匹配之后,跟踪恒速模型和跟踪参考关键帧的步骤基本就类似了,首先基于非线性优化计算当前帧的位姿,并过滤匹配误差较大的外点,得到最终的匹配数量,根据匹配数量是否满足要求判断是否跟踪成功。

进入跟踪参考关键帧TrackReferenceKeyFrame()函数的条件:

  • 当前恒速模型为空且IMU没有初始化
  • 或者当前帧距离重定位不久,与重定位只相差两帧
if((!mbVelocity && !pCurrentMap->isImuInitialized()) || mCurrentFrame.mnId// 跟踪参考关键帧bOK = TrackReferenceKeyFrame();
}

1.参考关键帧的确定与更新

首先捋一下参考关键帧mpReferenceKF的确定与更新。

双目或单目初始化成功后,将初始帧设置为第一个参考关键帧,此后在此基础上进行更新。

如果跟踪彻底跪了或者接收到reset的命令,到了重新创建子地图CreateMapInAtlas()这一步,会先将参考关键帧设置为空,然后等着初始化再进行更新。

每当新创建关键帧时CreateNewKeyFrame(),会即时更新当前帧的参考关键帧

在跟踪局部地图时,更新局部地图中的关键帧UpdateLocalKeyFrames()后会将与当前图像帧共视程度最高的关键帧设置为当前帧的参考关键帧和最新关键帧

2.将当前帧的描述子转化为BoW向量

mCurrentFrame.ComputeBoW();

主要使用DBOW库的函数,具体不进行深究了,最终输出的是一个词袋向量记录当前图像包含的单词,以及特征向量即根据描述子计算得到的每个特征点对应的节点信息(该信息用于加速特征匹配)

mpORBvocabulary->transform(vCurrentDesc,// 当前的描述子vectormBowVec,// 输出,词袋向量,记录的是单词的id及其对应权重TF-IDF值mFeatVec,// 输出,记录node id及其对应的图像 feature对应的索引4);// 4表示从叶节点向前数的层数

3.通过词袋BoW加速当前帧与参考帧之间的特征点匹配

int nmatches = matcher.SearchByBoW(mpReferenceKF,mCurrentFrame,vpMapPointMatches);

这一步的作用等同于跟踪恒速运动模型中的SearchByProjection,目的在于寻找当前帧与参考关键帧之间存在的匹配关系,只不过这里使用的是基于词袋向量快速查找的方法。

3.1单词与词典树

参考链接:https://blog.csdn.net/u011341856/article/details/109405181

视觉词典的本质是一个通过聚类得到的KD树,通过离线训练,对各种类型的特征点对应的描述子进行聚类,划分成不同的簇,然后以簇的聚类中心作为子节点,再对子节点中的描述子进行聚类划分子节点的子节点,以此循环,直到满足条件。

1.词典的创建
在这里插入图片描述

如上图所示,假设在训练时一共使用了1000个描述子,首先我们将这1000个描述子进行聚类划分成3个簇,每个簇分别有200,300,500个元素,其中每个簇对应的聚类中心作为kd树第一层的字节点。

然后再对每个字节点对应的簇继续聚类,各自再划分为3个簇,然后形成第二层的9个子节点。

如果不再继续聚类的话,最终我们得到一个分支为3深度为2的kd树。而最下面一层,每个簇的聚类中心被曾为单词,即该图的kd树有9个单词。

当我们保存整个训练好的词汇树时,只要把树的结构和聚类中心都保存下来就行了,其中那些用来训练的描述子都可以扔掉了。

整个过程总结如下:

  • step1.在根节点将样本聚为k类
  • step2.对第一层的每个节点,把属于该节点的样本再聚为k类
  • step3.重复step2,最后得到叶子层,每个叶子对应一个word,最终得到的树就是vocabulary tree

2.基于词袋向量搜索的特征匹配

假设对于当前帧图像提取了1000个特征点,对应的有1000个描述子,在ComputeBoW()函数中我们已经将整幅图像中的描述子转化为了词袋向量,同时记录了每个描述子对应的叶节点id。至于怎么计算的每个描述子对应的节点信息,就是和每一层节点(聚类中心描述子)计算描述子距离,和哪个节点的描述子距离最近该描述子就属于哪个节点。

在进行特征匹配时,为了加速匹配只计算属于同一节点的描述子以寻找匹配关系,这样就将1000对1000的暴力匹配转换为某个节点的小范围暴力匹配,节省计算时间。

每完成一个节点中的特征匹配,就要对这些匹配进行验证:

  • 相互匹配的两个特征点的描述子距离要小于设定的阈值
  • 最佳匹配的描述子距离要比较明显的小于次佳匹配的描述子距离(在SearchByBoW中最佳距离要小于0.7倍的次佳距离)

最后完成所有的特征匹配后需要对匹配的特征旋转偏差进行旋转一致性验证,然后记录最终的匹配关系,用于后续的非线性优化。

3.基于词袋向量的回环检测和重定位

参考链接:https://zhuanlan.zhihu.com/p/354616831

回环检测和重定位在本质上都是场景识别,在这两个模块中都使用了词袋向量进行了加速匹配。上面我们介绍了怎么为每一个特征点对应的描述子寻找对应的叶节点(也就是单词),假如我们在一张图像中提取了1000个特征点,对应1000个描述子,通过计算我们将这1000个描述子分别找到了对应的叶节点或者说单词,这样最终一帧图像可以用若干个单词进行表示。

随着SLAM过程的进行会不断的创建关键帧,同时会将关键帧转化为词袋向量,在进行回环检测和重定位时会遍历所有关键帧,其中和当前帧公共单词数最多的关键帧就是当前帧的最佳候选关键帧。

这里只简单叙述一下原理,在后面重定位和回环检测部分代码解析时再进行详细分析。

4.基于非线性优化的位姿估计

在拿到匹配关系之后就是和跟踪恒速模型一样的老三样了,只不过位姿优化的初始值是上一帧的位姿,而非借助恒速模型

mCurrentFrame.SetPose(mLastFrame.GetPose());

非线性优化和跟踪恒速运动模型使用同一个优化函数

Optimizer::PoseOptimization(&mCurrentFrame);

在非线性优化函数中,会根据投影误差筛选外点,最后根据投影匹配的内点数量决定当前是否匹配成功。

相关内容

热门资讯

findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...
安卓热点绕过系统验证,揭秘操作... 你是不是也遇到过这种情况?手机里的安卓热点突然不灵光了,系统验证总是跳出来,让人头疼不已。别急,今天...
安卓系统怎么关闭小艺,安卓系统... 亲爱的安卓用户们,你是否也和我一样,对手机里的小艺助手有些爱恨交加呢?有时候,它贴心得让人感动,有时...
安卓系统计划软件推荐,精选计划... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我可是挖到了一些超棒的安卓计划软件,它们不仅能...
收钱吧安卓系统插件,便捷支付新... 你有没有发现,现在的生活越来越离不开手机了?手机里装满了各种应用,而今天我要跟你聊聊一个特别实用的工...
鸿蒙系统是否还属于安卓,独立于... 你有没有想过,那个在我们手机上默默无闻的鸿蒙系统,它到底是不是安卓的“亲戚”呢?这个问题,估计不少手...
安卓系统手机用什么钱包,轻松管... 你有没有想过,你的安卓系统手机里装了那么多应用,但最离不开的,可能就是那个小小的钱包了。没错,就是那...
安卓系统能玩部落冲突吗,部落冲... 你有没有想过,安卓系统上的手机,是不是也能玩那款风靡全球的《部落冲突》呢?这款游戏自从推出以来,就吸...
智能机器人安卓系统,引领未来智... 你知道吗?在科技飞速发展的今天,智能机器人已经不再是科幻电影里的专属了。它们正悄悄地走进我们的生活,...
华为win10系统改装安卓系统... 你有没有想过,你的华为笔记本电脑里的Windows 10系统,能不能来个华丽变身,变成安卓系统呢?这...
旧电脑上安什么安卓系统,适配不... 你那台旧电脑是不是已经闲置好久了?别让它默默无闻地躺在角落里,给它来个华丽变身吧!今天,就让我来告诉...
安卓app语言跟随系统,随系统... 你知道吗?在手机世界里,有一个神奇的小功能,它就像你的贴身翻译官,无论你走到哪里,都能帮你轻松应对各...
惠城安卓系统降级在哪,揭秘降级... 你有没有遇到过手机系统升级后,发现新系统让你头疼不已,想回到那个熟悉的安卓系统呢?别急,今天就来告诉...