DM-VIO简析

2023-05-16

今天主要是针对DMVIO/DM-VIO的简析,中文网上有的东西都太少了,只能靠看完论文和组员们一起改代码。Lukas组这个东西在中文网被称为有史以来最好的VIO,但是实际过程中我们还是发现了许多不完美的地方。。。(比如ZUPT更新改造中该有的问题仍然在那里,不过根据实际在强力硬件上的运行来看确实比VINS-MONO强,但是明显不如VINS-MONO的工程版)

既然有简析,后续肯定会做包括函数/代码在内的一些关键详解。现在代码拆解还没到那个阶段,只能先把数论延续性和关键点的理解拆出来。计划春节前做好吧。

首先讲个前提,要搞懂这东西首先要有SLAM基础和VIO基础,了解所有Jacorbian和Hession相关,了解各种7788的耦合方式,熟悉因子图(Factor Graph)。一定要熟悉TUMDSO相关系统的传承和延续,不然你不知道我在说啥。。。DSO相关的参考资料已经很多了(推荐高翔博士的“DSO详解”,但是注意里面关于3个核心迭代的描述略有偏差)。另外既然是简析,肯定也是个人理解,不代表一定正确。

先发个比较重要的图,字比较丑,不要介意。。。

先说明一下,此图虽丑但是非常重要。。。作为一个40岁的老工程师大家就别太计较了。。。后面的详解估计会是其他同学来做,保证不会这么难看了。

要了解DM-VIO,必须得了解DSO和工大TUM的历史,这个Github和公开资料上很多不赘述了。重点讲Lukas组。

DM-VIO是VI-DSO的延续,VI-DSO因为实际使用效果较差,国内各组在跟的应该比较少。

但实际动态边缘化是一种非常精妙的思路,我也不知道这几年发生什么了(疫情?),最终L组并没有在这条路上一路走到黑,而是出了DM-VIO这个超工程但是令人无力吐槽的优秀版本。

在之前必须熟悉DSO中的基础(以下2式必须熟悉):

光度代价:

光度误差:

这2个式子不解释了,不了解的同学不适合阅读本文。

首先要牢记:无论任何多传感器融合融态系统,尤其是VIO系统,无论选择什么样的传感器组合,又或者采用何种算力平台,又或者怎么去做权重和约束策略,亦或者各种各样的ZUPT,甚至这个系统的基础可用性判断benchmark,就是是否能在完成SLAM的同时合理控制尺度(旋转与平移)

这篇因为是DM-VIO的简析,关于VI-DSO中的核心只做简述:

1.VI-DSO的核心是动态边缘化,其核心思维就是通过尺度因子s和重力方向因子Rv_I来构建一个动态边缘化,以尝试保持一致的边缘化先验(见附图右边因子图)。其中VI-DSO工程化了一个关键帧<=0.5秒的策略,但是边缘化中可以随时违背,以确保长期和持续的关联。优化的本身就是尺度s。

2.M因子(边缘化因子)在Margin时不固定尺度的线性化点并保留3个边缘化先验,当尺度开始飘飞前(或理解为尺度估计离线性化交点远时),进行重置!通过Mvisual/Mhalf/Mcurr来进行控制,分别指代包含之前状态中与尺度无关的信息(不可用其推断全局尺度)/设置线性化点以来所有的尺度信息/最接近当前值的尺度信息

3.初始化和DSO一样仍然是非常的高开销易失败,很容易在初始误差高的情况下直接失败,导致快速的尺度飘飞(尤其是户外),尺度飘飞也是VIO里最常见的问题了,ZUPT和各种各样的手段都是为了把这玩意掌控住

4. SIM(3)系,这个在DMVIO和VIDSO都是通用的,就是为了以尺度/重力初始值来优化,除了基础的度量系SE(3)(世界系),建立了一个DSO坐标系中度量系能被尺度收缩/旋转的版本。

5. VI-DSO后端优化通用性,DM-VIO也采用了同样的方式,用Gstam库进行后端优化以及完成IMU预积分。比较简单,不赘述。

好了开始讲DM-VIO:

本质一句话:

只要边缘因子不重新线性化,求解由此产生的更小系统就等同于求解更大的原始系统。

这句话就是无力吐槽的部分了,我来按我的理解翻译一下哈:

