MSCKF那些事(一)MSCKF算法简介

2023-05-16

转自:https://zhuanlan.zhihu.com/p/76341809

1. 什么是MSCKF?

MSCKF全称Multi-State Constraint Kalman Filter(多状态约束下的Kalman滤波器),是一种基于滤波的VIO算法,2007年由Mourikis在《A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation》中首次提出。MSCKF在EKF框架下融合IMU和视觉信息,相较于单纯的VO算法,MSCKF能够适应更剧烈的运动、一定时间的纹理缺失等,具有更高的鲁棒性;相较于基于优化的VIO算法(VINS,OKVIS),MSCKF精度相当,速度更快,适合在计算资源有限的嵌入式平台运行。在机器人、无人机、AR/VR领域,MSCKF都有较为广泛的运用,如Google Project Tango就用了MSCKF进行位姿估计。

VIO分类

VIO相对于VO的好处:

  1. 恢复尺度:IMU能够提供尺度信息(加速度计),解决单目VO的无法恢复尺度的问题。
  2. 应对纯旋转:在纯旋转的情况下,VO位姿解算会出现奇异,VIO可以利用IMU的陀螺仪(角速度计)来估计纯旋转运动。
  3. 应对短时间图像特征缺失:在出现图像过曝、图像过暗、环境纹理不足时,VO会无法工作,而VIO能在VO失效的情况下利用IMU积分来进行运动估计,能够应对短时间的视觉特征缺失(IMU积分越久累积误差会越大),比VO具有更高的鲁棒性。
  4. 精度更高:VIO融合了两种传感器的信息,位姿估计的精度要更高。

2. MSCKF相关学习资料

  • MSCKF开山之作

Mourikis A I, Roumeliotis S I. A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation​www-users.cs.umn.edu

 

  • 数学理论相关资料

Indirect Kalman Filter for 3D Attitude Estimation​mars.cs.umn.edu

 

Quaternion kinematics for the error-state Kalman filter​www.iri.upc.edu

 

  • Li Mingyang老师的系列论文
    • MSCKF2.0,FEJ

Improving the accuracy of EKF-based visual-inertial odometry​citeseerx.ist.psu.edu

 

    • 时钟同步误差估计

Online temporal calibration for camera-IMU systems​intra.ece.ucr.edu

 

    • 能观性分析,FEJ

High-precision, consistent EKF-based visual-inertial odometry​intra.ece.ucr.edu

 

  • Shelly(TUM CVG)的硕士论文,IPhone上跑MSCKF,实现步骤很详细

Monocular Visual Inertial Odometry on a Mobile Device​vision.in.tum.de

 

  • Vijay Kumar实验室在github上开源的双目MSCKF和配套论文

KumarRobotics/msckf_vio​github.com图标Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight​arxiv.org

 

3. MSCKF核心思想

MSCKF的目标是解决EKF-SLAM的维数爆炸问题。传统EKF-SLAM将特征点加入到状态向量中与IMU状态一起估计,当环境很大时,特征点会非常多,状态向量维数会变得非常大。MSCKF不是将特征点加入到状态向量,而是将不同时刻的相机位姿(位置 [公式]和姿态四元数 [公式])加入到状态向量,特征点会被多个相机看到,从而在多个相机状态(Multi-State)之间形成几何约束(Constraint),进而利用几何约束构建观测模型对EKF进行update。由于相机位姿的个数会远小于特征点的个数,MSCKF状态向量的维度相较EKF-SLAM大大降低,历史的相机状态会不断移除,只维持固定个数的的相机位姿(Sliding Window),从而对MSCKF后端的计算量进行限定。

[公式]

3.1 IMU状态向量与INS

MSCKF本质是一个EKF,介绍MSCKF之前,我们先介绍一下INS(Inertial Navigation System)中的IMU状态EKF估计,INS中IMU的状态向量为

[公式]

其中

  • [公式]为单位四元数,表示从世界系( [公式]系)到IMU坐标系( [公式]系)的旋转
  • [公式]为加速度计accelerator的bias
  • [公式]为IMU在G系下的速度
  • [公式]为陀螺仪gyroscope的bias
  • [公式]为IMU在G系下的位置

INS的EKF步骤为:

  • EKF预测:先利用传感器获得的观测加速度和观测角速度,可以对状态进行估计,显然,该步骤会使得估计的不确定度/协方差越来越大
  • EKF更新:然后利用GPS观测构建观测模型,对状态向量的均值和协方差进行更新, 修正预测过程的累积误差,减少不确定度。

