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

审核编辑:刘清

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

    关注

    2545

    文章

    50411

    浏览量

    750782
  • SLAM
    +关注

    关注

    23

    文章

    414

    浏览量

    31753

原文标题: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

    变量命名应简单清晰

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

    javascript变量命名规则与规范

    JavaScript 变量与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y)。变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的
    发表于 12-05 10:03 3615次阅读
    javascript<b class='flag-5'>变量</b><b class='flag-5'>命名</b><b class='flag-5'>规则</b>与规范

    Python公认的命名规则总结

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

    编程代码的书写规则

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

    获取单片机代码运行时间的方法资料下载

    电子发烧友网为你提供获取单片机代码运行时间的方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考
    发表于 04-24 08:49 12次下载
    <b class='flag-5'>简</b><b class='flag-5'>析</b>获取单片机<b class='flag-5'>代码</b><b class='flag-5'>运行</b>时间的方法资料下载

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

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

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

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

    OV2SLAM(高速视觉slam)

    视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在测试中都得到了认可。
    的头像 发表于 03-21 17:16 1500次阅读

    ORB-SLAM3整体流程详解

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

    python变量命名规则

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

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

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

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

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