软件工程应用与实践第二篇

本文介绍了ORB-SLAM3的主要系统组件,包括Atlas地图集、跟踪线程、局部建图线程和回环地图合并线程。详细分析了`System.cc`文件中的构造函数,展示了SLAM系统的初始化过程,如ORB字典的建立、关键帧数据库、地图集的创建,以及跟踪线程和局部建图线程的启动。
摘要由CSDN通过智能技术生成

ORB-SLAM3代码分析(一)

2021SC@SDUSC


一、ORB-SLAM3系统概述

ORB-SLAM3是建立在ORB-SLAM2和ORB-SLAM-VI上的。
在这里插入图片描述
图中是ORB-SLAM3的主要系统组件
·Atlas地图集
Atlas地图集由一系列不连续的小地图构成,并能够无缝连接,实现重定位、回环检测、地点识别等功能。当每一个新的视觉帧进入流程,跟踪线程立即追踪并定位新一帧的位姿。
·跟踪线程
用来根据当前的active地图,实时地跟踪最新一帧的位置,利用最小化重投影误差的方式实现位姿的最大后验估计MAP。决定新一帧是否作为关键帧加入地图也是在这个线程中完成的。
·局部建图线程
添加关键帧和点到active地图,VI-Bundle Adjustment在当前被插入帧前后窗口内被用来提升地图的质量。
·回环地图合并线程
该线程以关键帧率检测active地图和Atlas地图之间的公共区域。如果公共区域属于active地图,则需要进行loop correction回环矫正;如果它属于不同的地图,则两个地图则会被合并成一个地图并将大地图设置为当前的active地图。

二、System.cc代码分析

System.cc这个文件主要是SLAM系统的初始化、跟踪线程的入口以及轨迹的保存。

1.System的构造函数

代码如下(示例):

System::System(const string &strVocFile,                //词典文件路径
               const string &strSettingsFile,           //配置文件路径 
               const eSensor sensor,                    //传感器类型 
               const bool bUseViewer,                   //是否使用可视化界面 
               const int initFr,                        //初始化帧的id,开始时为0
               const string &strSequence,               
               const string &strLoadingFile             
               ):
               mSensor(sensor),                        //初始化传感器类型
               mpViewer(static_cast<Viewer*>(NULL)),    
               mbReset(false), mbResetActiveMap(false), 
               mbActivateLocalizationMode(false),      
               mbDeactivateLocalizationMode(false)

接下来摘取主要初始化代码段进行注释

//建立一个新的ORB字典
mpVocabulary = new ORBVocabulary();
// 建立关键帧数据库
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary); 
//创建地图集
mpAtlas = new Atlas(0);
// 创建用于显示帧和地图的类,由Viewer调用
mpFrameDrawer = new FrameDrawer(mpAtlas);
mpMapDrawer = new MapDrawer(mpAtlas, strSettingsFile);
// 创建跟踪线程(主线程),在mian函数中执行
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
                             mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensorstrSequence);
//创建并开启local mapping线程,线程函数为LocalMapping::Run()
mpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR, mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO, strSequence);
mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper); 

以上代码是对SLAM系统整体的初始化

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值