卡尔曼滤波器(一):卡尔曼滤波器简介

观看MATLAB技术讲座笔记,该技术讲座视频来自bilibili账号:MATLAB中国。

一、什么是卡尔曼滤波器

卡尔曼滤波器是一种优化估计算法,是一种设计最优状态观测器的方法,其功能为:

  • 估算只能被间接测量的变量;
  • 通过组合各种可能受噪声影响的传感器测量值,估算系统状态。

通常被应用于制导与导航系统、计算机视觉系统以及信号处理等领域。

卡尔曼滤波器就是一种状态观测器,要想了解什么是卡尔曼滤波器,需要先了解什么是状态观测器。状态观测器用来估计无法直接查看或测量的内容。

二、状态观测器

以下图为例,其中u为系统输入,x为系统状态,x不可直接测量,y为x的间接测量量。 x ^ \hat x x^ y ^ \hat y y^为x、y的估计值。如果测量值y能与其估计值 y ^ \hat y y^相互匹配,则 x ^ \hat x x^也会与真实的x相吻合。图中蓝色部分即为状态观测器,通过状态观测器,来消除测量值y和估算值 y ^ \hat y y^之间的误差,这样,x的估算值就会与其真实值吻合。

在这里插入图片描述

定义 e o b s = x − x ^ e_{obs}=x-\hat{x} eobs=xx^,由系统和观测器的方程可得:
e ˙ o b s = ( A − K C ) e o b s \dot e_{obs}=(A-KC)e_{obs} e˙obs=(AKC)eobs
该微分方程的解为:
e o b s ( t ) = e ( A − K C ) t e o b s ( 0 ) e_{obs}(t)=e^{(A-KC)t}e_{obs}(0) eobs(t)=e(AKC)teobs(0)
那么,如果 ( A − K C ) < 0 (A-KC)<0 (AKC)<0 e o b s e_{obs} eobs一定会随时间收敛至0,即 x ^ \hat x x^会收敛至 x x xK可以控制误差函数的衰减率。

三、最优状态估计

以一个简化的汽车模型为例,系统的输入为速度 u k u_k uk,系统状态为汽车的位置 x k x_k xk y k y_k yk x k x_k xk的间接测量输出,这里 C = 1 C=1 C=1。用随机变量 v k v_k vk表示传感器测量噪声,用随机变量 w k w_k wk表示系统过程噪声,可以代表风的影响或汽车速度的变化。假设噪声服从以下高斯分布:
v ∼ N ( 0 , R ) v \sim N(0,R) vN(0,R)
w ∼ N ( 0 , Q ) w \sim N(0,Q) wN(0,Q)
这里,R、Q为协方差,在这里由于系统为单输出,协方差为标量且等于噪声的方差。

在这里插入图片描述
我们可以用汽车数学模型来估算 x k x_k xk,但由于真实系统中过程噪声的存在,这个估算不会是完美的。
在这里插入图片描述
此时,我们有了估算值 x ^ k \hat x_k x^k和测量值 y k y_k yk,其均服从高斯分布。

四、卡尔曼滤波器(KF)

将上述 x ^ k \hat x_k x^k y k y_k yk的概率密度函数相乘,得到新的估计值的概率密度函数,同样服从高斯分布,新的方差小于原本的估计值分布的方差,新的均值即为 x k x_k xk的最佳估计。这就是卡尔曼滤波器背后的基本思想,其实现过程如下式所示。
x ^ k = A x ^ k − 1 + B u k + K k ( y k − C ( A x ^ k − 1 + B u k ) ) \hat x_k=A\hat x_{k-1}+Bu_k+K_k(y_k-C(A\hat x_{k-1}+Bu_k)) x^k=Ax^k1+Buk+Kk(ykC(Ax^k1+Buk))
其中, A x ^ k − 1 + B u k A\hat x_{k-1}+Bu_k Ax^k1+Buk为根据前一时间步估算状态以及当前输入对当前状态的预测,表示为 x ^ k − \hat{x}^{-}_k x^k,称其为先验估计值,其在使用当前测量值之前计算。上述方程重写为:
x ^ k = x ^ k − + K k ( y k − C x ^ k − ) \hat x_k=\hat{x}^{-}_k+K_k(y_k-C\hat{x}^{-}_k) x^k=x^k+Kk(ykCx^k)
K k ( y k − C x ^ k − ) K_k(y_k-C\hat{x}^{-}_k) Kk(ykCx^k)使用当前测量值来更新估计值,将最终结果 x ^ k \hat x_k x^k称为后验估计值。

