ORB-SLAM2源码学习:System.cc: System::TrackStereo、TrackRGBD、TrackMonocular追踪器接口

embedded/2024/12/30 15:42:40/

前言

在之前的单目实例中,我们在初始化一个SLAM的系统后,系统处理了接受的文件数据,初始化并运行了各个线程,之后就要给追踪器传入图像进行整个SLAM的流程了。

1.函数声明 

追踪器的函数定义在System源文件下,针对不同的传感器模式,分别实现了三种追踪器的定义。 

它们依次是单目、双目、RGBD追踪器。 

cv::Mat System::TrackMonocular(const cv::Mat &im, const double &timestamp)
cv::Mat System::TrackStereo(const cv::Mat &imLeft, 		//左侧图像const cv::Mat &imRight, 	//右侧图像const double &timestamp)	//时间戳
cv::Mat System::TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double &timestamp)

2.函数定义 

以单目为例:

1.检查传感器

不是指定的传感器内容输出信息提示。

if(mSensor!=MONOCULAR){cerr << "ERROR: you called TrackMonocular but input sensor was not set to Monocular." << endl;exit(-1);}

2.改变追踪模式 

追踪线程有两个模式,一个是定位建图另一个是纯定位模式,追踪器通过此部分代码来实现模式的改变。 

// Check mode change{// 独占锁,主要是为了mbActivateLocalizationMode和mbDeactivateLocalizationMode不会发生混乱unique_lock<mutex> lock(mMutexMode);// mbActivateLocalizationMode为true会关闭局部地图线程if(mbActivateLocalizationMode){mpLocalMapper->RequestStop();// Wait until Local Mapping has effectively stoppedwhile(!mpLocalMapper->isStopped()){usleep(1000);}// 局部地图关闭以后,只进行追踪的线程,只计算相机的位姿,没有对局部地图进行更新// 设置mbOnlyTracking为真mpTracker->InformOnlyTracking(true);// 关闭线程可以使得别的线程得到更多的资源mbActivateLocalizationMode = false;}// 如果mbDeactivateLocalizationMode是true,局部地图线程就被释放, 关键帧从局部地图中删除.if(mbDeactivateLocalizationMode){mpTracker->InformOnlyTracking(false);mpLocalMapper->Release();mbDeactivateLocalizationMode = false;}}

 3.检查是否有复位操作。

// Check reset{unique_lock<mutex> lock(mMutexReset);if(mbReset){mpTracker->Reset();mbReset = false;}

4.获取相机位姿估计的结果并返回。

//获取相机位姿的估计结果cv::Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);unique_lock<mutex> lock2(mMutexState);mTrackingState = mpTracker->mState;mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;return Tcw;

其他追踪器的代码也差不多,直接列在下面了。 

//双目输入时的追踪器接口
cv::Mat System::TrackStereo(const cv::Mat &imLeft, 		//左侧图像const cv::Mat &imRight, 	//右侧图像const double &timestamp)	//时间戳
{//检查输入数据类型是否合法if(mSensor!=STEREO){//不合法那就退出cerr << "ERROR: you called TrackStereo but input sensor was not set to STEREO." << endl;exit(-1);}   //检查是否有运行模式的改变// Check mode change{// TODO 锁住这个变量?防止其他的线程对它的更改?unique_lock<mutex> lock(mMutexMode);//如果激活定位模式if(mbActivateLocalizationMode){//调用局部建图器的请求停止函数mpLocalMapper->RequestStop();// Wait until Local Mapping has effectively stoppedwhile(!mpLocalMapper->isStopped()){usleep(1000);}//运行到这里的时候,局部建图部分就真正地停止了//告知追踪器,现在 只有追踪工作mpTracker->InformOnlyTracking(true);// 定位时,只跟踪//同时清除定位标记mbActivateLocalizationMode = false;// 防止重复执行}//如果激活定位模式if(mbDeactivateLocalizationMode){//如果取消定位模式//告知追踪器,现在地图构建部分也要开始工作了mpTracker->InformOnlyTracking(false);//局部建图器要开始工作呢mpLocalMapper->Release();//清楚标志mbDeactivateLocalizationMode = false;// 防止重复执行}//如果取消定位模式}//检查是否有模式的改变// Check reset,检查是否有复位的操作{//上锁unique_lock<mutex> lock(mMutexReset);//是否有复位请求?if(mbReset){//有,追踪器复位mpTracker->Reset();//清除标志mbReset = false;}//是否有复位请求}//检查是否有复位的操作//用矩阵Tcw来保存估计的相机 位姿,运动追踪器的GrabImageStereo函数才是真正进行运动估计的函数cv::Mat Tcw = mpTracker->GrabImageStereo(imLeft,imRight,timestamp);//给运动追踪状态上锁unique_lock<mutex> lock2(mMutexState);//获取运动追踪状态mTrackingState = mpTracker->mState;//获取当前帧追踪到的地图点向量指针mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;//获取当前帧追踪到的关键帧特征点向量的指针mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;//返回获得的相机运动估计return Tcw;
}//当输入图像 为RGBD时进行的追踪,参数就不在一一说明了
cv::Mat System::TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double &timestamp)
{//判断输入数据类型是否合法if(mSensor!=RGBD){cerr << "ERROR: you called TrackRGBD but input sensor was not set to RGBD." << endl;exit(-1);}    // Check mode change//检查模式改变{unique_lock<mutex> lock(mMutexMode);if(mbActivateLocalizationMode){mpLocalMapper->RequestStop();// Wait until Local Mapping has effectively stoppedwhile(!mpLocalMapper->isStopped()){usleep(1000);}mpTracker->InformOnlyTracking(true);mbActivateLocalizationMode = false;}if(mbDeactivateLocalizationMode){mpTracker->InformOnlyTracking(false);mpLocalMapper->Release();mbDeactivateLocalizationMode = false;}}// Check reset//检查是否有复位请求{unique_lock<mutex> lock(mMutexReset);if(mbReset){mpTracker->Reset();mbReset = false;}}//获得相机位姿的估计cv::Mat Tcw = mpTracker->GrabImageRGBD(im,depthmap,timestamp);unique_lock<mutex> lock2(mMutexState);mTrackingState = mpTracker->mState;mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;return Tcw;
}

