首页 > 编程语言 >ORB_SLAM3源码阅读笔记(四)

ORB_SLAM3源码阅读笔记(四)

时间:2023-04-17 12:01:21浏览次数:42  
标签:关键帧 函数 检测 SLAM3 源码 线程 回环 LoopClosing ORB

LoopClosing 线程

1 LoopClosing 线程的创建

    LoopClsing 线程的创建与启动和LocalMapping 线程一样,该线程的核心也在于Run()函数,以下对LoopClosing 线程进行逐步的分析。

  • 创建LoopClosing 对象mpLoopCloser
 mpLoopCloser = new LoopClosing(mpAtlas, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR, activeLC);

LoopClosing构造函数中完成各种初始化,基本上就是对各种vector类型的存储容器进行初始化(清空),这一部分没有太多需要进行说明的。

  • 启动LoopClosing 线程
    同样的,LoopClosing 线程的关键在于其Run()函数,下面开始对Run()函数进行分析。

2 Run 函数

    进入Run()函数首先将完成标志位置 false,然后映入眼帘的就又是“死循环”了。重点也就是Run()函数中的“死循环”部分。现在进入循环中对代码的功能进行分析。

  • CheckNewKeyFrames()函数,回环检测所有的主要功能都是在这个函数返回为真的情况下进行的,这个函数的主要功能就是检查mlpLookKeyFrameQueue列表中是否存在待处理的关键帧,这里我们先将没有关键帧的情况进行分析,队列中没有关键帧那么就会进入下一条函数ResetIfRequested(),这个函数其实就是一个重置函数,将队列中的所有关键帧都清除,相当于重新开始建图和定位(当然前提是重置请求已经收到)如果是收到地图激活那么就会从当前开始利用已有的关键帧建立起局部的小地图,这也是ORB_SLAM3算法地图集的强大之处。最后通过检查全局标志位来跳出循环,完成回环检测。备注:关键帧的数据来自于定位建图线程
  • 在进入下一个函数前这里进行了一个判断:
if(mpLastCurrentKF)
{
	mpLastCurrentKF->mvpLoopCandKFs.clear();
	mpLastCurrentKF->mvpMergeCandKF.clear();
}

这一部分的功能暂时还没有完完全全的理解透彻(虽然知道是对存储的数据进行清空),所以暂时先不分析,后面在整体的细节分析环节在进行分析描述。直接进入下一个函数。

  • NewDetectCommonRegions()函数,进入函数开始进行回环检测,首先取出mlpLoopKeyFrameQueue队列中的第一个关键帧作为当前关键帧,接着将当前帧的mbNotErase标志位设置为真,用于防止此关键帧在别的线程中被删除,并将当前帧的回环检测标志位置为真,且获得当前关键帧的地图。后面的几个连续性的判断分别对应着不同情况下所执行的操作:
  1. IMU模式下:如果在IMU模式下还没有进行第二次初始化则不进行回环检测,并且添加关键帧到关键帧数据库。
  2. 双目模式下:如果当前地图的关键帧5,则不进行回环检测并添加当前关键帧到关键帧数据库。
  3. 若当前地图的关键帧数量小于12则不进行回环检测,并将当前关键帧添加至关键帧数据库。
    关键的部分即将开始,首先需要知道mnLoopNumCoincidences表示的是回环成功的次数,初始化时该变量初始化为0。
    • DetectAndReffineSim3FromLastKF()函数,该函数简单来说就是对当前的关键帧进行匹配判断(暂时不做更多深入的说明)。
    • 融合。
    • 若当前关键帧没有被检测到回环或融合,则寻找当前关键帧的三个回环候选帧和融合候选帧。
    • 若当前关键帧没有检测到回环且回环候选帧不为空,那么就对候选回环帧再次进行检测,判断是否发生回环。
    • 若当前帧没有被检测到融合,且融合选帧不为空,那么就对融合候选帧再次进行检测,并判断是否发生融合。
    • 最后,当检测到回环或者融合的时候返回true
      NewDetectCommonRegions()函数返回值为真,即检测到回环或者融合的时候开始进行后面的操作,后续的操作主要分为检测到融合和检测到回环两种情况,这里进行分开讨论。
  • mbMergeDetected == true,也就是检测到融合的情况。此时进入该部分的处理,首先对IMU是否已经进行了初始化进行判断,如果没有初始化则中断,否则开始继续进行处理。假设已经进行了初始化,此时分别获取到当前关键帧的位姿和融合匹配帧的位姿,最后经过一系列处理得到一个最终的四元数,这里需要注意的是MergeLocal2()函数和MergeLocal()函数。
  • mbLoopDetected==true,也就是检测到回环,此时就会进行回环矫正。这里的矫正其实就是通过阈值判断与变换矩阵参数的修改实现的。
    最终完成整个回环检测与优化的过程。

