VINS-Mono 理论详细解读——紧耦合后端非线性优化 IMU+视觉的残差residual、Jacobian、协方差、基于舒尔补的边缘化

2023-05-16

本讲是VINS最核心部分了,前面经历了

 1)视觉跟踪feature_tracker、IMU预积分integrationBase类;

2)初始化中SFM纯视觉估计滑动窗中所有帧的位姿和3D路标点深度、SFM与IMU预积分松耦合对齐求解初始化参数。

在完成前面的初始化环节后,本节将进行第3部分,基于滑动窗的紧耦合后端非线性优化:将视觉约束、IMU约束、闭环约束放到一个大的目标函数中进行非线性优化,求解出滑动窗口中所有帧的PVQ、bias等。

在视觉约束和IMU约束中,基本思想是找到优化状态向量,然后通过视觉残差和IMU测量残差分别对状态向量求导,获得视觉和IMU预积分的Jacobian和协方差矩阵。

阅读本文所需知识储备:

1、最小二乘、梯度下降法、牛顿与高斯-牛顿与LM关系总结

2、《视觉SLAM十四讲精品总结》4:非线性优化g2o(BA基础)

3、IMU预积分integrationBase类

目录

一、VIO残差函数的构建

1、需要优化的状态向量:

2、目标函数为:

二、视觉约束(细致)

1.视觉重投影误差residual(归一化平面)

2、优化变量

3、Jacobian

4、协方差

三、IMU约束(粗略,祥细见之前)

1、残差:

2、优化变量:

3、IMU测量残差公式推导

4、残差对状态量的Jacobian

5、残差对状态量的协方差

四、基于舒尔补的边缘化

1、论文部分

2、基本公式

3、舒尔补

4、marg后形成的先验

5 具体例子

5.1 原来的信息矩阵H的构成

5.2 舒尔补后形成新的信息矩阵new_H,并构造为先验

5.3 新测量信息和先验构成新的系统

 


一、VIO残差函数的构建

1、需要优化的状态向量

滑动窗口内IMU状态(PVQ、加速度bias、陀螺仪bias)、IMU到Camera的外参、m+1个3D路标点逆深度。

第一个式子是滑动窗口内所有状态量,n是关键帧数量,m是滑动窗内所有观测到的路标点总数,维度是15*n+6+m。特征点逆深度为了满足高斯系统。

第二个式子xk是在第k帧图像捕获到的IMU状态,包括位置,速度,旋转(PVQ)和加速度偏置,陀螺仪偏置。

第三个式子是相机外参。

注意:xk只与IMU项和Marg有关;特征点深度也只与camera和Marg有关

2、目标函数为

视觉惯性BA:这三项分别为边缘化的先验信息、IMU的测量残差、视觉的重投影误差

BA优化模型分为三部分:

1、Marg边缘化残差部分(滑动窗口中去掉位姿和特征点约束)代码中使用Google开源的Ceres solver解决。

2、IMU残差部分(滑动窗口中相邻帧间的IMU产生)

3、视觉误差函数部分(滑动窗口中特征点在相机下视觉重投影残差)

二、视觉约束(细致)

这部分要拟合的目标可以通过重投影误差约束,求解的是对同一个路标点的观测值估计值之间的误差,注意是在归一化平面上表示

1.视觉重投影误差residual(归一化平面)

相关自变量是:该路标点被两帧观察到的相机帧位姿、Cam和IMU之间相对位姿、路标点在第一帧的逆深度。

 当某路标点在第i帧观测到并进行初始化操作得到路标点逆深度,当其在第j帧也被观测到时,估计其在第j帧中的坐标为:

此时的视觉残差为:(左侧为根据i帧反推估计的位置,右侧为观测值)

逆深度参数化

逆深度作为参数原因:1)观测到的特征点深度可能非常大,难以进行优化;2)可以减少实际优化的参数变量;3)逆深度更加服从高斯分布。这里特征点的逆深度在第i帧初始化操作中得到。

论文中:

