手把手带你死磕ORBSLAM3源代码(十)System.cc System类代码分析

目录

一.前言

二.代码分析

2.1 引用头文件

2.2 静态成员变量

2.3 System函数


一.前言

    这部分代码介绍引用头文件以及System类的函数定义文件。

二.代码分析

2.1 引用头文件

#include "System.h"
#include "Converter.h"
#include <thread>
#include <pangolin/pangolin.h>
#include <iomanip>
#include <openssl/md5.h>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/string.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
  1. #include "System.h"

    • 这是一个自定义头文件,可能包含了与系统相关的功能或类定义。
  2. #include "Converter.h"

    • 这也是一个自定义头文件,可能包含了转换功能或类定义。
  3. #include <thread>

    • 这是C++标准库中的线程头文件,提供了多线程编程的支持。
  4. #include <pangolin/pangolin.h>

    • Pangolin 是一个轻量级的 C++ 库,用于3D可视化和用户界面。此头文件是其主要接口。
  5. #include <iomanip>

    • 这是C++标准库中的一个输入输出流操作的头文件,提供了格式化输入输出的功能。
  6. #include <openssl/md5.h>

    • OpenSSL 是一个强大的安全套接字层密码库,此头文件提供了MD5哈希算法的支持。
  7. #include <boost/serialization/base_object.hpp>

    • Boost 是一个广泛使用的C++库,提供了许多实用的功能。这个头文件与序列化相关,用于支持对象的序列化。
  8. #include <boost/serialization/string.hpp>

    • 这是Boost库中关于字符串序列化的头文件。
  9. #include <boost/archive/text_iarchive.hpp>#include <boost/archive/text_oarchive.hpp>

    • 这两个头文件与Boost的文本存档相关,分别用于从文本文件中反序列化和序列化对象。
  10. #include <boost/archive/binary_iarchive.hpp>#include <boost/archive/binary_oarchive.hpp>

  • 这两个头文件与Boost的二进制存档相关,分别用于从二进制文件中反序列化和序列化对象。
  1. #include <boost/archive/xml_iarchive.hpp>#include <boost/archive/xml_oarchive.hpp>
  • 这两个头文件与Boost的XML存档相关,分别用于从XML文件中反序列化和序列化对象。

2.2 静态成员变量

  1. Verbose::eLevel Verbose::th = Verbose::VERBOSITY_NORMAL; 这行代码的意思是,声明一个类型为Verbose::eLevel的静态成员变量th,并将其初始化为Verbose::VERBOSITY_NORMAL。这通常是在类的定义外部进行的初始化,通常在源文件(.cpp文件)中而不是头文件(.h或.hpp文件)中。

这样的设置通常用于控制程序的日志记录或输出详细程度。例如,如果程序中有多个详细级别(如“简洁”、“正常”和“详细”),则可以通过更改th变量的值来轻松地在这些级别之间进行切换。

2.3 System函数