所以可知,卡尔曼滤波器分为预测和更新两个部分。在预测部分计算先验状态预估值和其误差协方差(对于单状态系统即为方差):
x ^ k − = A x ^ k − 1 + B u k \hat{x}^{-}_k=A\hat x_{k-1}+Bu_k x^k=Ax^k1+Buk
P k − = A P k − 1 A T + Q {P}^{-}_k=AP_{k-1}A^T+Q Pk=APk1AT+Q
在更新阶段,用先验预估值计算后验状态预估值和其误差协方差:
K k = P k − C T C P k − C T + R K_k=\frac{P^-_kC^T}{CP^-_kC^T+R} Kk=CPkCT+RPkCT
x ^ k = x ^ k − + K k ( y k − C x ^ k − ) \hat x_k=\hat{x}^{-}_k+K_k(y_k-C\hat{x}^{-}_k) x^k=x^k+Kk(ykCx^k)
P k = ( I − K k C ) P k − P_k=(I-K_kC)P^-_k Pk=(IKkC)Pk
调整卡尔曼滤波增益 K k K_k Kk,使更新后的状态值误差协方差 P k P_k Pk最小。

考虑两种极端情况,当测量噪声方差R为0时,此时 K k = C − 1 K_k=C^{-1} Kk=C1 x ^ k = y k \hat x_k=y_k x^k=yk,即对状态量的后验估计完全取决于测量值。当先验状态预估值误差协方差 P k − P^-_k Pk为0时, K k = 0 K_k=0 Kk=0 x ^ k = x ^ k − \hat x_k=\hat{x}^{-}_k x^k=x^k,即对状态量的后验估计完全取决于先验估计。

综上,用卡尔曼滤波器估计当前状态,需要上一个时间步的后验状态估计值及其误差协方差矩阵和当前测量值。

针对同样的问题,如果有两个传感器(即两个测量值),则卡尔曼滤波器方程为:
x ^ k [ 1 × 1 ] = x ^ k − [ 1 × 1 ] + K k [ 1 × 2 ] ( y k [ 2 × 1 ] − C [ 2 × 1 ] x ^ k − [ 1 × 1 ] ) {\hat x_k}_{[1\times1]}={\hat{x}^{-}_k}_{[1\times1]}+{K_k}_{[1\times2]}({y_k}_{[2\times1]}-C_{[2\times1]}{\hat{x}^{-}_k}_{[1\times1]}) x^k[1×1]=x^k[1×1]+Kk[1×2](yk[2×1]C[2×1]x^k[1×1])

五、非线卡尔曼滤波器

KF仅适用于线性系统,对于如下状态转换函数或观测函数是非线性的系统,需要使用非线性状态估算器。卡尔曼滤波器假设状态服从高斯分布,但高斯分布经非线性变化之后得到的可能不再是高斯分布,卡尔曼滤波器算法可能不会收敛。
x k = f ( x k − 1 , u k ) + w k x_k=f(x_{k-1},u_k)+w_k xk=f(xk1,uk)+wk
y k = g ( x k ) + v k y_k=g(x_k)+v_k yk=g(xk)+vk
可以使用以下三种非线性状态估算器。

1、扩展卡尔曼滤波器(EKF)

EKF把非线性函数在当前估算状态的平均值附近进行线性化,如下图所示。
在这里插入图片描述
在每个时间步执行线性化,然后将得到的雅可比矩阵用于预测和更新状态。
雅可比矩阵:
F = ∂ f ∂ x ∣ x ^ k − 1 , u k F=\frac{\partial f}{\partial x}|_{\hat x_{k-1},u_k} F=xfx^k1,uk
G = ∂ g ∂ x ∣ x ^ k G=\frac{\partial g}{\partial x}|_{\hat x_k} G=xgx^k
线性化系统:
Δ x k ≈ F Δ x k − 1 + w k \Delta x_k\approx F\Delta x_{k-1}+w_k ΔxkFΔxk1+wk
Δ y k ≈ G Δ x k + v k \Delta y_k\approx G\Delta x_k+v_k ΔykGΔxk+vk
EKF缺点如下:

  • 如果有复杂的导数存在,可能难以解析计算雅可比矩阵;
  • 如果以数值方式计算雅可比矩阵可能需要很高的计算成本;
  • EKF不适用于具有不连续模型的系统,因为系统不可微分时雅可比矩阵不存在;
  • 高度非线性系统的线性化效果不好,非线性函数可能不能通过线性函数很好的近似表达出来。换言之,使用EKF需要非线性系统本身能够很好的进行线性化。

