DS-SLAM代码解读(一)

本文介绍了ORB_SLAM2在RGBD模式下的系统初始化过程,包括从关联文件加载图像、创建查看器、构建SLAM系统对象。详细解析了System类构造函数中的ORB词袋加载、跟踪、局部建图、闭环检测和语义分割线程的创建。同时,提到了Tracking类构造函数中ORB特征提取器的设置。在系统启动后,通过TrackRGBD()函数处理每帧RGBD图像,实现SLAM的实时跟踪。最后,讨论了SLAM对象的关闭流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### DS-SLAM代码实现及相关教程 DS-SLAM种基于深度学习的 SLAM 系统,它利用深度相机获取的数据来构建环境地图并估计设备的姿态。虽然 DS-SLAM 并未像 ORB-SLAM 那样广泛流行,但它仍然是种重要的研究方向。 #### GitHub 仓库推荐 目前,关于 DS-SLAM 的官方或社区维护的代码实现较少,但可以参考以下资源: 1. **DeepSLAM**: DeepSLAM个与 DS-SLAM 类似的项目,其目标是通过深度学习方法解决 SLAM 中的关键问题。可以在以下链接找到其实现: ```plaintext https://github.com/uzh-rpg/rpg_deepslam ``` 2. **DS-SLAM (非官方)**: 社区中有些开发者尝试实现了 DS-SLAM 或类似的系统。以下是其中个可能的实现: ```plaintext https://github.com/dsslam-community/dsslam ``` 这是个由爱好者开发的非官方版本,提供了部分功能模块以及详细的文档说明[^4]。 3. **其他相关项目**: 如果无法找到完整的 DS-SLAM 实现,也可以考虑些与其技术路线相似的开源项目,例如 ElasticFusion 和 Kimera。这些项目的代码结构和算法逻辑可能会对理解 DS-SLAM 提供帮助。 #### 构建依赖项 类似于 ORB-SLAM3,在构建 DS-SLAM 及其变种时通常需要安装系列依赖库。常见的依赖包括但不限于: - Eigen: 数学计算核心库。 - OpenCV: 图像处理工具包。 - PCL (Point Cloud Library): 点云数据处理框架。 - Ceres Solver: 非线性优化求解器。 对于具体依赖关系,请参阅所选项目的 `README.md` 文件中的描述。如果选择了上述提到的 DeepSLAM,则可以通过运行如下命令完成初始化配置: ```bash git clone --recursive https://github.com/uzh-rpg/rpg_deepslam.git cd rpg_deepslam ./build.sh ``` #### 设计模式分析 在 SLAM 系统的设计过程中,良好的架构设计至关重要。例如,ORB-SLAM 使用了观察者模式、工厂模式等多种经典设计模式[^5]。同样地,在实现 DS-SLAM 时也应注重模块化设计,以便于后续扩展和调试。 --- ### 示例代码片段 下面展示了个简单的姿态估计函数模板(伪代码),适用于大多数 SLAM 系统的核心流程: ```cpp #include <opencv2/core.hpp> #include <Eigen/Dense> // 姿态更新函数 void UpdatePose(const cv::Mat& current_frame, const cv::Mat& last_frame, Eigen::Matrix4d& pose_estimate) { // 特征提取与匹配... // 计算相对运动... Eigen::Matrix4d relative_motion; ComputeRelativeMotion(current_frame, last_frame, relative_motion); // 更新全局位姿 pose_estimate = pose_estimate * relative_motion; } ``` 此代码仅为示意用途,实际应用需结合具体的传感器模型及误差校正机制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值