System::System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor,const bool bUseViewer, const int initFr, const string &strSequence):mSensor(sensor), mpViewer(static_cast<Viewer*>(NULL)), mbReset(false), mbResetActiveMap(false),mbActivateLocalizationMode(false), mbDeactivateLocalizationMode(false), mbShutDown(false)
{// Output welcome messagecout << endl <<"ORB-SLAM3 Copyright (C) 2017-2020 Carlos Campos, Richard Elvira, Juan J. Gómez, José M.M. Montiel and Juan D. Tardós, University of Zaragoza." << endl <<"ORB-SLAM2 Copyright (C) 2014-2016 Raúl Mur-Artal, José M.M. Montiel and Juan D. Tardós, University of Zaragoza." << endl <<"This program comes with ABSOLUTELY NO WARRANTY;" << endl  <<"This is free software, and you are welcome to redistribute it" << endl <<"under certain conditions. See LICENSE.txt." << endl << endl;cout << "Input sensor was set to: ";if(mSensor==MONOCULAR)cout << "Monocular" << endl;else if(mSensor==STEREO)cout << "Stereo" << endl;else if(mSensor==RGBD)cout << "RGB-D" << endl;else if(mSensor==IMU_MONOCULAR)cout << "Monocular-Inertial" << endl;else if(mSensor==IMU_STEREO)cout << "Stereo-Inertial" << endl;else if(mSensor==IMU_RGBD)cout << "RGB-D-Inertial" << endl;//Check settings filecv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);if(!fsSettings.isOpened()){cerr << "Failed to open settings file at: " << strSettingsFile << endl;exit(-1);}cv::FileNode node = fsSettings["File.version"];if(!node.empty() && node.isString() && node.string() == "1.0"){settings_ = new Settings(strSettingsFile,mSensor);mStrLoadAtlasFromFile = settings_->atlasLoadFile();mStrSaveAtlasToFile = settings_->atlasSaveFile();cout << (*settings_) << endl;}else{settings_ = nullptr;cv::FileNode node = fsSettings["System.LoadAtlasFromFile"];if(!node.empty() && node.isString()){mStrLoadAtlasFromFile = (string)node;}node = fsSettings["System.SaveAtlasToFile"];if(!node.empty() && node.isString()){mStrSaveAtlasToFile = (string)node;}}node = fsSettings["loopClosing"];bool activeLC = true;if(!node.empty()){activeLC = static_cast<int>(fsSettings["loopClosing"]) != 0;}mStrVocabularyFilePath = strVocFile;bool loadedAtlas = false;if(mStrLoadAtlasFromFile.empty()){//Load ORB Vocabularycout << endl << "Loading ORB Vocabulary. This could take a while..." << endl;mpVocabulary = new ORBVocabulary();bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);if(!bVocLoad){cerr << "Wrong path to vocabulary. " << endl;cerr << "Falied to open at: " << strVocFile << endl;exit(-1);}cout << "Vocabulary loaded!" << endl << endl;//Create KeyFrame DatabasempKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);//Create the Atlascout << "Initialization of Atlas from scratch " << endl;mpAtlas = new Atlas(0);}else{//Load ORB Vocabularycout << endl << "Loading ORB Vocabulary. This could take a while..." << endl;mpVocabulary = new ORBVocabulary();bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);if(!bVocLoad){cerr << "Wrong path to vocabulary. " << endl;cerr << "Falied to open at: " << strVocFile << endl;exit(-1);}cout << "Vocabulary loaded!" << endl << endl;//Create KeyFrame DatabasempKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);cout << "Load File" << endl;// Load the file with an earlier session//clock_t start = clock();cout << "Initialization of Atlas from file: " << mStrLoadAtlasFromFile << endl;bool isRead = LoadAtlas(FileType::BINARY_FILE);if(!isRead){cout << "Error to load the file, please try with other session file or vocabulary file" << endl;exit(-1);}//mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);//cout << "KF in DB: " << mpKeyFrameDatabase->mnNumKFs << "; words: " << mpKeyFrameDatabase->mnNumWords << endl;loadedAtlas = true;mpAtlas->CreateNewMap();//clock_t timeElapsed = clock() - start;//unsigned msElapsed = timeElapsed / (CLOCKS_PER_SEC / 1000);//cout << "Binary file read in " << msElapsed << " ms" << endl;//usleep(10*1000*1000);}if (mSensor==IMU_STEREO || mSensor==IMU_MONOCULAR || mSensor==IMU_RGBD)mpAtlas->SetInertialSensor();//Create Drawers. These are used by the ViewermpFrameDrawer = new FrameDrawer(mpAtlas);mpMapDrawer = new MapDrawer(mpAtlas, strSettingsFile, settings_);//Initialize the Tracking thread//(it will live in the main thread of execution, the one that called this constructor)cout << "Seq. Name: " << strSequence << endl;mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensor, settings_, strSequence);//Initialize the Local Mapping thread and launchmpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR,mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO || mSensor==IMU_RGBD, strSequence);mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper);mpLocalMapper->mInitFr = initFr;if(settings_)mpLocalMapper->mThFarPoints = settings_->thFarPoints();elsempLocalMapper->mThFarPoints = fsSettings["thFarPoints"];if(mpLocalMapper->mThFarPoints!=0){cout << "Discard points further than " << mpLocalMapper->mThFarPoints << " m from current camera" << endl;mpLocalMapper->mbFarPoints = true;}elsempLocalMapper->mbFarPoints = false;//Initialize the Loop Closing thread and launch// mSensor!=MONOCULAR && mSensor!=IMU_MONOCULARmpLoopCloser = new LoopClosing(mpAtlas, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR, activeLC); // mSensor!=MONOCULAR);mptLoopClosing = new thread(&ORB_SLAM3::LoopClosing::Run, mpLoopCloser);//Set pointers between threadsmpTracker->SetLocalMapper(mpLocalMapper);mpTracker->SetLoopClosing(mpLoopCloser);mpLocalMapper->SetTracker(mpTracker);mpLocalMapper->SetLoopCloser(mpLoopCloser);mpLoopCloser->SetTracker(mpTracker);mpLoopCloser->SetLocalMapper(mpLocalMapper);//usleep(10*1000*1000);//Initialize the Viewer thread and launchif(bUseViewer)//if(false) // TODO{mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile,settings_);mptViewer = new thread(&Viewer::Run, mpViewer);mpTracker->SetViewer(mpViewer);mpLoopCloser->mpViewer = mpViewer;mpViewer->both = mpFrameDrawer->both;}// Fix verbosityVerbose::SetTh(Verbose::VERBOSITY_QUIET);}

这段代码是一个系统类的构造函数,它主要用于初始化ORB-SLAM3(一个用于视觉SLAM的开源库)的实例。这个构造函数接收一系列参数,并根据这些参数配置系统。

以下是对代码主要部分的详细解释:

  1. 参数解释

    • const string &strVocFile:ORB词汇表的文件路径,用于特征匹配。
    • const string &strSettingsFile:设置文件的路径,包含系统配置。
    • const eSensor sensor:传感器的类型(如单目、双目、RGB-D等)。
    • const bool bUseViewer:是否使用查看器。
    • const int initFr:初始化帧数(在这段代码中未使用)。
    • const string &strSequence:序列的文件路径(在这段代码中未使用)。
  2. 成员变量初始化:初始化一系列成员变量,如传感器类型、查看器指针、各种标志等。

  3. 输出欢迎信息:输出ORB-SLAM3的版权和许可信息。

  4. 检查传感器类型:根据传入的传感器类型,输出相应的信息。

  5. 加载设置文件:使用OpenCV的FileStorage类加载设置文件,并检查文件是否可以打开。然后,检查文件版本,并根据版本加载相应的设置。

  6. 加载或创建地图:根据是否提供了加载地图的文件路径,决定是从文件中加载地图还是从零开始创建地图。

  7. 加载ORB词汇表:从给定的文件路径加载ORB词汇表。如果加载失败,则输出错误信息并退出程序。

  8. 创建关键帧数据库和地图集:创建关键帧数据库和地图集对象。如果提供了加载文件的路径并且成功加载了地图,那么就从加载的文件中恢复这些信息;否则,创建一个新的地图集。

  9. 加载或初始化地图集:如果提供了加载文件并且成功加载了地图集,就使用加载的数据初始化地图集;否则,创建一个新的地图集并从零开始初始化。

  10. 错误处理:在加载地图集或词汇表时,如果遇到错误,程序将输出错误信息并退出。

总的来说,这个构造函数的主要目的是根据提供的参数和设置文件来初始化ORB-SLAM3系统,包括加载或创建地图集、加载ORB词汇表、设置传感器类型等。它是整个系统运行的起点,为后续的视觉SLAM任务(如定位、建图等)做好准备。

代码的最后对多线程,传感器的数据进行了初始化。

// 如果传感器是IMU_STEREO、IMU_MONOCULAR或IMU_RGBD,则为Atlas设置惯性传感器  
if (mSensor==IMU_STEREO || mSensor==IMU_MONOCULAR || mSensor==IMU_RGBD)  mpAtlas->SetInertialSensor();  // 创建绘制器。这些由查看器使用  
mpFrameDrawer = new FrameDrawer(mpAtlas);  // 创建一个帧绘制器  
mpMapDrawer = new MapDrawer(mpAtlas, strSettingsFile, settings_);  // 创建一个地图绘制器  // 初始化跟踪线程  
//(它将在调用此构造函数的主执行线程中运行)  
cout << "Seq. Name: " << strSequence << endl;  
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,  mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensor, settings_, strSequence);  // 初始化本地映射线程并启动  
mpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR,  mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO || mSensor==IMU_RGBD, strSequence);  
mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper);  
// ... 一些设置和条件检查 ...  // 初始化闭环线程并启动  
// mSensor!=MONOCULAR && mSensor!=IMU_MONOCULAR  
mpLoopCloser = new LoopClosing(mpAtlas, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR, activeLC); // mSensor!=MONOCULAR);  
mptLoopClosing = new thread(&ORB_SLAM3::LoopClosing::Run, mpLoopCloser);  // 在线程之间设置指针,以便它们可以相互通信和访问  
mpTracker->SetLocalMapper(mpLocalMapper);  
mpTracker->SetLoopClosing(mpLoopCloser);  
mpLocalMapper->SetTracker(mpTracker);  
mpLocalMapper->SetLoopCloser(mpLoopCloser);  
mpLoopCloser->SetTracker(mpTracker);  
mpLoopCloser->SetLocalMapper(mpLocalMapper);  // 如果使用查看器,则初始化查看器线程并启动  
if(bUseViewer)  
{  mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile,settings_);  mptViewer = new thread(&Viewer::Run, mpViewer);  // ... 设置查看器与其他线程的关联 ...  
}  // 设置详细级别为“安静”,即不输出太多信息  
Verbose::SetTh(Verbose::VERBOSITY_QUIET);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure Machine Learning - Azure OpenAI GPT 3.5 Turbo 微调教程

