DS-SLAM代码解读(一)
只看主要部分,不看ROS部分
- ros_tum_realtime.cc中
...
//读取关联文件,RGB图片,深度图,时间戳
LoadImages(strAssociationFilename, vstrImageFilenamesRGB, vstrImageFilenamesD, vTimestamps);
...
//创建一个查看器
viewer = new ORB_SLAM2::Viewer();
...
//创建一个System类的SLAM对象
//类和类内成员函数和变量的声明在system.h中,类中成员(成员函数的实现在system.cc中)
//argv[o]是::google::InitGoogleLogging(argv[0]);
//argv[1]是词袋文件
//argv[2]是strSettingsFile???不太懂
//argv[5]是语义分割网络模型参数
//argv[6]是语义分割网络模型
//argv[7]是分割后掩膜调色板
//ORB_SLAM2::System::RGBD指的是SLAM选择RGBD模式运行
//viewer指的是启用查看器
ORB_SLAM2::System SLAM(argv[1],argv[2], argv[5],argv[6],argv[7],ORB_SLAM2::System::RGBD, viewer);
...
这里对ORB_SLAM2::System SLAM()进行展开叙述:
System类调用其构造函数,在system.cc中
(1) 加载了ORB词袋文件
bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
(2) 创建跟踪线程的对象之前已经创建,在其构造函数里加载一些参数并构造ORB的特征提取器;
创建局部建图线程的对象,并开启局部建图线程;
创建闭环检测线程的对象,并开启闭环检测线程;
创建语义分割线程的对象,并开启语义分割线程。
...//跟踪线程,这里不是直接开启新线程,而是创建一个Tracking对象,并在Tracking 类构造函数函数里面开启
mpTracker = new Tracking(this, mpVocabulary, mpMap, mpPointCloudMapping, mpKeyFrameDatabase, strSettingsFile, mSensor);
...
这里对Tracking类构造函数进行展开叙述:
在其构造函数中和ORBSLAM2一样,构造了ORB的特征提取器,分配了每层的pyramid特征点的个数和灰度质心圆的坐标计算
mpORBextractorLeft = new ORBextractor(nFeatures,fScaleFactor,nLevels,fIniThFAST,fMinThFAST);
接上,继续完成对剩下三个线程的创建
...//局部建图线程
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);
...//闭环检测线程
mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);
...//语义分割线程,//语义分割网络模型文件//训练后的参数文件// 标签上色文件
mpSegment =new Segment( pascal_prototxt, pascal_caffemodel, pascal_png);
mptSegment =new thread(&ORB_SLAM2::Segment::Run,mpSegment);
...
在Tracking 的构造函数和System.cc的构造函数执行完成后,整个SLAM系统就创建好了。
对ORB_SLAM2::System SLAM()的叙述到此结束。
- 回到ros_tum_realtime.cc中的SLAM对象创建之后
//遍历所有图像(图像有nImages张)
while(ros::ok()&&ni<nImages)
{
//加载一张RGB图像,一张深度图,和其对应时间戳
imRGB = cv::imread(string(argv[3])+"/"+vstrImageFilenamesRGB[ni],CV_LOAD_IMAGE_UNCHANGED);
imD = cv::imread(string(argv[3])+"/"+vstrImageFilenamesD[ni],CV_LOAD_IMAGE_UNCHANGED);
double tframe = vTimestamps[ni];
…
//Camera_Pose相机位姿,cv::Mat类型
//调用SLAM的成员函数TrackRGBD(),传入一张RGB图像,一张深度图,和其对应时间戳
//.TrackRGBD()是运行整个系统的主线程,下一篇博客就是对这里进行展开
Camera_Pose = SLAM.TrackRGBD(imRGB,imD,tframe);
…
}
...
//调用成员函数关闭SLAM
SLAM.Shutdown();
...
下一篇博客将对.TrackRGBD()进行分析
参考:
https://blog.youkuaiyun.com/weixin_45626706/category_10983442.html
https://blog.youkuaiyun.com/qq_41623632/category_10612418.html