手把手带你死磕ORBSLAM3源代码(九)System.h代码分析
2023-12-26 15:53:08
目录
一.前言
System库是orbslam3直接调用的库,内部调用了众多其它库。
二.System.h代码分析
2.1代码调用
#ifndef SYSTEM_H
#define SYSTEM_H
#include <unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<thread>
#include<opencv2/core/core.hpp>
#include "Tracking.h"
#include "FrameDrawer.h"
#include "MapDrawer.h"
#include "Atlas.h"
#include "LocalMapping.h"
#include "LoopClosing.h"
#include "KeyFrameDatabase.h"
#include "ORBVocabulary.h"
#include "Viewer.h"
#include "ImuTypes.h"
#include "Settings.h"
在这里调用了其他的代码文件,并引入必要的库文件。
2.2 Verbose类
class Verbose
{
public:
enum eLevel
{
VERBOSITY_QUIET=0,
VERBOSITY_NORMAL=1,
VERBOSITY_VERBOSE=2,
VERBOSITY_VERY_VERBOSE=3,
VERBOSITY_DEBUG=4
};
static eLevel th;
public:
static void PrintMess(std::string str, eLevel lev)
{
if(lev <= th)
cout << str << endl;
}
static void SetTh(eLevel _th)
{
th = _th;
}
};
这是一个名为Verbose
的C++类,它的目的是管理日志或输出的详细程度。下面是这段代码的逐行解释:
class Verbose
: 声明一个名为Verbose
的类。{
: 类的开始。public:
: 下面的成员是公开的,意味着从类的外部也可以访问它们。enum eLevel
: 声明一个名为eLevel
的枚举类型。这个枚举用于表示不同的详细程度或日志级别。{
: 枚举的开始。VERBOSITY_QUIET=0,
: 表示"安静"模式,不输出任何日志。VERBOSITY_NORMAL=1,
: 表示"正常"模式,输出基本的日志信息。VERBOSITY_VERBOSE=2,
: 表示"详细"模式,输出更多的日志信息。VERBOSITY_VERY_VERBOSE=3,
: 表示"非常详细"模式,输出大量的日志信息。VERBOSITY_DEBUG=4
: 表示"调试"模式,输出所有的日志信息,通常用于调试目的。};
: 枚举的结束。static eLevel th;
: 声明一个静态的eLevel
类型的变量th
。这个变量表示当前的日志级别阈值。只有级别低于或等于这个阈值的日志才会被输出。因为它是静态的,所以这个变量在类的所有实例之间共享。public:
: 下面的成员函数是公开的,意味着从类的外部也可以调用它们。static void PrintMess(std::string str, eLevel lev)
: 声明一个静态成员函数PrintMess
,它接受一个字符串和一个eLevel
枚举值作为参数。这个函数用于打印消息,但只有在消息的级别低于或等于当前阈值时才会打印。{
: 函数体的开始。if(lev <= th)
: 检查传入的日志级别是否低于或等于当前的阈值。cout << str << endl;
: 如果上面的条件为真,则输出传入的字符串并在其后加一个换行符。}
: 函数体的结束。static void SetTh(eLevel _th)
: 声明另一个静态成员函数SetTh
,它接受一个eLevel
枚举值作为参数。这个函数用于设置新的阈值。{
: 函数体的开始。th = _th;
: 设置新的阈值。}
: 函数体的结束。};
: 类的结束。
?2.3 声明类
class Viewer;
class FrameDrawer;
class MapDrawer;
class Atlas;
class Tracking;
class LocalMapping;
class LoopClosing;
class Settings;
通过这些语句实现对其他文件调用的类的声明。
2.4System类
class System
{
public:
// Input sensor
enum eSensor{
MONOCULAR=0,
STEREO=1,
RGBD=2,
IMU_MONOCULAR=3,
IMU_STEREO=4,
IMU_RGBD=5,
};
// File type
enum FileType{
TEXT_FILE=0,
BINARY_FILE=1,
};
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
// Initialize the SLAM system. It launches the Local Mapping, Loop Closing and Viewer threads.
System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor, const bool bUseViewer = true, const int initFr = 0, const string &strSequence = std::string());
// Proccess the given stereo frame. Images must be synchronized and rectified.
// Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double ×tamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");
// Process the given rgbd frame. Depthmap must be registered to the RGB frame.
// Input image: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Input depthmap: Float (CV_32F).
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double ×tamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");
// Proccess the given monocular frame and optionally imu data
// Input images: RGB (CV_8UC3) or grayscale (CV_8U). RGB is converted to grayscale.
// Returns the camera pose (empty if tracking fails).
Sophus::SE3f TrackMonocular(const cv::Mat &im, const double ×tamp, const vector<IMU::Point>& vImuMeas = vector<IMU::Point>(), string filename="");
// This stops local mapping thread (map building) and performs only camera tracking.
void ActivateLocalizationMode();
// This resumes local mapping thread and performs SLAM again.
void DeactivateLocalizationMode();
// Returns true if there have been a big map change (loop closure, global BA)
// since last call to this function
bool MapChanged();
// Reset the system (clear Atlas or the active map)
void Reset();
void ResetActiveMap();
// All threads will be requested to finish.
// It waits until all threads have finished.
// This function must be called before saving the trajectory.
void Shutdown();
bool isShutDown();
// Save camera trajectory in the TUM RGB-D dataset format.
// Only for stereo and RGB-D. This method does not work for monocular.
// Call first Shutdown()
// See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset
void SaveTrajectoryTUM(const string &filename);
// Save keyframe poses in the TUM RGB-D dataset format.
// This method works for all sensor input.
// Call first Shutdown()
// See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset
void SaveKeyFrameTrajectoryTUM(const string &filename);
void SaveTrajectoryEuRoC(const string &filename);
void SaveKeyFrameTrajectoryEuRoC(const string &filename);
void SaveTrajectoryEuRoC(const string &filename, Map* pMap);
void SaveKeyFrameTrajectoryEuRoC(const string &filename, Map* pMap);
// Save data used for initialization debug
void SaveDebugData(const int &iniIdx);
// Save camera trajectory in the KITTI dataset format.
// Only for stereo and RGB-D. This method does not work for monocular.
// Call first Shutdown()
// See format details at: http://www.cvlibs.net/datasets/kitti/eval_odometry.php
void SaveTrajectoryKITTI(const string &filename);
// TODO: Save/Load functions
// SaveMap(const string &filename);
// LoadMap(const string &filename);
// Information from most recent processed frame
// You can call this right after TrackMonocular (or stereo or RGBD)
int GetTrackingState();
std::vector<MapPoint*> GetTrackedMapPoints();
std::vector<cv::KeyPoint> GetTrackedKeyPointsUn();
// For debugging
double GetTimeFromIMUInit();
bool isLost();
bool isFinished();
void ChangeDataset();
float GetImageScale();
#ifdef REGISTER_TIMES
void InsertRectTime(double& time);
void InsertResizeTime(double& time);
void InsertTrackTime(double& time);
#endif
private:
void SaveAtlas(int type);
bool LoadAtlas(int type);
string CalculateCheckSum(string filename, int type);
// Input sensor
eSensor mSensor;
// ORB vocabulary used for place recognition and feature matching.
ORBVocabulary* mpVocabulary;
// KeyFrame database for place recognition (relocalization and loop detection).
KeyFrameDatabase* mpKeyFrameDatabase;
// Map structure that stores the pointers to all KeyFrames and MapPoints.
//Map* mpMap;
Atlas* mpAtlas;
// Tracker. It receives a frame and computes the associated camera pose.
// It also decides when to insert a new keyframe, create some new MapPoints and
// performs relocalization if tracking fails.
Tracking* mpTracker;
// Local Mapper. It manages the local map and performs local bundle adjustment.
LocalMapping* mpLocalMapper;
// Loop Closer. It searches loops with every new keyframe. If there is a loop it performs
// a pose graph optimization and full bundle adjustment (in a new thread) afterwards.
LoopClosing* mpLoopCloser;
// The viewer draws the map and the current camera pose. It uses Pangolin.
Viewer* mpViewer;
FrameDrawer* mpFrameDrawer;
MapDrawer* mpMapDrawer;
// System threads: Local Mapping, Loop Closing, Viewer.
// The Tracking thread "lives" in the main execution thread that creates the System object.
std::thread* mptLocalMapping;
std::thread* mptLoopClosing;
std::thread* mptViewer;
// Reset flag
std::mutex mMutexReset;
bool mbReset;
bool mbResetActiveMap;
// Change mode flags
std::mutex mMutexMode;
bool mbActivateLocalizationMode;
bool mbDeactivateLocalizationMode;
// Shutdown flag
bool mbShutDown;
// Tracking state
int mTrackingState;
std::vector<MapPoint*> mTrackedMapPoints;
std::vector<cv::KeyPoint> mTrackedKeyPointsUn;
std::mutex mMutexState;
//
string mStrLoadAtlasFromFile;
string mStrSaveAtlasToFile;
string mStrVocabularyFilePath;
Settings* settings_;
};
这部分代码声明了System.cc中System类的各个函数。
文章来源:https://blog.csdn.net/anananajiushiwo/article/details/135220812
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!