【卡尔曼滤波的学习,以及一些理解】

news2025/1/19 13:04:19

卡尔曼滤波的一些理解

  • 优秀的博客推荐
  • 直观理解
  • 卡尔曼滤波核心算法
  • 举个例子

最近两个多月在实习,做的是GPS定位相关的一些工作,同时也简单做了一下组合导航。卡尔曼滤波是组合不同传感器比较核心的算法,应用也比较广泛,也有很多文章对其进行了详细的介绍,这里记录一下自己的一些理解。

优秀的博客推荐

这里必须要分享一篇博客,在我了解卡尔曼滤波的开始,看过很多上来就给你列出一堆公式或者说一堆让你看不懂的教材或者文章,让人从入门到放弃。但是这篇博客写的非常浅显易懂,可以说让我耳目一新,不得不佩服作者的写作风格,原文链接:How a Kalman filter works, in pictures

里面的语言也很通俗,遇到看不懂的用翻译软件翻译一下也完全够了。

直观理解

简单以上面博客的内容举个例子。假设小机器人在一维方向需要估计自己走了多远。现在有两类数据:

  • 在起点有一个仪器,可以测量现在的位置距离起点有多远
  • 同时可以小机器人可以给出自己的速度信息

由此,首先小机器人已知

  • 传感器测量的离起点的距离(称之为观测值,比如雷达直接测量机器人离障碍物距离7m)
  • 上个时刻机器人离起点距离
  • 自己当前时刻的速度

而根据 上个时刻机器人离起点距离自己当前时刻的速度 可以估算出当前机器人离起点的距离(称之为估计值)。例如:上一秒离起点2m,速度是4m/s,那么现在这秒估计就离起点距离是6m。但是这个时刻传感器测量的离起点的距离是7m

那么问题来了,机器人离起点的距离现在既有个观测值7m,又有个估计值6m。到底相信哪个?单纯相信观测值万一那传感器坏了呢?单纯相信估计值那么万一上个时刻的距离估计值或者速度不准呢?所以,我们要根据观测值和估计值的准确度来得到最终机器人离起点的距离估计值。准确度高的就最终结果比重高,准确度低就占比低。

如果雷达测量的那个7m准确度是90%,根据速度估计出的那个6m准确度是80%,那么最终的距离估计结果就是 **0.8/(0.8+0.9)6+0.9/(0.8+0.9)7=6.52米

事实上,0.9/(0.8+0.9) 就是所谓的卡尔曼增益,它就是表示这个传感器数据相对于根据速度计算出的估计值的靠谱程度。(每个传感器在使用前都可以对它的噪声的方差进行测量,比如IMU有对应的Allen方差)

卡尔曼滤波核心算法

重复的我也不多说了,根据上面的博客我们可以得到卡尔曼滤波的五个核心公式:
(以下公式截图均来自于i2Nav实验室的组合导航课程讲义)

卡尔曼滤波算法; 图源自Dr. Xiaoji Niu, Nav. Group, WHU

  • 思路就像把上述的简单的值变成了一个矩阵, x ^ \hat x x^是状态向量 , ϕ \phi ϕ是状态转移矩阵,例如是运动方程的参数,因此第一个公式利用上一个时刻的状态向量 x ^ k − 1 ( + ) \hat x_{k-1}(+) x^k1(+)乘上 k − 1 k-1 k1 k k k 状态的状态转移矩阵就可以得到这个时刻的状态向量预测值 x ^ k ( − ) \hat x_k(-) x^k(),为什么是预测值呢?因为是用状态转移矩阵直接乘出来了,没有加任何的观测约束。所以下一步就是要进行观测值对状态的更新修正。注意到更新之前还需要把状态向量对应的协方差矩阵也更新了,协方差在更新的时候需要主要误差的引入。这样第一步的预测过程就完成了。
  • 在利用观测值更新的时候首先要计算卡尔曼增益 K k K_k Kk,卡尔曼增益即权重,决定了下一步哪个传感器的权重大哪个小,推到过程需要用正太分布的特性去计算,具体计算过程可以参考这篇博客:卡尔曼增益推导
  • 卡尔曼增益计算完后对状态向量进行更新,注意到后面的括号中是 z k − H k x ^ k ( − ) z_k-H_k\hat x_k(-) zkHkx^k(),其中 z k z_k zk是观测值, H k H_k Hk是观测矩阵, x ^ k ( − ) \hat x_k(-) x^k()是状态向量预测值,那观测矩阵乘以状态向量预测值应该得到什么呢?没错,就是预测的观测值,因此这一步实际是用真实的观测值减去预测的观测值,求出之间的差值再乘以卡尔曼增益。
    • 假设 K k K_k Kk很大, K k H k x ^ k ( − ) K_kH_k\hat x_k(-) KkHkx^k() x ^ k ( − ) \hat x_k(-) x^k()基本消去, x ^ k ( + ) ≈ Z k \hat x_k(+) \approx Z_k x^k(+)Zk
    • 假设 K k K_k Kk很小,后面与等于0, x ^ k ( + ) ≈ x ^ k ( − ) \hat x_k(+) \approx \hat x_k(-) x^k(+)x^k()
    • 因此可以看出卡尔曼增益就是起到该相信那部分数据的作用
  • 最后再根据卡尔曼增益更新误差协方差矩阵 P k P_k Pk,显然 ( I − K k H k ) < I (I-K_kH_k)<I (IKkHk)<I,所以 P k ( + ) < P k ( − ) P_k(+)<P_k(-) Pk(+)<Pk(),这表明经过一次滤波,融合观测值信息会降低误差,而降低多少,就得看观测值起到的作用有多大了。
  • 这样一直的循环修正,一个迭代的过程。

