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

本文介绍了卡尔曼滤波器的基本概念,包括其在状态估计中的应用,以及与状态观测器的关系。着重讲解了线性卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)的区别,指出EKF的局限性和UKF的优点。同时提到了粒子滤波器作为非线性滤波的另一种方法。
PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

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

一、什么是卡尔曼滤波器

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

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

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

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

二、状态观测器

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

在这里插入图片描述
反馈控制器K的引入,使得:
x^˙=Ax^+Bu+K(y−y^)\dot{\hat x}=A\hat x+Bu+K(y-\hat y)x^˙=Ax^+Bu+K(yy^)
定义eobs=x−x^e_{obs}=x-\hat{x}eobs=xx^,由系统和观测器的方程可得:
e˙obs=(A−KC)eobs\dot e_{obs}=(A-KC)e_{obs}e˙obs=(AKC)eobs
该微分方程的解为:
eobs(t)=e(A−KC)teobs(0)e_{obs}(t)=e^{(A-KC)t}e_{obs}(0)eobs(t)=e(AKC)teobs(0)
那么,如果(A−KC)<0(A-KC)<0(AKC)<0eobse_{obs}eobs一定会随时间收敛至0,即x^\hat xx^会收敛至xxxK可以控制误差函数的衰减率。

三、最优状态估计

以一个简化的汽车模型为例,系统的输入为速度uku_kuk,系统状态为汽车的位置xkx_kxkyky_kykxkx_kxk的间接测量输出,这里C=1C=1C=1。用随机变量vkv_kvk表示传感器测量噪声,用随机变量wkw_kwk表示系统过程噪声,可以代表风的影响或汽车速度的变化。假设噪声服从以下高斯分布:
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为协方差,在这里由于系统为单输出,协方差为标量且等于噪声的方差。

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

四、卡尔曼滤波器(KF)

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

所以可知,卡尔曼滤波器分为预测和更新两个部分。在预测部分计算先验状态预估值和其误差协方差,且已知协方差具有以下性质:如果Y=FXY=FXY=FXXXX的协方差为PPP,则Y的协方差为FPFTFPF^TFPFT
x^k−=Ax^k−1+Buk\hat{x}^{-}_k=A\hat x_{k-1}+Bu_kx^k=Ax^k1+Buk
Pk−=APk−1AT+Q{P}^{-}_k=AP_{k-1}A^T+QPk=APk1AT+Q
在更新阶段,用先验预估值计算后验状态预估值和其误差协方差:
Kk=Pk−CTCPk−CT+RK_k=\frac{P^-_kC^T}{CP^-_kC^T+R}Kk=CPkCT+RPkCT
x^k=x^k−+Kk(yk−Cx^k−)\hat x_k=\hat{x}^{-}_k+K_k(y_k-C\hat{x}^{-}_k)x^k=x^k+Kk(ykCx^k)
Pk=(I−KkC)Pk−P_k=(I-K_kC)P^-_kPk=(IKkC)Pk
调整卡尔曼滤波增益KkK_kKk,使更新后的状态值误差协方差PkP_kPk最小。

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

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

针对同样的问题,如果有两个传感器(即两个测量值),则卡尔曼滤波器方程为:
x^k[1×1]=x^k−[1×1]+Kk[1×2](yk[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仅适用于线性系统,对于如下状态转换函数或观测函数是非线性的系统,需要使用非线性状态估算器。卡尔曼滤波器假设状态服从高斯分布,但高斯分布经非线性变化之后得到的可能不再是高斯分布,卡尔曼滤波器算法可能不会收敛。
xk=f(xk−1,uk)+wkx_k=f(x_{k-1},u_k)+w_kxk=f(xk1,uk)+wk
yk=g(xk)+vky_k=g(x_k)+v_kyk=g(xk)+vk
可以使用以下三种非线性状态估算器。

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

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

您可能感兴趣的与本文相关的镜像

PyTorch 2.7

PyTorch 2.7

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值