4.卡尔曼滤波原理及实战

news2024/12/1 0:42:57

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


文章目录

    • 0.关于卡尔曼
    • 1.卡尔曼滤波算法
    • 2.卡尔曼滤波算法的应用
      • 一个简单例子
      • 一个复杂的例子
      • 参考

0.关于卡尔曼

卡尔曼,匈牙利数学家,1930年出生于匈牙利首都布达佩斯。1953,1954,1957年分别于麻省理工学院分别获得电机工程学士及硕士学位。于哥伦比亚大学获得博士学位。卡尔曼滤波器正是源于他的博士论文和1960年发表的论文《A New Approach to Linear Filtering and Prediction Problems》。

卡尔曼滤波器是求解线性高斯系统状态估计的最优化自回归数据处理算法,其广泛应用在机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等。

1.卡尔曼滤波算法

卡尔曼算法可用于线性高斯系统的最优状态估计,线性高斯系统是指其系统方程是线性的,满足比例性和可加性,系统噪声服从高斯分布。

对于一个线性控制系统,我们可以得到系统状态变量的运动方程,及状态变量值的观测方程,使用如下方程表示,

{ x k = A k x k − 1 + B k μ k + ω k z k = H k x k + v k   k = 1 , . . . , N \left\{\begin{matrix} x_k=A_kx_{k-1}+B_k\mu_k+\omega_k\\ z_k=H_kx_k+v_k \end{matrix}\right. \space k=1,...,N {xk=Akxk1+Bkμk+ωkzk=Hkxk+vk k=1,...,N

  • k k k表示的第 k k k时刻
  • x k x_k xk表示的是 k k k时刻的系统状态量,根据运动方程来预测
  • A A A是状态转移矩阵,从 k − 1 k-1 k1时刻的 x k − 1 x_{k-1} xk1 k k k时刻的 x k x_k xk
  • μ k \mu_k μk k k k时刻系统输入的控制变量
  • B B B是从控制变量映射到状态变量的矩阵
  • ω k ∼ N ( 0 , Q ) \omega_k\sim N(0, Q) ωkN(0,Q)表示的是状态的噪声,对于高斯系统,噪声服从正态分布
  • Q Q Q是状态噪声的方差
  • H H H是从状态变量到观测变量的映射矩阵
  • v k ∼ N ( 0 , R ) v_k\sim N(0, R) vkN(0,R)表示的测量值,观测变量的噪声,对于高斯系统,噪声服从正态分布
  • R R R是测量噪声的方差

对于实际中的控制系统,系统状态的值有三个,一个是系统运行的真实值,这个是没有办法获得的,因为无论是测量得到的观测值,还是根据状态转移方程即运动方程计算得到的预测值,都存在误差。最好的办法就是,能够根据预测值和测量值的可信度,自动的平衡取测量值和预测值中间的某个值作为系统状态的估计值。这正是卡尔曼滤波器发挥作用的地方。

直接给出卡尔曼滤波最关键的五个方程,

预测方程(运动方程)

{ x k ∣ k − 1 = A k x k − 1 ∣ k − 1 + B k μ k P k ∣ k − 1 = A k P k − 1 ∣ k − 1 A + k T + Q k \left\{\begin{matrix} x_{k|k-1}=A_kx_{k-1|k-1}+B_k\mu_k\\ P_{k|k-1}=A_kP_{k-1|k-1}A+k^T+Q_k \end{matrix}\right. {xkk1=Akxk1∣k1+BkμkPkk1=AkPk1∣k1A+kT+Qk

更新方程

{ K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R k ) − 1 x k ∣ k = x k ∣ k − 1 + K k ( z k − H k x k ∣ k − 1 ) P k ∣ k = ( I − K k H k ) P k ∣ k − 1 \left\{\begin{matrix} K_k=P_{k|k-1}H_k^T(H_kP_{k|k-1}H_k^T+R_k)^{-1}\\ x_{k|k}=x_{k|k-1}+K_k(z_k-H_kx_{k|k-1})\\ P_{k|k}=(I-K_kH_k)P_{k|k-1} \end{matrix}\right. Kk=Pkk1HkT(HkPkk1HkT+Rk)1xkk=xkk1+Kk(zkHkxkk1)Pkk=(IKkHk)Pkk1

  • x k ∣ k − 1 x_{k|k-1} xkk1表示从 k − 1 k-1 k1时刻到 k k k时刻,状态转移得到预测值
  • x k ∣ k x_{k|k} xkk是使用卡尔曼滤波后综合预测值和观测值后得到的估计值
  • P P P是状态变量的协方差矩阵
  • K k K_k Kk是卡尔曼增益,仔细观察其形如 E r r o r p r e d i c t i o n E r r o r p r e d i c t i o n + E r r o r o b e r v a t i o n \frac{Error_{prediction}}{Error_{prediction}+Error_{obervation}} Errorprediction+ErrorobervationErrorprediction,因此卡尔曼增益平衡了预测值和测量值的误差。
  • I I I表示的是单位矩阵。

到这里,卡尔曼滤波算法的原理部分就介绍完毕了,接下来部分,使用一个具体的例子来介绍卡尔曼滤波的应用。

2.卡尔曼滤波算法的应用

一个简单例子

估计水箱中的水的量,水箱是水平的,水箱中水的体积也是近似固定的,即一个静态的系统。

水箱的真实水量 L = c L=c L=c

系统状态变量只剩下一维: x ^ = x \hat{x} =x x^=x, x x x是水的体积 L L L的估计量

因为水箱中的水的体积假设是不变,因此 x k + 1 = x k x_{k+1}=x_k xk+1=xk, A = 1 , B = 0 A=1,B=0 A=1,B=0

水箱的测量量是浮子的数值,有可能浮子(float)的数值是 1 c m 1cm 1cm对应水的体积是 1 1 1升,为简化系统,假设测量量 z = x , 即 H = 1 z=x,即H=1 z=x,H=1

测量值的噪声假设 R = r R=r R=r

状态量只有一维,其协方差矩阵中只有一个数, P = p P=p P=p,假设状态量的预测值的噪声 Q = q Q=q Q=q

基于上面的假设,用于这个简单水箱系统水深估计的卡尔曼滤波方程表示为:

预测方程

{ x k ∣ k − 1 = x k − 1 ∣ k − 1 p k ∣ k − 1 = p k − 1 ∣ k − 1 + q \left\{\begin{matrix} x_{k|k-1}=x_{k-1|k-1} \\ p_{k|k-1}=p_{k-1|k-1}+q \end{matrix}\right. {xkk1=xk1∣k1pkk1=pk1∣k1+q

更新方程

{ K k = p k ∣ k − 1 ( p k ∣ k − 1 + r ) − 1 x k ∣ k = x k ∣ k − 1 + K k ( z k − x k ∣ k − 1 ) p k ∣ k = ( 1 − K k ) p k ∣ k − 1 \left\{\begin{matrix} K_k=p_{k|k-1}(p_{k|k-1}+r)^{-1}\\ x_{k|k}=x_{k|k-1} + K_{k}(z_k-x_{k|k-1}) \\ p_{k|k}=(1-K_k)p_{k|k-1} \end{matrix}\right. Kk=pkk1(pkk1+r)1xkk=xkk1+Kk(zkxkk1)pkk=(1Kk)pkk1

基于上面的假设,这个非常简单的水箱模型就定义完了,现在代入一些值来看一下计算过程:

状态初始化

假设水箱中水的实际体积是 1 1 1升,初始估计的水的体积是 x 0 = 0 x_0=0 x0=0,因为初始值是随机设置的,因此开始时系统状态预测量的方差很大, p 0 = 1000 p_0=1000 p0=1000。水箱中的水实际上没有变化,因此状态量的预测噪声应该很小,假设 q = 0.0001 q=0.0001 q=0.0001。测量的噪声假设为 r = 0.1 r=0.1 r=0.1

  • 第1步
    • 预测, 假设测量值 z 1 = 0.9 z_1=0.9 z1=0.9
    • { x 1 ∣ 0 = 0 p 1 ∣ 0 = 1000 + 0.0001 \left\{\begin{matrix} x_{1|0}=0\\ p_{1|0}=1000+0.0001 \end{matrix}\right. {x1∣0=0p1∣0=1000+0.0001
    • 更新
    • { K 1 = ( 1000 + 0.0001 ) [ ( 1000 + 0.0001 ) + 0.1 ] − 1 ≈ 0.9999 x 1 ∣ 1 = 0 + 0.9999 ( 0.9 − 0 ) = 0.8999 p 1 ∣ 1 = ( 1 − 0.9999 ) ( 1000 + 0.0001 ) ≈ 0.1 \left\{\begin{matrix} K_1=(1000+0.0001)[(1000+0.0001)+0.1]^{-1}\approx0.9999\\ x_{1|1}=0+0.9999(0.9-0)=0.8999\\ p_{1|1}=(1-0.9999)(1000+0.0001)\approx 0.1 \end{matrix}\right. K1=(1000+0.0001)[(1000+0.0001)+0.1]10.9999x1∣1=0+0.9999(0.90)=0.8999p1∣1=(10.9999)(1000+0.0001)0.1

这样,经过一步迭代,可以发现状态量预测值的方差已经降到了 0.1 0.1 0.1,状态量的值已经从 0 → 0.8999 0\rightarrow0.8999 00.8999,已经比较接近真实值了。

继续后面的迭代,可得到如下的表格:

k x k ∣ k − 1 x_{k|k-1} xkk1 p k ∣ k − 1 p_{k|k-1} pkk1 z k z_k zk K k K_k Kk x k ∣ k x_{k|k} xkk p k ∣ k p_{k|k} pkk
20.89990.10010.80.50020.84990.05
30.84990.05011.10.33390.93340.0334
40.93340.03351.00.25090.95010.0251
50.95010.02520.950.20120.95010.0201
60.95010.02021.050.16820.96690.0168
70.96690.01691.20.14471.00060.0145
81.00060.01460.90.12720.98780.0127
90.98780.01280.850.11360.97220.0114
100.97220.01151.150.10280.99050.0103

从上面表格中的可以看到,估计量 x x x越来越接近系统的真实值 1 1 1

同时估计量的方差 p p p越来越小,说明估计量越来越稳定;

卡尔曼增益的值越来越小,还记得前面介绍的卡尔曼增益的含义是预测量误差在系统总误差中的占比,系统预测量越来越准,因此卡尔曼增益越来越小。

一个复杂的例子

上面介绍的是非常简单的一个系统,状态变量也只有一个,为了与实际应用更接近,看一个状态变量是多维度的例子,此时状态变量的协方差是一个矩阵,状态转移等也都是矩阵。

TODO

先鸽了,复杂例子后面再加吧^_^


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考

简单例子部分参考自康奈尔大学的讲义,可以直接看讲义。

  • 1.https://www.cs.cornell.edu/courses/cs4758/2012sp/materials/MI63slides.pdf
  • 2.https://thekalmanfilter.com/kalman-filter-explained-simply/
  • 3.https://towardsdatascience.com/kalman-filter-in-a-nutshell-e66154a06862

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

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

相关文章

chatgpt赋能python:Python数据分析:Vlookup函数在Python中的实现

Python数据分析:Vlookup函数在Python中的实现 简介 Vlookup是一种常见的数据分析函数,用于在两个数据表/数据集中查找并关联相应的数据。这个函数是在Excel中非常常见的,但是当我们进行大型数据分析时,我们可以使用Python来实现…

2023.6.8小记——嵌入式系统初识、什么是ARM架构?

今天还挺充实的,早上在图书馆本来想学一下notion,结果看李沐老师的动手深度学习看到十点半,在电脑上配置了李沐老师的d2l和jupyter,等后续有时间的时候再继续学。 下午看了一下notion的使用方法,这玩意初学者用起来是…

chatgpt赋能python:Python如何一行输出五个星号

Python如何一行输出五个星号 Python是一种流行的编程语言,它被广泛用于各种领域,包括Web开发,数据科学和机器学习。在这篇文章中,我们将探讨如何使用Python在一行中输出五个星号。 输出五个星号的方法 Python提供了几种方法来在…

牛客网语法刷题(C语言) — 输出格式化

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C语言—语法篇》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…

从字符串中读写的方法:c语言中的sscanf、sprintf函数,c++中的I/O流strstream、stringstream

一、sscanf、sprintf函数 众所周知,c语言中我们常使用的标准输入输出流函数为scanf()、printf(),默认从键盘上输入数据、向屏幕输出数据。此外,c语言中还提供了另一组库函数sscanf()、sprintf()函数,它们的功能与前者相同&#x…

spark复习重点

什么是大数据 大数据是指数据量巨大、类型繁多、处理速度快的数据集合。它不仅包括传统的结构化数据,还包括非结构化数据、半结构化数据等多种形式的数据。大数据的处理需要使用特殊的技术和工具,如分布式存储、分布式计算、数据挖掘、机器学习等。 大…

软考A计划-系统架构师-官方考试指定教程-(7/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

uniapp主题切换功能的第二种实现方式(scss变量+require)

在上一篇 “uniapp主题切换功能的第一种实现方式(scss变量vuex)” 中介绍了第一种如何切换主题,但我们总结出一些不好的地方,例如扩展性不强,维护起来也困难等等,那么接下我再给大家介绍另外一种切换主题的…

聊聊那些奇葩的代码规范 —— 滥用静态导入

因为有些要求感觉实是太过奇葩,收集下来娱乐下大家。 代码规范要求 要求如果代码可以静态导入的话,就必须要静态导入。 所有的代码如果不静态导入,就直接 PR 拒绝合并。 举例:equalsAnyIgnoreCase("test","tes…

总结894

学习目标: 月目标:6月(线性代数强化9讲遍,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟&#xff0…

chatgpt赋能python:Python怎么Import自己写的SEO文章

Python怎么Import自己写的SEO文章 如果你是一位Python开发人员,并且正在为SEO优化而努力编写文章,那么你可能会想知道如何将自己编写的SEO文章导入您的程序中以便更好的利用。 在这篇文章中,我们将介绍如何使用Python中的import语句将自己编…

UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字

随着IP安全体系结构(IPsec)的引入,密钥加密和认证密钥的管理越来越需要一套标准机制。RFC 2367介绍了一个通用密钥管理API,可用于IPsec和其他网络安全服务,该API创建了一个新协议族,即PF_KEY域,…

chatgpt赋能python:Python一行输入三个数:方便快捷,还能提高效率!

Python一行输入三个数:方便快捷,还能提高效率! Python是一门非常流行的编程语言,不仅仅因为它简单易用,更因为它拥有丰富的生态系统和强大的库支持。但是,Python的输入方式却是许多人常常感到头疼的部分。…

学会使用“条件断点“来解放你的鼠标

(PS:对调试较为熟悉却没有使用过条件断点的同学可以直接翻到文章底部看操作的GIF图~) 一、背景 "Debug"想必大家在开发的过程中也是有经常使用的,这里简单的介绍一下浏览器"Debug"其中的两种方式。&#xff…

使用idea创建java web项目

创建web项目有很多方法,就说一个最简单的方法吧。 创建一个java项目,点击创建右击项目选择添加框架支持。勾选上web应用程序,点击确定。 再点击当前文件,编辑配置 点击加号,选择Tomcat服务器(本地&#xf…

【连续介质力学】变形梯度

变形梯度 简介 本节讨论两个不同质点P和Q的之间的相对运动变化 拉伸比和相对伸长 d X ⃗ d\vec X dX : 在参考构形连接质点P和Q的向量,线单元 M ^ \hat M M^: d X ⃗ d\vec X dX 方向的单位向量 d x ⃗ d\vec x dx : 在当前构形连接质点P’和Q‘的向量&#xff…

对象存储分布式代理-go初学者的开源练手项目

最近写了一个go语言练手项目osproxy和osproxy-grpc,代码已完全开源到github。 相信不少接触go语言的读者,都是被它"极简协程",“高并发”,"高性能"的特性所吸引,我也不例外,想着学完之…

基于MATLAB涡度通量数据处理技术应用

点击查看原文 本文基于MATLAB语言、以实践案例为主,提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例:基于MATLAB开展上机操作 2、涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1…

第3章 需求分析(上)

第3章 需求分析(上) 3.1 需求分析任务 3.1.1 确定对系统的综合要求 1. 功能需求 通过需求分析应该划分出必须完成的所有功能。 2. 性能需求 性能需求指定系统必须满足的定时约束或容量约束 3. 可靠性和可用性需求 可靠性需求定量地指定系统的可靠…

二叉树的最近公共祖先LCA

一、什么是最近公共祖先 LCA为最近公共祖先(Lowest Common Ancestor)的缩写。 对于一棵有根树T的两个节点u,v,最近公共祖先LCA(T,u,v)代表一个节点x。 LCA(5,6) 2 LCA(7,12) 3 LCA(2,1)1 二、公共祖先的朴素解法 两个节点先调整到相同的深度每一次…