ORB-SLAM2中变量和函数很多,学会了命名结构,能让我们快速的理解是代表什么意思,方便我们后续写代码的时候,比如引用类的成员时,是用 . 还是用->。
代码示例:
System.h文件:
eSensor mSensor;
ORBVocabulary* mpVocabulary;
bool mbActivateLocalizationMode;
ORBextractor.h文件:
bool bNoMore;
std::vector<cv::Mat> mvImagePyramid;
int nlevels;
std::vector<float> mvScaleFactor;
命名规范:
接下来就是这些晦涩难懂的命名规范
以小写字母m(member的首字母)开头的变量表示类的成员变量。比如:
int mSensor;
int mTrackingState;
std::mutex mMutexMode;
对于某些复杂的数据类型,第2个甚至第3个字母也有一定的意义,比如:
mp开头的变量表示指针(pointer)型类成员变量;
Tracking* mpTracker;
LocalMapping* mpLocalMapper;
LoopClosing* mpLoopCloser;
Viewer* mpViewer;
mb开头的变量表示布尔(bool)型类成员变量;
bool mbOnlyTracking;
mpt开头的变量表示指针(pointer)型类成员变量,并且它是一个线程(thread);
std::thread* mptLocalMapping;
std::thread* mptLoopClosing;
std::thread* mptViewer;
ml开头的变量表示列表(list)型类成员变量;
mlp开头的变量表示列表(list)型类成员变量,并且它的元素类型是指针(pointer);
mlb开头的变量表示列表(list)型类成员变量,并且它的元素类型是布尔型(bool);
list<double> mlFrameTimes;
list<bool> mlbLost;
list<cv::Mat> mlRelativeFramePoses;
list<KeyFrame*> mlpReferences;
我们能够简单区分一个变量的属性,会为我们阅读或者编写代码节约时间,比如在索引一个类对象的成员时,根据命名我们就能知道应该使用 . 还是–> 进行引用。
补充知识:
引用成员: 类对象: 用"."操作符
类指针: 用"->"操作符
class Data
{
public:
Data(){cout << "Data::Data()" << endl;}
~Data(){}
void setData(int data) { cout << "Data::setData" << endl; m_iData = data; }
int getData() { return m_iData; }
private:
int m_iData;
};
Data a; //实例化一个类对象a
a.setData(1);
// Data *b = new Data();
Data *b; //实例化一个类指针b
b = new Data();
b->setData(2);
源码的总体框架:以mono_kitti.cc为例子
1、加载图像数据,配置文件
2、启动系统,然后for循环进行追踪
3、系统停止
对应代码为
int main(int argc, char **argv){
// 从关联文件中,获得所有RGB图像路径以及深度图路径
LoadImages(string(argv[3]), vstrImageFilenames, vTimestamps);
//初始化ORB-SLAM2系统
ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);
//对图像序列中的每张图像展开遍历
for(int ni=0; ni<nImages; ni++)
im = cv::imread(vstrImageFilenames[ni],CV_LOAD_IMAGE_UNCHANGED);
double tframe = vTimestamps[ni];
// 根据输入的图像进行追踪
SLAM.TrackMonocular(im,tframe);
SLAM.Shutdown(); //系统停止
}