举个例子

卡尔曼滤波中的矩阵,以IMU+GNSS松组合为例,其中IMU是系统的运动估计,GNSS得到的位置坐标作为观测值输入。

常见系统状态含有位置、速度、姿态、传感器误差等是21x1大小的矩阵,常见GNSS测量值包含经度、纬度、高程是3x1大小的矩阵。即状态空间 x ^ \hat x x^是21维,观测空间 z z z 是3维。

  • F F F ——状态转移矩阵:根据上一刻状态,进行系统状态预测;大方阵 21x21维
    在这里插入图片描述

  • H H H——观察矩阵:根据系统状态,胖矩阵,3x21维
    观测矩阵

  • K K K——卡尔曼增益,这是一个瘦矩阵,21x3维,直观意义是代表了对观测结果(GNSS)的接受程度,同时,还兼具把观测空间 z z z 转换到 x ^ \hat x x^ 空间的功能。

  • P P P——状态估计矩阵,这是一个大方阵,21x21维

  • Q Q Q——运动噪声矩阵(IMU的噪声),这是一个中型方阵,取决与IMU的噪声模型,比如考虑零偏,随机游走,读数非线性, 3x3(三维)x2(陀螺仪/加计)=18, 则Q阵是18x18维,中方阵
    在这里插入图片描述

  • R R R——观察噪声矩阵(GNSS的噪声),只考虑经纬高,则是3x3,小方阵

  • G G G——G矩阵
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子数据保全及数据恢复

目录 一.创建虚拟磁盘 系统操作 1.创建虚拟磁盘文件 2.完成低级格式化——分区——高级格式化 3.虚拟磁盘创建完成 用winhex做 2. 镜像&#xff1a; 克隆&#xff1a; 计算分区的hash值&#xff1a; 二.FAT32文件系统 1.认识FAT32文件系统 三.NTFS文件系统 认识NTFS文…

数字信号处理5

好长时间没有更新了&#xff0c;一是这段时间事情比较多&#xff0c;另外一个&#xff0c;我觉得抄书其实意义不大&#xff0c;不如先看书&#xff0c;一个章节看完之后&#xff0c;再写&#xff0c;那样子的话&#xff0c;会效果更好一些&#xff0c;所以我就花了一段时间去把…

chatgpt赋能Python-python_chia

简介&#xff1a;什么是Python Chia&#xff1f; Python Chia是一种加密货币&#xff0c;它的挖矿过程使用Python编程语言。Python Chia是开源的&#xff0c;任何人都可以参与挖矿。 Chia使用绿色挖矿的方式&#xff0c;这意味着Chia的挖矿过程对环境没有任何负面影响。此外&…

typeScript开发

typeScript开发 1.TypeScript简介2.TypeScript 安装3.TypeScript 基础语法3.TypeScript 基础类型4.TypeScript 变量声明5.TypeScript 运算符6.TypeScript 条件语句7.TypeScript 循环8.TypeScript 函数9.TypeScript Number10.TypeScript String&#xff08;字符串&#xff09;11…

使用github CICD 简单部署vue项目

1.首先先创建一个github访问地址&#xff0c;关于Github Pages的域名访问地址&#xff0c;在github上新建一个以域名为名称的仓库即可&#xff0c;一般都是githubname.github.io 2.首先创建vue项目&#xff0c;这里我就使用自己写的前端项目脚手架来创建vue项目 这里顺便把图标…

立创梁山派学习笔记——GPIO输入检测

按键检测 前言按键的硬件电路BOOT选择复位按键唤醒按键GPIO输入框图软件配置寄存器简介1.端口控制寄存器&#xff08;GPIOx_CTL, xA..I&#xff09;2.端口上拉/下拉寄存器&#xff08;GPIOx_PUD, xA..I&#xff09;3.端口输入状态寄存器&#xff08;GPIOx_ISTAT, xA..I&#xf…