3.2 MSCKF中的观测模型

对于MSCKF来说,EKF预测步骤与INS一样,区别在EKF观测更新,需要用视觉信息来构建观测模型,从而对IMU预测的状态进行更新。INS中GPS可以直接给出位置 [公式]的观测,而视觉通常只能提供多个相机之间相对位姿关系的约束。那观测模型要怎么构建呢?

视觉中,约束通常都是特征点到相机的重投影误差(空间中一个3D特征点根据相机的姿态和位置投影到相机平面,与实际观测的特征点之间的误差):

[公式]

我们希望用这个重投影误差的约束等式来作为观测模型,但前提是需要知道特征点的3D坐标,而实际应用中特征点的3D坐标是未知的。

  • EKF-SLAM的做法是将特征点加入到状态向量进行估计,但它的状态向量会随特征点的增多而变得非常大。
  • MSCKF的做法是根据历史相机位姿和观测来三角化计算特征点的3D坐标。这又带来了一个问题:如何确保三角化的精度呢?如果三角化误差太大,那么观测模型就会不准,最终会使得VIO精度太差。MSCKF做法是当特征点跟踪丢失后再进行三角化,特征点跟丢表示该特征的观测不会再继续增加了,这时利用所有的历史观测三角化。所以MSCKF中观测更新的时机是特征点跟丢。

4. MSCKF算法步骤

MSCKF算法步骤如下:

  1. IMU积分:先利用IMU加速度和角速度对状态向量中的IMU状态进行预测,一般会处理多帧IMU观测数据。
  2. 相机状态扩增:每来一张图片后,计算当前相机状态并加入到状态向量中, 同时扩充状态协方差.
  3. 特征点三角化:然后根据历史相机状态三角化估计3D特征点
  4. 特征更新:再利用特征点对多个历史相机状态的约束,来更新状态向量。注意:这里不只修正历史相机状态,因为历史相机状态和IMU状态直接也存在关系(相机与IMU的外参),所以也会同时修正IMU状态。
  5. 历史相机状态移除:如果相机状态个数超过N,则剔除最老或最近的相机状态以及对应的协方差.

MSCKF状态propagation和update的流程如下图所示:

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