本教程将引导你在Azure平台完成对 gpt-35-turbo-0613 模型的微调。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&…

Javacv-利用Netty实现推流直播复用(flv)

前言 上一篇文章《JavaCV之rtmp推流&#xff08;FLV和M3U8&#xff09;》介绍了javacv的基本使用&#xff0c;今天来讲讲如何实现推流复用。 以监控摄像头的直播为例&#xff0c;通常分为三步&#xff1a; 从设备获取音视频流利用javacv进行解码&#xff08;例如flv或m3u8&am…

随笔记录.1

1.find高级用法 find . -name *.te | xargs grep -i "zygote_tmpfs" find . -name *.te | xargs grep -i "_app_tmpfs" 2.audit2allow -p policy < avc_log.txt 3.fastboot oem set_selinux na 4.adb disable-verity 5.adb shell am broadcast -a …

初级游戏客户端社招面试问题总结

目录 c c# lua Unity NGUI AssetBundles资源管理 Unity性能优化 图形学 网络 场景题 计组&操作系统 其他知识 算法题 c 虚函数的原理 智能指针的原理 如何解决循环引用 智能指针的源码 c&#xff0c;使用char实现自定义的一个string 可以通过new去申请一…

如何实现准时的setTimeout

背景 setTimeout 是不准的。因为 setTimeout 是一个宏任务&#xff0c;它的指定时间指的是&#xff1a;进入主线程的时间。 setTimeout(callback, 进入主线程的时间)所以什么时候可以执行 callback&#xff0c;需要看 主线程前面还有多少任务待执行。 由此&#xff0c;才有了…