上面的公式是传统的针孔相机模型,这里用的是单位半球体的相机观测残差。是一个鱼眼相机。

在相机的归一化平面上比较残差,再将视觉残差投影到单位球面的正切平面上。由于视觉残差的自由度是2,所以我们将残差向量投影到切平面上。

在第i帧第一次观测到第l个路标点,在第j帧中对该路标点进行观测的残差为

第一个式子就是残差的表达式,第二个式子是鱼眼相机反投影函数将观测到的像素坐标转换成单位向量的观测值数据,b1和b2是此单位向量的切平面上的一组基。第三个式子是重投影估计模型。其实VINS代码中也可以使用普通的针孔相机模型。

2、优化变量

包括两个时刻的状态量、外参,以及逆深度

值得注意的是:和纯视觉不同的是,待优化的状态量中的旋转平移都是IMU系到w系,而不是Camera到w系。

状态量特征

1、待优化量和IMU约束中待优化量有重叠,再次体现了紧耦合。

2、和IMU不同的是,IMU每次优化的状态量是相邻两帧的,但是视觉优化的2帧不一定是相邻的,因此用i,j表示。

3、Jacobian

求解Jacobian就是用视觉残差对上述7个状态变量进行求导。

方法一:崔博直接给出答案

2)

在这里插入图片描述

方法二:深蓝学院详细推导

 

 

4、协方差

void Estimator::setParameter()
{
    for (int i = 0; i < NUM_OF_CAM; i++)
    {
        tic[i] = TIC[i];
        ric[i] = RIC[i];
    }
    f_manager.setRic(ric);
    ProjectionFactor::sqrt_info = FOCAL_LENGTH / 1.5 * Matrix2d::Identity();
    ProjectionTdFactor::sqrt_info = FOCAL_LENGTH / 1.5 * Matrix2d::Identity();
    td = TD;
}

三、IMU约束(粗略,祥细见之前)

1、残差:

状态量传播预测IMU预积分的残差。

2、优化变量:

IMU的第i、j时刻下的p位置,v速度,Q旋转(PVQ),两个偏置ba,bw

之前对IMU预积分进行了详细讲解。参考:VINS-Mono 代码详细解读——IMU离散中值预积分

3、IMU测量残差公式推导

简单来说,如果每一帧IMU都要相对于第一帧求位姿,计算量很大;考虑将PVQ积分公式改为相对第i时刻的姿态。

原PVQ积分公式:

基于预积分的PVQ积分公式

预积分量为:

最新的PVQ积分公式变为:

IMU测量残差e为:

4、残差对状态量的Jacobian

这里直接给出结果,如果想看详细推导,参考:VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h

对应位置补充上这个J的矩阵块就行了,其他位置还是0。一共分为四大模块:

整个残差对某个变量求导;

例如:\frac{\partial r_{B}}{\partial p_{b}^{w}} 指的是\begin{bmatrix} \frac{\partial r_{p}}{\partial p_{b}^{w}}\\\frac{\partial r_{v}}{\partial p_{b}^{w}} \\\frac{\partial r_{q}}{\partial p_{b}^{w}} \\ \frac{\partial r_{ba}}{\partial p_{b}^{w}}\\ \frac{\partial r_{bg}}{\partial p_{b}^{w}}\end{bmatrix}

5、残差对状态量的协方差

四、基于舒尔补的边缘化

为什么进行边缘化操作

如果仅仅从前后两帧图像计算相机位姿,速度快但是精度低;但是采用全局优化BA,连接所有图像帧,精度高但是复杂度高。

采用滑动窗,固定数量的帧进行优化,这样能够保证精度和速度。既然是滑动窗,在滑动的过程中会有新的图像进来,旧的图像离开,所谓边缘化就是为了删除图像,但是把图像信息约束保留下来。

1、论文部分

为了防止pose和特征的个数的复杂度随着时间不断增长,引入边缘。

化,在移除位姿时将关联的约束转化为先验放入优化问题中。

