VIO算法总结(一)

2023-05-16

所谓VIO(visual inertial odometry)就是视觉传感器(camera)+IMU(inertial measurement unit)一起来做自主定位。目前主要应用手机AR,无人车高精地图,无人机等领域。这个技术目前做的怎么样呢?理论很成熟,但是纯靠vio去解决定位的应用并不多。手机AR算是一个比较成功单靠vio做的比较好应用,automated driving, UAV 和mobile robot 基本没有全靠vio来做的。

我把VIO分成前端和后端两个部分。顺便总结一下知识点。

一:视觉和IMU前端数据处理

对于视觉前端做法基本分为三种:

①特征点提取(feature detection)+根据描述子匹配特征点

主流的算法如orbslam, okvis都这采取的这个算法,优点是因为有描述子,因此对地图的维护很方便(包括重定位,闭环,全局优化)。这点很重要,尤其是对室内环境,当视觉上共视关系较多的时候,这种方法能很大提高定位精度和局部的稳定性。比如手机AR,室内移动机器人建议使用这种方法。缺点是每帧图像都要提取特征点数量的描述子,有些浪费时间(其实提取描述子时间没有大多数人想象的那么多时间,1000特征点,在3000元的手机上提取brief描述子的话,大概在10ms左右。)还有个缺点是在tracking过程中,如果出现运动过快(图像出现模糊)比较容易tracking failed。而光流要好一些(其实这个差距不是特别明显)。

②特征点提取+光流跟踪

主流的比如vins,svo的初始化(后面的方法也类似)。优点简单高效,tracking要鲁棒一些。缺点很明显:不容易构建全局map,视觉约束只靠sliding window里面的关键帧。比如vins的闭环和重定位是需要另外在提取特征点和描述子的。而且klt的tracking时间也很长(大概需要20ms,在移动手机上)。那vins做的为啥那么好呢?因为它后端做的好,这个后面再讲。rovio方法类似这种。

③直接法

主流方法有lsdslam,dso。优点在弱纹理下,鲁棒性好。缺点明显,不容易维护全局地图,对光照影响较大,高精度地图中无法使用等。

视觉前端涉及的知识点。

初始化的2D-2D的对极几何。

fundamental matrix,essential matrix ,homography matrix和SVD

fundamental matrix = k.inverse().transpose()*essential matrix*k.inverse(),其中k是相机的内参。

p1*E*p2=0 这是基本矩阵的约束,其中p1,p2是匹配点的归一化坐标即(u1,v1,1)和(u2,v2,1).E是essential matrix。这里可以看出每对匹配点会产生一个约束,由于E=t^ * R 其中t^是translation的斜对称矩阵,因此E共有6个自由度,又因为尺度的原因,E只有5个自由度,所以至少需要5个匹配点。

homegraphy 认为两张图像上的点都在一个平面上,因此有:p2=H*p1。H有8个自由度,因为每个匹配点可产生2个约束,因此求解它至少需要4对matchs。

在slam中会有很多线性方程求解的地方,而SVD分解是最好用的工具。假设有A*x =0的形式, 假设A是一个m×n的矩阵,如果A是满秩的方正,那么x有唯一解。如果m<n,则有多个解,这是我们不想要的。如果m>n则无解,我们可以根据奇异值分解出的最小奇异值对应的右奇异特征向量求解。

对于IMU前端

IMU前端基本都是使用预积分的方式,和积分的区别(预积分把gravity考虑进去了)。imu预积分主要是在两帧图像之间跟新imu的15个状态变量(p, v, q, ba, bg)的Jacob和covariance。

假设我们要积分的非线性微分方程为:

x' = f(t,x)

积分的时间间隔为delta_t,the euler method assumes that f(t,x) is constant over delta_t,则:

x(t+delta_t) = x(t) + delta_t * f(t,x)

但是在delta_t时间段内 f(t,x)并不是常量,因此一种closed-form integration methods 出现了,假设

x'(t) = A* x(t), 注意这是连续时间上的关系。

假设积分的时间间隔是(t,t+delta_t),则:

Xn+1 = exp(A*delta_t) * Xn   =>    exp(A*delta_t) = I + A*delta_t + 1/2 * A*A * delta_t*delta_t + ...

如果取泰勒一阶近似,我们就可以更新离散时间下的jacob和covariance:

jacobian =  (I + A*delta_t) * jacobian;
covariance =  (I + A*delta_t) * covariance * ( I + A*delta_t) + V * noise * V.transpose()

每次预积分的初始值:jacobian是单位矩阵,covariance是零矩阵。noise是白噪声大小,V是噪声的状态转移矩阵。