2、无迹卡尔曼滤波器(UKF)

UKF不像EKF那样近似非线性函数,其近似概率分布。UKF选择一组最小的采样点(称为sigma点),让它们均值与协方差和要近似的分布一致,且sigma围绕均值对称分布。将sigma进行非线性变化,计算变化后的点的均值和协方差,用来确定确定新的高斯分布,计算新的状态值。
在这里插入图片描述

粒子滤波器(PF)与UKF原理类似,其使用的样本点称为粒子。但与UKF不同,PF近似任意分布。为了表示未明确知道的任意分布,PF所需的粒子数远大于UKF。

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

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

相关文章

https加密证书

网站要出去安全模式访问&#xff0c;加强网络安全就需要使用HTTPS加密证书。 本文主要介绍什么是HTTPS加密证书&#xff0c;如何申请HTTPS加密证书&#xff0c;如何安装HTTPS加密证书等问题展开讨论。 什么是HTTPS加密证书&#xff1f; HTTPS加密证书的行业产品用语叫作SSL证…

互联网大佬座位排排坐:马化腾第一,雷军第二

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是马化腾、雷军、张朝阳、周鸿祎的座位&#xff0c;我觉得是按照互联网地位排序的。 马化腾坐头把交椅&#xff0c;这个没毛病&#xff0c;有他在的地方&#xff0c;其他几位都得喊声“大哥”。雷军坐第二把交椅…

Go语言常见错误 | 工程组织不合理 (工程结构和包的组织)

编写程序的过程中,组织代码的方式,不仅影响到代码的质量,也决定了团队的协作效率。在使用Golang进行项目开发时,工程组织不合理(包括工程结构和包的组织)是个常见的问题。下文将详述这个问题,并提供改善的方案。 工程结构不合理 Golang项目的工程结构对于代码的模块性…

ApplicationListener监听器

在spring-context 5.3.26中来看一下它的定义&#xff1a; package org.springframework.context;import java.util.EventListener; import java.util.function.Consumer;FunctionalInterface public interface ApplicationListener<E extends ApplicationEvent> extends…

[论文笔记] megatron训练参数:dataloader_type

在深度学习中&#xff0c;dataloader_type参数通常控制着数据的加载、处理和输入到模型的方式。不同的dataloader可能会按照不同的策略处理数据集&#xff0c;这可以显著影响模型训练和评估的效果。具体来说&#xff0c;single和cyclic类型通常如此区别&#xff1a; Single Dat…

关键绩效指标(KPI):明确目标及跟踪进展

在企业管理中&#xff0c;关键绩效指标&#xff08;KPI&#xff09;是一种重要的工具&#xff0c;用于明确目标并跟踪进展。通过设定和监控这些指标&#xff0c;企业能够确保员工、团队和整个组织都朝着既定的目标努力。本文将详细探讨关键绩效指标的重要性、设定方法以及如何有…

缓解工作压力的小窍门:保持健康与创新

目录 1 前言2 工作与休息的平衡3 保持心理健康4 社交与网络建设5 结语 1 前言 作为程序员&#xff0c;我们常常承受着高度的工作压力和持续的创新挑战。为了保持高效和健康&#xff0c;我们需要采取一些方法来缓解工作压力&#xff0c;同时促进个人的心理和身体健康。 2 工作…

大模型的原理与特点,奇异值分解(SVD);低秩近似

目录 一、大模型的原理与特点 二、一个基本架构,三种形式: Parameter-Efficient Fine-Tuning

5. Tailwind CSS 响应式设计的实现

Tailwind CSS 是一个功能类优先的 CSS 框架&#xff0c;它允许开发者通过使用响应式工具类来构建自适应的用户界面。这些工具类可以在不同的断点处有条件地应用&#xff0c;使得在不离开 HTML 的情况下构建复杂的响应式界面变得轻而易举。 基本概念 响应式设计在 Tailwind CS…

Python dlib(HOG+SVM)人脸识别总结