为了限制基于优化的VIO计算复杂度,引入边缘化。有选择地从滑动窗口中将IMU状态xK和特征λ1边缘化,同时将对应于边缘状态的测量值转换为先验。

分为两种情况,

1、一种是倒数第二帧如果是关键帧的话,将最旧的pose移出Sliding Window,将最旧帧关联的视觉和惯性数据边缘化掉。把第一个老关键帧及其测量值被边缘化;Margin_Old作为先验值。

2、如果倒数第二帧不是关键帧的话,那么就只剔除倒数第二帧的视觉观测,而不剔除它的IMU约束。原因是边缘化保证关键帧之间有足够视差而能够三角化足够多的地图点。并且保证了IMU预积分的连贯性。

为了保持系统的稀疏性,我们不会边缘化非关键帧的所有测量值。

2、基本公式

我们根据运动模型和观测模型建立H矩阵(高斯牛顿法中的JJT)的过程其实就是根据概率图模型(多元高斯分布)建立各个节点变量间的信息矩阵(协方差矩阵的逆)的过程,而边缘化则是去掉概率图中的某一个节点后信息矩阵会发生怎样的变换的问题。

基于高斯牛顿的非线性优化理论可知,H*delta_x=b可以写成:

其中,delta_xa和delta_xb分别是希望marg掉的部分和保留部分。

VINS中需要边缘化滑动窗口中的最老帧,目的是希望不再计算这一帧的位姿或者与其相关的路标点,但是希望保留该帧对窗口内其余帧的约束关系。我们基于与移除状态相关的所有边缘化测量值构造一个先验。新的先验项被添加到现有的先验项中。

3、舒尔补

4、marg后形成的先验

xa为需要marg的变量,假设为相机pose,我们更关心如何求解希望保留的xb,而不再求解xa(即marg的变量改为0,左乘时左上是0),这里是要变化为上三角。

即:new_H*delta_xb=new_b;

形成新的信息矩阵new_H具体流程:

注意:去掉了x1,但是之前和x1相连的所有量x2  x3  x4  x5 在marg掉x1后变得两两相连。

5 具体例子

 

5.1 原来的信息矩阵H的构成

上述最小二乘问题,对用的高斯牛顿求解为:

矩阵乘法公式写成连加:

雅克比J和信息矩阵H的稀疏性:由于每个残差只和某几个状态量有关,因此,雅克比矩阵求导时,无关项的雅克比为 0。

将五个残差的信息矩阵加起来,得到样例最终的信息矩阵 Λ, 可视化如下

5.2 舒尔补后形成新的信息矩阵new_H,并构造为先验

5.3 新测量信息和先验构成新的系统

 

 

 

参考文章:

VINS-Mono理论学习——后端非线性优化   by Manii

VINS-mono详细解读 by 极品巧克力

VINS-Mono之后端非线性优化 (目标函数中视觉残差和IMU残差,及其对状态量的雅克比矩阵、协方差递推方程的推导)  by Hansry

深蓝学院手写VIO课程

https://blog.csdn.net/iwanderu/article/details/104729332

 

 

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

