DynaSLAM-10 DynaSLAM中双目运行流程(Ⅳ):DynaSLAM的三大线程解析

news2024/11/15 11:47:42

目录

1.双目初始化部分

2.三种追踪模式


1.双目初始化部分

        进入追踪线程首先判断双目追踪器状态mstate,在刚进入SLAM系统时,

Tracking::Tracking函数默认将其设置为NO_IMAGES_YET,系统经过reset时也会将mstate设置为NO_IMAGES_YET......如果是这种状态,将SLAM系统状态设置为未初始化状态NOT_INITIALIZED。

        mLastProcessedState设置为mstate的值。

        如果SLAM系统没有初始化,则执行双目初始化函数StereoInitialization。

void Tracking::StereoInitialization()
{
    if(mCurrentFrame.N>500)
    {
        // Set Frame pose to the origin
        mCurrentFrame.SetPose(cv::Mat::eye(4,4,CV_32F));

        // Create KeyFrame
        KeyFrame* pKFini = new KeyFrame(mCurrentFrame,mpMap,mpKeyFrameDB);

        // Insert KeyFrame in the map
        mpMap->AddKeyFrame(pKFini);

        // Create MapPoints and associate to KeyFrame
        for(int i=0; i<mCurrentFrame.N;i++)
        {
            float z = mCurrentFrame.mvDepth[i];
            if(z>0)
            {
                cv::Mat x3D = mCurrentFrame.UnprojectStereo(i);
                MapPoint* pNewMP = new MapPoint(x3D,pKFini,mpMap);
                pNewMP->AddObservation(pKFini,i);
                pKFini->AddMapPoint(pNewMP,i);
                pNewMP->ComputeDistinctiveDescriptors();
                pNewMP->UpdateNormalAndDepth();
                mpMap->AddMapPoint(pNewMP);

                mCurrentFrame.mvpMapPoints[i]=pNewMP;
            }
        }

        cout << "New map created with " << mpMap->MapPointsInMap() << " points" << endl;

        mpLocalMapper->InsertKeyFrame(pKFini);

        mLastFrame = Frame(mCurrentFrame);
        mnLastKeyFrameId=mCurrentFrame.mnId;
        mpLastKeyFrame = pKFini;

        mvpLocalKeyFrames.push_back(pKFini);
        mvpLocalMapPoints=mpMap->GetAllMapPoints();
        mpReferenceKF = pKFini;
        mCurrentFrame.mpReferenceKF = pKFini;

        mpMap->SetReferenceMapPoints(mvpLocalMapPoints);

        mpMap->mvpKeyFrameOrigins.push_back(pKFini);

        mpMapDrawer->SetCurrentCameraPose(mCurrentFrame.mTcw);

        mState=OK;
    }
}

        构造此帧为关键帧并加入mspKeyFrames集合中,这个集合存储着所有的关键帧,同时更新关键帧的最大id mnMaxKFid

        遍历所有此帧的特征点,如果特征点有深度,则创建地图点存入mvpMapPoints

        将此关键帧传入局部建图线程的处理队列mlNewKeyFrames中,并将mbAbortBA标志置为true。

        更新有关于Last的信息:

        ①mLastFrame:上一帧,更新为本帧的信息

        ②mnLastKeyFrameId:上一帧的ID,更新为本帧的ID

        ③mpLastKeyFrame:上一关键帧,更新为本帧

        更新局部地图信息:

        ①将本帧加入局部关键帧mvpLocalKeyFrames

        ②将本帧地图点加入局部地图点mvpLocalMapPoints

        更新其他信息:

        ①mpReferenceKF:更新为本帧

        ②mCurrentFrame.mpReferenceKF:更新为本帧

        ③置参考地图点用于绘图显示局部地图点(红色)mpMap->SetReferenceMapPoints

        ④保留最初始的关键帧mvpKeyFrameOrigins。

        ⑤设置当前帧相机的位姿mpMapDrawer->SetCurrentCameraPose

        ⑥将追踪状态mState设置为true。

        最后将跟踪线程的数据拷贝到绘图线程(图像、特征点、地图、跟踪状态)