结束语 

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。 


http://www.ppmy.cn/embedded/149729.html

相关文章

python进阶-06-Selenium一个真实项目实战,还有FastAPI背景介绍

python进阶-06-Selenium一个真实项目实战和FastAPI背景介绍 一.说明 截止到目前我们已经掌握了python爬虫这一基础的基本知识,并从另外一个方向来利用爬虫帮助我们实现办公自动化,实现自动帮我们处理日常工作,这次我们利用Selenium+FastAPI搭建一个真实项目,并部署到服务…

YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传&#xff08;一&#xff09;类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 YOLO系列正传&#xff08;二&#xff09;YOLOv3论文精解(上)——从FPN到darknet-53-C…

NestJS 中间件与拦截器:请求处理流程详解

在上一篇文章中&#xff0c;我们介绍了 NestJS 的认证与授权实现。本文将深入探讨 NestJS 的请求处理流程&#xff0c;包括中间件、拦截器、管道和异常过滤器的使用。 请求生命周期 在 NestJS 中&#xff0c;请求处理流程按以下顺序执行&#xff1a; 中间件&#xff08;Midd…

Go语言的数据结构

Go语言的数据结构详解 Go语言&#xff08;又称Golang&#xff09;是一种由Google开发的编程语言&#xff0c;其设计旨在提高编程的效率和简洁性。在开发中&#xff0c;数据结构的选择与设计至关重要&#xff0c;因为它们影响着程序的性能和可维护性。本文将详细探讨Go语言中的…

Vue3 +Element-Plus el-select下拉菜单样式(局部生效)

下拉框代码 <el-selectclass"buttons-switch-group select-hub":teleported"false"style"width: 120px"v-model"queryParam.type"placeholder"请选择"size"mini"change"loadData"><el-option…

<packaging>jar</packaging>和<packaging>pom</packaging>的区别

在Maven项目中&#xff0c;<packaging> 元素在 pom.xml 文件中定义了项目打包的方式。<packaging> 的值决定了构建过程中生成的构件类型。以下是 <packaging>jar</packaging> 和 <packaging>pom</packaging> 两种最常见的打包类型的区别&a…

Mooncake:kimi后端推理服务的架构设计

前言 本文依托论文《Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving》来讲解kimi的后端服务架构Mooncake,并按照自己的思路来梳理论文中的一些关键信息。 背景 服务端面临的问题 随着大模型技术越来越强,很多应用都是以Maas(Model as a Service…

如何使用 Firewalld 设置 Linux 防火墙

简介 在 Linux 中&#xff0c;防火墙是一个应用程序或服务&#xff0c;它使用预定的规则集来过滤或控制进出 Linux 服务器的网络流量。通常将防火墙配置为允许所需的流量通过&#xff0c;同时阻止其余的外部流量。 Firewalld 是一个用于 Linux 系统的防火墙管理解决方案。它是…