ORB-SLAM3算法和代码学习——系统初始化浅谈

news2024/11/15 21:28:47

总述

先放一张LocalMapping的代码结构图
在这里插入图片描述

相比于ORB-SLAM2,ORB-SLAM3的系统初始化分成了三个主要的模块:纯视觉初始化、纯IMU初始化、视觉和IMU联合优化。

纯视觉初始化和之前一样就是单目或者双目初始化,在Tracking线程中进行;

纯IMU初始化和视觉与IMU联合优化目的是为了通过视觉创建的关键帧以及关键帧之间的积分和位姿,获取精确的IMU不确定度即偏置信息,减小IMU传感器数据的不稳定性。

参考链接:
单目+IMU初始化流程梳理
ORB-SLAM3的IMU初始化(1)理论部分

1.纯视觉优化

纯视觉优化并未作出改动,对于单目模式通过自适应初始化模型计算相邻帧的运动,并通过三角化恢复缺少尺度信息的3D地图点和位姿信息

对于双目和RGB-D模式则可以直接获取地图点的3D坐标

if(mSensor==System::STEREO || mSensor==System::RGBD || mSensor==System::IMU_STEREO || mSensor==System::IMU_RGBD)
{
    // 双目和RGBD相机时共用一个初始化函数,因为可以直接得到深度信息
    StereoInitialization();
}
else
{
    // 单目初始化
    MonocularInitialization();
}

2.IMU初始化

这一步的目的是获得IMU参数最优估计,对于单目来说还要回复尺度信息并将视觉地图对齐到惯性系。

纯IMU的初始化要进行三个阶段,目的是为了不断的优化IMU传感器的不确定性即IMU偏置、scale等参数,并联合视觉定位信息进行联合优化,进一步优化智能体的位姿和地图点信息。

第一次IMU初始化
在VI模式下,对于局部地图线程的每一次循环,都会进入IMU第一阶段初始化函数,并且判断当前活跃子地图中关键帧数量(大于10帧)和距离初始关键帧的时间(单目1s双目2s)是否满足IMU初始化的要求,因为对于IMU来说需要足够的运动才能进行准确的初始化。

第一阶段的初始化,只对IMU的偏置bias信息、scale以及相关残差进行优化,不涉及与视觉和IMU的联合优化。这个优化问题的因子图表示为下图,不包含视觉残差,而是多了一个先验残差项 用来约束IMU的bias需要接近于0。
在这里插入图片描述

if(!mpCurrentKeyFrame->GetMap()->isImuInitialized() && mbInertial)
{
    // 在函数InitializeIMU里设置IMU成功初始化标志 SetImuInitialized
    // IMU第一次初始化
    // 
    if (mbMonocular)
        InitializeIMU(1e2, 1e10, true);
    else
        InitializeIMU(1e2, 1e5, true);
}

第二次和第三次IMU初始化
同样的,为了获得足够的运动,IMU的第二次初始化需要在第一次初始化5s之后再进行,第三次需要在第二次成功后15s进行。

第二次初始化,会对IMU数据做一次BA优化

// 当前关键帧所在的地图还未完成VIBA 1
if(!mpCurrentKeyFrame->GetMap()->GetIniertialBA1())
{
    // 如果累计时间差大于5s,开始VIBA1(IMU第二阶段初始化)
    // 距离第一次初始化后需要让IMU攒点数据进行第二次的初始化
    if (mTinit>5.0f)
    {
        cout << "start VIBA 1" << endl;
        mpCurrentKeyFrame->GetMap()->SetIniertialBA1();
        if (mbMonocular)
            InitializeIMU(1.f, 1e5, true);
        else
            InitializeIMU(1.f, 1e5, true);

        cout << "end VIBA 1" << endl;
    }
}

第二次初始化和第三次初始化在对IMU参数进行优化后,需要联合视觉信息进行联合BA优化,优化因子图如下
在这里插入图片描述