就是如果我采用系统运行时非常古早的信息来求解系统,选用的边缘因子(M因子)不进行重线性化(边缘化重线性化是SLAM的2个基操),那被我求解而产生的这个更小的系统就相当于我求解了更大的原始系统。这就是延迟边缘化

这里是DM-VIO关键式:

Epj和Ephoto延续至DSO,这里的小ephoto是Ephoto/Nresidual(残差个数)开均方根,本质是利用光度误差形成视觉权重。这里的θ和主流程中各个奇怪的θxx不是一码事,代表一个阈值。

E(s)这个表述,熟悉VINS-MONO的同学一看就知,和VINS三权重是一码事,权重和约束是控制尺度的基础。不过VINS-MONO是通过各自的协方差矩阵Σ来做的,其先验Prior是为了保持上一个重线性化点的状态的约束,但是这个约束很松,犹如一根细线,很容易被视觉或IMU权重带走(事实也需要这么设计),我这块说的比较抽象,但是直观理解就是这个意思。

yaw不可观,一堆转换弄出Rv_I,和s联合构建出:

(这是完整的需要被优化的状态变量)

还有一个活动关键帧状态Si(Active frame),也是DM-VIO中最重要的函数

里面分别是状态值-齐次坐标4x4的SE(3)或SIM(3) ,速度,bias(Ba/Bg都有,2个列向量),2个关键光度参数,所有点(2000个默认)的逆深度。

imu因子误差:

舒尔补/cholesky分解那些比较简单清晰的就不列了。 

这里补个马尔科夫毯一目了然图:

 使变量A条件独立的一张毯子,切断A与世界和整个系统的联系。

看完这些知识后,开始讲DM-VIO因子图

因子图其实算是一目了然了:

1.DM-VIO最大的特点是构建了2个完全不同作用的视觉BA。

其中一个是全局视觉因子图,另一个是延迟边缘化因子图。

在例图中给的Nf=4,代表延迟了4个激活帧(或关键帧),同时在延迟边缘化b因子图中d=4(但这个延迟是高达d=100个关键帧的!)如系统以1秒30fps对应7-8个KF生成为例,相当于使用了10余秒前的信息(所以称为古早)

但实际上这是一种非常好的策略。

2.两个BA其实是同一套BA,根据Nf值的延时来对时,如因子图中的2条虚线就是进行对时的指向线。使Main和Delay的因子图完全保持了一致。

3.然后M掉P1后,使用被延迟的这一帧加入了PGBA(这里我理解为Populate gragh with IMU factors),迁移并入IMU因子进行尺度归一,关键就是优化s(见前式)。一定要注意这里使用的M因子对应延迟边缘化中被并入帧的M因子

4.一定要注意因子图中已线性化的光度因子激活光度因子的位置与对应关系!每一个激活的光度因子包含了多个三元因子(每个关联一个逆深度/Host frame/Target frame,DSO基础知识),在因子图中总结成了一个链接所有激活关键帧的因子。

5.向前推进PGBA,完整地完成边缘化,并优化s

最后讲右下角的主流程图(可以认为就是初始化的流程图)

初始化是整个DSO与其分支最重要的部分,要注意在这类系统中初始化/前端/后端是不严格区分的,可以理解为同步不间歇进行。

1.主流程图分为了视觉里程计VIO两个部分,在这里可以理解为松耦合。当然在最后算E(s)时又是紧耦合了,看不懂就看看前面那句话。

2.这里一共设定了一堆θ,分别是θinit=1,θreinit=0.5,θlost=50,θmarg,这一堆都是经验值

3.这一堆阈值的整个初始化优化的目标是使:cov(s)<=0.5,Nlost>=50,Nlost指代丢失的IMU因子数量。第一个s的协方差控制在比较小的范围很好理解,满足系统设计主旨。Nlost很难理解,指至少需要优化到有50个kf没有和imu因子链接上,并不存在IMU变量才能停止边缘化替换。实际指的是禁用和终止边缘化替换,使主系统继续的关键条件。

4.主流程中最关键的优化迭代运算动作是:PGBA/初始化主VIO/延迟边缘化替换,均在因子图中明确了动作,优化目标见3。

简述完毕,给一下我的基础结论