void FrameDrawer::Update(Tracking *pTracker)
{
    unique_lock<mutex> lock(mMutex);
    //拷贝跟踪线程的图像
    pTracker->mImGray.copyTo(mIm);
    //拷贝跟踪线程的特征点
    mvCurrentKeys=pTracker->mCurrentFrame.mvKeys;
    N = mvCurrentKeys.size();
    mvbVO = vector<bool>(N,false);
    mvbMap = vector<bool>(N,false);

    mbOnlyTracking = pTracker->mbOnlyTracking;

    //如果上一帧的时候,追踪器没有进行初始化
    if(pTracker->mLastProcessedState==Tracking::NOT_INITIALIZED)
    {
        //那么就要获取初始化帧的特征点和匹配信息
        mvIniKeys=pTracker->mInitialFrame.mvKeys;
        mvIniMatches=pTracker->mvIniMatches;
    }
    //如果上一帧是在正常跟踪
    else if(pTracker->mLastProcessedState==Tracking::OK)
    {
        //获取当前帧地图点的信息
        for(int i=0;i<N;i++)
        {
            MapPoint* pMP = pTracker->mCurrentFrame.mvpMapPoints[i];
            if(pMP)
            {
                if(!pTracker->mCurrentFrame.mvbOutlier[i])
                {
                    //该mappoints可以被多帧观测到,则为有效的地图点
                    if(pMP->Observations()>0)
                        mvbMap[i]=true;
                    else
                    //否则表示这个特征点是在当前帧中第一次提取得到的点
                        mvbVO[i]=true;
                }
            }
        }
    }
    //更新追踪线程的跟踪状态
    mState=static_cast<int>(pTracker->mLastProcessedState);
}

}

2.三种追踪模式

        和ORB - SLAM2中完全相同,不做赘述!详见博客:

ORB-SLAM2 --- Tracking::Track 追踪线程解析icon-default.png?t=N0U7https://blog.csdn.net/qq_41694024/article/details/128321440        局部建图和回环检测线程也相同,详见博客:

ORB-SLAM2 --- LocalMapping::Run 局部建图线程解析icon-default.png?t=N0U7https://blog.csdn.net/qq_41694024/article/details/128500904ORB-SLAM2 --- LoopClosing::Run 回环检测线程解析icon-default.png?t=N0U7https://blog.csdn.net/qq_41694024/article/details/128572883

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工业视觉-CCD相机和CMOS相机成像的本质区别】

工业视觉-CCD相机和CMOS相机成像的本质区别1.CCD的功耗高&#xff0c;CMOS的功耗低2.CCD速度较CMOS慢3.CCD的画质优于CMOS4.CCD的高感画质低于CMOS在学习工业视觉的起初&#xff0c;一般都是先去了解光源、镜头、相机等概念&#xff0c;在接触工业相机时看到两个概念&#xff0…

Java集合框架

Java集合框架 每博一文案 《杀死一只知更鸟》中有这样一段话&#xff1a;“你永远不可能真正地了解一个人&#xff0c;除非你穿上他的鞋子走来走去&#xff0c;站在他的角度思考问题。 可真当你走过他的路时&#xff0c;你连路过都觉得难过。” 世上没有真正的感同身受&#x…

数据结构 第六章 二叉树与树(树和森林)

1 双亲表示法(方便查找双亲) 使用层次遍历的方法将一个树中的所有结点存储到一维数组中 2 孩子表示法(方便查找孩子) 顺序链式存储结构&#xff1a; 1 使用数组来存储所有结点 2 为每一个结点来设置一个单链表 3 单链表链接的是其所有孩子结点的下标3 双亲孩子结合表示法 …

扬兴 | 选型技巧!晶振在商业显示屏的应用

据有关机构预计&#xff0c;未来五年&#xff0c;商显市场将以每年13-16%的增速发展&#xff0c;预计到2024年将达到1545亿元的规模。伴随着商显屏行业的飞速发展&#xff0c;必然带动电子元器件行业的增长&#xff0c;这也对元器件产品要求不断提高&#xff0c;其中晶振作为数…

【字符串】剑指Offer 05.替换空格(C/C++/Java/Python/Js)

剑指Offer 05.替换空格1 题目2 思路--双指针法3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python3版本3.5 JavaScript版本4 总结1 题目 题源链接 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are…

重磅!马斯克再抛特斯拉股票,去年中国市场份额首次下滑

特斯拉的走势&#xff0c;正在凸显智能电动汽车市场格局的新变化。 几周前&#xff0c;特斯拉首席执行官埃隆马斯克出售了价值近36亿美元的股票&#xff0c;就在三周前&#xff0c;这家全球智能电动汽车领头羊宣布未能实现年度交付目标&#xff08;少了近2.2万辆&#xff09;。…

windows下同时安装mysql5.5和mysql8.0.32

