0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ORB-SLAM2的变量命名规则代码运行流程简析

工程师邓生 来源:CSDN 作者:ncepu_Chen 2022-09-29 09:49 次阅读

运行官方Demo

以TUM数据集为例,运行Demo的命令:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE

rgbd_tum.cc的源码:

poYBAGM0-gOAXumXAAGdQ4YQ8ns561.jpg
pYYBAGM0-gyAehCOAAEtp0ovUKg988.jpg

运行程序rgbd_tum时传入了一个重要的配置文件TUM1.yaml,其中保存了相机参数和ORB特征提取参数:


poYBAGM0-jyAI7fXAAELEC16DeQ600.jpgpoYBAGM0-kaAJXHhAABrtvyeWDY012.jpg阅读代码之前你应该知道的事情 变量命名规则 ORB-SLAM2中的变量遵循一套命名规则: 1、变量名的第一个字母为m表示该变量为某类的成员变量. 2、变量名的第一、二个字母表示数据类型: ·p表示指针类型 ·n表示int类型 ·b表示bool类型 ·s表示std::set类型 ·v表示std::vector类型 ·l表示std::list类型 ·KF表示KeyFrame类型 这种将变量类型写进变量名的命名方法叫做匈牙利命名法. 理解多线程 为什么要使用多线程? 1、加快运算速度: 

poYBAGM0-nyAJcUxAABrR2C_b6Y862.jpg

开两个线程同时计算两个矩阵,在多核处理器上会加快运算速度 2. 因为系统的随机性,各步骤的运行顺序是不确定的 . Tracking线程不产生关键帧时,LocalMapping和LoopClosing线程基本上处于空转的状态 . 而Tracking线程产生关键帧的频率和时机不是固定的,因此需要3个线程同时运行,LocalMapping和LoopClosing线程不断循环查询Tracking线程是否产生关键帧,产生了的话就处理.

406907ac-3f83-11ed-9e49-dac502259ad0.png


poYBAGM0-siAG2huAAEV_81wYwY762.jpgpYYBAGM0-tCARGafAACXQYjc83I836.jpg多线程中的锁 为防止多个线程同时操作同一变量造成混乱,引入锁机制: 将成员函数本身设为私有变量(private或protected),并在操作它们的公有函数内加锁. 

pYYBAGM0-uyAbZBtAACaF0bno9M743.jpg

一把锁在某个时刻只有一个线程能够拿到,如果程序执行到某个需要锁的位置,但是锁被别的线程拿着不释放的话,当前线程就会暂停下来;直到其它线程释放了这个锁,当前线程才能拿走锁并继续向下执行. 什么时候加锁和释放锁? unique_lock lockCon(mMutexConnections);这句话就是加锁,锁的有效性仅限于大括号{}之内,也就是说,程序运行出大括号之后就释放锁了.因此可以看到有一些代码中加上了看似莫名其妙的大括号.

poYBAGM0-xiABa0JAACNoQ9tg8M303.jpg

SLAM主类System System类是ORB-SLAM2系统的主类,先分析其主要的成员函数和成员变量:

409ead8a-3f83-11ed-9e49-dac502259ad0.png

40bfc844-3f83-11ed-9e49-dac502259ad0.png

构造函数 System(const string &strVocFile, string &strSettingsFile, const eSensor sensor, const bool bUseViewer=true): 构造函数

poYBAGM0-1yAe5G5AAH7Aw9eI_U257.jpgpYYBAGM0-2OAT08BAABoaeVDoMs467.jpg

LocalMapping和LoopClosing线程在System类中有对应的std::thread线程成员变量,为什么Tracking线程没有对应的std::thread成员变量? 因为Tracking线程就是主线程,而LocalMapping和LoopClosing线程是其子线程,主线程通过持有两个子线程的指针(mptLocalMapping和mptLoopClosing)控制子线程. (ps: 虽然在编程实现上三大主要线程构成父子关系,但逻辑上我们认为这三者是并发的,不存在谁控制谁的问题).

跟踪函数

System对象所在的主线程就是跟踪线程,针对不同的传感器类型有3个用于跟踪的函数,其内部实现就是调用成员变量mpTracker的GrabImageMonocular(GrabImageStereo或GrabImageRGBD)方法.

40df2ee6-3f83-11ed-9e49-dac502259ad0.png

传感器类型用于跟踪的成员函数 pYYBAGM0-36ASEIEAACHrnznLmI311.jpg

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48069

    浏览量

    739997
  • SLAM
    +关注

    关注

    22

    文章

    390

    浏览量

    31589