在DMVIO实际拆解动作中,我们发现了一系列的问题,首先2次BA成倍地增加了开销,大量的判断带来了不间断的迭代和优化运算,间接影响了原来非常漂亮简洁的DSO(虽然DSO比较难懂,但是代码水平是很高的)。如简述所描述,整个DM-VIO的实现非常工程思维(但是却没太考虑开销,嵌入式系统难以承受ZUPT问题依旧),DM-VIO完全舍弃了VI-DSO动态边缘化的思路,但是达到了很好的效果。延迟边缘化相对动态边缘化孰优孰劣当然最终是由结果决定的,DM-VIO也证明了这一点。

这个系统对大部分工程师来说整体不算友好,它完善地解决了IMU初始化器中正确捕获视觉不确定性的问题,非常优秀地改善了初始化,成功将尺度和IMU变量信息从初始化器传递到了主系统,最终也通过这一系列特别的延迟边缘化工程策略,保持了当尺度估计变化时一致的边缘化先验。佩服之余也不禁有感慨,希望后续有更好的详解,同时更希望有厉害的同学去解决依然存在的问题。

继续完善SLAM/VSLAM的前进路径从来都是曲折和漫长的,少不了我们一起的努力,如何平衡精度与开销,是SLAMer长期的课题。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DM-VIO简析 的相关文章

  • 你可以再去啃透vision_to_mavros和VIO的代码来锻炼自己C++的水平

    你可以再去啃透vision to mavros和VIO的代码来锻炼自己C 43 43 的水平 也就是不单单啃普罗米修斯 以前分析的VIO的代码 https blog csdn net sinat 16643223 article detai
  • 似乎做VIO要注意相机和IMU的同步

    似乎做VIO要注意相机和IMU的同步 xff0c 我多次看到这个了 https blog csdn net sinat 16643223 article details 109108616 MAVROS里我居然专门看到一个消息类型就是 IM
  • MSCKF_VIO作者就是用小觅双目摄像头跑的

    https gitee com maxibooksiyi msckf vio GPS 我在youtube上也看到有人用小觅摄像头跑MSCKF VIO 还有小觅自己也写过用小觅摄像头跑MSCKF https blog csdn net sin
  • imu 里程计融合_视觉惯性里程计Visual–Inertial Odometry(VIO)概述

    周围很多朋友开始做vio了 xff0c 之前在知乎上也和胖爷讨论过这个问题 xff0c 本文主要来自于知乎的讨论 个人理解错误的地方还请不吝赐教 xff0c 转载请标明出处 xff0c 内容如有改动更新 xff0c 请看原博 xff1a h
  • VINS-FUSION代码超详细注释(VIO部分)/VIO入门(2)

    文章目录 0 前情回顾本次工作 1 sync processinputImage2 trackImage2 1 图像处理2 2 hasPrediction2 3 if SHOW TRACK 2 4 setMask2 5 goodFeatur
  • VINS-FUSION代码超详细注释(VIO部分)/VIO入门(4)

    文章目录 0 前情回顾本次工作 1 updateLatestStates 和slideWindow 2 optimization 0 前情回顾 VINS FUSION代码超详细注释 xff08 VIO部分 xff09 VIO入门 1 讲到了
  • MSCKF-vio源码阅读

    作为一个菜狗来说 xff0c 一开始弄明白kf ekf等滤波方法实属不易 xff0c 但是一旦理解原理之后再发散到基于滤波的状态估计方法 xff0c 学习起来就会事半功倍 xff0c 就像导航包中的robot pose ekf xff0c
  • VIO/VINS/VSLAM问题定位流程与思路

    首先假设读者是了解基础VSLAM xff0c 了解VIO基础 至少要会标定 xff0c 调过几个开源系统的 先说一下双目的VINS FUSION xff0c 大部分问题都是基线造成的问题 xff0c 简单点说就是如果使用较短的基线如5cm
  • 主流VIO框架分析及VINS部分解析

    本文为搜集的资料整理 xff1a C0包含位姿和运动信息 xff1b 对于T0来说 xff0c 不仅受rv10 rv11的视觉影响 xff0c 也受rb01的IMU的影响 上述方式繁琐 xff0c 故引入因子图 xff0c 便于思路梳理和理
  • AirSim中运行VIO算法(VINS-Mono)

    VINS Mono在AirSim上跑通 文章目录 VINS Mono在AirSim上跑通一 IMU参数配置二 相机参数设置三 AirSim发布数据问题 关于相机 IMU内外参的完整解释 xff0c 可以参考我的另一篇文章 一 IMU参数配置
  • VIO标定(相机和IMU的标定)

    VIO标定 VIO标定分为三个部分 xff0c 相机的标定 xff0c IMU的标定 xff0c 相机和IMU的联合标定 双目相机相机内参标定 xff08 单目相机可以用类似的方法 xff09 标定单目和标定双目的区别 标定单目相机就是简单
  • 视觉惯性里程计VIO综述

    参考 xff1a https blog csdn net xiaoxiaowenqiang article details 81192045 目前主流的VIO开源方案主要有以下几类 xff0c 按照相机与IMU的耦合方式可分为松耦合和紧耦合
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • SLAM --- VIO 基于 EKF 开源

    1 VIO based on EKF 已知一致性的Visual Inertial EKF SLAM 实现添加链接描述
  • msckf_vio使用记录

    使用环境 xff1a ubuntu14 04 indigo indigo版本的ros默认支持的是opencv2 4 8 xff0c 其带的库cv bridge依赖于opencv2 但是 xff0c msckf vio使用的是Ubuntu 1
  • VSLAM与VIO的3D建图,重定位与世界观综述

    作者 紫川Purple River 编辑 汽车人 原文链接 xff1a zhuanlan zhihu com p 592225457 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自
  • VINS - Fusion GPS/VIO 融合 一、数据读取

    目录 一 相关概念 二 程序解读 2 1 参数读取 解析 xff1a 2 2 获取图像时间信息 解析 xff1a 2 3 获取图像时间信息 解析 xff1a 2 4 定义VIO结果输出路径和读取图像信息 解析 xff1a 2 5 读取GPS
  • 视觉惯导里程计VIO综述

    最近阅读了VIO中的一些论文 xff0c 在这里做个汇总方便以后查阅 xff0c 如有问题欢迎指正 一 背景 VIO xff08 Visual Inertial Odometry xff09 视觉惯导里程计 xff0c VINS xff08
  • dm-vio-ros的安装(详细)

    前言 dm vio安装 参考博客 SLAM DM VIO ros版 安装和论文解读 在安装过程中 xff0c 有些地方提示的不是很清楚 xff0c 故写一篇记录避免再次犯错 在dm vio的一个子目录下创建ros工作空间 xff0c 如图所
  • 关于VIO零速更新(ZUPT)与控制三种约束的工程实践

    今天这篇是深度稍微高一些的 xff0c 尽量写细 xff0c 但是具体实践各家都有不同的方式与工程习惯 xff0c 就不多赘述了 小组工作比较忙 xff0c 代码还没来得及整理 xff0c 总体更新一下基础知识 VIO系统后端核心的三种约束

