详谈ORB-SLAM2的局部建图线程LocalMapping

news2024/10/9 20:29:46

ORB-SLAM2的局部建图线程LocalMapping分为5个步骤,非常简单。当得到缓冲队列里的关键帧,第一步处理当前关键帧的地图点关系等;第二步判断地图点是否为新创建,如果是那就进入测试,测试地图点的好坏,如果不好的地图点就舍弃;第三步创建新地图点,这里创建的是局部地图(真正会被注册到环境变量的里面的局部地图),trakcing的局部地图只用来跟踪使用;第四步进行局部的BA优化;第五步删除掉冗余的关键帧。

在ORB-SLAM2中创建的局部地图点这些都是从头开始创建的,根本没有利用到tracking线程里面的局部地图点局部关键帧的信息,这个操作在使用上感觉是作者的疏漏。其实LocalMapping管理全部的地图或者在Map对象里面管理全部的地图,Tracking线程就查找LocalMapping创建的变量这样是最好的选择,不然它创建的局部地图没有参与其中,局部地图创建了两遍设计的不是很好。

文章目录

    • 一、局部建图线程的成员函数/变量
    • 二、局部建图主函数: Run()

在这里插入图片描述

一、局部建图线程的成员函数/变量

Tracking线程向LocalMapping线程插入关键帧的缓冲队列,这两个线程之间通过关键帧进行交互信息传递的,所以有一个缓冲队列。

成员函数/变量访问控制意义
std::list<KeyFrame*> mlNewKeyFramesprotectedTracking线程向LocalMapping线程插入关键帧的缓冲队列
void InsertKeyFrame(KeyFrame* pKF)public向缓冲队列mlNewKeyFrames内插入关键帧
bool CheckNewKeyFrames()protected查看缓冲队列mlNewKeyFrames内是否有待处理的新关键帧
int KeyframesInQueue()public查询缓冲队列mlNewKeyFrames内关键帧个数
bool mbAcceptKeyFramesprotectedLocalMapping线程是否愿意接收Tracking线程传来的新关键帧
bool AcceptKeyFrames()publicmbAcceptKeyFrames的get方法
void SetAcceptKeyFrames(bool flag)publicmbAcceptKeyFrames的set方法

LocalMapping线程局部关键帧太多处理不过来,所以把mbAcceptKeyFrames变量设置为false,通知Tracking线程停止输入,实际上mbAcceptKeyFrames变量在系统非常需要关键帧的时候,无论这个mbAcceptKeyFrames变量的取值,Tracking线程依然会输入,这个mbAcceptKeyFrames变量表示接受关键帧意愿

成员函数mbAcceptKeyFrames表示当前LocalMapping线程是否愿意接收关键帧,这会被Tracking线程函数Tracking::NeedNewKeyFrame()用作是否生产关键帧的参考因素之一;但即使mbAcceptKeyFramesfalse,在系统很需要关键帧的情况下Tracking线程函数Tracking::NeedNewKeyFrame()也会决定生成关键帧。

二、局部建图主函数: Run()

主函数就是一个无限循环,每次循环检查当前环境队列里面有无关键帧,如果当前队列没有传来关键帧,当前线程暂停3毫秒开启下一轮查询;如果当前环境队列有当前帧,就处理队列的关键帧剔除坏点、创建新点、将局部地图关键帧与地图点融合、局部BA优化、剔除冗余关键帧和将当前关键帧加入闭环检测中。
在这里插入图片描述

void LocalMapping::Run() {

    while (1) {
        SetAcceptKeyFrames(false);		// 设置当前LocalMapping线程处于建图状态,不愿意接受Tracking线程传来的关键帧

		// step1. 检查缓冲队列内的关键帧 
        if (CheckNewKeyFrames()) {
            // step2. 处理缓冲队列中第一个关键帧
            ProcessNewKeyFrame();
            
            // step3. 剔除劣质地图点
            MapPointCulling();

            // step4. 创建新地图点
            CreateNewMapPoints();

            if (!CheckNewKeyFrames()) {
                // step5. 将当前关键帧与其共视关键帧地图点融合
                SearchInNeighbors();
                    
                // step6. 局部BA优化: 优化局部地图
                mbAbortBA = false;	
                Optimizer::LocalBundleAdjustment(mpCurrentKeyFrame, &mbAbortBA, mpMap);

                // step7. 剔除冗余关键帧
                KeyFrameCulling();
            }

            // step8. 将当前关键帧加入闭环检测中
            mpLoopCloser->InsertKeyFrame(mpCurrentKeyFrame);
        } 
        
        SetAcceptKeyFrames(true);		// 设置当前LocalMapping线程处于空闲状态,愿意接受Tracking线程传来的关键帧

        // 线程暂停3毫秒再开启下一轮查询
        std::this_thread::sleep_for(std::chrono::milliseconds(3));
    }
}

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

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

