DS-SLAM代码解读(二)

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

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

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

### TextSLAM 技术介绍 TextSLAM 是一种基于文本的 VSLAM (视觉同步定位与建图) 系统,由 Li 等人提出。该系统利用 FAST 角检测技术从场景中提取并处理文本项,并将其集成到 SLAM 流程中[^1]。通过这种方式,TextSLAM 可以高效地构建高质量的三维文本地图。 #### 文本作为可靠标志物 在 TextSLAM 中,文本被用作可靠的视觉基准标记。当首次识别出某段文字时,会对其进行参数化描述;随后可以在其他视角下重新定位这些已知的文字位置。这种做法不仅提高了系统的鲁棒性和精度,而且还能提供额外的信息来辅助环境理解。 #### 参数化技术 为了更好地表示瞬态出现的文字特征,研究者们引入了一种新颖的三变量参数化方案来进行初始化工作。这种方法有助于提高跟踪性能以及重建质量。 #### 实验验证 研究人员使用单目摄像机设备,在不同类型的室内外环境下进行了广泛的测试实验。结果显示,即使是在复杂多变的真实世界条件下,TextSLAM 依然能够保持较高的准确性。 然而值得注意的是,这项技术也面临着一些挑战: - **无文本区域的操作**:对于那些缺乏明显可读字符的地方,如何继续维持良好的表现是一个待解决问题; - **短消息解析困难度高**:较难解读少量或模糊不清的文字内容; - **大容量词库需求**:需要占用较多资源用来储存可能遇到的各种字体样式和单词组合。 ### 应用实例 尽管存在上述局限性,TextSLAM 已经展示了其潜在的应用价值。例如,在增强现实领域中,它可以为用户提供更加精准的位置服务和支持;而在机器人导航方面,则可以借助于周围环境中存在的自然语言提示实现自主探索任务。此外,还有更多可能性等待进一步挖掘和发展。 ```python # Python 示例代码展示如何加载 DS-SLAM 开源项目中的部分功能模块 import os from dsslam import load_model, process_image model_path = 'path/to/model' image_dir = '/path/to/images' if not os.path.exists(model_path): raise FileNotFoundError('Model file does not exist.') for img_file in sorted(os.listdir(image_dir)): if img_file.endswith('.png') or img_file.endswith('.jpg'): image_path = os.path.join(image_dir, img_file) result = process_image(load_model(model_path), image_path) print(f'Processed {img_file}, results:', result) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值