VINS-Mono 理论详细解读——紧耦合后端非线性优化 IMU+视觉的残差residual、Jacobian、协方差、基于舒尔补的边缘化 的相关文章

  • 【Git】国内代码托管中心码云(Gitee)

    9 国内代码托管中心码云 Gitee 9 1 简介 众所周知 xff0c GitHub 服务器在国外 xff0c 使用 GitHub 作为项目托管网站 xff0c 如果网速不好的话 xff0c 严重影响使用体验 xff0c 甚至会出现登录不
  • 3.3应用程序

    3 3 应用程序 程序中我们首先创建一个四边形 xff0c 然后使用像素着色器进行纹理混合后对其进行渲染 下面是应用程序代码 xff1a 顶点格式定义 struct CUSTOMVERTEX 定点位置坐标 float x y z 两套纹理坐
  • 4.HLSL Effect(效果框架)

    4 HLSL Effect xff08 效果框架 xff09 进行到这里 xff0c 读者可能会觉得使用着色器多少有些繁琐 xff0c Effect xff08 效果框架 xff09 被提出以解决这些问题 作为一种方法 xff0c Effe
  • 4.2用Effect实现多纹理化效果

    4 2 用 Effect 实现多纹理化效果 前面我们介绍了一个使用像素着色器实现的多纹理化 xff0c 这里用 Effect 框架重新给于实现 xff0c 读者可以比较两者之间的异同 xff0c 体会 Effect 框架给我们带来了哪些方面
  • HLSL初级教程-结语,参考资料

    结语 至此 xff0c HLSL 初级内容介绍完毕 xff0c 相信读者已经对 HLSL 着色器 Effect 等概念有了比较深入的理解 xff0c 并且掌握了 HLSL 编程的基本方法 xff0c 文章中裁去了对 HLSL 语法等细节的讨
  • Unity 3D网页游戏 Demo 展示

    2011 年 xff0c 网页 3D 这一网游开发新趋势逐渐浮出水面 xff0c Unity 作为浏览器及移动设备 3D 引擎领域的佼佼者 xff0c 在国内开始崭露头角 我们团队也完成了首款 Unity Demo 的第一个版本 Demo
  • 用Ogre实现无缝地图

    用 Ogre 实现无缝地图 1 7 版本之前 xff0c 如果想用 Ogre 内建的地形系统实现一个像样的无缝地图 xff0c 恐怕要闹到抓狂 所幸 sinbad 在 1 7 为 Ogre 加入了全新的地形组件 xff0c 它囊括了一个地形
  • 一劳永逸地解决寻路问题

    一劳永逸地解决寻路问题 作者 xff1a PaulT 译者 xff1a trcj 原文 xff1a http www ai blog net archives 000152 html 通常我都会尽量避免对业内游戏产品或开发者们评头论足 但这
  • 口吐莲花

    久不更新blog xff0c 优狗 进展尚可 xff0c 新项目又开 xff0c 忙里偷闲想写点东西 xff0c 一时竟无从下笔 xff0c 以往那种花几天甚至几星期整理一篇技术文章的机会恐怕越来越少了 六月份 优狗 团队新入数名成员 xf
  • Unity3D运行时刻资源管理

    Unity运行时刻资源管理 Asset Bundles 制作 xff1a BuildPipeline BuildAssetBundle 加载 xff1a AssetBundle Load 卸载 xff1a AssetBundle Unloa
  • Unity3D页游《坦克英雄》发布!

    坦克英雄 是一款主打PVP的射击类3D竞技页游 xff0c 它基于Unity引擎 xff0c 以二战坦克为题材 xff0c 既保留了射击类游戏的操作性 xff0c 又缓和了其与页游载体看似相悖的剧烈节奏 xff0c 目前游戏的核心玩法及主体
  • 给我时间

    Jenifer Tell 39 ment de gens veulent Tell 39 ment tre aim s Pour se donner peuvent Tout abandonner Tellement d 39 erreur
  • Docker 查看Image镜像的Dockerfile方法

    Dokcer中使用的Image镜像可能别人写好 xff0c 我们下载来直接使用 xff0c 但有些情况可能不能满足我们的需求 xff0c 那就需要修改镜像 xff0c 一般可以通过在容器中修改 xff0c 之后在生成镜像 xff0c 但有时
  • (三)ROS上位机与stm32进行串口通信

    ROS上位机与stm32进行串口通信 1 1 ROS发送数据1 2 stm32接收数据2 1 stm32发送数据2 2 ROS接收数据上位机串口初始化文件代码下位机stm32的串口配置代码 总代码在文末 xff0c 需要完整的工程文件可以留
  • 智能车摄像头算法——寻线

    寻线 1 灰度图像二值化2 找边线3 获得中线 1 灰度图像二值化 如果使用的是小钻风摄像 xff08 二值化摄像头 xff09 xff0c 就不用再进行软件二值化 使用灰度摄像头 xff0c 就需要这步 以下展示常用的大津法 xff08
  • 【Vue】在vue中命名的时候会遇到 component name “index“ should always be multi-word的解决方案

    Vue 在vue中命名的时候会遇到 component name index should always be multi word的解决方案 文章目录 Vue 在vue中命名的时候会遇到 component name 34 index 3
  • docker容器和镜像的停止和删除

    文章目录 docker容器和镜像的停止和删除1 列出所有docker镜像2 查看正在运行的 或所有的docker容器3 停止所有容器4 删除所有容器5 删除所有镜像通过 image name 删除单个镜像通过 image id 删除单个镜像
  • Windows上应用Docker容器技术的动态代码测试

    转载自维克多汽车技术 xff08 上海 xff09 有限公司 xff0c 作者Vector China 随着软件项目复杂度的提升和不可控的团队资源变更 xff0c 研发组织对DevOps部署的灵活性 可快速迁移和适配CI CD的迭代提出了更
  • 写学术论文的一些感想

    我自己写得是真差 xff01 虽然和我英语程度低有一定的关系 xff0c 最重要的是没有这个基础的底蕴和不明白自己做的东西的意义 所以来总结一下关于学术论文的想法 1 最基础的 xff0c 最重要的 xff0c 你要做出东西来 xff0c
  • kvaser怎么用?Kvaser 汽车CAN通讯协议总线分析仪新手入门常见问题解决方案教程

    logo png 1 驱动安装问题 答 xff1a 驱动程序安装问题通常是由防病毒软件引起的 在驱动程序安装期间 xff0c 常见问题是无法安装枚举服务 解决方案 xff1a 确保您的防病毒软件已关闭 xff0c 然后再次安装驱动程序 2

