关于VIO零速更新(ZUPT)与控制三种约束的工程实践

2023-05-16

今天这篇是深度稍微高一些的,尽量写细,但是具体实践各家都有不同的方式与工程习惯,就不多赘述了。

小组工作比较忙,代码还没来得及整理,总体更新一下基础知识。

VIO系统后端核心的三种约束是:先验约束,视觉约束与IMU预积分

实验对象是VINS-MONO,首先因为我们主要的工程是基于VINS-MONO,另外VINS-MONO也是当前所有VIO系统里整个骨干脉络和原理逻辑比较清晰的一版,在其基础上出的工程问题较容易被处理与定位。

VIO,视觉IMU里程计,相信未来是比较实用和高性价比的位置姿态估计方式,但当前主要存在以下的一系列问题

1.FEJ,等一线性化点雅克比,VIO系统在SWF滑动窗口优化的过程中,信息矩阵H会分为两个部分H1和H2,其中一部分线性化点在变化,另一部分线性化点被固定。针对性的策略是使不同残差对同一状态估计求Jacobian时,线性化点必须一致,以避免矩阵中的Null space退化而使不可观变量变为可观。VINS-MONO未使用FEJ,原因未知,实际产生的结果并未有太多影响。

2.YAW角与3自由度不可观问题,这4个自由度不可观的好处就在于系统可以更好的估计最优解,坏处在于如果发生异常现象(不要过于相信数据集,在实际情况下异常现象是很容易出现的)时,轨迹会产生突刺,并迅速因尺度不确定性而导致系统不可用,即使回环也无法处理。

2.视觉完全丢失的情况,举几个很常见的例子(1)突然进入无纹理区转向 (2)突然遭受撞击在极短时间从东南向西北 (3)使用卷帘快门高速进入了急剧晃动和颠簸的状态。这多种情况都会导致系统视觉跟踪丢失,如其使用的LK法中,蓝色点表示新跟踪点,到了一段时间后转红色,这一类情况都会导致红色丢失产生一堆新的蓝色。产生的直接结果就是系统不再有视觉约束,如采用的硬件比较弱的话,系统会快速输入错误的先验约束,并逐步被IMU预积分约束联合拉飞

3.相机行进间视觉剧烈扰动的情况,相机前出现新的无法被辨识的动态障碍物,如人员,并大量破坏了特征点。在这种情况下VIO会不断更新错误的关键帧,并塞满滑窗SWF,在IMU实际并没有什么太大实际运动的情况下,视觉约束的权重矩阵Σ会占据主导。

4.零速下IMU漂移的问题,这也是很普遍的现象之一了。当系统快速进入零速(缓慢进入问题不大),系统Margin new frame的策略是不再生成新的关键帧KF,并丢弃视觉测量,继续向下传递预积分。在此种情况下VIO会很容易进入累积预积分误差进入尺度飘飞

5.零速下视觉扰动的问题,如系统顺利进入零速,轨迹稳定后相机前出现了一系列的扰动(和第3点基本一致,略有不同),系统也会较容易进入尺度飘飞

6.长时间无yaw输入向上产生大pitch角长期静止观察产生尺度飘飞。这个问题还没有定位,但实际是有这类现象的,row角同理。

对应的解决工程及手段:

这块应该是充满干货的知识了,也不知道会不会有人看到~

从1-6的一系列问题,大家会了解,使VIO正确和理想的工作本来就是一件充满困难的事情。首先这类系统要完全掌握和学懂原理,就需要花大量的时间,即使学懂了,上面那一系列的问题也是难以避免的,那这一系列的问题根源是什么呢? 其实就是在你使用的位置姿态估计组件与方法中的约束!以VIO为例,其中最关键的就是先验约束,视觉约束和IMU约束,我们的目标函数最终实际是针对这3种约束的非线性最小二乘解,但这每个约束里面的Σ及其对应的权重控制策略,决定了系统的鲁棒性和可用性。而实际是否会有比较完美的策略呢?当然不会有,这里就需要使用对应的工程进行深化处理。

