1.System.h
全局作用域 ORB_SLAM3
namespace ORB_SLAM3
{
//...
}
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;
}
};
类的声明:
class Viewer;
class FrameDrawer;
class MapDrawer;
class Atlas;
class Tracking;
class LocalMapping;
class LoopClosing;
class Settings;
System类初始化:
1.Input传感器类型
enum eSensor{
MONOCULAR=0,
STEREO=1,
RGBD=2,
IMU_MONOCULAR=3,
IMU_STEREO=4,
IMU_RGBD=5,
};
2.文件类型 // File type
enum FileType{
TEXT_FILE=0,
BINARY_FILE=1,
};
3.EIgen的宏
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
EIGEN_MAKE_ALIGNED_OPERATOR_NEW是一个宏,用于在Eigen C++库中启用对齐内存分配。
4.System函数声明
System(const string &strVocFile, const string &strSettingsFile,
const eSensor sensor, const bool bUseViewer = true,
const int initFr = 0, const string &strSequence = std::string());
5. 三种Track
1.Sophus::SE3f TrackStereo
// 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="");
2.Sophus::SE3f TrackRGBD
// 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="");
3.Sophus::SE3f TrackMonocular
// 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="");
6. LocalizationMode
// 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();
bool MapChanged();
// 如果自上次调用此函数以来地图发生了重大变化(循环闭包、全局 BA),则返回 true
void Reset();
void ResetActiveMap();
//重置系统(清除 Atlas 或活动地图)
void Shutdown();
bool isShutDown();
// 将请求所有线程完成。
// 等待所有线程完成。
// 必须在保存轨迹之前调用此函数。
TUM格式数据集
void SaveTrajectoryTUM(const string &filename);
// 以 TUM RGB-D 数据集格式保存相机轨迹。
// 仅适用于立体和 RGB-D。此方法不适用于单目。
// 首先调用 Shutdown()
void SaveKeyFrameTrajectoryTUM(const string &filename);
// 以 TUM RGB-D 数据集格式保存关键帧姿势。
// 此方法适用于所有传感器输入。
// 首先调用 Shutdown()
EuRoC数据集
void SaveTrajectoryEuRoC(const string &filename);
void SaveKeyFrameTrajectoryEuRoC(const string &filename);
void SaveTrajectoryEuRoC(const string &filename, Map* pMap);
void SaveKeyFrameTrajectoryEuRoC(const string &filename, Map* pMap);
void SaveDebugData(const int &iniIdx);
// 保存用于初始化调试的数据
KITTI数据集
void SaveTrajectoryKITTI(const string &filename);
// 以 KITTI 数据集格式保存相机轨迹。
// 仅适用于立体和 RGB-D。此方法不适用于单目。
// 首先调用 Shutdown()
// 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();
7. private域
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_;
2.System.cc
全局作用域ORB_SLAM3
1. Verbose::eLevel Verbose::th = Verbose::VERBOSITY_NORMAL;
2.System::System
初始化: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 message
cout << 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 file:
cv::FileStorage对象代表一个YAML或XML格式的文件。
c_str() 以 char* 形式传回 string 内含字符串 ,如果一个函数要求char*参数,可以使用c_str()方法。
cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
if(!fsSettings.isOpened())
{
cerr << "Failed to open settings file at: " << strSettingsFile << endl;
exit(-1);
}
cv::FileNode 是 OpenCV 中的一个类,用于处理 YAML 或 XML 文件中的节点数据。它主要用于读取和解析这些文件中的数据,适用于配置文件、参数存储等场景。
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;
}
}
loopClosing节点
3.Settings.h
namespace ORB_SLAM3
定义System类; class System;
定义Setting类
针对不同相机类型实施的枚举
enum CameraType {
PinHole = 0,
Rectified = 1,
KannalaBrandt = 2
};
来自文件的构造函数
Settings(const std::string &configFile, const int& sensor);
Ostream 运算符重载将设置转储到终端
friend 关键字使函数成为该类的友元函数。友元函数可以访问类的私有和受保护成员。
friend std::ostream &operator<<(std::ostream &output, const Settings &s);
std::ostream &output: 这个参数表示输出流的引用。通常是 std::cout,但也可以是其他类型的输出流,如文件流 std::ofstream。
const Settings &s: 这是对 Settings 类对象的常量引用,表示要输出的对象。这是 const 的,因此该函数不会修改传入的 Settings 对象。
它使得 Settings 类的对象可以通过 << 运算符直接输出。
类方法定义:
/*
* Getter methods
*/
CameraType cameraType() {return cameraType_;}
GeometricCamera* camera1() {return calibration1_;}
GeometricCamera* camera2() {return calibration2_;}
cv::Mat camera1DistortionCoef() {return cv::Mat(vPinHoleDistorsion1_.size(),1,CV_32F,vPinHoleDistorsion1_.data());}
cv::Mat camera2DistortionCoef() {return cv::Mat(vPinHoleDistorsion2_.size(),1,CV_32F,vPinHoleDistorsion1_.data());}
Sophus::SE3f Tlr() {return Tlr_;}
float bf() {return bf_;}
float b() {return b_;}
float thDepth() {return thDepth_;}
bool needToUndistort() {return bNeedToUndistort_;}
cv::Size newImSize() {return newImSize_;}
float fps() {return fps_;}
bool rgb() {return bRGB_;}
bool needToResize() {return bNeedToResize1_;}
bool needToRectify() {return bNeedToRectify_;}
float noiseGyro() {return noiseGyro_;}
float noiseAcc() {return noiseAcc_;}
float gyroWalk() {return gyroWalk_;}
float accWalk() {return accWalk_;}
float imuFrequency() {return imuFrequency_;}
Sophus::SE3f Tbc() {return Tbc_;}
bool insertKFsWhenLost() {return insertKFsWhenLost_;}
float depthMapFactor() {return depthMapFactor_;}
int nFeatures() {return nFeatures_;}
int nLevels() {return nLevels_;}
float initThFAST() {return initThFAST_;}
float minThFAST() {return minThFAST_;}
float scaleFactor() {return scaleFactor_;}
float keyFrameSize() {return keyFrameSize_;}
float keyFrameLineWidth() {return keyFrameLineWidth_;}
float graphLineWidth() {return graphLineWidth_;}
float pointSize() {return pointSize_;}
float cameraSize() {return cameraSize_;}
float cameraLineWidth() {return cameraLineWidth_;}
float viewPointX() {return viewPointX_;}
float viewPointY() {return viewPointY_;}
float viewPointZ() {return viewPointZ_;}
float viewPointF() {return viewPointF_;}
float imageViewerScale() {return imageViewerScale_;}
std::string atlasLoadFile() {return sLoadFrom_;}
std::string atlasSaveFile() {return sSaveto_;}
float thFarPoints() {return thFarPoints_;}
cv::Mat M1l() {return M1l_;}
cv::Mat M2l() {return M2l_;}
cv::Mat M1r() {return M1r_;}
cv::Mat M2r() {return M2r_;}
private:
模板,定义读参数
template<typename T>
T readParameter(cv::FileStorage& fSettings, const std::string& name, bool& found,const bool required = true){
cv::FileNode node = fSettings[name];
if(node.empty()){
if(required){
std::cerr << name << " required parameter does not exist, aborting..." << std::endl;
exit(-1);
}
else{
std::cerr << name << " optional parameter does not exist..." << std::endl;
found = false;
return T();
}
}
else{
found = true;
return (T) node;
}
}
私有方法
void readCamera1(cv::FileStorage& fSettings);
void readCamera2(cv::FileStorage& fSettings);
void readImageInfo(cv::FileStorage& fSettings);
void readIMU(cv::FileStorage& fSettings);
void readRGBD(cv::FileStorage& fSettings);
void readORB(cv::FileStorage& fSettings);
void readViewer(cv::FileStorage& fSettings);
void readLoadAndSave(cv::FileStorage& fSettings);
void readOtherParameters(cv::FileStorage& fSettings);
void precomputeRectificationMaps();
int sensor_;
CameraType cameraType_; //Camera type
/*
* Visual stuff
*/
GeometricCamera* calibration1_, *calibration2_; //Camera calibration
GeometricCamera* originalCalib1_, *originalCalib2_;
std::vector<float> vPinHoleDistorsion1_, vPinHoleDistorsion2_;
cv::Size originalImSize_, newImSize_;
float fps_;
bool bRGB_;
bool bNeedToUndistort_;
bool bNeedToRectify_;
bool bNeedToResize1_, bNeedToResize2_;
Sophus::SE3f Tlr_;
float thDepth_;
float bf_, b_;
/*
* Rectification stuff
*/
cv::Mat M1l_, M2l_;
cv::Mat M1r_, M2r_;
/*
* Inertial stuff
*/
float noiseGyro_, noiseAcc_;
float gyroWalk_, accWalk_;
float imuFrequency_;
Sophus::SE3f Tbc_;
bool insertKFsWhenLost_;
/*
* RGBD stuff
*/
float depthMapFactor_;
/*
* ORB stuff
*/
int nFeatures_;
float scaleFactor_;
int nLevels_;
int initThFAST_, minThFAST_;
/*
* Viewer stuff
*/
float keyFrameSize_;
float keyFrameLineWidth_;
float graphLineWidth_;
float pointSize_;
float cameraSize_;
float cameraLineWidth_;
float viewPointX_, viewPointY_, viewPointZ_, viewPointF_;
float imageViewerScale_;
/*
* Save & load maps
*/
std::string sLoadFrom_, sSaveto_;
/*
* Other stuff
*/
float thFarPoints_;
4.Settings.cc