if (bFIBA)
{
    // 5. 承接上一步纯imu优化,按照之前的结果更新了尺度信息及适应重力方向,所以要结合地图进行一次视觉加imu的全局优化,这次带了MP等信息
    if (priorA!=0.f)
        Optimizer::FullInertialBA(mpAtlas->GetCurrentMap(), 100, false, mpCurrentKeyFrame->mnId, NULL, true, priorG, priorA);
    else
        Optimizer::FullInertialBA(mpAtlas->GetCurrentMap(), 100, false, mpCurrentKeyFrame->mnId, NULL, false);
}

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

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

相关文章

js数据结构之栈

1.栈数据结构 栈是一种遵从后进先出&#xff08;LIFO&#xff09;原则的有序集合。新添加或待删除的元素都保存在栈的同一端&#xff0c;称作栈顶&#xff0c;另一端就叫栈底。在栈里&#xff0c;新元素都靠近栈顶&#xff0c;旧元素都接近栈底。 在现实生活中也能发现许多栈的…

【服务器数据恢复】Raid5崩溃导致EMC存储不可用的数据恢复案例

服务器数据恢复环境&#xff1a; EMC存储&#xff0c;多块stat硬盘组建raid5磁盘阵列&#xff0c;两块热备盘&#xff0c;上层采用zfs文件系统。 服务器故障&检测&分析&#xff1a; EMC存储中的raid5磁盘阵列有2块硬盘出现故障&#xff0c;但是只有一块热备盘被激活&am…

关于原型和原型链的整理学习

关于原型和原型链是很多人学习或面试时遇到的问题&#xff0c;可能部分不懂&#xff0c;部分懂但不会说&#xff0c;下面关于原型和原型链进行简单的整理总结&#xff0c;希望可以帮助到大家。 一、JS中的原型和原型链 1、原型说明 所有的引用类型&#xff08;数组、函数、对…

【Tools】Git和VS Code配置

文章目录0 前期教程1 前言2 基本使用2.1 配置2.2 获取帮助3 GitHub仓库和git3.1 新建一个GitHub仓库3.2 删除一个仓库&#xff08;repository&#xff09;3.3 上传项目代码4 git常用指令4.1 创建分支4.2 合并分支4.3 在git提交记录上移动4.4 撤销变更4.5 整理提交记录5 在VS Co…

蓝桥杯 stm32 DAC

文章代码使用 HAL 库。 文章目录前言一、根据手册了解 DAC 重要特性 :二、CubeMX 创建工程&#xff1a;三、DAC 代码&#xff1a;1. 设置DAC输出值函数。2. 开启DAC输出函数。3. DAC 输出电压。总结前言 DAC 就是 数字模拟信号转换器 &#xff0c;也就是把 数字信号转变成模拟…

实施MES系统前,先想清楚首先用来解决什么问题

MES系统首先用来解决什么问题&#xff1f; 很多人会自然而然地认为&#xff0c;MES系统是用来解决管理问题的&#xff0c;是为了明确管理流程的&#xff0c;是为了建立管控标准的…… 甲方会有很多很多想解决的问题&#xff0c;甚至在系统导入过程中&#xff0c;各个部门也会…

vue中安装与引用echarts示例

第002个点击查看专栏目录Echarts发展到现在&#xff0c;已经陆续经过了很多版本&#xff0c;越来越完善&#xff0c;现在主要研究5.0以上的功能。这里是介绍在vue项目中&#xff0c;如果全局或者局部引用echarts&#xff0c;对项目初装echarts会起到非常大的帮助。 NPM 安装 E…

电脑文件如何自动备份?

电脑文件如何自动备份&#xff1f;计算机的出现是人类科技发展的重要标志&#xff0c;电脑已经成为我们工作、生活以及学习中必不可少的工具&#xff0c;尤其是在工作中的应用&#xff0c;它改变了以前传统的工作方式。电脑的使用给我们带来极大方便的同时&#xff0c;也带来了…

mPEG-SS-NH2 ;mPEG-SS-Amine;甲氧基聚乙二醇-双硫键-氨基-科研用试剂简介