1.零速更新ZUPT是一种工程策略,如针对问题5和6,可以直接在后端优化前加入限定条件,我们使用的策略是针对IMU输入的6自由度,判断在一段时间内IMU对应的欧式距离平均值,我们的IMU是200HZ,即5ms输出一个数据。通过40-100ms即8至20个IMU数据计算欧式距离,即可判断系统是否进入静止/零速状态。在状态被激活时,可以破坏原Σ的权重策略(如直接降低视觉权重至极小值),使视觉滑窗SWF停止更新。对应的IMU策略有多种 (1)如不断使用最新的一组最新的IMU数据进行预积分,相当于把VIO变成了IO,工程实操会比较困难和更细节一些。(2)或者直接在零速更新判断生效时,把VIO变成VO,使IMU的预积分停止,但是第二种情况仍然会出现障碍物扰动导致的轨迹飘飞。在工程处理的过程中,一定要注意不要破坏滑窗和后端优化本身

2.针对问题2有一种更简单直接的暴力策略,实际效果是很好的,即通过IMU的高速运动输入(如上提到的欧式距离策略),(1)一种策略是使系统直接从VIO变为IO,这样在处理剧烈颠簸和急剧晃动时的视觉丢失效果是比较好的。前提仍然是一定注意不要破坏滑窗和后端优化本身!(2)另一种策略是在后端优化中写回调函数,从前端来取红色/蓝色LK法的特征点数量进行直接判断。 一种是视觉的方法,一种是IMU的方法。本质都是针对极端情况建立新的三约束Σ调整策略

3.问题1的话可以直接尝试手动加入FEJ,我们试了一下效果没什么变化。问题2其实算是问题3-6的成因之一,就不赘述了。最后讲一下问题3,问题3是最难处理的,比如系统在运动,同时一直有个人员在前方随动的情况。这种我们目前也没有好的方法,其实从思路上来说就是让系统进入纯IO优化,但是这个判断条件难以被建立,如果主系统带NPU的话就好办,可以用机器学习的方法建立人员判断条件进入IO,那就很简单了。

4.加入这些工程策略后,尺度飘飞得到了很好的处理。大家也可以使用自己的策略去约束极端情况。综上所述,最容易出现问题的场景如下:(1)静转动,动转静 (2)视觉高速晃动丢失,无纹理丢失,大Pitch/Row视觉丢失 (3)活动障碍物

常规的处理手段是内参/外参调整,使用硬件同步对时确保td的准确性,使用全局快门。很多同学认为如果能保障这些都处理得很好的情况时,建立一个统一的Σ策略即可解决问题,实际也是不可能的~今天介绍的重点是如何从系统后端优化与三约束的整体层面去策略性地提升鲁棒性Robust

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