相关文章

【关于Linux中----信号】

文章目录一、信号入门1.1 信号概念1.2 用 kill-l命令查看信号列表1.3 信号处理常见方式预览二、产生信号2.1 通过终端按键产生信号2.2 由于程序中存在异常产生信号2.3 系统接口调用产生信号2.4 软件条件产生信号三、阻塞信号3.1 信号相关常见概念补充3.2 在内核中的表示3.3 sig…

编码技巧——JDK版本切换/JDK7和JDK6下的文件输入输入

最近有使用低版本JDK实现文件输入输出的需求&#xff0c;主要是妹子计算机专业考研复试上级算法题&#xff0c;输入输入依赖文件而非纯算法代码&#xff0c;并且IDE一般使用JDK8以下的SDK&#xff0c;导致一些JDK8的API不适用&#xff1b;较早版本的JDK API代码是操作一大堆的缓…

jenkins部署过程

Jenkins 安装 示例服务器为 阿里云 CentOS 服务器。安全组中增加 8080 端口 Jenkins 默认占用 Jenkins 安装大体分两种方式&#xff0c;一种使用 Docker 另一种则是直接安装&#xff0c;示例选择后者。不管使用哪种方式安装&#xff0c;最终使用层面都是一样的。 Linux安装过…

Linux下源码安装nginx

一 安装步骤 nginx在linux下的源码安装&#xff0c;步骤还是比较简单的&#xff0c;主要分为以下 1. 下载安装包&#xff0c;这里选择&#xff1a;nginx-1.18.0.tar.gz 下载地址&#xff1a;http://nginx.org/en/download.html 2. 安装前置环境&#xff1a; yum install -y…

苹果手机字体大小怎么设置?简单实用,轻松学会

使用苹果手机的时候&#xff0c;发现苹果手机的字体看起来不是很舒服&#xff0c;想要将字体调大一点&#xff0c;却不知道怎么办。苹果手机字体大小怎么设置&#xff1f;其实方法很简单&#xff0c;今天小编就来具体的讲一下调整苹果手机字体大小的方法。 苹果手机字体大小怎么…

智能工厂中的设备如何实现远程监控和故障报警

智能工厂是在数字化工厂内&#xff0c;利用物联网技术和云计算计算加强设备信息管理水平&#xff0c;提高生产过程可控性、减少生产线人工干预&#xff0c;保证安全稳定的生产节奏&#xff0c;助力构建高效、节能、绿色、舒适、安全的工厂。 物通博联推出的智能工厂设备物联网…

C语言及算法设计课程实验四:选择结构程序设计

C语言及算法设计课程实验四&#xff1a;选择结构程序设计一、实验目的二、实验内容2.1、根据x的分段函数求对于的y值2.2、求小于1000正数的平方根2.3、百分制等级输出2.4、四个整数的顺序输出三、实验步骤3.1、选择结构程序设计实验题目1&#xff1a;根据x的分段函数求对于的y值…

四、GStreamer基础

本章介绍GStreamer的基本概念。理解这些概念对于阅读本指南的其他任何内容都是很重要的&#xff0c;它们都假定理解了这些基本概念。 元素 元素是GStreamer中最重要的一类对象。你通常会创建一个链接在一起的元素链&#xff0c;并让数据在这个元素链中流动。元素有一个特定的…

运动耳机有必要买吗、口碑最好的运动耳机品牌排行