cs109-energy+哈佛大学能源探索项目 Part-2.2(Data Wrangling)

博主前期相关的博客见下&#xff1a; cs109-energy哈佛大学能源探索项目 Part-1&#xff08;项目背景&#xff09; cs109-energy哈佛大学能源探索项目 Part-2.1&#xff08;Data Wrangling&#xff09; 这次是将数据整理的部分讲完。 Data Wrangling 数据整理 Weather data 天…

chatgpt赋能Python-python_changeint

Python中changeint函数介绍&#xff1a;将浮点数转换为整数 Python是一种高级编程语言&#xff0c;众所周知&#xff0c;它非常强大且易于学习。在Python中&#xff0c;有一个很有用的函数&#xff0c;名为changeint&#xff0c;它可以将一个浮点数转换为整数。在本文中&#…

进程间通信—进程池设计

进程池设计 文章目录 进程池设计代码目的头文件 对子进程操作建立子进程对象并把子进程对象放进数组里建立子进程需要执行的任务表创建子进程和父进程通信的管道&#xff0c;并且让子进程阻塞读取对父进程操作回收子进程整体代码子进程具有读端未关闭的bug 代码目的 创建一个父…

【libdatachannel】1 :cmake+vs2022 构建

libdatachannel libdatachannel 是基于c++17实现的cmake 链接openssl 可以参考【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*构建 OpenSSL 找不到 Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identifi…

机试打卡 -01 字母异位词(滑动窗口)

算法小白的代码如下↓ class Solution(object):def findAnagrams(self, s, p):""":type s: str:type p: str:rtype: List[int]"""# 输出列表answer_list[]# p的长度p_lenlen(p)# 索引遍历s的子串for i in range(len(s)):# 最后一次循环if ip_le…

Python对大量表格文件加以数据截取、逐行求差、跨文件合并等处理的方法

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件&#xff0c;首先依据某一列数据的特征截取我们需要的数据&#xff0c;随后对截取出来的数据逐行求差&#xff0c;并基于其他多个文件夹中同样大量的Excel表格文件&#…

【NeRF】(一)NeRF论文学习笔记

文章目录 NeRF学习笔记1 实现过程1.1 相机参数&#xff1a;如何通过不同角度的照片得出输入数据1.2 MLP1.3 体积渲染及离散化1.4 优化点 NeRF学习笔记 概述&#xff1a; 重建&#xff1a;根据目前有的不同角度二维图片&#xff0c;重建三维物体。 用 MLP 网络学 Scene Represe…

《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

1.任意文件上传漏洞原理 文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权…

汇编实现点灯

循环亮灯 .text .global _start _start: bl LED1_INIT bl LED1_ON bl delay_1s bl LED1_OFF bl LED2_INIT bl LED2_ON bl delay_1s bl LED2_OFF bl LED3_INIT bl LED3_ON bl delay_1s bl LED3_OFF bl _start /**********LED1点灯PE10**************/ LED1_INIT: 1.通过RC…

UE5实现天际线分析效果

文章目录 1.实现目标2.实现过程2.1 后处理材质2.2 验证测试3.参考资料1.实现目标 UE5中使用CesiumForUnreal插件加载在线的地形影像与OSM建筑数据,再基于后处理材质实现天际线分析效果,GIF动图如下所示: 2.实现过程 依旧是通过边缘检测,得到天际线位置,再通过后处理材质将…

PointGPT 论文解读,点云的自回归生成预训练

PointGPT: Auto-regressively Generative Pre-training from Point Clouds 论文&#xff1a;https://arxiv.org/pdf/2305.11487.pdf 一种将GPT概念扩展到点云的方法&#xff0c;在多个3D点云下有任务中&#xff08;点云分类&#xff0c;part分割等&#xff09;上实现了最先进…

C++中set的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

[SWPUCTF 2021 新生赛] (WEB一)

目录 gift_F12 jicao easy_md5​ caidao include easy_sql easyrce babyrce Do_you_know_http ez_unserialize gift_F12 1.开启环境 2.题目提示f12 ctrlf 搜索flag 得到flag "WLLMCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft} jicao 1.开启环境 2.传参 jso…

MyBatis-Plus中AutoGenerator的详细使用案例

AutoGenerator是什么&#xff1f; AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 AutoGenerator 可以快速生成 Pojo、Mapper、 Mapper XML、Service、Controller 等各个模块的代码 AutoGenerator能干什么&#xff1f; 对于单表而言&#xff0c;几乎是一个全能…