关于VIO零速更新(ZUPT)与控制三种约束的工程实践 的相关文章

  • imu 里程计融合_视觉惯性里程计Visual–Inertial Odometry(VIO)概述

    周围很多朋友开始做vio了 xff0c 之前在知乎上也和胖爷讨论过这个问题 xff0c 本文主要来自于知乎的讨论 个人理解错误的地方还请不吝赐教 xff0c 转载请标明出处 xff0c 内容如有改动更新 xff0c 请看原博 xff1a h
  • 运行msckf_vio

    1 编译 cd span class token operator span span class token operator span msckf catkin make span class token operator span p
  • MSCKF-vio源码阅读

    作为一个菜狗来说 xff0c 一开始弄明白kf ekf等滤波方法实属不易 xff0c 但是一旦理解原理之后再发散到基于滤波的状态估计方法 xff0c 学习起来就会事半功倍 xff0c 就像导航包中的robot pose ekf xff0c
  • VINS-MONO运行TUM VIO数据集真实轨迹问题处理

    小loser第一次写记录 xff0c 再次记录一下测试TUM VIO数据集碰到的问题及处理 VINS本身输出的数据需要进行格式转换才能用 xff0c 输出文件修改参考这个博客 Ubuntu 18 04 VINS Mono运行与EVO的评测与
  • DM-VIO简析

    今天主要是针对DMVIO DM VIO的简析 xff0c 中文网上有的东西都太少了 xff0c 只能靠看完论文和组员们一起改代码 Lukas组这个东西在中文网被称为有史以来最好的VIO 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综述

    参考 xff1a https blog csdn net xiaoxiaowenqiang article details 81192045 目前主流的VIO开源方案主要有以下几类 xff0c 按照相机与IMU的耦合方式可分为松耦合和紧耦合
  • SLAM --- VIO 基于 EKF 开源

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

    MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xff0c 在进行卡尔曼增益之前通过多帧图像之间的约束进行最小二乘优化来估计特征点的空间位置 xff0c 然后根
  • Pixhawk4+Up Board / NUC Implement VIO By Deploying T265

    How learning without GFW Reference Links Open links below in sequence Things you need to learn or following Overall Step
  • Auterion PX4 VIO代码分析

    也就是PX官方文档给的VIO代码 xff0c 用的T265 也是之前在github里面搜PX4 T265搜到的 https github com Auterion VIO blob master src nodes px4 realsens
  • msckf_vio使用记录

    使用环境 xff1a ubuntu14 04 indigo indigo版本的ros默认支持的是opencv2 4 8 xff0c 其带的库cv bridge依赖于opencv2 但是 xff0c msckf vio使用的是Ubuntu 1
  • 视觉惯性里程计Visual–Inertial Odometry(VIO)概述

    周围很多朋友开始做vio了 xff0c 之前在知乎上也和胖爷讨论过这个问题 xff0c 本文主要来自于知乎的讨论 来自https www zhihu com question 53571648 answer 137726592 个人理解错误
  • 从零开始手写 VIO

    前言 最近和高博合作推出了一个关于 VIO 的课程 xff0c 借此博客推荐下 这个课程的图优化后端是我们自己写的 xff0c 仅依赖 Eigen 实现后系统的精度和 ceres 以及 g2o 不相上下 个人感觉这个课程还是能学到不少东西
  • VINS - Fusion GPS/VIO 融合 一、数据读取

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

    XTDrone 视觉惯性里程计 xff08 VIO xff09 配置 参考XTDron进行配置 xff0c 对于依赖的配置写成文档 xff0c 参考主要为 xff1a XTDrone Ceres Solver 2 0 0 1 下载2 0 0
  • VIO松耦合和紧耦合对比

    松耦合 xff08 结果级融合 xff09 xff1a 两个独立的运动估计过程中分别处理视觉和惯性测量的信息 xff0c 最终将他们的输出 xff08 位置和姿态 xff09 融合作为结果 紧耦合 xff08 特征级融合 xff09 xff
  • dm-vio-ros的安装(详细)

    前言 dm vio安装 参考博客 SLAM DM VIO ros版 安装和论文解读 在安装过程中 xff0c 有些地方提示的不是很清楚 xff0c 故写一篇记录避免再次犯错 在dm vio的一个子目录下创建ros工作空间 xff0c 如图所

