VINS-Mono论文笔记(中)

2023-05-16

VINS-Mono论文笔记-中

  • 前言
  • 1.初始化过程
    • 1.1 视觉重构
    • 1.2 视觉惯性联合
  • 2 紧耦合的单目VIO系统
    • 2.1 公式
    • 2.2 imu残差
    • 2.3 视觉残差
    • 2.4 边缘化残差
    • 2.5 针对相机实时帧率的纯运动视觉惯性状态估计器
    • 2.6 imu向前传播以得到imu频率的状态估计
  • 3 重定位
    • 3.1 回环检测
    • 3.2 特征检索
    • 3.3紧耦合的重定位

前言

本篇内容涉及VINS-Mono第五至第气节内容,在原论文中为(p4-p9)包括:
第五节:VINS-Mono的鲁棒性初始化过程
第六节:紧耦合、自校准、基于非线性优化的单目VIO
第七节:紧耦合的重定位

1.初始化过程

单目惯性系统是高度非线性系统,系统的正常运行高度依赖准确的初始化过程。
初始化过程由松耦合下的imu预积分辅助纯视觉结构还原过程。

1.1 视觉重构

使用滑动窗口中纯视觉的sfm方法。
初始化过程从一个sfm过程开始,还原一个缺乏尺度信息的,由相机姿态和特征点位置构成的图模型。
1)获取视觉计算所需的大位移帧
因为图像是源源不断地传进来的,开始是不断对最新帧进行特征追踪,计算最新帧与之前所有帧特征的关系。如果最新帧与之前某一帧存在如下关系:对应追踪的特征点不少于30个,特征点间对应位移大于20像素(这里在代码里是平均位移),那么就算找到合适的大位移帧。
利用五点法,计算这两帧之间的位移和旋转(缺乏尺度信息的)。然后任意设置一个尺度,用三角测量方法计算出这两帧中特征点的三维坐标。
基于已三角化的特征点,使用pnp法计算整个滑动窗口中所有帧(一般为10帧)的姿态。
最后,使用完整BA(既包含姿态,又包含特征点)来最小化特征点的重投影误差。
因为还没有关于世界坐标系的信息,这里把相机的第一帧作为sfm过程的参考帧,也就是参考坐标系。
所有帧的姿态和特征点坐标结果都是相对于相机的第一帧(第一帧也就是相机坐标系)。借助于相机和imu的外参 p c b p^b_c pcb q c b q^b_c qcb,可以把相机坐标系下位姿转换到imu坐标系下:
坐标系变换

  • 笔记:这里说的,其实是基于imu和相机的外参,计算每一个相机位姿下对应的imu位姿,其参考帧,还是基于相机坐标系,也就是相机坐标系下对应时刻imu位姿。
    这里的尺度信息还是未知的,接下来会进行求解。

1.2 视觉惯性联合

视觉惯性联合
使用imu预积分值,使纯视觉中的尺度信息得以和imu测量相匹配。
A)陀螺仪偏置校准
从纯视觉sfm中可以获得滑动窗口中所有帧得姿态,而从imu预积分中也可也获得连续两帧的相对旋转。最小化如下代价函数:
陀螺仪偏置校准
相对旋转的更新使用第二个函数,可以得到一个初始化的偏置的校正值,使用新的陀螺仪偏置值,对滑动窗口内imu预积分量进行重新积分。
B)速度、重力向量、尺度的初始化
陀螺仪偏置初始化后是对导航必要信息的速度、重力向量、尺度的初始化。
初始化量

对imu预积分量有如下两个公式
在这里插入图片描述
该公式和尺度,重力向量、尺度信息相关。
在这里插入图片描述
通过最小化上面这个代价函数,可以获得滑动窗口中每一帧的速度。相对于相机坐标系的重力向量和尺度值。
C)重力向量优化
重力向量分解模型
重力向量的更新策略是将 g g g向量使用 g ( g ^ + δ g ) g(\hat{g}+\delta g) g(g^+δg)来代替,其中 g ^ \hat{g} g^是测量出的平均重力向量单位方向, δ g \delta g δg是在正切球空间里的微小扰动。不断迭代这个值,直到 g g g向量收敛。