MySQL8安装教程

MySQL安装教程 安装环境 Windows 10 软件下载 1、官网下载 官网可以下载最新版本的MySQL 8.0 下载地址&#xff1a; https://dev.mysql.com/downloads/windows/installer/8.0.html 开始安装 1、下载完成后&#xff0c;我们就开始安装&#xff0c;双击安装包&#xff0c…

李宏毅机器学习2023|图像生成模型

文章目录 图像生成Autoregressive&#xff08;各个击破&#xff09;Non-Autoregressive&#xff08;一次到位&#xff09;一次到位法额外的输入——从一个高维的Normal Distribution作simple得到一个向量常用的图片生成模型VAEFlow-based Generative ModelDiffusion ModelGAN D…

计量校准方案分享No.11——定碳定硫分析仪校准方案

[测量单元:红外碳硫分析仪,是否使用220V交流电源:是,碳测量范围:0.005%-4.3%,硫测量范 围:0.0005%-0.33%] 一 依据文件 CNAS CL01-G002-2021 《测量结果的计量溯源性要求》现行有效 RB/T 034-2020 《测量设备校准周期的确定和调整方法指南》现行有效 CNAS TRL-004-2017 《 …

跨境电商独立站的6大模式,任你选择!

在几年前搭建跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好创建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最…