随机推荐

  • 【C++教学】第一课——头文件,全局命名空间,主函数的介绍

    头文件 初学者肯定疑惑为什么每次打代码都要写一个所谓的头文件 xff08 如 xff1a iostream xff09 xff0c 因为你所用的 cout gt gt 34 hello world 34 就是这个 是在iostream里的东
  • JavaWeb02(js基本语法&表单提交方式)

    一 xff0c js基本语法 1 jsp是什么 xff1f 实际上jsp就是Servlet xff0c 是一种可以用来开发web资源的技术 2 jsp运行原理 xff1f jsp文件先翻译成 java xff0c 在将其编译成 class
  • JavaWeb(分页)

    1 分页显示的步骤 xff1a xff08 1 xff09 确定每页显示的数据量 xff08 2 xff09 计算显示的页码 xff08 3 xff09 编写SQL语句 当数据多起来的时候 xff0c 记得需要一个容器将它包装起来 xff0
  • HTTP代理

    HTTP代理 xff08 HTTP Proxy xff09 是一种在网络中经常使用的技术 xff0c 允许客户端计算机通过指定的代理服务器来进行HTTP请求 在本文中 xff0c 我将介绍HTTP代理的基本原理 实现方法以及相关的应用和安全
  • LayUI项目之我的会议(送审以及排座)

    目录 一 xff0c 会议排座 1 前台编码 调试后的jsp代码 2 后台编码 1 图片工具类 2 js代码 3 SQL语句编写 4 子控制器 5 dao方法 三 图片处理 图片处理类 前台代码 后台接收 三 xff0c 会议送审 1 前台
  • Docker-宿主机与容器之间的文件拷贝

    目录 一 xff0c Docker运行MySQL容器 二 xff0c 数据卷 三 xff0c 数据卷容器 四 xff0c Dockerfile制作增强版 五 xff0c Docker制作自定义Tomcat 一 xff0c Docker运行M
  • 小程序框架

    目录 一 xff0c 框架 二 xff0c 响应的数据绑定 三 xff0c 页面管理 四 xff0c 基础组件 逻辑层 App Service 五 xff0c 小程序的生命周期 六 xff0c 注册页面 1 使用 Page 构造器注册页面
  • 小程序后台数据交互-个人中心

    目录 一 xff0c 获取用户昵称和头像 登录过程 二 xff0c 登录 小程序 三 xff0c 后台 小程序服器配置 一 xff0c 获取用户昵称和头像 登录过程 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身
  • 微服务框架及多模块开发

    目录 一 xff0c 项目模式 二 xff0c 项目架构图 三 xff0c 案例演示 主模块 公共子模块 子模块 添加页面公共资源 一 xff0c 项目模式 电商模式 xff1a 市面上有5种常见的电商模式 xff0c B2B B2C C2
  • Mybatis与微服务注册

    目录 一 xff0c Springboot整合MybatisPlus 创建商品微服务子模块 二 xff0c SpringBoot整合Freeamarker 三 SpringBoot整合微服务 amp gateway amp nginx 整合
  • 服务调用&分布式session

    目录 一 xff0c Nginx动静分离 二 xff0c 服务调用 创建配置zmall cart购物车模块 创建配置zmall order订单模块 服务调用 四 xff0c spring session实战 什么是Spring Sessio
  • C语言调试技巧(以vs编译器为例)

    实用调试技巧 什么是bug调试是什么 xff0c 调试有何重要调试是什么 xff1f 调试的基本步骤Debug和Release的介绍 Windows环境调试介绍调试快捷键调试的时候查看程序当前信息查看临时变量的值查看内存信息查看调用堆栈查看
  • (十三)STM32——串口通信(UART)

    目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式 UART 特点 串口参数 通信流程 寄存器 USART SR USART DR USART BRR 过程 代码 运行结果 运行结果 遇到的问题 总结 学习目标 本节我们
  • 关于VINS-MONO与VIO轨迹漂移问题定位的一些方向

    整个VINS MONO系统 xff0c 较容易在系统静止或外力给予较大冲击时产生轨迹漂移 xff0c 原因是imu的bias在预积分中持续发散 xff0c 视觉重投影误差产生的约束失效 如静止 xff0c 先验约束可能会在LM的线性求解器中
  • 爬虫的基本原理

    爬虫是一种自动化程序 xff0c 可以模拟人类在互联网上的行为 xff0c 从而获取网页上的信息 爬虫技术在互联网上的应用非常广泛 xff0c 例如搜索引擎 数据挖掘 网络爬虫等等 本文将从爬虫的基本原理 爬虫的分类 爬虫的应用 爬虫的优化
  • 通信接口五种主要的类型是什么?RS-232、485、CAN、USB

    笔者电子信息专业硕士毕业 xff0c 获得过多次电子设计大赛 大学生智能车 数学建模国奖 xff0c 现就职于南京某半导体芯片公司 xff0c 从事硬件研发 xff0c 电路设计研究 对于学电子的小伙伴 xff0c 深知入门的不易 xff0
  • 关于机器人状态估计/VIO/VSLAM中能观性/可观性/FEJ的一些直接解释

    知识来源是高翔博士与贺一家老师的VIO课程 xff0c 以及Barfoot教授的机器人学中的状态估计 可观性问题会直接带来多传感器融合融态中的关键手段 xff1a FEJ First Estimated Jacobian 即不同残差对同一状
  • 关于电子与电气自动化芯片侧的一些基础理解

    EEE Electrical and Electronics Engineering 电子与电气自动化工程 人类科技母行业 涉及的主要领域 xff1a 半导体元器件 芯片 xff0c 模组 PCBA xff0c 嵌入式系统 xff08 驱动
  • BA(后端)优化与卡尔曼滤波的一些区别

    今天这篇文章会写得深入一些 xff0c 主要知识来自于业内多位大佬的实际落地与自身的思考 主要涉及机器人状态估计与机器视觉 xff0c 多传感器结合时 xff0c BA优化与卡尔曼滤波的差异及如何选择 机器人状态估计中 xff0c 大家应该
  • 关于VIO零速更新(ZUPT)与控制三种约束的工程实践

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