DS-SLAM代码解读(二)

本文详细介绍了ROS系统中SLAM(Simultaneous Localization And Mapping)模块如何与语义分割线程进行交互。在`TrackRGBD`函数中,RGBD图像被传递给跟踪线程和语义分割线程,通过`GetImg`和`GrabImageRGBD`函数处理。首先,图像被转化为灰度图并计算深度,然后创建`Frame`对象并等待语义分割结果。在语义分割完成后,去除动态点并执行SLAM跟踪,最终返回当前帧的Tcw位姿矩阵。此过程揭示了实时SLAM系统中多线程处理和传感器数据融合的机制。

ros_tum_realtime.cc 的while循环里面:

 Camera_Pose =  SLAM.TrackRGBD(imRGB,imD,tframe);

在System::TrackRGBD 函数中,将RGB图片分别发送给Tracking线程和Semantic Segmantation线程:

// Inform Semantic segmentation thread
mpTracker->GetImg(im);  //图片发送给语义分割线程
return  mpTracker->GrabImageRGBD(im,depthmap,timestamp);  //返回值是当前帧的Tcw的位姿矩阵

(1)调用了Tracking类中的GetImg()函数,将图片发送给语义分割线程。GetImg中:
将新来的RGB(彩色)图片复制给了 语义分割线程的mImg 类成员变量,该变量存放需要语义分割的图片

void Tracking::GetImg(const cv::Mat& img)
{
    unique_lock<mutex> lock(mpSegment->mMutexGetNewImg);
    mpSegment->mbNewImgFlag=true;  // 新来图片的标志位
    img.copyTo(mpSegment->mImg);  // 实现了一幅图片分别发送给 Track 线程和 语义分割 Segment线程
}

(2)调用了Tracking类中的GrabImageRGBD()函数,计算当前帧的cv::Mat类型的Tcw位姿矩阵,并return:

//输入RGB图,深度图,时间戳
cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double &timestamp)
{
...
//step 1:将RGB(或BGR)或RGBA(BGRA)图像转为灰度图像
cvtColor(mImGray,mImGray,CV_RGB2GRAY); //如果图像是RGB四通道,就转成RGB灰度图
cvtColor(mImGray,mImGray,CV_RGBA2GRAY);//如果图像RGB是四通道,就转成RGBA灰度图
//step 2:将深度相机的disparity转为Depth , 也就是转换成为真正尺度下的深度
if(mDepthMapFactor!=1 || mImDepth.type()!=CV_32F);
    mImDepth.convertTo(mImDepth,CV_32F,mDepthMapFactor);
//step 3: 创建了Frame ,调用Frame构造函数去提取特征点,通过LK光流提取角点,并对生成的角点施加对极约束,极线约束删除动态点
mCurrentFrame = Frame(mImGray,mImDepth,timestamp,mpORBextractorLeft,mpORBVocabulary,mThDepth);
...

帧构造这一步很重要,下一篇博客将对这里进行展开解读

...
//step 4:等待语义分割结果 ,语义分割完成,这个函数isNewSegmentImgArrived 返回 false
while(!isNewSegmentImgArrived()) {
        usleep(1);
    }
...
//step 5 : 结合语义分割结果移除动态的外点
//// 彩色图,灰度图,深度图,mpSegment->mImgSegmentLatest是上面图像的语义分割的结果
mCurrentFrame.CalculEverything(mImRGB,mImGray,mImDepth,mpSegment->mImgSegmentLatest);
...
//step 6 : 语义分割线程已经执行完,移除动态的外点之后进行正常SLAM的Track部分
Track();
...
//step 7 : 得到SLAM计算的位姿
return mCurrentFrame.mTcw.clone();
}

System::TrackRGBD 函数叙述结束。
下一篇博客将对帧构造函数Frame()
参考
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; } ``` 此代码仅为示意用途,实际应用需结合具体的传感器模型及误差校正机制。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值