随机推荐

  • 图解git使用

    1 基本用法 上面的四条命令在工作目录 暂存目录 也叫做索引 和仓库之间复制文件 git add em files em 把当前文件放入暂存区域 对比stage和working dir xff0c 如果有改变就增加 xff1b 如果没有改变
  • Docker容器 - DockerFile详解

    目录 DockerFile 一 是什么 二 构建步骤 DockerFile构建过程 一 DockerFile基础 二 Docker执行DockerFile的流程 三 总结 DockerFile常用保留字 零 参考Tomcat的DockerF
  • Docker网络 - docker network详解

    目录 是什么 一 Docker不启动时默认的网络情况 二 Docker启动时的网络情况 能干什么 常用基本命令 一 ls 1 no trunc 2 DRIVER 3 ID 4 format 二 create 三 rm 四 inspect 五
  • 时间划过的伤痕叫成长

    我要用代码敲出整个世界 也许刚看这句话的时候 很多人都嗤之以鼻 太自大太高傲了 但这是我梦想也是我目标 我出生在一个小县城的普通家庭里 经济状况也只能解决温饱 上高中的时候我就没想着要读大学 我很贪玩 几乎都是和一群 34 狐朋狗友 34
  • CMD终端中一些常用的快捷键

    1 使用键盘上的 xff0c 可以快速定位到上一次执行的命令 2 使用键盘上的tab键 xff0c 可以快速补全路径 3 使用键盘上的esc键 xff0c 能够快速清空当前已经输入的命令 4 输出cls命令 xff0c 可以清空终端
  • github在线简历

    github在线简历 对于找工作 xff0c 不论是对校招还是社招的来说 xff0c 在线简历这个东西还是比较加分的 xff0c 可以让hr和面试官 xff0c 看到你更多的东西 xff0c 比如你的个人项目之类的 xff0c 还是挺不错的
  • nrm ls不显示星号

    npmi切换依赖 xff0c 使用nrm ls命令查看当前下载以来的地址看不到是哪一个 nrm是什么 xff1a nrm 是npm常用镜像源管理工具 xff0c 方便本地切换npm的镜像源 xff0c 因为我们在安装依赖的时候 xff0c
  • npm i安装依赖报错,npm ERR! code EPERM npm ERR! syscall unlink,errno -4048

    我的项目是公司内网的react项目 xff0c 安装依赖的时候报错 xff0c 报错信息如下 解决方案 xff1a 1 删除 npmrc文件 他的位置不是nodejs安装目录npm模块下的那个npmrc文件 而是在C Users 账户 下的
  • element对话框遮罩层和弹出内容样式优先级错误

    代码 加入 append to body 61 34 true 34 就可以了 span class token operator lt span el span class token operator span dialog span
  • van2的弹窗自定义事件

    今天帮别人解决了一个移动端的van2的弹窗自定义事件就记录一下 现在国内开发大多数还是已vue为主 xff0c vue3已经比较火热 xff0c 但是对比vue2来讲 xff0c vue2更加稳定 xff0c 以及一些老项目还是用的vue2
  • svg图形绘画

    最近是在整理项目交接工作的时候 xff0c 把之前遇到的问题难点给找出来 xff0c 梳理一下 这个是做svg画布组态项目遇到的问题 目前组态项目中是使用ts文件 xff0c 定义组态类型和格式 xff0c 将不同的组件渲染在画布以及列表上
  • 基于Spring接口,集成Caffeine+Redis两级缓存

    原创 xff1a 微信公众号 码农参上 xff0c 欢迎分享 xff0c 转载请保留出处 在上一篇文章Redis 43 Caffeine两级缓存 xff0c 让访问速度纵享丝滑中 xff0c 我们介绍了3种整合Caffeine和Redis作
  • 不需要登录的app业务如何记录用户状态

    可以采用app获取设备号并服务端保存设备信息和业务信息的方式 欢迎加入我的QQ技术交流群425783133
  • web前端基础-给td设置宽度

    在实际需求中 xff0c 经常遇到要在table中的td中 xff0c 让用户输入比较长的字符串 xff0c 这时就要使td的宽度能较大 在WEB前端中 xff0c 对于 表格元素中的元素td 直接设置宽度是无法生效的 要想达到给td设置宽
  • Kali Linux 暴力破解 wifi密码

    Kali Linux 暴力破解 wifi密码 注意 xff1a 私自破解他人WiFi属于违法行为 xff0c 我这里使用自己的WiFi热点作为学习和测试 明白了破解原理就知道应该怎么防范了 前期准备 暴力破解需要准备的工具 xff1a ka
  • Docker安装与使用

    Docker安装与使用 介绍容器 xff1a 为什么需要Docker xff1f Docker 的用途 xff1a 特点 xff1a Docker安装Linux下安装 xff1a Windows 下安装 xff1a Docker的架构镜像
  • 前端PHP项目部署后404

    问题 xff1a php项目部署后 xff0c 首页可正常访问 xff0c 但跳转其他页面均为404 xff0c 经查询有以下原因 文件以及文件夹权限错误nginx配置错误 span class token comment 无效404方式
  • VINS-Mono 代码详细解读——初始化1:视觉SFM详解 processImage()+initialStructure()

    Estimator类 目录 processImage 函数 initialStructure 初始化函数 SFM初始化 relativePose 函数 getCorresponding 函数返回两帧匹配特征点3D坐标 solveRelati
  • VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h

    前言 xff1a 对第k帧和第k 43 1帧之间所有的IMU进行积分 xff0c 可得到第K 43 1帧的PVQ xff08 位置 速度 旋转 xff09 xff0c 作为视觉估计的初始值 每次qwbt优化更新后 xff0c 都要重新进行积
  • VINS-Mono 理论详细解读——紧耦合后端非线性优化 IMU+视觉的残差residual、Jacobian、协方差、基于舒尔补的边缘化

    本讲是VINS最核心部分了 xff0c 前面经历了 1 xff09 视觉跟踪feature tracker IMU预积分integrationBase类 xff1b 2 xff09 初始化中SFM纯视觉估计滑动窗中所有帧的位姿和3D路标点深