VINS知识点汇总

2023-05-16

0、总体框架

        包括5个部分:数据预处理、初始化、后端非线性优化、闭环检测、位姿图优化。

图片来自大佬博客:https://blog.csdn.net/try_again_later/article/details/104854698 

VINS原框架:

图解VINS框架:

闭环检测拆解:

1、数据预处理

        1、视觉 

                1)提取Harris角点,KLT金字塔光流跟踪相邻帧;

                2)2维特征点先矫正为不失真的(畸变校正),通过外点剔除后投影到一个单位球面的;

                3)去除异常点:先进行F矩阵测试,通过RANSAC去除异常点;

                4)关键帧选取:(1)当前帧相对最近的关键帧的特征平均视差大于一个阈值就为关键就为关键帧(因为视差可以根据平移和旋转共同得到,而纯旋转导致不能三角化成功,所以这一步需要IMU预积分进行补偿);(2)当前帧跟踪到的特征点数量小于阈值视为关键帧;              

        2、IMU 

                1)两帧k和k+1之间进行位置、速度、姿态(PVQ)预测;

                2)避免每次姿态优化调整后重复IMU传播,采用预积分算法,计算预积分误差的雅克比矩阵和协方差项。

2、初始化

        采用松耦合(将IMU定位与视觉的位姿直接后处理融合)的传感器融合方法得到初始值。

        首先利用SFM进行纯视觉估计滑动窗口内所有帧的位姿以及路标点逆深度(步骤1);

        然后与IMU预积分对齐(步骤2),继而恢复①对齐尺度s,②重力g,③IMU速度v和④陀螺仪偏置bg

        VINS初始化过程中忽略了加速度的bias偏置ba,因为加速度计与重力耦合,并且重力向量很大,初始化过程动态过程很短,幅度又不大,加速度偏置很难观测到。

        初始化的过程:是为视觉和IMU“牵线搭桥”的过程。视觉计算的轨迹和IMU计算的轨迹,需要“门当户对”才能凑成一对,方能“儿孙满堂”:重力、尺度、bg、速度。