mPEG-SS-NH2 甲氧基聚乙二醇-双硫键-氨基 英文名称&#xff1a;mPEG-SS-NH2 英文别名&#xff1a;mPEG-SS-Amine 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&#xff0c;取…

3D渲染优化入【Three.js】

Three.js 应用程序以每秒 60 帧 (FPS) 的速度执行 3D 渲染是流畅和愉快体验的保证。 然而&#xff0c;这是一个有时难以实现的目标&#xff01;本文整理了优化 Three.js 应用程序和达到 60 FPS 的最佳提示和技巧&#xff01; 推荐&#xff1a;使用 NSDT场景编辑器 快速搭建 3D…

Day13【元宇宙的实践构想02】—— 元宇宙与沉浸式交互技术介绍、支撑开发与应用

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 ✍今日内容&#xff1a;《元宇宙的实践构想》02——元宇宙与沉浸式交互技术 &#x1f6a9; 今日留言&#xff1a;亮亮被迫去练科目二啦&#xff0c;定时发布的文章&#xff…

鉴源论坛 · 观通丨联锁系统原理浅析

作者 |刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 01 联锁系统的硬件结构 根据联锁系统的层级关系&#xff0c;联锁系统的硬件层级可以分为4层&#xff1a;人机会话层、联锁层、接口层、室外设备层。 图1 联锁系统的硬件结构 02 联锁系统的软件结…

误删照片音视频文件不要担心 几种方法解救慌乱的你

误删照片音视频文件不要担心 几种方法解救慌乱的你 推荐的几款软件涵盖了大量的恢复方式,手机如果刷机或者损坏找回的几率会越低 免费软件获取方式关注公众号回复8585 更多软件获取方式点我 方法1&#xff1a;从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差…

C/C++ Linux Socket网络编程

之前已经学习了QT的socket编程 和 C/C在window环境的socket编程&#xff0c;现在再来学习一波C/C在Linux环境下的socket编程&#xff0c;为以后学习C Linux 服务器开发做准备。 目录 一、Socket简介 二、Socket编程基础 1. 网络字节序 2. sockaddr数据结构 3. IP地址转换函数…

新C++(5):异常

"山&#xff0c;请你慢些走向我呀~"一、异常初始每当我们使用传统C写一些诸如malloc\realloc,或者不允许传入的参数为空(nullptr)时&#xff0c;我们时长会加一个断言(assert),一旦条件为false立即终止程序&#xff0c;不仅如此&#xff0c;当申请的空间够大&#xf…

二叉树:二叉树的最近公共祖先

二叉树的最近公共祖先 文章目录一、题目描述二、解题思路三、代码解析一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c…

Vue实现下载文件而非浏览器直接打开

问题背景 对于一个txt文本、图片、视频、音频等浏览器可以直接使用浏览器进行预览的文件&#xff0c; 使用传统的a标签加download属性进行下载是行不通的&#xff0c;会在浏览器直接打开&#xff0c;因此需要搞一个新的方式进行下载。 实现流程 实现思路 这里使用Vue自定义…

ElasticSearch从入门到出门【中】

文章目录DSL查询文档DSL查询分类全文检索查询使用场景基本语法示例精准查询term查询range查询地理坐标查询矩形范围查询附近查询复合查询相关性算分算分函数查询布尔查询搜索结果处理排序普通字段排序地理坐标排序分页基本的分页深度分页问题高亮高亮原理实现高亮RestClient查询…

档案数据智能采集工厂模型设计与实现

档案信息化从业人员肯定对异构系统数据采集过程中碰到的各种问题深有体会&#xff0c;有源系统供应商不配合的&#xff1b;数据接口不开放的&#xff1b;归档数据不符合规范的&#xff1b;数据敏感不提供的&#xff1b;等等&#xff1b;不一而足。但不幸的是档案信息系统处于政…

C 语言零基础入门教程(二十二)

C 错误处理 C 语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值的形式允许您访问底层数据。在发生错误时&#xff0c;大多数的 C 或 UNIX 函数调用返回 1 或 NULL&#xff0c;同时会设置一个错误代码 errno&#xff0c;该错误代码是…