SVO、vinsmono、 OKVIS系统比较

2023-11-08

几个经典视觉slam系统的比较

SVO

  • 高翔链接:https://www.zhihu.com/question/39904950/answer/138644975
  • 处理的各个线程:
    tracking部分-frame to frame 、frame to map
  1. 金字塔的处理。这一步估计是从金字塔的顶层开始,把上一层的结果作为下一层估计的初始值,最后迭代到底层的。顶层的分辨率最小,所以这是一个由粗到精的过程(Coarse-to-Fine),使得在运动较大时也能有较好的结果
  2. SVO自己实现了高斯——牛顿法的迭代下降,并且比较取巧地使用了一种反向的求导方式:即雅可比在k-1帧图像上进行估计,而不在k帧上估计。这样做法的好处是在迭代过程中只需计算一次雅可比,其余部分只需更新残差即可(即G-N等式右侧的)。这能够节省一定程度的计算量。另一个好处是,我们能够保证k-1帧的像素具有梯度,但没法保证在k帧上的投影也具有梯度,所以这样做至少能保证像素点的梯度是明显的。
  3. 根据更精确的投影位置,进行位姿与地图点的优化。这一步类似于Bundle Adjustment,但SVO实现中,是把Pose和Point两个问题拆开优化的,速度更快。
    地图点初次被观测到的图像与当前帧的图像进行比对时,不能直接对两个图像块求差,而需要计算一个仿射变换(Affine Warp)。这是因为初次观测和当前帧的位移较远,并且可能存在旋转,所以不能单纯地假设图像块不变。
  • mapping部分:
    Mapping部分主要是计算特征点的深度。
    单目VO中,刚刚从图像中提取的热乎的关键点是没有深度的,需要等相机位移之后再通过三角化,再估计这些点的深度。这些尚未具备有效深度信息的点,不妨称之为种子点(或候选点)。然而,三角化的成功与否(以及精度),取决于相机之间的平移量和视线的夹角,所以我们通常要维护种子点的深度分布,而不是单纯的一个深度值。
    实际可以操作的只有高斯分布一种——高斯只要在计算机里存均值和协方差即可。在逆深度[8]流行起来之后,用逆深度的高斯分布成了SLAM中的标配。然而SVO却使用了一种高斯——均匀混合分布的逆深度(由四个参数描述),推导并实现了它的更新方式,称为Depth Filter。它的工作逻辑大概是这样的:如果进来一个关键帧,就提取关键帧上的新特征点,作为种子点放进一个种子队列中。如果进来一个普通帧,就用普通帧的信息,更新所有种子点的概率分布。如果某个种子点的深度分布已经收敛,就把它放到地图中,供追踪线程使用。

单目初始化既要有旋转,也要有平移;E=t^R,当纯旋转,t=0时,E为零,无法恢复出R;而当t不为零,R为零时,三角化求深度的时候s1x1=s2Rx2+t,也就没有办法求取深度

vinsmono(四自由度,平移和yaw(z方向的角速度未知))

视觉的sfm和惯性的预积分对齐(主要就是将相机的sfm和IMU的预积分进行对齐,相机只有位置、姿态的6维状态,而IMU15状态,对齐的量是什么呢?
回答是利用相机估计出来的位姿相对量和imu的相对量进行对齐。深度优化量在视觉重投影中进行优化,一些零偏量在IMU误差中进行优化,
但是因为共同的位姿量的存在,所以虽然不在某一项优化函数里,但是其实还是受到影响的)

单目的初始化很鲁棒,视惯的紧耦合,有效初始化相机与imu之间的外参、陀螺仪的零偏、尺度、速度、重力加速度;(由于估计了速度,就可以在动态场景下进行初始化,更适合系统应用场景)
由于利用相机求解的位姿和IMU预积分结合外参有一个约束(这里应用旋转约束),利用估计和量测信息可以构建优化函数,求解外参;求出来外参可以继续估计陀螺仪的零偏
利用平移约束,可以估计尺度、速度、重力加速度(同时对重力加速度进行细化)
对齐第零帧相机系下的重力加速度和世界系下的重力加速度,就可以对齐相机系和世界系。

建立关于IMU、视觉的残差函数
一个特色:基于优化的方法,通过滑动窗口的schur边缘化进行位姿维护。根据前一帧相机是否是关键帧,确定是否保留该帧留在窗口中,不是关键帧的话就丢弃该视觉信息;是关键帧就将最老的一帧边缘化掉,同时保留视觉信息在窗口中。(这里是实现的时候,优化函数分为四部分:1.所有的IMU残差2.窗口里的局部视觉重投影进行优化3.产生回环帧的部分)