2.0 初始化代码

        具体的实现可以在VINS代码中查找下面几个函数:

 1. relativePose:计算当前帧跟参考帧的相对位姿。(步骤1

2. GlobalSFM::construct:SFM计算滑窗内的路标点和相机位姿。(步骤1

3. cv::solvePnP:计算所有位姿(步骤1,上面三步都是视觉sfm的过程

4. visualInitialAlign:视觉和IMU对齐。(步骤2,这是真正的对齐过程

2.1 初始化视觉与IMU对齐流程(visualInitAlign()函数过程详解)

        这部分内容来自深蓝学院《手写VIO》第7讲,首先要归结出视觉和IMU之间的联系,则利用外参数q_bc,t_bc构建等式,几何约束如下:

其中,s为尺度因子,表示非米制单位的轨迹。等式(3)等价于:

视觉与IMU对齐流程如下:

         接下来就按照这个步骤进行初始化工作:

2.1.1 利用旋转约束估计外参数旋转q_bc 

具体代码见:initial_ex_rotation.cpp函数CalibrationExRotation()

2.1.2 基于旋转约束的Gyroscope Bias 

        

具体代码见:initial_alignment.cpp函数solveGyroscopeBias()。函数在solve_5pts.cpp中,作用是利用旋转约束估计陀螺仪bias Bg,并根据新的bg重新预积分。

2.1.3 初始化速度、重力和尺度因子 

        

  

具体代码见:initial_alignment.cpp函数LinearAlignment()。函数在initial_alignment.cpp文件中。

2.1.4 优化重力向量g^{c0} 

        在其切线空间上用两个变量重新参数化重力,采用球面坐标进行参数化。

其中,|| g || 是已知重力的大小,为重力方向的单位向量。b1和b2是跨越切平面的两个正交基。w1和w2是待优化变量,表示沿着两个正交基方向的位移。

替换后,Hx=b,变化为:之后采用最小二乘对变量重新优化。

2.1.5 将相机坐标系对齐世界坐标系 

        对齐流程:

2.2 滑动窗口(Sliding Window) 纯视觉SFM

       上面的过程全部是步骤2:视觉sfm恢复出的位姿和IMU预积分得到的PVQ对齐的过程。那么这一节主要记录视觉SFM是怎么得出位姿和点的逆深度。

        1. 选择一个滑动窗,在最后一帧与滑动窗中第一帧中寻找参考帧:跟踪到的点数目大于30个的并且视差超过20的,找到后用5点法(其实使用RANSAC)求本质矩阵E,然后分解E矩阵恢复出R和t。

        2. 

2.3 视觉惯性校准(IMU预积分与纯视觉结构对齐)

       函数调用关系如下:

Estimator::processImage()

Estimator::initialStructure()

        

2.3.1 陀螺仪零漂bg标定

        旋转两种方式:陀螺仪测量值和视觉观测值,二者的误差其实就是其实就是陀螺仪偏置bg。

目标函数:visual给出的相邻帧间的旋转应等于IMU预积分的旋转值Q之间的差。

考虑到了陀螺仪bias噪声,我们得到了陀螺仪偏置bias的初始校准,需要将陀螺仪偏置bg代入到IMU预积分重新计算预积分。

2.3.2 速度v、重力g和尺度初始化s

2.4 重力矢量修正

        为什么需要优化重力向量?

        利用如下公式求解重力向量g^{c0}过程中,并没有加入模长限制|| g^{c0} || = 9.81。三维变量g^{c0}实际只有两个自由度。

重力向量参数化


3、紧耦合后端非线性优化(IMU约束+视觉约束+先验约束)

3.1 公式

3.2 IMU残差

3.3 视觉残差

3.4 边缘化 Marginalization

        为了防止pose和特征的个数的复杂度随着时间不断增长,引入边缘化,在移出位姿时将关联的约束转化为先验放入优化问题中

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

分为两种情况: 

        1、一种是新来帧是关键帧的话(与倒数第二帧相比追踪到的点数少于20个或者平均视差大于30,视差够大可以保证特征点三角化),将最旧的pose移出SLiding window,将最旧帧关联的视觉和惯性数据边缘化掉。把第一个老关键帧及其测量值边缘化,Margin_Old作为先验值。

         2、如果新来帧与倒数第二帧差别不大(追踪到上一帧点数较多,并且平均视差小于30),那么剔除倒数第二帧的视觉观测,拼接IMU约束。原因是边缘化保证关键帧之间有足够视差而能够三角化足够多的地图点,并且保证了IMU预积分的连贯性。

        

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

3.5 相机速率下的状态估计——只有运动的VIO

4、重定位(relocalization)

4.1 回环检测(只对关键帧)

4.2 回环候选帧之间的特征匹配

4.3 紧耦合重定位

5、全局位姿图优化

5.1 位姿图中添加关键帧

5.2 4自由度位姿图优化

5.3 位姿图管理

6、IMU预积分

6.1 IMU模型

6.2 连续时间IMU运动模型,积分PVQ(两帧之间)

6.3 运动模型的离散积分

6.4 IMU预积分

6.5 预积分量

6.6 预积分误差

6.7 预积分离散形式(IMU增量)

6.8 bias预积分量(bias发生变化)

7、基于舒尔补的边缘化

7.1 舒尔补

7.2 marg后形成的先验

7.3 具体例子

7.3.1 原来信息矩阵H的构成

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

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

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

VINS知识点汇总 的相关文章

  • 实用工具合集

    工作中遇到的比较好用的网站 xff0c 记录一下 数学 1 3D Rotation converter 这是一个欧拉角 xff0c 旋转矩阵 xff0c 旋转向量相互转换的网站 2 坐标系 实时显示函数的一个网站 xff0c 功能强大 xf
  • Opencv3.2安装opencv_contrib-3.2

    在open3 x的版本中 xff0c 图像特征提取的算法并未在源码中 xff0c 需要从OpenCV contrib 3 2编译安装 xff0c 下面就是记录一下编译安装的过程 下载 opencv contrib 3 2下载地址 编译 cm
  • vector的成员函数解析

    vector是线性容器 它的元素严格的按照线性序列排序 和动态数组很相似 和数组一样 它的元素存储在一块连续的存储空间中 这也意味着我们不仅可以使用迭代器 iterator 访问元素 还可以使用指针的偏移方式访问 和常规数组不一样的是 ve
  • ROS编程遇到的错误小结

    1 终端出现MD5值不匹配问题 这种情况 xff0c 是由于通信双方的数据内容不同 持续更新
  • HTML 和 XML 数据的分析与解析

    引言 目前在 Java 中 xff0c 解析 HTML 工具主要包含以下几种 xff1a jsoup xff1a 强大的 HTML 解析工具 xff0c 支持以 jQuery 中 CSS Selector 的方式提取 HTML 中的元素 x
  • 【掌控板】0、基础教程

    环境搭建 软件 xff1a mind 43 硬件 xff1a 掌控板2 0 mind 43 使用界面 项目 新建项目 连接掌控板和pc 我的显示有问题 xff0c 是因为我原先代码出错了 xff0c 正常情况下会显示掌控板 驱动更新好了在m
  • 方波的产生——运算放大器LM324产生方波

    方波的产生 运算放大器LM324产生方波 双电源供电 xff08 1 xff09 搭建振荡电路如图所示 xff0c 先采用双电源供电讲解 xff0c 需要两个滑动变阻器RP1和RP2 xff0c 一个固定电阻R1和一个电容C1 xff0c
  • Android Studio开发手机APP(一)

    Day1 新建工程 软件安装可以参考Android第一天 安装Android Studio 3 5 一 打开Android Studio xff0c 新建工程 xff08 Android Studio版本 xff1a Version 3 5
  • 在Win10上使用Linux子系统和VSCode搭建C语言开发环境

    在Win10上使用Linux子系统和VSCode搭建C语言开发环境 一 启动Windows下的Linux子系统 打开控制面板 xff0c 点击卸载程序 点击右侧的 启用和关闭Windows功能 找到适用于Linux的Windows子系统 x
  • C语言网络编程(3)— 通过DNS连接到百度

    C语言网络编程 xff08 3 xff09 通过DNS连接到百度 一 gethostbyname 函数 我们现在认知一台计算机主机通常采用直观可读的名字 例如百度我们会记住 www baidu com 而不是他的IP地址 对于大多数的应用程
  • C语言网络编程(4)— 通过DNS连接到百度-优化

    C语言网络编程 xff08 4 xff09 通过DNS连接到百度 优化 一 gethostbyname和getaddrinfo 之前我们使用gethostbyname 函数完成了主机名到地址的解析 xff0c 但这个函数仅仅支持IPv4 x
  • C语言网络编程(5)— MQTT通信

    C语言网络编程 xff08 5 xff09 MQTT通信 一 下载mqtt C语言库 首先我们要下载支持MQTT的C语言库 xff0c 直接使用git命令拉取 xff1a span class token function git span
  • 转:DSP28335使用FIFO的串口中断总结

    版权声明 xff1a 本文为CSDN博主 E ROAD BY U 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net E R
  • ESP8266 RTOS2.0学习之旅(4)— UDP通信和TCP客户端通信

    UDP通信和TCP客户端通信 一 前言 在之前的基础上开始 xff1a ESP8266 RTOS学习之旅 xff08 3 xff09 连接到WiFi 在user文件夹下新建一个文件app main c xff0c 然后再wifi连接成功后创
  • Cadence 17.2 软件使用(1)— 软件安装

    Cadence 17 2 软件使用 xff08 1 xff09 软件安装 一 软件介绍 参考自 xff1a Cadence17 2软件安装与介绍 Cadence 目前使用量比较大的版本是16 6 17 2 Cadence在2019年年底也推
  • 小熊派gd32f303学习之旅(9)— 使用硬件I2C读写EEPROM

    小熊派gd32f303学习之旅 xff08 9 xff09 使用硬件I2C读写EEPROM 一 前言 在上一篇中 xff0c 我们使用软件模拟IIC对AT24C02进行了读写 xff0c 通过查看GD32F30X的参考手册可以知道 xff0
  • AD学习之旅(1)— Altium Designer 20 软件下载与安装

    AD学习之旅 xff08 1 xff09 Altium Designer 20 软件下载与安装 一 前言 本次软件安装参考自 xff1a Altium Designer 20 AD20软件安装详解教程 凡亿 Altium公司推荐的系统配置如
  • AD学习之旅(1)— Altium Designer 16 软件下载与安装

    AD学习之旅 xff08 1 xff09 Altium Designer 16 软件下载与安装 一 前言 Altium Designer是目前EDA行业中使用最方便 xff0c 操作最快捷 xff0c 人性化界面最好的辅助工具 本次软件安装
  • AD学习之旅(16)— 差分线规则的设置及走线

    AD学习之旅 xff08 16 xff09 差分线规则的设置及走线 一 前言 差分线的定义 xff1a 两条存在耦合且平行等长的两根传输线 xff0c 用来传输相位差180度的信号 差分线从理论上说 xff0c 可以是任意两根普通的传输线
  • SystemVerilog学习之路(8)— QuestaSim里覆盖率的查看

    SystemVerilog学习之路 xff08 8 xff09 QuestaSim里覆盖率的查看 一 前言 覆盖率 是衡量设计验证完成程度的一个通用词 xff0c 随着测试逐步覆盖各种合理的组合 xff0c 仿真过程会慢慢勾画出你的设计情况

随机推荐

  • Verilog学习之路(1)— Quartus II 13.0下载安装和HelloWorld

    Verilog学习之路 xff08 1 xff09 Quartus II 13 0下载安装和HelloWorld 一 前言 Quartus II是Altera的FPGA设计工具 xff0c 二 安装包下载 百度云链接地址 xff1a htt
  • Verdi使用方法(1)— 打开user guide和加载波形

    Verdi使用方法 xff08 1 xff09 打开user guide和加载波形 一 在linux上快速打开user guide 在安装有Verdi的Linux服务器上输入如下命令即可快速的打开Verdi的user guide verdi
  • Verdi使用方法(2)— 高效对比两个波形

    Verdi使用方法 xff08 2 xff09 高效对比两个波形 一 打开第一个波形 直接使用如下命令打开一个波形 xff1a verdi tb1 fsdb 加载需要的信号 二 新建一个容器 点击 Window gt Dock to gt
  • C++ 实现 发送HTTP Get/Post请求

    1 简述 最近简单看了一下关于HTTP请求方面的知识 xff0c 之前一直用Qt来实现 xff0c 有专门HTTP请求的QNetworkAccessManager类来处理 xff0c 实现也比较简单 xff0c 这里主要讲解一下用C 43
  • Python学习之路(4)— 正则表达式(一)

    Python学习之路 xff08 4 xff09 正则表达式 一 一 前言 参考文章 xff1a 爬虫要讲武德 xff0c 你却用正则 一篇文章搞定正则表达式 xff01 参考视频 xff1a 硬核Python进阶篇 一小时掌握正则表达式
  • vs code 远程连接服务器(超详细,图文说明)

    工作中需要使用vs code远程连接服务器 xff0c 网上找了好多教程 xff0c 发现没有完善的说明 xff0c 对我这种小白来说真是耗时耗力 xff0c 完成连接后 xff0c 特地把搭建过程图文分享出来 1 安装完vs code后
  • Jetson TX2 --GPIO 库使用(点亮一个LED灯)

    项目介绍 Jetson GPIO Jetson TX2 J21有40个引脚 xff0c 类似于树莓派的40个引脚 xff0c 可以通过Jetson GPIO samples包中提供的python库控制输入输出 该库与Raspberry Pi
  • 机械键盘改热插拔

    所需原料 电烙铁 大概就十几块而已 我计算机系的 不常用 贵了浪费焊锡丝 大概20g就足够挥霍也就几块钱 松香 买的时候让卖家送一点 这个很便宜鸡心眼m1 3买大概250个把 每个按键需要两个 还有一种m1 0的是改灯的 当初买了一千个才十
  • ROS知识

    按规范学习 直接开始学习ROS文件目录结构 转载 https zhuanlan zhihu com p 139405796 常用操作 xff1a 启动测试和订阅服务和话题 小白先熟悉ROS和M300的操作 xff1a ubuntu18 04
  • Ubuntu18.04 ,安装opencv4.5.4

    背景 手眼标定时候 xff0c 需要用到opencv4的findChessboardCornersSB 所以需要下载opencv4 5 4 安装 Ubuntu 18 04 安装opencv4 2 0 遇到的问题 安装结束后 xff0c 出现
  • ubuntu播放文件需要MPEG-4 AAC解码器

    即可
  • 类模板成员函数定义问题

    span class token macro property span class token directive keyword include span span class token string 34 pch h 34 span
  • 视觉SLAM面试题汇总(三)

    北京某自动驾驶公司 xff1a 1 点云的聚类 xff1b 求法向量 xff1b 多个点集 xff0c 求点集的法向量 xff1b 2 LM算法里面lamda的作用 xff1b 3 KD Tree 4 描述子距离的匹配的方法 xff1f 除
  • ORB-SLAM2中关键知识点总结

    目录 1 ORB SLAM2的总体框架是怎样的 xff1f 2 ORB SLAM2是怎样完成初始化的 xff1f 3 ORB SLAM2是如何进行Tracking的 xff1f 4 ORB SLAM2是如何选取关键帧的 xff1f 5 OR
  • RS485知识点

    为什么RS485空闲时的电平要求大于 43 200mv 这不是很容易被接收端接收吗 xff1f a 其实 xff0c 如果RS485的AB线空闲电平如果小于 43 200mv xff0c 485芯片的输出不定 xff0c 有些芯片会输出高
  • 两种点云地面去除方法

    目录 1 基于角度分割的地面 非地面分割 1 1 PCL基本入门 1 1 1 在ROS项目中引入PCL库 1 2 编写节点进行Voxel Grid Filter 1 2 1 验证效果 1 3 点云地面过滤 1 3 1 点云剪裁和过滤 去除过
  • ROS面试题汇总

    1 ROS中订阅 xff08 Subscribe xff09 最新消息以及消息队列相关问题 机器人应用中难免会遇到运算起来很费时间的操作 xff0c 比如图像的特征提取 点云的匹配等等 有时候 xff0c 不可避免地 xff0c 我们需要在
  • VINS-Mono后端知识点汇总

    processImage xff1a 每帧都干了什么 谁是Featureanager xff1a 维护路标点与图像 后端干了啥 xff1a 详解因子图 xff08 视觉的因子图 IMU的因子图 因子图和Hessian矩阵的关系 xff09
  • VINS-Mono学习(二)——松耦合初始化

    初始化 xff1a 如何当好一个红娘 xff1f 图解SfM 视觉和IMU的羁绊 怎么知道发生了闭环 xff1f 位姿图优化与滑窗优化都为哪般 xff1f 闭环优化 xff1a 拉扯橡皮条 整体初始化流程如下 xff1a 1 SFM纯视觉估
  • VINS知识点汇总

    0 总体框架 包括5个部分 xff1a 数据预处理 初始化 后端非线性优化 闭环检测 位姿图优化 图片来自大佬博客 xff1a https blog csdn net try again later article details 1048