为啥要求jacobian和covariance?jacobian主要是为了求一阶近似的p, v,R

Eigen::Quaterniond corrected_delta_q = delta_q * Utility::deltaQ(dq_dbg * dbg);
Eigen::Vector3d corrected_delta_v = delta_v + dv_dba * dba + dv_dbg * dbg;
Eigen::Vector3d corrected_delta_p = delta_p + dp_dba * dba + dp_dbg * dbg;

covariance主要是为了求imu误差项的权重:

Eigen::Matrix<double, 15, 15> sqrt_info = Eigen::LLT<Eigen::Matrix<double, 15, 15>>(pre_integration->covariance.inverse()).matrixL().transpose();

IMU积分还有个问题就是初值的确定(initialization),尤其velocity,ba,bg。至于初始的position 和 quaternion可以假设为0,和单位矩阵。这个初值一般结合visual information 来求,比如vins-mono。

 

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

VIO算法总结(一) 的相关文章

  • STVP烧录程序

    STVP介绍 STVD xff1a ST Visual Develop xff0c 可视化开发工具STVP xff1a ST Visual Programmer xff0c 可视化编程工具 xff0c stvp主要打开一些固件 hex s1
  • 传感器标定系列——Kalibr工具

    文章目录 Kalibr介绍安装资源 Kalibr介绍 Kalibr is a toolbox that solves the following calibration problems 多相机标定 Multi Camera Calibra
  • TCP传输图片及多线程

    最终效果图 xff1a 注意 xff1a 图片发送大体流程同 Qt网络编程 TCP IP 一 只是在发送时这里采用 的 数据流QDataStream形式 因为使用摄像进行监控时也是对一帧一帧的图片进 行处理 xff0c 因此掌握了如何用Qt
  • GCC编译过程及基本命令总结

    一 GCC简介 GCC即GNU Compiler Collection xff0c 原本只是针对C语言的编译工具 xff0c 现在已经变成了一个工具集 xff0c 包含了C C 43 43 JAVA等语言的集合体 管理和维护 xff1a 由
  • 第一章 PX4-Pixhawk-程序编译过程解析

    第一章 PX4程序编译过程解析 PX4 是一款软硬件开源的项目 xff0c 目的在于学习和研究 其中也有比较好的编程习惯 xff0c 大家不妨可以学习一下国外牛人的编程习惯 这个项目是苏黎世联邦理工大学的一个实验室搞出来的 该方案是基于 N
  • 第二章 PX4-Pixhawk-RCS启动文件解析

    第二章 PX4 RCS 启动文件解析 RCS 的启动类似于 linux 的 shell 文件 xff0c 如果不知道 shell 文件是什么东西可以理解成是为程序的流程框 xff0c 它是告诉处理器应该怎么样去运行 xff0c 前一章介绍的
  • 第三章 PX4-Pixhawk-SPI底层驱动解析

    第三章 PX4 SPI 底层驱动解析 这一章节我们会对 PX4 的底层驱动进行解析 xff0c 我们这里主要解析的是 SPI 协议 xff0c 因为这个协议是所有传感器的一个协议 xff0c 至于 IIC 和串口就可以类似的读写一下 xff
  • 第四章 PX4-Pixhawk-MPU6000传感器驱动解析

    第四章MPU6000传感器驱动解析 Mpu6000 是一个 3 轴加速度和 3 轴陀螺仪传感器 xff0c 这一章节我们将对 MPU6000 这个传感器进行解析 xff0c 依照这个解析步骤同样可以对 L3GD20 xff08 3 轴陀螺仪
  • 第五章 PX4-Pixhawk-GPS解析

    第五章 PX4 GPS解析 在上一章节我们对传感器MPU6000做了一个解析 xff0c MPU6000所支持的协议是SPI 这一章节我们来解析GPS xff0c GPS使用的是串口通信 这里我们着重讲解UBLOX的解析过程 xff0c 并
  • 第六章 PX4-Pixhawk-Sensors解析

    xfeff xfeff 第六章 PX4 Sensors 解析 这一章节并不难 xff0c 也很容易理解 xff0c 但是这一章节有几个函数需要我们去理解一下 xff0c 所以这里我们这里写一章来说明一下 Sensors 是所有传感器进行数据
  • 第七章 PX4-Pixhawk-Mavlink解析

    xfeff xfeff 第七章 PX4 Mavlink 解析 首先我们是还是来说一说 mavlink 吧 Mavlink 协议是无人机的一种开源通信协议 可以理解就是按照一定的格式来发送数据 这一章节涉及到了消息的打包发送和接收解析 首先我
  • STM8S 低功耗模式

    功耗控制的概念调整 功耗控制之硬件调整 在硬件体系中可以有以下优化手段 xff1a 优化电路设计优化电源供电效率 xff08 减少用于发热的能源 xff09 调节单片机时钟频率 xff08 频率越高功耗越高 xff09 选择单片机或者外围的
  • 第八章 PX4-Pixhawk-SDlog解析

    xfeff xfeff 第八章 PX4 SDlog 解析 这一章节我们对 SD 存储卡来进行解析 SD 卡涉及到 log 日志 xff0c 在很多飞行中 log 文件非常重要的 xff0c 尤其是新手在炸机过程中有了这些数据我们基本上就能分
  • 第九章 PX4-pixhawk-姿态估计解析

    第九章 PX4 pixhawk 姿态估计解析 这一章节我们对姿态估计进行解析 xff0c 这一章节涉及到算法 xff0c 主要涉及到的还是DCM 方向余弦 算法 首先我们还从启动文件开始进行讲解 我们找到rc mc apps中 xff0c
  • 第十章 PX4-Pixhawk-姿态控制

    第十章 PX4 Pixhawk 姿态控制 这一章节我们对姿态控制进行解析 xff0c 姿态解算我们还是从启动文件开始 xff0c 找到姿态解算的启动文件rc mc app 这里面找到姿态解算的启动项为mc att control start
  • 第十一章 PX4-Pixhawk-LPE位置估计

    xfeff xfeff 位置估计的解析我们还是遵循源代码的规则 xff0c 至于组合惯导和扩展卡尔曼我们以后慢慢分析 xff0c 这里主要还是对源代码来进行解析 在前一章节我们找到SYS MC EST GROUP参数设置的是1 xff0c
  • Prometheus + Grafana 接入实践

    文章目录 Prometheus 系统监控数据模型jobs安装 Grafana 可视化应用监控接入exporter 接入应用中集成 prometheus client 告警 Alertmanager参考 Prometheus 系统监控 Pro
  • docker 使用实践

    文章目录 准备环境安装运行配置环境使用镜像加速器修改 docker 目录翻墙设置代理限制容器 log 大小 操作命令基本命令容器网络网络模式容器连接外部外部连接容器容器互联 数据管理数据卷数据卷容器 挂载本机目录 镜像构建使用 docker
  • FreeRTOS 软定时器实现

    64 嵌入式 简述使用定时器 配置定时器服务任务创建 启动 停止定时器修改定时器获取定时器状态 定时器实现 数据结构 定时器控制块定时器管理链表命令队列 定时器服务任务 回调定时器处理节拍计数器溢出命令处理 参考 FreeRtos 简述 考
  • FreeRTOS 消息队列

    64 嵌入式 简述Queue 使用 创建一个消息队列发送消息 接受消息 Queue 实现 数据结构队列创建发送消息 任务中调用发送函数中断中调用发送函数 接收消息 参考 FreeRtos 简述 FreeRTOS 任务间通信方式有 消息通知