一、安装mysql8.0.32 我先安装的是mysql5.5&#xff0c;如&#xff1a;MySQL5.5安装教程SQLyog安装_柒七的博客-CSDN博客_mysql5.5的安装步骤 1.下载解压 https://dev.mysql.com/downloads/mysql/ 2.创建配置 下载完后&#xff0c;建议解压到一个没有中文的路径&#xff0…

Vue使用ElementUI动态修改table单元格背景颜色或文本颜色

前言 今天遇到一个场景&#xff0c;表格行属性的字典项要针对不同的状态&#xff0c;展示不同的文本颜色&#xff0c;如下图所示&#xff1a; 账号状态这一栏&#xff0c;如果是正常就展示以绿色字体展示&#xff0c;如果是禁用就以红色颜色展示 针对这个需求&#xff0c;我第…

u盘文件被电脑杀毒软件删掉了,怎么才能恢复

案例分享&#xff1a;【我的u盘中毒文件被电脑杀毒软件删掉了&#xff0c;怎么才能恢复啊&#xff1f;&#xff1f;里面有很重要的资料。求高手指点&#xff01;急&#xff01;&#xff01;&#xff01;】——虽然u盘能够存储数据&#xff0c;且体积小巧便于携带&#xff0c;但…

算法:(十二)排序

文章目录12.1 计数排序面试题75&#xff1a;数组相对排序12.2 快速排序面试题76&#xff1a;数组中第k大的数12.3 归并排序面试题77&#xff1a;链表排序面试题78&#xff1a;合并排序链表12.1 计数排序 面试题75&#xff1a;数组相对排序 题目&#xff1a; 给定两个数组&…

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); var user requi…

龙芯处理器7A2000桥片iTOP-3A5000开发板

龙芯处理器7A2000桥片iTOP-3A5000开发板 主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm C…

力扣二叉树篇题

题目说明B树如果为空树则不是A树的子结构 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {public boolean isSubStructure(TreeNode A,…

VMware ESXi 7.0 Update 3j 更新发布,修复已知问题

VMware ESXi 7.0 Update 3j Standard & All Custom Image for ESXi 7.0 U3j Install CD 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 产品简介…

迁移mysql数据库到opengauss

一、安装chameleon工具1.下载源码git clone gitgitee.com:opengauss/openGauss-tools-chameleon.git2.创建Python虚拟环境并激活安装依赖&#xff1a;yum install mysql-devel gcc gcc-devel python-develpython3 -m venv venvsource venv/bin/activate3.进入代码的目录&#x…

CAD转PDF其实很简单,掌握这4种方法就可以

Hello&#xff0c;大家好&#xff0c;这里是建模助手&#xff01; CAD作为一种绘图格式&#xff0c;在工业设计领域发挥着不可替代的作用&#xff0c;一般有DXF、DWG两种常见的格式&#xff0c;但是一般需要在电脑中安装特定软件才能打开此类格式的文件。 因此大多数人在给别…

网站表单实时通知 销售线索不错漏

对于企业来说&#xff0c;在进行产品发布或营销推广时&#xff0c;都需要大量的信息收集汇总。此时都会用到表单功能&#xff0c;网站上的表单功能应用非常广泛&#xff0c;可做信息收集效果&#xff0c;可做付费预约效果等&#xff0c;而如果希望能实时推送表单收集到的数据&a…

AQS(AbstractQueuedSynchronizer)是什么?

目录简介原理概览资源的共享方式独占&#xff08;Exclusive&#xff09;共享&#xff08;Shared&#xff09;模板方法模式在AQS中的应用经典应用ReentrantLockSemaphore简介 AQS全称AbstractQueuedSynchronizer&#xff0c;位于java.util.concurrent.locks包下&#xff0c;它是…

Kubernetes (k8s)在企业项目中的重点应用场景以及云原生和云架构的原理

Kubernetes &#xff08;k8s&#xff09;在企业项目中的重点应用场景以及云原生和云架构的原理。 Kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替中间 8 个字符 “ubernete” 而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应…

Allegro因为DRC报错无法使用走线居中命令的解决办法

Allegro因为DRC报错无法使用走线居中命令的解决办法 在用Allegro做PCB设计的时候,走线居中是非常实用的功能 但是这个功能只能在走线居中不会产生DRC的使用。 如果居中后仍然存在DRC,比如间距,等长等等DRC,如下图: 使用居中命令就会出现报错,如图,因为居中后线距离孔的…