原文标题:ORB-SLAM2代码运行流程

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    代码里的命名规则:错误的和正确的对比

    命名规则。这样做的主要作用就是使源代码更易读易懂。所以,也就更容易维护和扩展。这篇文章里,我将举出一些例子,说明什么是“不好的代码”,什么是“清楚的
    发表于 06-13 22:33

    请问用树莓派运行ORB-SLAM2算法可行吗?

    最近想用树莓派3B跑ORB-SLAM2,现在的问题就是Pangolin无法执行,每次执行都报错 Pangolin X11: Unable to retrieve framebuffer
    发表于 03-15 22:30

    视觉SLAM特征点法与直接法对比分析

    视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO
    发表于 06-02 16:56

    1.1FreeRTOS的命名规则

    1.1FreeRTOS 的命名规则 2017.2.1 书zzw 最近几天开始学习FreeRTOS,学习笔记将陆续发布。 变量:  uint32_t 定义的变量都加上前缀 ul。u 代
    发表于 07-25 05:49

    Armv8.1-M PAC和BTI扩展

    1、Armv8.1-M PAC和 BTI 扩展Armv8-M通过Trustzone for Armv8-M, Memory Protection Unit (MPU) 和Privileged
    发表于 08-05 14:56

    Verilog代码命名六大黄金规则

    电子发烧友网核心提示: 关于Verilog代码命名的六大黄金规则。 1. 系统级信号的命名。 系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字
    发表于 09-04 14:40 5807次阅读

    变量命名应简单清晰

    代码中使用了超长的命名会影响代码的清晰性。同时,超长的变量命名会造成换行,这会影响代码的结构,不
    发表于 09-26 11:48 14次下载

    Python公认的命名规则总结

    对于模块名/包名、函数名、变量名、类名、常量名的命名,Python有一些公认的规则,具体如下。
    的头像 发表于 01-23 11:25 1580次阅读

    编程代码的书写规则

    为大家搜集到编程代码的书写规则,小伙伴们千万要记住这些规则。 如果对现在的工作不满意,掌握这些技巧也是可以顺利离职的小窍门哦~ 01 以一种代码已经被混淆的方式
    的头像 发表于 11-12 18:03 2230次阅读

    ORB SLAM中涉及的一些基础概念

    ORB-SLAM 3提供了多地图的存储和拼接功能,在跟踪丢失后可以尝试将现有地图和历史地图进行匹配、融合,并更新当前的活跃地图(Active Map)
    的头像 发表于 10-28 14:28 981次阅读

    ORB-SLAM3与ORB-SLAM2相比有哪些优势呢?

    自主导航是机器人基础性和关键性技术,是机器人实现其他更高级任务的前提。视觉 SLAM (Simultaneous Localization And Mapping) 利用视觉传感器获取环境图像信息,基于多视图几何算法构建环境地图。
    的头像 发表于 01-16 10:58 2143次阅读

    ORB-SLAM3整体流程详解

    ORB-SLAM2相比,ORB-SLAM3在处理大视差和长时间未观测到的场景时效果更好。它还提供了更准确的帧间运动估计和更快的处理速度。
    的头像 发表于 06-19 09:28 2135次阅读
    <b class='flag-5'>ORB-SLAM</b>3整体<b class='flag-5'>流程</b>详解

    python变量命名规则

    规则和约定。本文将详尽、详实、细致地探讨Python变量命名规则,帮助读者了解如何正确命名变量
    的头像 发表于 11-23 15:44 740次阅读

    工程实践中VINS与ORB-SLAM的优劣分析

    ORB-SLAM是一种基于特征的单目视觉SLAM系统,广泛用于实时三维地图构建和机器人定位。该系统使用ORB特征进行高效的视觉识别和地图重建,支持关键帧技术和回环检测来优化地图的准确性。
    的头像 发表于 04-08 10:17 358次阅读
    工程实践中VINS与<b class='flag-5'>ORB-SLAM</b>的优劣分析

    基于多摄像头的高鲁棒性视觉SLAM系统设计

    本文的主要目标是通过扩展ORB-SLAM2的功能来增强准确性,从多个摄像头中的姿态估计和地图重用开始。所有这些多摄像头的图像特征将被合并到跟踪模块中进行特征匹配,以及在闭环检测期间进行位置识别。
    发表于 04-20 17:51 83次阅读
    基于多摄像头的高鲁棒性视觉<b class='flag-5'>SLAM</b>系统设计