误差来自滑动窗口和边缘化,主要体现在四个自由度(利用重力向量可以将第0帧相机系和世界坐标系的x、y平面也就是水平面进行对齐,从而感受到滚转角和偏航角,这两个角度是没有偏差的,只有yaw、x、y、z有误差)
重定位模块: 闭合回环检测、建立当前帧与回环的特征关联、将这些特征关联集成到前面的VIO模块以消除漂移如果当前窗口有多个回环帧的话,那么就一起加到回环的优化函数中,增加多个角度的约束

全局位姿图优化 global pose graph optimization(VIO模块使得位姿中的滚转和俯仰变得可观,只剩下了3自由度平移和偏航角(绕重力向量的旋转)不可观,因此这里的全局图优化只用来估计这四个自由度,也就是优化函数是关于这四个变量的函数,所有又称为4自由度全局位姿图优化):位姿图包括所有关键帧的IMU位姿为顶点,约束为回环边和正常的递推下来的边。

论文实验中出现的实验说明:
VINS-Mono在滚转roll和俯仰pitch的估计中效果不如OKVIS,原因可能是这两个量是根据IMU的预积分得到的,预积分其实是为了节省计算量而采用的一种一阶近似手段,因此可能造成了误差存在。关闭了回环检测和重定位功能的VINS-Mono表现大打折扣,和OKVIS一样在四自由度(三自由度平移和yaw角)上有漂移,但是打开回环检测后效果提升就很显著了。移植到IOS移动端的程序与商用的Google tango比起来丝毫不落下风,尤其是在全局的误差消除上,甚至比tango还要好,这得益于4自由度的全局位姿图优化。

OKVIS:Keyframe-Based Visual-Inertial SLAM UsingNonlinear Optimization

initial :not dynamic /yaw points to the z 论文里说是强制固定位置和yaw角的
(freeze yawing around the gravity direction (world z-axis), as well as the position)
In the case where the oldest frame in the temporal
window (x c−ST ) is not a keyframe, we will drop all its
landmark measurements and then marginalize it out together
with the oldest speed and bias states.
根据确定的滑动窗口大小(大小即是滑动窗口内图像关键帧的多少),滑动窗口内的关键帧是滞后于图像当前帧的,okvis论文以三帧为例,vinsmono直接是1,因此如果图像帧已经到kc,但实际上还在判断kc-3/kc-1帧是不是关键帧,要不要边缘化。
okvis:是关键帧:就把窗口里最旧的关键帧边缘化,且因为看到相同地图点的两帧已经具有相对位姿信息,就可以把之前帧里看到但在当前帧没看到的地图点和最旧的关键帧都踢掉
不是关键帧,把该帧、地图点通通都边缘化掉
而且在边缘化中okvis是把估计的变量拆分为两部分,机器人的位置、姿态信息由是否是关键帧在滑动窗口中慢慢被边缘化,而速度、加速度计、陀螺仪的偏移量与该帧是不是关键帧没有关系,马上被边缘化掉
//different from VINSmono

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

SVO、vinsmono、 OKVIS系统比较 的相关文章

  • 数据分析08——Pandas中对数据进行数据清洗

    0 前言 使用pandas修改数据是否会改变源数据 Pandas 对 DataFrame 的操作通常是针对原始数据本身而不是其副本的 例如 当我们使用 loc 或 iloc 方法选择 DataFrame 中的某行或某列并进行修改时 实际上是
  • python实现手势识别

    python实现手势识别 入门 使用open cv实现简单的手势识别 刚刚接触python不久 看到了很多有意思的项目 尤其时关于计算机视觉的 网上搜到了一些关于手势处理的实验 我在这儿简单的实现一下 PS 和那些大佬比起来真的是差远了 毕

