百科定义
卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。
推导由来
hat(Xk) = hat(Xk-1) + Kk * ( Zk - hat(Xk-1) )
我们要预估一个值,最直接的做法就是求平均,假设我们🈶️N组测试数据
用hat(Xk) 来表示在k时刻的一个预估值,就会有
step 1,平均
hat(Xk) = (1/k) * (Z1 + Z2 + Z3 + ... + ZK)
step 2,分离
hat(Xk) = (1/k) * (Z1 + Z2 + Z3 + ... + Zk-1) + (1/k) * Zk
step 3,变换乘以1,即(k-1)/(k-1)
hat(Xk) = (1/k) *((k-1)/(k-1))* (Z1 + Z2 + Z3 + ... + Zk-1) + (1/k) * Zk
step 4,观察提取hat(Xk-1)
hat(Xk-1) = (1/(k-1))*(Z1 + Z2 + Z3 + ... + Zk-1)
step 5,与上一预估值的关系
hat(Xk) = (k-1)/k*hat(Xk-1) + (1/k) * Zk
step 6,得到平均算法的增益(1/k)<这个说法不太准确,后面我们会把(1/k)->Kk>
hat(Xk) = hat(Xk-1) + (1/k) * (Zk - hat(Xk-1))
最终得到的就是我们想要的(这个公式很重要):
hat(Xk) = hat(Xk-1) + (Kk) * (Zk - hat(Xk-1))
简要分析:
可以看到,k时刻的预估值,与k-1时刻的预估值、k时刻的测量、还有一个Kk系数有很大的关系。
第1种情况:如果Kk系数♾️0时,那么可以得到k时刻的预估值就是k-1时刻的预估值hat(Xk-1)
第2种情况:如果Kk系数♾️1时,那么同样得到k时刻的预估值就是k时刻的测量值Zk
那么好了怎么样Kk♾️接近0或1呢或者说为什么会接近呢?卡尔曼增益因此就诞生了,它又跟什么有关系呢?又是怎么计算出来的?小朋友,是不是有很多疑问???带着疑问继续往下看吧。
[ PS这里请学习的同学思考下:为什么要把平均的1/k换成Kk(kalman gain)呢?]
OK,下面我们来首先看下卡尔曼过滤应用的几个关键参数
- Zk 第k时刻的真实测量值
- hat(Xk) 第k时刻的预估值
- Emea(k) 第k时刻的测量误差
- Eest(k) 第k时刻的预估误差
- K(k) 第k时刻的卡尔曼增益
那么如何计算和使用这些值呢?还有Kk(卡尔曼增益)如何确认呢?先看计算步骤及方法,后面我们在实际慢慢推导公式的由来。
Step 1 计算卡尔曼增益 kalman gain
Kk = Eest(k-1)/( Eest(k-1) + Emea(k) )
Step 2 计算本次预估值 hat(Xk)
hat(Xk) = hat(Xk-1) + (Kk) * (Zk - hat(Xk-1))
Step 3 更新预估误差值Eest(k)
Eest(k) = (1 - Kk) * Eest(k-1)
for example
初始化标值:假设预估值为40,估计误差5,测试误差为3
实际理想值:50
按照上述的Step(1~3),来计算k每一时刻的预估值,就得到下图所示数据内容