D)初始化的完成
在对重力向量完成优化后,就可以通过把重力向量旋转到z轴来获得世界坐标系和相机坐标系的旋转关系。然后把所有相机坐标系的量旋转到世界坐标系下,此时imu坐标系的量同样也旋转到世界坐标系下。在sfm中的位移关系会缩放到米单位下。到这里,初始化完成,所有米制数据会提供给接下来的紧耦合单目VIO系统。

2 紧耦合的单目VIO系统

完成初始化后,就进入基于滑动窗口的紧耦合单目VIO系统。
紧耦合单目VIO系统

2.1 公式

滑动窗口中的状态向量
第一个是所有状态的集合。第二个是imu的状态向量,第三个是相机与imu的外参。
这里我就不解释每个字母含义了,论文里都介绍的很详细。对视觉特征的参数化使用的是逆深度形式。
这里使用的是视觉惯性BA优化方式,使得先验误差和所有测量值残差的马氏距离最小,从而获得最大后验估计。
代价函数
第一项为先验误差,第二项为imu测量残差,第三项为摄像机测量残差。对视觉测量使用Huber函数以减小特征误匹配带来的影响。

2.2 imu残差

在滑动窗口中连续两帧imu测量残差为:
imu残差
基于状态量计算得到的相对位移,速度,旋转和imu预积分量的差值。

2.3 视觉残差

与传统方法中将特征点投影到单位平面上计算残差不一样的是,VINS-Mono把像素误差投影到一个单位圆上。即相机残差定义在如下的单位圆:

在这里插入图片描述
其原因是这种残差定义方式几乎适用于所有类型的相机,包括广角、鱼眼或全向相机。
将特征点第一次观测的坐标,通过先转到imu局部坐标,然后imu局部坐标转换到世界坐标,imu世界坐标再转换到局部坐标,然后投影到当前相机坐标系,当前坐标系下投影到单位圆,就形成了路标的单位向量。
观测点单位向量与路标单位向量相减,向量差在单位圆上一切平面分解,就得到了两个残差值,即视觉的几何误差残差。
在这里插入图片描述

2.4 边缘化残差

为了限制VIO非线性优化的复杂度,使用了边缘化。对imu状态量和视觉特征选择性的进行边缘化,同时把边缘化的状态量转为先验。
边缘化
如果第二新的帧是关键帧,则把滑动窗口中最老的关键帧边缘化掉(对应于第一种情况),如果第二新的帧不是关键帧,则把该帧对应的特征点舍弃掉,但保留其imu测量值。
为保证稀疏性,非关键帧的测量值不是所有的都会被边缘化掉。(这句话我认为是对第二新的帧不是关键帧情况的解释)。
边缘化方案只是对窗口中的关键帧。它确保三角化特征点过程中计算特征点具有足够的视差,并且加速度计能得到充分的激励。
边缘化使用舒尔补。
基于所有与移除状态的测量值,VINS-Mono建立了一个新的先验方法。新的先验被添加到现有的先验中。(没懂啥意思)
我们注意到边缘化导致线性化点的早期固定,这可能导致次优估计结果。然而,由于VIO的小漂移是可以接受的,我们认为由边缘化造成的负面影响并不重要。

  • 笔记:边缘化过程中残差的雅可比可能不是在同一点得到的,这是边缘化一直存在的问题,对于该问题,其实也有很多解决办法。但VINS-Mono中认为漂移本身就存在,后续通过回环也可以来进行消除。

2.5 针对相机实时帧率的纯运动视觉惯性状态估计器