随机推荐

  • Flink Sql使用mysql-cdc捕获多个表失败的问题

    问题描述 要捕获同一个库里的多个表的binlog 程序不报错 但是修改某个表后没有结果没有任何改变 fllinkSql的with语句 WITH connector mysql cdc hostname s port s username s
  • Linux安装anaconda3是否初始化的区别

    Linux安装anaconda3提示是否希望安装程序通过运行conda init来初始化Anaconda3 Do you wish the installer to initialize Anaconda3 by running conda
  • 数据结构1.1.1单链表的实现

    1 初始化链表节点内容 typedef struct char isbn 20 char name 10 double price Book typedef struct list Book date struct list next Li
  • GIT——! [rejected] master -> master (non-fast-forward)

    问题 rejected master gt master non fast forward error failed to push some refs to ssh 192 168 137 64 29418 51Selling git h
  • Maven的安装与使用

    一 简介 1 什么是Maven Maven翻译为 专家 内行 的意思 是著名Apache公司下基于Java开发的开源项目 Maven项目对象模型 POM 是一个项目管理工具软件 可以通过简短的中央信息描述来管理项目的搭建 报告和文档等步骤
  • JS+AES解密(CBC模式、输出HEX)

    if tokenMsgs const response await getMqttMsgService let mqttMsg response data msg state mqttconfigs mqttMsg const aesKey
  • 【工具类】发送邮件表格html生成类

    发送邮件的时候 有时候要自己拼html画一个表格 嫌麻烦就写了个工具类 核心类MailTableBuilder import java util MailTableCell author zgd date 2022 8 25 17 43 p
  • 【JAVA】垃圾回收详解

    文章目录 垃圾回收 调用垃圾回收器的方法 finalize 方法 判断对象是否可回收 引用计数算法 根搜索算法 引用的分类 垃圾回收算法 标记 清除算法 标记 整理算法 复制算法 分代收集算法 分配内存与回收策略 Minor GC 和 Fu
  • 使用UDP实现下载上传

    include
  • python基础知识点汇总

    本文包括python基本知识 简单数据结构 数据结构类型 可变 列表 字典 集合 不可变 数值类型 字符串 元组 分支循环和控制流程 类和函数 文件处理和异常等等 python控制语句 if语句 当条件成立时运行语句块 经常与else el
  • 纯js原生实现图片批量下载

    前端纯js实现图片批量下载到本地 图片转base64 getImageBase64 image const canvas document createElement canvas canvas width image width canv
  • 4行Python代码打败美图秀秀

    我们平时使用一些图像处理软件时 经常会看到其对图像的亮度 对比度 色度或者锐度进行调整 你是不是觉得这种技术的底 层实现很高大上 其实最基础的实现原理 用 Python 实现只需要几行代码 学会后你也可以进行简单的图像增强处理了 图像增强哪
  • wsl 内突然不能上网了

    现象 1 一开始是间歇性无法联网 无法连接外网 表现为 apt get update 时请求失败 国内源 2 尝试 ping www baidu com等外网域名 超时 nslookup能够正常解析域名 IP 在 host 主机上也能够正常
  • 进程和线程:进程的开销比线程大在了哪里?

    进程和线程 进程 Process 顾名思义就是正在执行的应用程序 是软件的执行副本 而线程是轻量级的进程 进程是分配资源的基础单位 线程很长一段时间被称作轻量级进程 Light Weighted Process 是程序执行的基本单位 在计算
  • pyltp安装教程windows11

    我是用anaconda创建一个环境 这个比较容易管理 第一步 anaconda创建环境 网上很多教程 第二步 安装pyltp 第一种方法 pip install pyltp 用这个多半失败 第二种方法 用wheel安装 下载wheel 参考
  • 使用 CUBLAS 库给矩阵运算提速

    前言 编写 CUDA 程序真心不是个简单的事儿 调试也不方便 很费时 那么有没有一些现成的 CUDA 库来调用呢 答案是有的 如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库 本文将大致介绍如何使用 CUBLAS 库 同时演示
  • python项目构建_通过构建4个项目来学习Python网络

    python项目构建 The Python programming language is very capable when it comes to networking We ve released a crash course on
  • [JavaWeb]完美解决IDEA(2022)新建没有Servlet选项(无法访问Servlet 404问题)

    IntelIJ IDEA在2022版本中更新和2021版本界面差距还是比较大的 你们是否有遇到过以下问题呢 右键包没有新建Servlet的选项 WebServlet 404 web xml配置映射时
  • cross gcc linux gcc 区别,深入理解交叉编译(Cross Compile)

    深入理解交叉编译 Cross Compile 首先你要了解一下 三个名词 build haost target 和三元组 build 构建 gcc 编译器的平台系统环境 编译该软件使用的平台 host 是执行 gcc 编译器的平台系统环境
  • SVO、vinsmono、 OKVIS系统比较

    几个经典视觉slam系统的比较 SVO 高翔链接 https www zhihu com question 39904950 answer 138644975 处理的各个线程 tracking部分 frame to frame frame