MSCKF那些事(一)MSCKF算法简介 的相关文章

  • 移动开发者大会--除了App,软件,我们还应该考虑什么

    今天有幸参加 移动者开发大会 xff0c 也是我第二次参与这个活动了 随着智能机的普及 xff0c 尤其是安卓千元的手机迅猛发展 xff0c 2011年可以说事移动领域的积累期 xff0c 2012年将会是蓬勃的发展期 各大厂商也在努力学习
  • 野火的freeRTOS工程怎么移植到正点原子上

    目录 简介 xff1a 时钟 xff1a 串口波特率设置问题 xff1a 滴答时钟的中断的时长问题 xff1a 简介 xff1a 正点原子的freeRTOS教程和野火系列的对比跟玩一样 xff0c 教的不细致 xff0c 代码注释也还没有野
  • ORB特征点提取代码详解 四叉树均匀化

    ORB特征点提取代码详解 ExtractORB 最近在尝试将ORB提取特征点机制放置于芯片上 xff0c 便于后期调用 xff0c 减小CPU的计算负担 xff0c 故最近对ORB特征点提取代码进行了研读 xff0c 记录一下 xff0c
  • Docker 使用教程

    Docker 使用教程 1 基本使用教程 使用docker docker 下载镜像 span class token function sudo span span class token function docker span pull
  • os.popen os.system subprocess shutil区别

    os popen os system subprocess shutil 区别 最近由于工作需求接触python xff0c 记录下遇到的问题 1 os popen os system 的区别 xff1a 总结 xff1a os popen
  • json与pickle相同和区别

    json与pickle相同和区别 1 json是可以在不同语言之间交换数据的 xff0c 而pickle只在python之间使用 2 json只能序列化最基本的数据类型 xff0c 而pickle可以序列化所有的数据类型 xff0c 包括类
  • 【id:58】【20分】C. 复数运算(友元函数)

    时间限制 1s 内存限制 128MB 题目描述 复数类的声明如下 xff1a class Complex private double real 实部 double imag 虚部 public Complex Complex double
  • Melodic + Realsense D435i 配置及错误问题解决

    Melodic 43 Realsense D435i 配置及错误问题解决 安装环境 xff1a RealSense SDK安装1 克隆SDK2 安装相关依赖3 安装权限脚本4 进行编译与安装5 测试安装是否成功6 错误汇总0x01 进行编译
  • Realsense-Ros安装配置介绍与问题解决

    Realsense Ros安装配置介绍与问题解决 Realsense Ros安装配置功能包克隆与编译编译错误与问题分析解决方案 结束语 本文主要讲述在如何进行Realsense Ros的安装与配置 xff0c 以及提出在安装配置过程中遇到相
  • 树莓派3 Ubuntu Meta16.04 操作系统烧录教程及系统换源

    树莓派3 Ubuntu Meta16 04 操作系统烧录教程及系统换源 1 写在开头 xff1a 2 操作系统烧录软件下载3 Ubuntu Meta 操作系统下载4 操作系统烧录4 1 SD 存储卡格式化4 2 操作系统写入4 3 换源更新
  • Ubuntu nautilus 快速打开文件浏览器

    Ubuntu nautilus 快速打开文件浏览器 1 问题描述2 nautilus 命令说明3 bashrc 下使用 alias 创建命令别名Reference 测试时间 xff1a 2022年6月20日 测试平台 xff1a Ubunt
  • 结构体嵌套结构体,及其的初始化

    作用 xff1a 结构体的的参数成员包含另一个结构体 利用 操作符来逐级访问结构体中的元素 1 先来个普通的结构体嵌套 xff0c xff08 不涉及数组 xff09 span class token macro property span
  • Spark Streaming + Spark SQL 实现配置化ETL流程

    Spark Streaming 非常适合ETL 但是其开发模块化程度不高 xff0c 所以这里提供了一套方案 xff0c 该方案提供了新的API用于开发Spark Streaming程序 xff0c 同时也实现了模块化 xff0c 配置化
  • 程序员永远的痛之字符编码的奥秘

    字符编码相信是每个程序员的噩梦 xff0c 只要是有中文的地方 xff0c 总是会遇到各种编码的问题 xff0c 并且这种问题还非常难缠 xff0c 尤其在linux上 xff0c 因为上面很多软件都是针对英语国家开发的 xff0c 是不会
  • 2013年终总结

    年终感悟 xff1a 2013年就这样过去了 xff0c 每个人都一样 xff0c 使用了自己一年生命药水 xff0c 要知道这种药品是花多少钱都买不来的 现在回头看看 xff0c 我用这一瓶药水都做了那些事情 在这一年里 xff0c 有过
  • C++11 之for 新解

    前言 C 43 43 11这次的更新带来了令很多C 43 43 程序员期待已久的for range循环 xff0c 每次看到javascript xff0c lua里的for range xff0c 心想要是C 43 43 能有多好 xff
  • c++11之初始化列表

    一 前言 C 43 43 的学习中 xff0c 我想每个人都被变量定义和申明折磨过 xff0c 比如我在大学笔试过的几家公司 xff0c 都考察了const和变量 xff0c 类型的不同排列组合 xff0c 让你区别有啥不同 反正在学习C
  • Unity Update 详解

    0x01 简介 Unity的脚本继承了Monobehaviour类 xff0c 在脚本中定义函数 xff1a void FixedUpdate span class hljs list span void span class hljs k
  • 2016总结

    欲言又止 xff1a 每年的年终总结是要在新年之前发表在博客上 xff0c 今年的年终总结拖到现在完成 xff0c 我也是服自己 这里要感谢我的高中好友 64 万学清同学 xff0c 在我去年微信发表的有关年终总结的朋友圈下 xff0c 催
  • 阅读代码和修改别人代码的一些技巧以及注意事项

    作为刚刚走上工作岗位的fish xff0c 都要熟悉前辈们留下来的代码 这段时间是fish最痛苦的时间同时也是最轻松的时间 痛苦是因为要看大量的代码 xff0c 同时要慢慢从学生到社会人士的转变 xff08 xff0c 再不能睡懒觉了 xf