对于计算能力有限的平台,比如手机,紧耦合单目VIO由于非线性优化沉重的计算量,在这些平台是难以达到相机实时帧率更新的。为此,除了完全优化之外,VINS-Mono还采用了轻量级运动视觉惯性优化,将状态估计频率提高到相机率(30Hz)。
纯运动视觉惯性优化的代价函数与单眼视觉优化的代价函数相同。但不同的是,纯运动状态估计并没有优化滑动窗口中的所有状态,而只是优化了固定数量的最新IMU状态的姿态和速度。将特征深度、外部参数、偏差和不想优化的旧IMU状态视为常数值。
但这确实使用所有的视觉和惯性测量来进行仅限运动的优化。(只不过有些值只是约束,不是优化量)
在这里插入图片描述
这种方法比单帧的pnp方法结果更为平滑。
这种方法把原来在嵌入式设备上需要50毫秒的全优化计算降低为5毫秒,使得在低算力设备上能得到相机帧率的姿态估计,特别适合在需要AR或者VR的手机上进行运行。

2.6 imu向前传播以得到imu频率的状态估计

IMU测量的速度比视觉测量的速度要高得多。虽然我们的VIO频率受图像捕获频率的限制,但我们仍然可以直接传播最近的IMU测量的VIO估计,以实现IMU速率性能。高频状态估计可以作为回环状态反馈。第九-c节介绍了一个利用这种imu速率状态估计的自主飞行实验。

3 重定位

滑动窗口和边缘化可以控制计算复杂度,但同时也给系统带来了累计漂移。
VINS-Mono使用了一种紧耦合的重定位方式来消除累计误差。
重定位从一个回环检测模块开始,以分辨什么地方之前来过。
当前帧和回环帧在特征程度上的约束得以建立。
这些对应特征的约束被集成到了单目VIO系统中,优化至最小以得到无漂移的状态估计。
多特征的多次观测约束直接在重定位中使用,可以得到更高精度和平滑度的状态估计。
重定位

3.1 回环检测

使用词袋方法DBoW2进行循环检测。
为了进行回环检测,从图像中抽取了500个特征角点并计算其BRIEF描述子。
额外的角点抽取是为了提高召回率。
描述子作为视觉数据库的检索词。
DBoW2在时间和几何一致性检查后返回候选闭环。数据库中保留所有简短的描述符以进行特征检索,但丢弃原始图像以减少内存消耗。

3.2 特征检索

当检测到一个回环时,需要通过特征对应关系来求解回环帧间关系。特征对应关系通过描述符进行匹配。但特征匹配可能会导致误匹配的问题,对该问题通过如下方式来解决。
回环检测误匹配解决办法
A)2D-2D:使用RANSAC的基本矩阵检验。在当前图像和环闭合候选图像中检索到的特征的二维坐标来进行基本矩阵测试,去除离群点。
B)3D-2D:使用RANSAC进行的PnP测试。基于已知的局部滑动窗口中特征在局部滑动窗口中的三维位置,以及在回环帧图像中的二维特征点坐标,可以进行PnP测试。
在除去异常值后,将该候选对象视为正确的循环检测,并执行重新定位。

  • 笔记:如果去除异常点后,正确匹配的特征点大于某一个阈值,则会基于匹配点计算回环帧间的相对关系,如果几何关系满足某一个限制,则认为发生了回环。

3.3紧耦合的重定位

重定位高效地将滑动窗口的帧与过去的姿态关联到了一起。
在重定位时,把回环的帧(滑动窗口中的帧)设为固定帧。
回环帧观察到的特征的视觉测量模型,与VIO中的视觉测量模型相同,其残差的计算方法类似。
唯一的区别是,回环帧的姿态取自姿态图(见第八节,即姿态图合并的情况),或直接来自过去的VIO里程计的输出(如果这是第一次重新定位),并被视为一个常数。
于是,可以很轻易把回环帧的残差添加进优化中:
重定位代价函数
其中,回环残差的变量是在回环帧中检索到的所有特征的集合。
请注意,尽管待求解函数与(14)略有不同,但要求解的状态的维数保持相同,因为回环帧的姿态被认为是常数。
当滑动窗口中发生了多个回环时,同时使用所有回环帧的所检索的所有对应特征进行优化。
这为重新定位提供了多视图约束,从而获得了更高的精度和更好的平滑度。重新定位后保持一致性的全局优化将在第八节中进行讨论。

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