标签:关键帧,函数,检测,SLAM3,源码,线程,回环,LoopClosing,ORB
From: https://www.cnblogs.com/Mortal-ShangZhi/p/17291602.html

相关文章

  • 足球竞猜系统源码,打造高效预测体育直播比分预测平台
    东莞梦幻网络科技的体育直播比分竞猜预测系统为用户提供体育赛事直播、竞猜比分和预测赛果等功能。该系统可以帮助用户在观看比赛的同时,参与到比分竞猜和赛果预测中,增加了用户的参与度和体验感。同时,该系统也为用户提供了竞猜排行榜和销售机制,让用户可以在竞猜中获得更多的回报和认......
  • Gin源码分析
    Gin源码gin框架源码解析发布于2020/06/08,更新于2020/06/0821:30:06|Golang|总阅读量:422次通过阅读gin框架的源码来探究gin框架路由与中间件的秘密。gin框架路由详解gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结构,它基本上是一个紧凑的Tri......
  • CesiumJS 源码杂谈 - 从光到 Uniform
    目录1.有什么光2.光如何转换成Uniform以及何时被调用2.1.统一值状态对象(UniformState)2.2.上下文(Context)执行DrawCommand2.3.对WebGLUniform值的封装2.4.自动统一值(AutomaticUniforms)3.在着色器中如何使用3.1.点云3.2.冯氏着色法3.3.地球3.4.模型架构中的光着色阶......
  • FBV和CBV的区别(源码分析)
    FBV和CBV源码分析FBV直接调用user方法执行业务代码CBV相当于在FBV上面封装了一层fromdjango.contribimportadminfromdjango.urlsimportpathfromapp01importviewsurlpatterns=[path('users/',views.UserView.as_view()),]fromdjango.viewsimport......
  • Tomcat长轮询原理与源码解析
    系列文章目录和关于我零丶长轮询的引入最近在看工作使用到的diamond配置中心原理,发现大多数配置中心在推和拉模型上做的选择出奇的一致选择了基于长轮询的拉模型基于拉模型的客户端轮询的方案客户端通过轮询方式发现服务端的配置变更事件。轮询的频率决定了动态配置获取的实......
  • vue2源码-六、根据render函数生成vnode
    根据render函数生成vnode上文介绍上面已经将模板编译成了render函数,下面就要使用render函数,从而完成渲染的操作:首先,根据render函数生成虚拟节点;然后根据虚拟节点+真实数据生成真实节点。实现mountComponent方法,完成渲染虚拟节点生成封装vm._render方法。Vue.proto......
  • DAPLink源码生成Keil工程并编译成功——笔记(实践篇)
    本文介绍使用DAP源码生产Keil工程的步骤。一、前期准备工作以下1~4为步骤:1.安装Python3(https://www.python.org/downloads/),并添加至路径PATH,此处忘截图了,总之看见pip、alluser、addtoPATH之类的就勾选。(网上也有些帖子说暂时不支持Python3要用Python2.7的,本人实测Pyt......
  • eureka源码简单剖析-服务端(服务续约接口)
           ......
  • eureka源码简单剖析-服务端(服务注册接口-作用是客户端的注册服务)
    本部分讲的是客户端的一些服务注册要注册中心,就是服务的提供者将服务注册到注册中心,方便消费者拿到需要的服务  peer是集群的模式 然后看下这个super.register(info,leaseDuration,isReplication);   日常学习使用的一般是eureka单机模式,企业使用都是eureka......
  • r0tracer 源码分析
    使用方法修改r0tracer.js文件最底部处的代码,开启某一个Hook模式。functionmain(){Java.perform(function(){console.Purple("r0tracerbegin...!")//0.增加精简模式,就是以彩虹色只显示进出函数。默认是关闭的,注释此行打开精简模式。//is......