随机推荐

  • Android SDK的安装步骤

    1 Android SDK下载 https www androiddevtools cn 2 解压Android SDK压缩包 放在没有中文的目录里面 3 打开Android sdk windows文件夹 xff0c 双击SDK manag
  • Apollo control之PID算法

    Apollo studio 官网 xff1a Apollo开发者社区 baidu com 目录 1 PID简介 2 PID调参思路 3 代码 4 解决积分饱和的方法 4 1 IC 积分遇限削弱法 4 2 BC 反馈抑制抗饱和 1 PID简介
  • TCP通信模型(C语言实现)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 今天我们来分享TCP通信模型 xff0c 并且用C语言实现它 目录 一 我们将实现三个示例功能 xff1a 二 TCP服务器搭建流程 xff08 1 xff
  • 场景文本识别中的字符感知采样与校正(Character-Aware Sampling and Rectification for Scene Text Recognition)

    摘要 由于形状和纹理变化较大 xff0c 曲面场景文本识别在多媒体社会中是一项具有挑战性的任务 以前的方法通过等距离采样提取和校正文本行来解决这一问题 xff0c 这忽略了字符级别信息并导致字符失真 为了解决这个问题 xff0c 本文提出了
  • MyBatisPlus中的likeLeft和likeRight

    在使用MyBatisPlus来匹配身份证后6位时遇到了likeLeft和likeRight的问题 xff1a likeLeft时匹配最左边还是匹配最右边 xff1f 所以来一个简单的测试 xff08 通过打印 成功 失败 来判断 xff09
  • 计算机网络第一章总结

    目录 1 1计算机网络再信息时代中的作用 1 2互联网的概述 1 2 1网络 xff0c 互联网和因特网 1 2 2互联网基础结构的三个阶段 1 2 3互联网的标准化工作 1 3互联网的组成 1 3 1三种交换方式 1 4计算机网络的类别
  • Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column……报错的解决办法

    问题原因 xff1a 这个报错是执行有GROUP BY的语句时出现的 原因是MySQL启用了默认的only full group by SQL模式 导致GROUP BY语句报错 解决办法 xff1a 打开mysql的安装目录找到my ini
  • 【Linux安全管理】Firewalld详解

    目录 1 与iptables不同 2 配置防火墙 3 firewalld区域概念 4 filewalld 配置生效 5 firewalld服务 firewalld 端口映射 富规则 rich rule 1 与iptables不同 firew
  • C++之class和struct的区别

    在C语言中 xff0c struct是一个数据类型 xff0c 所以struct内不能定义函数 xff1b 在C 43 43 中保留了struct关键字 xff0c 并且进行了补充 xff0c struct类似于class xff0c 可以
  • QEMU使用virtio磁盘(Ubuntu/windows)

    环境 宿主环境 xff1a windows 10 pro QEMU版本 xff1a 3 1 客户机 xff1a windows2003 virtio是一种半虚拟化技术 xff0c window2003安装盘不带驱动程序 xff0c 所以首先
  • 创建一个ArrayList<String> 集合,通过反射向集合中添加Integer类型的数据

    1 思路 创建一个ArrayList lt String gt 集合 通过反射获取到ArrayList的Class对象通过Class类获取到ArrayList中的add方法 2 所需关键知识 获取Class类有三种方法 xff1a xff0
  • Git分支&标签

    目录 一 xff0c 分支 环境的的功能及特点 分支的策略 分支的相关指令 二 xff0c 标签 1 查看所有标签 2 创建tag 3 删除tag 4 分支与版本 一 xff0c 分支 1 分支的命名规范 dev test pre pro
  • java酒店管理系统小型项目

    前言 学习java这段时间以来 xff0c 给我的感觉是非常枯燥和乏味的 xff0c 因为学习编程这个过程就是这样 xff0c 除此之外我是自学 xff0c 所以遇到问题只能自己上网找资料 xff0c 或者看一些大佬的文章来解决问题 不过学
  • 基于智能优化算法的无人机路径规划(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 无人机作为一种现代航空设备 不仅作业速度快 成本低 还具有卓越的灵活性和时效性 常用于完成那些繁冗 危险 对灵活性要求较高 作业范围较大的任务 比如航空拍摄 农
  • 布谷鸟搜索算法的改进及其在优化问题中的应用(Matlab代码实现)

    x1f352 x1f352 x1f352 欢迎关注 x1f308 x1f308 x1f308 x1f4dd 个人主页 xff1a 我爱Matlab x1f44d 点赞 评论 收藏 61 61 养成习惯 xff08 一键三连 xff09 x1
  • 基于MATLAB中雷达和视觉合成数据的目标级传感器融合(Matlab)代码实现

    目录 x1f4a5 1 概述 x1f4da 2 运行结果 x1f389 3 参考文献 x1f468 x1f4bb 4 Matlab代码 x1f4a5 1 概述 本文使用MATLAB的场景生成器工具箱 xff0c 通过合成雷达和视觉观察创建一
  • Linux嵌入式开发——C编程

    文章目录 Linux嵌入式开发 C编程一 编写C程序1 1 设置vim编辑器1 2 编写C程序 二 编译C程序三 make工具和Makefile文件3 1 编写C程序C文件H文件 3 2 不使用make工具3 3 使用make工具和Make
  • C#中的接口

    一 什么是接口 含义 xff1a 接口是指定一组函数成员而不实现它们的引用类型 xff08 只能用类和结构实现接口 xff09 接口可以包含实例方法 属性 事件 索引器或这四种成员类型的任意组合 接口可以包含静态构造函数 xff08 不能创
  • VINS-MONO工程改造

    这篇是接着前文 主流VIO VSLAM系统改造与工程化落地 和 关于VIO零速更新 ZUPT 与控制三种约束的工程实践 的 xff0c 有时候想一出是一出 xff0c 导致写的东西还是太分散了 要做VINS改造首先要熟悉VSLAM和数学基础
  • DM-VIO简析

    今天主要是针对DMVIO DM VIO的简析 xff0c 中文网上有的东西都太少了 xff0c 只能靠看完论文和组员们一起改代码 Lukas组这个东西在中文网被称为有史以来最好的VIO xff0c 但是实际过程中我们还是发现了许多不完美的地