VINS-Mono论文笔记(中) 的相关文章

  • 如何在 MS Windows 上加载 GTK Sharp 主题

    我正在 MS Windows 上使用 Xamarin Studio 5 4 编写 GTK Sharp v2 12 应用程序 安装的Mono版本是3 2 3 但我使用 Net工具链进行编译 因为Xamarin不允许我使用Mono工具链进行编译
  • 图片来自流问题

    我在从流创建图像时遇到问题 在我的 Windows 电脑上 它分叉得很好 在 ubuntu 服务器上 它抛出一个错误 System ArgumentException A null reference or invalid value wa
  • 安装旧版本的 Mono

    今天我的 Ubuntu 将 Mono 更新到了 4 2 1 102 它不会允许我绝对需要运行的某个程序 如何将其降级到 4 0 5 1 我努力了 sudo apt get install mono complete 4 0 5 1 那是行不
  • 将大端字节集合编组到结构中以提取值

    有一个很有洞察力的问题从字节数组中读取 C 中的 C C 数据结构 https stackoverflow com questions 2871 reading a c c data structure in c from a byte a
  • 如何限制 .net / mono 进程的内存大小

    假设您有一个用 C 编写的应用程序 单进程 默认情况下 应用程序分配巨大的虚拟内存 远远超过其需要 例如驻留内存约为 10mb 而虚拟内存约为几 GB 在 Java 中 可以使用一个选项来限制这一点 java mx128m 如何对 net
  • 不使用 Visual Studio 的 C# 中的 GUI

    好的 我是 C 新手 但我需要创建一个简单的 GUI 但我没有 Visual Studio 我使用 Geany 和 Mono 问题是 当我尝试通过 Google 找到以下代码时 using System using System Windo
  • GTK C# 小部件更改颜色不起作用

    我试图通过使用更改 GTK 中按钮小部件的颜色 button1 ModifyBase Statetype Normal new Gdk Color 1 1 1 这是从另一个按钮单击事件调用的 但小部件颜色未更新 为什么是这样 您可以只使用M
  • RestSharp 在上传时将整个文件加载到内存中。如何避免呢?

    我在 Mono 项目中使用 RestSharp 上传一些文件 我注意到上传大文件时 内存会大幅增长 看着RestSharp源代码 https github com restsharp RestSharp blob master src Re
  • 是否可以使用 Mono 运行 clickonce 应用程序?

    我正在开发 clickonce 应用程序 我可能想在 Mac 平台上分发该应用程序 我知道我可以使用 Mono 编译 Net 应用程序 并且它可以在 Mac 上运行 但是我可以使用 clickonce 作为安装程序吗 thanks 我认为
  • 如何将 Windows 桌面应用程序转换为 Mac 桌面应用程序?

    我需要将 C NET Windows 桌面应用程序转换为 Mac 我读过有关 Qt REAL Studio LiveCode RunRev wxWidgets 和 Mono 的跨平台方面的内容 www mono project com 和h
  • 无法使用 mono 命令提示符为 gtk# 编译 hello.cs

    本来希望this https stackoverflow com questions 8835352 cannot compile gtk example会有所帮助 但会出现不同的错误 尝试将以下内容编译为 hello cs using G
  • 嵌入.Net运行时

    我是否可以嵌入 net 运行时 以便主机操作系统不需要 net 我正在考虑用 Mono 来做到这一点 如下所示 http mono project com Embedding Mono http mono project com Embed
  • Directory.GetCurrentDirectory() 在 Linux 上不起作用?

    因此 我尝试创建一个需要读取名为 scripts 的子文件夹中的脚本的应用程序 我的代码有问题 string script Console ReadLine string path Directory GetCurrentDirectory
  • 编译时引用.NET dll(使用单声道)

    我问了一个安装 F powerpack 并使用它的问题here https stackoverflow com questions 6206406 how to install and use f powerpack in mono err
  • monodevelop 2.1+ 支持 Visual Studio 2010 项目文件吗?

    monodevelop 2 1 是否支持 Visual Studio 2010 项目文件 但是 如果不支持 有人知道计划何时提供支持吗 我问的原因是我有一个在 VS2008 和 Monodevelop 中都使用的解决方案 当我在 2010
  • .NET csc 和 Mono mcs 的兼容性

    我知道 NET 和 Mono 是二进制兼容的 但给定一组源代码 csc 和 mcs 会生成完全相同的 100 相同的二进制 CLI 可执行文件吗 人们能够判断可执行文件是用 csc 还是 mcs 编译的吗 很多东西在规范中没有完全定义 或者
  • 扩展 Mono C# 编译器:有任何文档或先例吗?

    我目前正在参与一些有趣的编程语言研究 到目前为止 这些研究的重点是通过一些非常强大的基于程序员生产力的功能来扩展即将推出的 Java 7 0 编译器 这项工作应该同样适用于 C 等相关编程语言 我目前正在研究用于对该功能的 C 端口进行原型
  • MonoGame真的跨平台吗?

    当我下载 MonoGame 我将使用它来代替 XNA 因为我使用的是 Mac 并解压它时 所有 MonoDevelop 解决方案文件都被命名为MonoGame Framework PLATFORM NAME sln with PLATFOR
  • Mono for Android,读取和写入 XLSX

    我正在使用 Mono for Android 开发一个应用程序 我需要读取和创建 XLSX Excel 文件的功能 我尝试过EPPlus和NPOI 并快速浏览了一下微软的Open XML SDK 发现了以下问题 EPPlus 需要 Wind
  • 使用 Xamarin 主题的 Gtk 应用程序非一致性执行

    我有一个 mkbundled mono 应用程序 其中嵌入了 mono 我使用 platypus 创建了一个独立的包 我使用以下内容加载 Mac 主题 Xamarin Gtk Rc Parse Default gtkrc 主题是Xamari

