DS-SLAM代码解读(一)

DS-SLAM代码解读(一)

只看主要部分,不看ROS部分

  1. 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()的叙述到此结束。

  1. 回到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值