【卡尔曼滤波器】_DR_CAN合集
学习笔记
卡尔曼滤波器(Kalman Filter)
- 不是一般意义上的滤波器
- 是一种最优化递归数字处理算法(optimal recursive data processing algorithm)
- 更像是一种观测器(observer)
卡尔曼滤波器广泛应用的原因:世界中存在大量不确定性
- 不存在完美的数学模型
- 系统的扰动不可控,难以建模
- 测量的传感器存在误差
案例:
- 用尺子多次
测量
硬币的直径Z, - 使用求平均数的方式
估计
硬币真实直径X^。
测量结果
第n次测量结果Zn |
---|
Z1=50.1mm |
Z2=50.4mm |
Z2=50.2mm |
求平均数公式推导递归算法:
X^n=n1(Z1+Z2+⋯+Zn)=n1(Z1+Z2+⋯+Zn−1)+n1Zn=nn−1n−11(Z1+Z2+⋯+Zn−1)+n1Zn=nn−1X^n−1+n1Zn=X^n−1−n1X^n−1+n1Zn=X^n−1−n1(Zn−X^n−1)
结论
X^n=X^n−1−n1(Zn−X^n−1)本次估计=上次估计+n1(本次测量−上次估计)
n→+∞;n1→0;X^n→X^n−1;随着测量次数增加;测量结果不再重要;估计值逐渐稳定;n→0;n1→+∞;X^n→Zn;测量次数较小时;测量结果作用较大;估计值受测量结果影响较大;
把上面案例中的系数n1换成代表卡尔曼增益的系数K,
那么就得到了卡尔曼滤波算法中的第一个公式:
X^n=X^n−1+Kn(Zn−X^n−1)本次估计=上次估计+增益系数K(本次测量−上次估计)
其中卡尔曼增益K
Kn=eESTn−1+eMEAneESTn−1本次卡尔纳曼增益=上次估计误差+本次测量误差上次估计误差
分析:
- 估计误差≫测量误差;K→1;本次估计→本次测量;
- 估计误差≪测量误差;K→0;本次估计→上次估计;
第一步:计算卡尔曼增益
Kn=eESTn−1+eMEAneESTn−1
第二步:计算估计值
X^n=X^n−1+Kn(Zn−X^n−1)
第三步:更新估计误差
eESTn=(1−Kn)eESTn−1
案例
import numpy as np
import matplotlib.pyplot as plt
N = 50
Z = []
X = [0]
Error_mes = 5
Error_est = 50
K = 0
for i in range(0,N):
Z.append(np.random.normal(50,5))
for i in range(1,N):
K = Error_est/(Error_est+Error_mes)
x = X[i-1] + K * (Z[i] - X[i-1])
Error_est = (1-K) * Error_est
X.append(x)
plt.scatter(range(0,len(Z)),Z)
plt.plot(range(0,len(X)),X)
plt.show()