随机推荐

  • C语言结构体(struct)常见使用方法

    目录 结构体声明与定义 结构体变量及其内部成员变量的定义及访问 引用 xff08 C 43 43 xff09 指针和数组 结构体嵌套 结构体与函数传参 占用内存空间 变长结构体 基本定义 xff1a 结构体 xff0c 通俗讲就像是打包封装
  • 如何禁止STL map 自动排序

    最近在做一个SPC SQC 的项目 其中有一处用到了stl map 得到了一个小小的心得 xff0c 分享给大家 我们知道 xff0c 在向map中插入数据对时候 xff0c map中的元素将按照一定的顺序被插入到对应的节点上 xff0c
  • 关于buffer overflow detected 程序崩溃的思考

    我是在使用别人源码 xff08 DBT2 benchmark xff09 的时候 xff0c 编译成功然后运行就出现了这个问题 本以为像这种开源的软件应该没什么太明显的bug xff0c 但是后来细想 xff0c buffer overfl
  • 安卓微信自动抢红包插件优化和实现

    转载请注明作者AndroidMSky和链接http blog csdn net AndroidMsky article details 53490459 又是兴趣系列 网上有很多自动强红包的例子和代码 xff0c 笔者也是做了一些优化 先说
  • 串口通信的基本知识

    串口通信的基本知识 前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 分享一下给大家 点击跳转到教程 本文介绍了串口通讯的基本概念 数据格式 通讯方式 典型的串口通讯标准等内容 串口通讯 xff
  • 【毕业设计】深度学习YOLO图像视频足球和人体检测 - python opencv

    1 前言 x1f6a9 深度学习YOLO图像视频足球和人体检测 x1f947 学长这里给一个题目综合评分 每项满分5分 难度系数 xff1a 3分工作量 xff1a 3分创新点 xff1a 5分 x1f9ff 选题指导 项目分享 xff1a
  • 【C语言编程入门系列】—— 第三章,编写第一个C语言程序!

    导读 xff1a 一般学一门计算机语言的第一堂上机课 xff08 上机 顾名思义 xff0c 上计算机 xff0c 机你太美 xff09 xff0c 就是往屏幕输出 hello world xff0c 本章也不例外 3 1 Hello Wo
  • 基于PCNTL的PHP并发编程

    原创文章 xff0c 转载请注明出处 xff1a http huyanping sinaapp com p 61 178 作者 xff1a Jenner PHP是一门较早出现的WEB开发脚本语言 xff0c 并由于其语法结构简单 易学 开源
  • 基于Redis的MessageQueue队列封装

    原创文章 xff0c 转载请注明出处 xff1a http www huyanping cn p 61 275 作者 xff1a Jenner Redis的链表List可以用来做链表 xff0c 高并发的特性非常适合做分布式的并行消息传递
  • 基于PHP的crontab定时任务管理

    BY JENNER 2014年11月10日 阅读次数 xff1a 6 linux的crontab一直是服务器运维 业务开展的利器 但当定时任务增多时 xff0c 管理和迁移都变得很麻烦 xff0c 而且容易出问题 下面提供了一个使用php编
  • PHP模拟SQL的GROUP BY算法

    BY JENNER 2015年1月24日 阅读次数 xff1a 25 github地址 xff1a https github com huyanping Zebra PHP ArrayGroupBy packagist地址 xff1a ht
  • flume:支持重命名、移动文件的roll file sink升级版

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 flume xff1a 支持重命名 移动文件的roll file sink升级版 转载请注明 xff1a 始终不够 flume xff1a 支持重命名 移动文件的r
  • wordpress全栈优化

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 wordpress全栈优化 转载请注明 xff1a 始终不够 wordpress全栈优化 从最开始计算 xff0c 始终不够 个人博客上线已经有两年多了 从最开始就
  • 递归与循环

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 递归与循环 转载请注明 xff1a 始终不够 递归与循环 大一学C 43 43 的时候 xff0c 老师说过递归与循环是可以相互转化的 xff0c 当时好像是用来两
  • 安卓仿知乎个人主页,实现嵌套滑动和渐隐效果

    本篇文章已经授权微信公共号guolin blog 郭霖 独家发布 转载请注明作者AndroidMsky和出处 http blog csdn net AndroidMsky article details 53784984 本文github
  • PHP异步编程简述

    概述 异步编程 xff0c 我们从字面上理解 xff0c 可以理解为代码非同步执行的 异步编程可以归结为四种模式 xff1a 回调 事件监听 发布 订阅 promise模式 我们最熟悉的两种模式是回调和事件监听 xff0c 举两个最简单的j
  • CSV是什么文件格式

    CSV 即 Comma Separate Values xff0c 这种文件格式经常用来作为不同程序之间的数据交互的格式 具体文件格式 每条记录占一行 以逗号为分隔符 逗号前后的空格会被忽略 字段中包含有逗号 xff0c 该字段必须用双引号
  • 写给4年前开始编程序的自己

    最近在网上看到有人写了一篇关于 写给4年前没有开始做设计的自己 xff0c 突然也想写这样一篇文章 具体那篇文章的内容我并没有细读 xff0c 防止自己的思路照着他的来 首先 xff0c 我先简单介绍下自己 xff0c 好为后面的内容做一个
  • STM32单片机(七). USART串口、IIC和CAN通信

    在简单的学习过了STM32中的简单外设以及中断系统后 xff0c 在本章节中开始介绍STM32芯片中各个通信接口的配置 在计算机中 xff0c 按数据传输方式可分为串行通信以及并行通信 xff1b 按数据同步方式可分为异步通信和同步通信 x
  • VINS-Mono论文笔记(中)

    VINS Mono论文笔记 中 前言1 初始化过程1 1 视觉重构1 2 视觉惯性联合 2 紧耦合的单目VIO系统2 1 公式2 2 imu残差2 3 视觉残差2 4 边缘化残差2 5 针对相机实时帧率的纯运动视觉惯性状态估计器2 6 im