随机推荐

  • shell 当前工作目录的绝对路径

    64 Linux 命令脚本 编写脚本中 xff0c 需要获取执行脚本的绝对路径 xff0c 今天写脚本的时候不小心踩了个坑 xff0c 记录下 那个坑的脚本大概是这样的 xff1a span class hljs shebang bin b
  • 基于opentracing + jaeger 实现全链路追踪

    文章目录 链路追踪OpenTracingTrace 和 sapn Inject 和 Extract 操作 Sampling 采样 OpenTracing 多语言支持 链路追踪 当代互联网服务 xff0c 通常都是用复杂 xff0c 大规模分
  • STM32G030F6P6 CubeMX和keil5开发环境的搭建

    规格了解 封装 xff1a TSSOP 20内核 xff1a Arm 32 位 Cortex M0 43 CPU工作电源电压 xff1a 2 V to 3 6 VCPU频率 xff1a 64 MHzFlash存储器 xff1a 32KBRA
  • 卡尔曼滤波(KF)与扩展卡尔曼滤波(EKF)的一种理解思路及相应推导(1)

    前言 xff1a 从上个世纪卡尔曼滤波理论被提出 xff0c 卡尔曼滤波在控制论与信息论的连接上做出了卓越的贡献 为了得出准确的下一时刻状态真值 xff0c 我们常常使用卡尔曼滤波 扩展卡尔曼滤波 无迹卡尔曼滤波 粒子滤波等等方法 xff0
  • STM32工程文件组成结构

    STM32工程文件目录结构 以LED流水灯程序为例 1 CMSIS 内核驱动程序 包含c文件 xff0c ST公司官方提供的 xff0c 对arm内核和mcu系统的基础文件 xff0c 一般不做修改 2 LIB 内部功能的基本函数库 包含c
  • nvidia jetson xavier nx与agx xavier和tx2对比

    1 性能比AGX xavier低 xff0c 但体积更小 xff08 nx为70 x 45 mm xff0c AGX xavier为100 x 87 mm xff09 2 性能是TX2和jetson Nano的10倍 3 安装ubuntu系
  • 总结:单独标定IMU的工具包(kalibr_allan,imu_tk,imu_utils)

    目录 一 常用开源IMU标定工具包汇总 kalibr allan imu tk imu utils imu tk与imu utils的区别 二 使用kalibr allan计算imu误差 参考 xff1a 下载 xff1a 安装 xff1a
  • git使用总结

    Git使用总结 1 本地更新代码前忘记拉取 pull 最新代码 本地对代码进行了修改 xff0c 但是忘记拉取最新版本的代码 这时想要拉最新的代码时 xff0c git pull origin branch name xff0c 会提示你
  • matlab中im2bw函数的用法

    matlab中DIP工具箱函数im2bw使用阈值 xff08 threshold xff09 变换法把灰度图像 xff08 grayscale image xff09 转换成二值图像 所谓二值图像 xff0c 一般意义上是指只有纯黑 xff
  • 最优化方法总结:公式解、数值优化、求解思想

    机器学习的目标是给出一个模型 xff08 一般是映射函数 xff09 xff0c 然后定义对这个模型好坏的评价函数 xff08 目标函数 xff09 xff0c 求解目标函数的极大值或者极小值 xff0c 以确定模型的参数 xff0c 从而
  • AGV小车基础知识介绍

    AGV基础知识 一 AGV的基本概念二 AGV的基本结构硬件组成软件组成1 硬件结构2 单机结构3 主要类型4 主要引导方式介绍5 驱动方式介绍6 AGV的移载方式 三 AGV的控制系统1 AGV控制系统2 AGV安全系统3 激光导航控制系
  • ardupilot & PX4 RTK配置指南

    ardupilot amp PX4 RTK配置指南 随着无人机对于高精度位置需求越来越强烈 xff0c 同时也伴随着北斗三代导航系统正式服务全球 xff0c 国产的实时载波相位差分 xff08 RTK xff09 导航产品也正在以更优惠 更
  • 无人机ADS-B模块 (兼容Px4、ardupilot、极致飞控)拒绝黑飞,耗子尾汁!

    近年来 xff0c 无人机等低空飞行器成为很多玩家的新 玩具 xff0c 但是绝大多数飞行器都属于 黑飞 xff0c 就是没有民航管理部门的适航许可 也没有相关部门颁发的驾驶执照的 2018年2月7日 xff0c 河北省唐山市古冶区公安分局
  • RK3308 蓝牙接口测试

    BT相关接口 deviceio test bluetooth bt server open 蓝牙测试初始化 xff0c 执行蓝牙测试前 xff0c 先调用该接口 BLE的接收和数据请求回调函数的注册 注 xff1a BLE读数据是通过注册回
  • 无人机高精度导航系统GT08N——支持RTK、PPK 、双天线测向

    最近几年无人机市场可以说的上是非常火爆的 xff0c 无人机公司也是数不胜数 无人机的应用场合也是非常之多的 xff0c 农业 物流 安防 巡航 测绘 航拍等等都得到了非常好的应用 同时无人机市场也催生了许多的配套设备的发展 RTK xff
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 自平衡小车控制(stc12+mpu6050程序)

    自平衡小车控制 xff08 stc12 43 mpu6050程序 xff09 两轮自平衡车最终版控制程序 xff08 6轴MPU6050 43 互补滤波 43 PWM电机 xff09 单片机STC12C5A60S2 晶振 xff1a 20M
  • 深度学习常见名词概念:Sota、Benchmark、Baseline、端到端模型、迁移学习等的定义

    深度学习 xff1a Sota的定义 Sota非端到端模型端到端模型Benchmark Baseline并发 并行 串行迁移学习微调进程 线程监督学习非监督学习半监督学习泛化 xff08 Generalization xff09 正则化 x
  • VINS 系统总结

  • VIO算法总结(一)

    所谓VIO xff08 visual inertial odometry xff09 就是视觉传感器 xff08 camera xff09 43 IMU xff08 inertial measurement unit xff09 一起来做自