随机推荐

  • 一个分号引发的血案

    最近在看 Data Structures and Algorithms 这本书 xff0c 书里对数据结构和算法进行了简单的描述 xff0c 并且用伪码进行了实现 伪码毕竟和代码还是有很大不同的 xff0c 书的说明里说有C 写的源码 xf
  • Iphone客户端程序员半年工作总结

    来公司四个半月了 xff0c 从对客户端游戏编程的小白慢慢的也能写一些东西了 xff0c 当然了这里最感谢的人就是九天了 xff0c 对于九天其它的好我就不说了 xff0c 就是感觉九天为了团队 xff0c 为了项目 xff0c 他在很用心
  • Unity Android Activity控制

    前言 开发游戏 xff0c 在国内发行 xff0c 接入各个渠道SDK是一件绕不开的事情 并且这件事非常复杂琐碎 xff0c 原因如下 xff1a a 发行平台多 xff0c Android平台有30 xff0c 40家主流发行平台 b 每
  • MongoDB ODM 框架MongoMongo-简化你的数据存储

    MongMongo是一个用Java写的ODM框架 xff0c 使得对MongoDB的操作更加便捷 MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API 并且保留了MongoDB的sche
  • Unity Android 加载动态库

    前言 在接入360 Android SDK时遇到在有些机型的Android机器上报错 xff0c 具体错误提示为 xff1a Failure to initialize Your hardware does not support this
  • 德鲁克谈《自我管理》笔记摘要

    一 我的长处是什么 多数人都以为他们知道自己擅长什么 xff0c 其实不然 要发现自己的长处 xff0c 唯一的途径就是分析回馈法 写下自己预期的结果 9 12个月后 xff0c 将实际结果和预期比较 总结改善自己的预期和行动 我们要以持之
  • ubuntu下搭建cocos2dx编程环境-上

    这大半年一直在开发flash游戏 xff0c 用到的编程语言是actionscript和c 43 43 所以这次公司决定开发手游端的话 xff0c C 43 43 不是很生疏 xff0c 这是个好消息 坏消息是由于现在网页游戏还没有上线 x
  • netty使用epoll报错:java.lang.UnsatisfiedLinkError: failed to load the required native library

    Caused by java lang UnsatisfiedLinkError could not load a native library netty transport native epoll x86 64 最近修改moquett
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • datetime.datetime.now().strftime

    datetime datetime now strftime Y m d H M S 1 python datetime模块用strftime 格式化时间 span class token keyword import span datet
  • 图像处理之灰度图像转换与二值化

    灰度图像与二值化 问题描述 xff1a 将彩色图像转换为灰度图像并进行二值化处理 代码如下 xff08 示例 xff09 xff1a span class token macro property span class token dire
  • softmax函数如何防止数值上溢和溢出问题

    参照https blog csdn net csuzhaoqinghui article details 79742685
  • VR系统的组成与交互技术汇总

    今天给大家介绍一下VR系统的组成与当前一些VR交互技术 xff0c 希望大家对VR有更深的理解 一个典型的虚拟现实系统主要由计算机 输入输出设备 虚拟现实设计 浏览软件等组成 用户以计算机为核心 xff0c 通过输入输出设备与应用软件的虚拟
  • 嵌入式Linux C编程学习之路(三)——初识GCC

    Gcc xff08 GNU C Compiler xff09 是GNU推出的功能强大 性能优越的多平台编译器 xff0c 是GNU的代表作之一 Gcc可以在多种硬体平台上编译出可执行程序 xff0c 其执行效率与一般的编译器相比平均效率要高
  • 【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录

    VINS Mono xff08 A Robust and Versatile Monocular Visual Inertial State Estimator xff09 https github com HKUST Aerial Rob
  • python编码与反编码 decode('unicode-escape')

    反编码 我自己起的名字 xff0c 大概意思就是我得到一串字符 xff0c 是unicode码 xff0c 如 xff1a u53eb u6211 xff0c 进行反编码后得到其对应的汉字 f 61 39 u53eb u6211 39 pr
  • HTTP解析库http-parser简介及使用

    https blog csdn net fengbingchun article details 85224885 http parser是一个用C编写的HTTP消息解析器 xff0c 可以解析请求和响应 xff0c 被设计用于高性能HTT
  • 大疆horizon激光雷达拆箱及参数详解

    首先上四张拆箱实物图镇楼 大疆这款horizon激光雷达的价格是800美元 xff0c 可以说性价比超高了 xff08 不是广告 xff0c 看看参数 xff0c 再对比同类产品的价格 xff0c 就知道它的性价比有多高了 xff09 下面
  • Docker中 Ubuntu 容器 apt-get update网络访问失败解决办法

    转自 xff1a https www cnblogs com coffeebox p 12672467 html 学习Docker在Ubuntu容器中使用apt get update命令遇到如下网络连接错误 xff1a docker run
  • MSCKF那些事(一)MSCKF算法简介

    转自 xff1a https zhuanlan zhihu com p 76341809 1 什么是MSCKF MSCKF全称Multi State Constraint Kalman Filter xff08 多状态约束下的Kalman滤