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

ORB_SLAM3源码阅读笔记(三)

时间:2023-04-03 14:47:19浏览次数:46  
标签:关键帧 Run 函数 LocalMapping SLAM3 源码 线程 ORB BA

LocalMapping 线程

    与Tracking线程一样,同样从LocalMapping线程的创建开始逐步对LocalMapping进行分析。

1 LocalMapping 线程的创建

mpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR,mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO || mSensor==IMU_RGBD, strSequence);

    在System类的构造函数中创建了LocalMapping类的mpLocalMapper这样一个对象,现在进入LocalMapping类的的构造函数中查看具体的内容,在构造函数中并没有特别,仅仅只是进行了一些成员变量的初始化。接着往下看:

mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper);

原来关键在这里,关键在于LocalMapping类的run()函数,该条语句的执行也代表着LocalMapping线程的正式启动。上面这条语句表示线程将运行类中的成员函数Run,传入的参数为LocalMapping类对象的一个指针。

2 Run 函数

    现在只需要明白Run函数中是如何工作的,整个线程的工作也就清晰明了了。进入Run()函数发现该函数的主体是一个“死循环”(没错,就是“死循环”)。在Run()函数中,通过对多个和Tracking类共享的变量进行查询,判断是否需要进行LocalMapping。在整个循环中关键在于if(CheckNewKeyFrames() && !mbBadImu)判断,如果满足条件则会进入真正核心的部分。现在假设满足该条件进行进一步分析(根据程序运行自上而下的顺序进行分析)。

  • CheckNewKeyFrames() 函数
    对于CheckNewKeyFrames() 函数,它的作用就是检查是否有新的关键帧输入进来(关键帧列表是否为空,因为LocalMapping每次处理完一个关键帧就会将其从列表中删除)。
  • ProcessNewKeyFrame() 函数
    ProcessNewKeyFrame() 函数首先会将容器中的新的关键帧删除,接着计算关键帧的词袋模型并进行匹配,如果匹配结果良好则添加到地图点容器中,并将当前帧添加到地图的关键帧容器中。
  • MapPointCulling() 函数
    MapPointCulling() 函数目的在于检查最近的地图点,该函数对最近新添加的地图点进行检查,如果新添加的地图点计算得到的值小于阈值则认为是坏点,此时该点将从地图中删除。
  • CreateNewMapPoints() 函数
    CreateNewMapPoints() 函数对新的地图点进行三角剖分,在该函数中针对单目,取了30帧可见性关键帧,关于IMU部分的内容暂时不看,函数最终返回的也是 MapPoint 类型。

2.1 进入“死循环”

  进入“死循环”,首先对地图中关键帧的个数进行判断,当帧数大于2时进入,如果只是单目的话则执行以下的代码:

 Optimizer::LocalBundleAdjustment(mpCurrentKeyFrame,&mbAbortBA, mpCurrentKeyFrame->GetMap(),num_FixedKF_BA,num_OptKF_BA,num_MPs_BA,num_edges_BA);
 b_doneLBA = true;

该部分的代码就是开始进行 BA 优化了,这里暂时不对 BA 优化进行说明,后续再进行详细说明。BA 优化完成后同样先跳过IMU部分,然后开始进行本地冗余帧的检查,关键函数为KeyFrameCulling()。函数中作者的注释是这样描述的“如果看到关键帧 90% 的地图点,则该关键帧被认为是多余的,在至少其他 3 个关键帧中(相同或更精细的比例),我们只考虑接近的立体点”。整个过程的不断重复,直到完成标志位为“True”时跳出“死循环”。

  以上所有的描述仅仅为最简介的方式进行了大致粗略的说明,后续还需要对每一部分的细节更进一步的进行分析描述。

标签:关键帧,Run,函数,LocalMapping,SLAM3,源码,线程,ORB,BA
From: https://www.cnblogs.com/Mortal-ShangZhi/p/17276363.html

相关文章

  • cbv分析、模板、请求与响应、session及源码分析、闪现、请求扩展
    目录1cbv分析1.1源码分析2模板2.1py2.2html3请求与响应4session及源码分析4.1session的使用4.2源码分析4.3session执行原理5闪现6请求扩展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodViewapp=Flask(__......
  • 成品直播源码推荐,Android 禁止下拉菜单栏
    成品直播源码推荐,Android禁止下拉菜单栏1.屏蔽非锁屏下的下拉菜单栏这种Android系统其实是提供了方法的,只不过是隐藏的,只给系统应用,也就是用mk编译的apk使用。如果第三方应用想要使用,或者Androidstuido编译方式的想要使用。则可以使用反射。 /** *Allowsanapptoco......
  • Spring源码复习
    Bean的生命周期 ApplicationContextCentralinterfacetoprovideconfigurationforanapplication.*Thisisread-onlywhiletheapplicationisrunning,butmaybe*reloadediftheimplementationsupportsthis.**<p>AnApplicationContextprovides:*<ul......
  • 【转】【Revit】revit二次开发——基于teigha读取CAD几何与文字(提供源码、引用包与异
    1.下载64位Teigha完整包:链接:https://pan.baidu.com/s/1KXW54YlkkWJZNQYhbc99kw提取码:05052.VS平台架构选择64位,.net版本4.0以上:  3.dll必须手动指定引用:(重点)staticstringdll=@"D:\Desktop\Rvt\bin\Debug\TD_Mgd.dll";//引用位置Assemblya=Assembly.UnsafeL......
  • Uniapp开发的微商个人相册多端小程序源码
    ☑️品牌:Uniapp☑️语言:vue☑️类型:微商个人相册☑️支持:小程序......
  • 【开源项目】宁波~超经典智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!
    最新消息,数字孪生智慧宁波开源了其数据工程源码和工程,免费送出供大家学习、使用、分享。智慧宁波实现了一系列全面的功能,如实现长三角经济圈特效、智慧地铁特效、智慧灯杆特性等。这些项目利用数字孪生技术和物联网等先进技术,可以实现精细化管理和智能控制,提高城市管理效率和品质......
  • 智慧停车场微信小程序源码/全开源智能停车系统源码
    ☑️品牌:小程序☑️语言:小程序☑️类型:智慧停车场系统☑️支持:小程序......
  • 基于uniapp开发的zblog多端小程序源码
    ☑️品牌:uniapp☑️语言:vue☑️类型:文章资讯博客☑️支持:小程序......
  • ETCD源码阅读(四)
    DAY3:ETCD分布式锁:etcd/contrib/lock这一部分代码主要是为了展示ETCD实现分布式锁的原理(Lease),并且贴出了DDIA作者的一篇博文作为应用场景建模。那么我们就先来读这篇博文吧。为什么要使用分布式锁防止数据竞争:多个分布式下节点可能会同时修改同一份数据,如果不加锁,会导致数......
  • rocketmq-spring : 实战与源码解析一网打尽
    RocketMQ是大家耳熟能详的消息队列,开源项目rocketmq-spring可以帮助开发者在SpringBoot项目中快速整合RocketMQ。这篇文章会介绍SpringBoot项目使用rocketmq-springSDK实现消息收发的操作流程,同时笔者会从开发者的角度解读SDK的设计逻辑。1SDK简介项目地址:......