Python dlib(HOG+SVM)人脸识别总结 面部标志检测 dlib 68点(HOG+SVM),194点人脸识别模型,包括口(外嘴唇,内嘴唇),鼻,眉毛(左右眉),眼睛(左右眼),下鄂 5点面部标志检测器(左眼2点,右眼2点,鼻子1点)面部对齐更高效 眨眼检测 ear 眨眼瞬间达到0 疲劳驾驶检测…

kill 端口所属进程

IC:\Users\23022>netstat -ano | findstr “8080” TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 13532 C:\Users\23022>taskkill /f /t /pid 13532 成功: 已终止 PID 21028 (属于 PID 13532 子进程)的进程。 成功: 已终止 PID 13532 (属于 PID 19260 子进程)的进程。 C:\U…

如何在PostgreSQL中设置自动清理过期数据的策略

文章目录 方法一&#xff1a;使用临时表和定期清理步骤&#xff1a;示例代码&#xff1a;创建临时表&#xff1a;定期清理脚本&#xff08;bash psql&#xff09;&#xff1a; 方法二&#xff1a;使用分区表和定期清理步骤&#xff1a;示例代码&#xff1a;创建分区表&#xf…

初始化Git仓库时应该运行哪个命令?

文章目录 初始化Git仓库时&#xff0c;你应该运行git init这个命令。这个命令的作用是在你当前所在的目录里创建一个新的Git仓库。这样&#xff0c;你就可以在这个目录里开始使用Git来管理你的文件了。 下面我给你举个详细的例子来说明一下&#xff1a; 首先&#xff0c;你需要…

【Mysql】用frm和ibd文件恢复mysql表数据

问题 总是遇到mysql服务意外断开之后导致mysql服务无法正常运行的情况&#xff0c;使用Navicat工具查看能够看到里面的库和表&#xff0c;但是无法获取数据记录&#xff0c;提示数据表不存在。 这里记录一下用frm文件和ibd文件手动恢复数据表的过程。 思路 1、frm文件&…

c++ 派生类向基类转换的可访问性

1.如果派生类以public继承基类&#xff0c;则是is a关系&#xff0c;用派生类可以完成基类的所有功能&#xff0c;所以可以在任意地方将派生类自动转换成基类&#xff0c;注意&#xff0c;这里都是指指针或引用&#xff0c;而不是对象。 比如&#xff1a; class A{}&#xff1…

【代码】Python3|用Python PIL压缩图片至指定大小,并且不自动旋转

代码主体是GPT帮我写的&#xff0c;我觉得这个功能非常实用。 解决自动旋转问题参考&#xff1a;一行代码解决PIL/OpenCV读取图片出现自动旋转的问题&#xff0c;增加一行代码image ImageOps.exif_transpose(image) 即可恢复正常角度。 from PIL import Image, ImageOpsdef …

call,apply,bind

入参 call: 参数数量不固定。第一个参数指定了函数体内的this指向&#xff0c;从第二个参数开始往后&#xff0c;每个参数被依次传入函数。 apply: 接受两个参数。第一个参数指定了函数体内的this指向。第二个参数接受一个数组 [1,2]&#xff0c;但函数拿到的是解构后的入参 1…

spring-core:获取类/方法/字段/字段上直接定义的注解

AnnotatedElement.getAnnotation 如何获取一个类上定义的注解&#xff1f; 这个问题似乎不应该问&#xff0c;我们知道如果要获取一个类/方法/字段/字段上直接定义的注解是很方便的&#xff0c;如Class.getAnnotation(Class<CasbanScan>)就能实现, 只要实现了java.lang.…

Linux:Win10平台上,用VMware安装Centos7.x及系统初始化关键的相关配置(分步骤操作,详细,一篇足以)

VMware安装Centos7.x镜像的详细步骤&#xff1a;VMWare安装Centos系统&#xff08;无桌面模式&#xff09; 我这里是为了安装Hadoop集群&#xff0c;所以&#xff0c;以下这些步骤是必须进行的 如果你是学习Linux&#xff0c;可以跳过非必须的那些配置项 我安装的版本是&…

集群工具之HAProxy

集群工具之HAProxy HAProxy简介 它是一款实现负载均衡的调度器适用于负载特别大的web站点HAProxy的工作模式 mode http&#xff1a;只适用于web服务mode tcp&#xff1a;适用于各种服务mode health&#xff1a;仅做健康检查&#xff0c;很少使用 配置HAProxy client&#x…