【Qt-Edit】

Qt编程指南 ■ QTextEdit■ QLineEdit■ QLineEdit 设置正则表达式 ■ QPlainTextEdit■ QKeySequenceEdit■ QList<QLineEdit *> edits■■ ■ QTextEdit /* 实例和对象&#xff0c;设置位置和显示大小 */ textEdit new QTextEdit(this); textEdit->setGeometry(0…

每日一题(LeetCode)----栈和队列-- 简化路径

每日一题(LeetCode)----栈和队列-- 简化路径 1.题目&#xff08;71. 简化路径&#xff09; 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的…

ISO27001认证主要的审核方向

ISO27001审核主要针对组织的信息安全管理体系&#xff08;ISMS&#xff09;进行全面的审查&#xff0c;以确保其符合ISO/IEC 27001标准的要求。审核过程通常包括以下几个方面&#xff1a; 1. 组织环境&#xff1a;审核组织的信息安全管理体系是否能够在组织内部环境以及与外部供…

熟悉DHCP面临的安全威胁与防护机制

一个网络如果要正常地运行&#xff0c;则网络中的主机&#xff08;Host&#xff09;必需要知道某些重要的网络参数&#xff0c;如IP地址、网络掩码、网关地址、DNS服务器地址、网络打印机地址等等。显然&#xff0c;在每台主机上都采用手工方式来配置这些参数是非常困难的、或是…

Springboot学习

Springboot扩展点之InitializingBean-CSDN博客

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

《微信小程序开发从入门到实战》学习六十三

6.4 交互API 使用交互API可以在小程序中显示各种弹窗或动画&#xff0c;达到交互反馈的目的。 6.4.1 提示框API 使用wx.showToast接口可显示消息提示框。接口接受Object参。属性如下&#xff1a; title&#xff08;必填&#xff09; 提示的内容 icon …

postgres数据库安装

选择所需数据库版本进行下载 下载地址&#xff1a;PostgreSQL: File Browser 我是以/data当作主目录&#xff0c;所以在/data下创建俩文件夹&#xff0c;默认目录应该是usr mkdir software mkdir module 进入目录&#xff0c;上传下载的gz安装包 cd software rz 解压缩,版本…

6-2 递归求阶乘和

本题要求实现一个计算非负整数阶乘的简单函数&#xff0c;并利用该函数求 1!2!3!...n! 的值。 函数接口定义&#xff1a; double fact( int n ); double factsum( int n ); 函数fact应返回n的阶乘&#xff0c;建议用递归实现。函数factsum应返回 1!2!...n! 的值。题目保证输…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…