冬天绝对是个减肥的好季节&#xff0c;因为这个季节天气比较冷&#xff0c;我们在运动过程中消耗的热量也就会更多&#xff0c;因此选择一款不错的运动耳机来用坚持就显得尤为重要了。这款运动耳机要能稳定在耳朵上&#xff0c;还要具备防水功能&#xff0c;同时音质上也要有保…

gd32f103vbt6 串口OTA升级-问题记录

今天研究了一下gd32单片机串口OTA升级的事情。我感觉ota的唯一好处就是不用调试器就可以下载&#xff08;更新&#xff09;单片机应用程序。(但是需要232串口&#xff0c;OTA程序我是使用stlink下载的&#xff01;&#xff01;) 可能有些同学要问&#xff0c;32的单片机本身就…

【综合】数字IC设计需要考虑的时序参数;Race Hazard;同步系统时序要求;建立时间、保持时间;偏斜;抖动;毛刺、竞争冒险;亚稳态

【综合】数字IC设计需要考虑的时序参数&#xff1b;Race Hazard&#xff1b;同步系统时序要求&#xff1b;建立时间、保持时间&#xff1b;偏斜&#xff1b;抖动&#xff1b;毛刺、竞争冒险&#xff1b;亚稳态数字设计时需要考虑的时序参数传播延迟 propagation delay, 上升时间…

十一、树结构的实际应用—堆排序

1、基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最好最坏平均时间复杂度均为O(n\log n) 。也不是稳定排序。堆是具有以下性质的完全二叉树&#xff1a;每个节点的值都大于或等于其左右孩子节点的值&#xff0c;…

云音乐实现注册功能

1. 新建web项目 Shop_SM2. 复制Shop资源和相关代码&#xff0c;实现注册功能回顾当前配置下的加载顺序1.MyBatis的主配置文件mybatis-config.xml &#xff08;在根目录下&#xff09;和 工具类MyBatisUtil&#xff08;注意总配置文件的路径&#xff09;2.实体类&#xff08;Use…

docker篇---pycharm连接docker,使用docker环境

pycharm连接docker&#xff0c;使用docker环境一、生成镜像和容器1.1 创建容器&#xff0c;需要加端口映射1.2 进入容器1.3 设置root密码&#xff0c;后续登录会用到1.4 修改配置文件1.5 重启ssh服务1.5 本机连接ssh二、pycharm连接docker2.1 允许远程客户端连接2.2 pycharm配置…

线程互斥与同步--Linux

文章目录线程互斥的概念与意义互斥的原理--原子性关于售票模拟的互斥应用死锁问题线程同步的概念与意义条件变量实现同步生产者消费者模型--互斥与同步基于阻塞队列的生产者消费者模型基于环形队列的生产者消费者模型POSIX信号量线程池线程安全下的单例模式总结线程互斥的概念与…

OMS标准 第二卷 主要通讯

版本4.1.2/2016-12-16 发布 1 引言 1.1 概述 本部分描述了从设备&#xff08;仪表或执行器或断路器&#xff09;和&#xff08;固定的&#xff0c;通常由市电供电的&#xff09;主设备&#xff08;网关或其他通信单元&#xff09;之间有线和无线通信的最低开放式计量系统要…

1. Mybatis 入门

文章目录1. Mybatis 简介2. Mybatis 快速入门3. 使用 idea 写 SQL4. Mapper 代理开发5. MyBatis 核心配置文件1. Mybatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。 官方文档&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 持久层&am…

【自学Docker】Docker cp命令

Docker cp命令 大纲 docker cp命令教程 docker cp 命令用于在本地文件系统与 Dokcer容器 之间复制文件或者文件夹。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker cp命令语法 从容器复制到宿主机 haicoder(www.haicoder.net)# docker cp [OPTION…

第57篇-某日头条signature参数分析【2023-02-01】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、signature参数四、完整代码一、前言 今天来看一下新闻网站,分析一下参数 二、网站分析 网…

WebDAV之葫芦儿·派盘+一叶日记

一叶日记 支持WebDAV方式连接葫芦儿派盘。 推荐一款操作方便、界面简洁,记录生活点滴与心情,具有诗情画意的日记软件。 一叶日记是一款记录日记的手机软件,在这款软件中它里面有着各种不同的工具,可以方便用户去随时随地的记录日记,同时里面还有着各种不同的主题背景&…