详解Kalman Filter

中心思想

现有:

  1. 已知上一刻状态,预测下一刻状态的方法,能得到一个“预测值”。(当然这个估计值是有误差的)
  2. 某种测量方法,可以测量出系统状态的“测量值”。(当然这个测量值也是有误差的)

我们如何去估计出系统此时真实的状态呢?
答案是需要结合“预测值”和“测量值”。例如我们可以加权求和,但是这个权重要怎么定义,才能准确估计出真实状态呢?这个权重就是Kalman Filter解决的事情。

系统建模

预测方法

xk=Fkxk1+Bkuk+wkx_k=F_kx_{k-1}+B_ku_k+w_k
我们假设这个预测方法是线性变换,BkukB_ku_k是除了状态转移之外的控制量。wkw_k是预测误差,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为QkQ_k
也就是说,下一刻我们的预测值,有一部分与上一刻状态有关,一部分与外力控制有关(外力控制与上一刻状态无关),还有一部分被噪声所影响。
举个例子:
假设一小车在x轴上向前以速度vv匀速运动,xkx_k表示的是k时刻小车在x轴上的坐标。显然我们有xk=xk1+vtx_k=x_{k-1}+vt,这里速度v和时间t都和上一个状态无关,属于让小车位置变化的“外力”。

测量方法

zk=Hkxk+vkz_k=H_kx_k+v_k
因为我们不一定有测量仪器能直接测量出系统状态,因此我们假设测量方法也是线性变换。
也就是说,当我们的测量仪器用于测量系统状态xkx_k时,它的读数是系统状态加上一定的线性变换HkH_k,以及测量噪声vkv_k,假设为高斯分布(即均值为0的多元正态分布),其协方差矩阵为RkR_k
举个例子:
我们称体重需要得到以“斤”为单位的数据,这是系统状态,但是我们的称只能读出单位为“kg”的数据(这就是zkz_k),那我们就需要做一个单位转换(对应HkH_k),此外,由于称不一定准,所以最后称的读数还得加上一点噪声。

所有参数中:FkF_kBkB_kuku_kQkQ_kHkH_kRkR_k都需要已知,要么自己根据公式和经验定义,要么从样本数据里估计一个值。

算法

Kalman Filter将一直维护对系统状态xkx_k的最优估计值,以及这个估计值的偏差:

  • x^k\hat{x}_k,系统状态,可以是多维的。
  • PkP_kx^k\hat{x}_k的误差。当xk^\hat{x_k}是一维时,PkP_k是方差;当xk^\hat{x_k}是多维时,PkP_k是协方差cov(xk^)cov(\hat{x_k}),就是xk^\hat{x_k}里各维两两协方差。

预测阶段

首先,通过系统的预测方法,我们可以得到“预测值”:
xkˉ=Fkx^k1+Bkuk\bar{x_k}=F_k\hat{x}_{k-1}+B_ku_k
由于误差不知道,且假设其均值为0,所以这里不算误差
那么协方差也可以从上一个状态转移:
Pˉk=FkPk1FkT+Qk\bar{P}_k=F_kP_{k-1}F_k^T+Q_k

更新阶段

这个阶段需要结合“预测值”和“测量值”。结合思想如下:

参考:如何通俗并尽可能详细地解释卡尔曼滤波? - 肖畅的回答 - 知乎

详解Kalman Filter详解Kalman Filter详解Kalman Filter
那么具体公式怎么推导呢?结合高斯分布:

参考这里

让我们从一维看起,设方差为σ2\sigma^2,均值为μ\mu,一个标准一维高斯钟形曲线方程如下所示:
N(x,μ,σ)=1σ2πe(xμ)22σ2\mathcal{N}(x,\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}
那么两条高斯曲线相乘呢?
详解Kalman Filter
N(x,μ0,σ0)N(x,μ1,σ1)=N(x,μ,σ)\mathcal{N}(x,\mu_0,\sigma_0)\cdot\mathcal{N}(x,\mu_1,\sigma_1)=\mathcal{N}(x,\mu',\sigma')
把这个式子按照一维方程进行扩展,可得:
μ=μ0+σ02(μ1μ0)σ02+σ12\mu'=\mu_0+\frac{\sigma_0^2(\mu_1-\mu_0)}{\sigma_0^2+\sigma_1^2}
σ2=σ02σ04σ02+σ12\sigma'^2=\sigma_0^2-\frac{\sigma_0^4}{\sigma_0^2+\sigma_1^2}
如果有些太复杂,我们用k简化一下:
k=σ02σ02+σ12\mathbf{k}=\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2}
μ=μ0+k(μ1μ0)\mu'=\mu_0+\mathbf{k}(\mu_1-\mu_0)
σ2=σ02kσ02\sigma'^2=\sigma_0^2-\mathbf{k}\sigma_0^2
以上是一维的内容,如果是多维空间,把这个式子转成矩阵格式:
K=Σ0(Σ0+Σ1)1\mathbf{K}=\Sigma_0(\Sigma_0+\Sigma_1)^{-1}
μ=μ0+K(μ1μ0)\mu'=\mu_0+\mathbf{K}(\mu_1-\mu_0)
Σ=Σ0KΣ0\Sigma'=\Sigma_0-\mathbf{K}\Sigma_0
其中,Σ\Sigma表示协方差。
代入到Kalman Filter里,我们把“预测分布”(μ0,Σ0)=(Hkxˉk,HkPˉkHkT)(\mu_0, \Sigma_0)=(H_k\bar{x}_k,H_k\bar{P}_kH_k^T),和“测量分布”(μ1,Σ1)=(zk,Rk)(\mu_1, \Sigma_1)=(z_k,R_k)代入到上面的等式里,那么新分布(μ,Σ)=(Hkx^k,HkPkHkT)(\mu',\Sigma')=(H_k\hat{x}_k, H_kP_kH_k^T)为:

这里(μ0,Σ0)=(Hkxˉk,HkPˉkHkT)(\mu_0, \Sigma_0)=(H_k\bar{x}_k,H_k\bar{P}_kH_k^T)乘以了系数HkH_k是为了把xkx_k转换到和zkz_k一个坐标系。

K=HkPˉkHkT(HkPˉkHkT+Rk)1K=H_k\bar{P}_kH_k^T(H_k\bar{P}_kH_k^T+R_k)^{-1}
Hkx^k=Hkxˉk+K(zkHkxˉk)H_k\hat{x}_k=H_k\bar{x}_k+K(z_k-H_k\bar{x}_k)
HkPkHkT=HkPˉkHkTKHkPˉkHkTH_kP_kH_k^T=H_k\bar{P}_kH_k^T-KH_k\bar{P}_kH_k^T
等式两边消掉HkH_k并化简后:
Kk=PˉkHkT(HkPˉkHkT+Rk)1K_k=\bar{P}_kH_k^T(H_k\bar{P}_kH_k^T+R_k)^{-1}
x^k=xˉk+Kk(zkHkxˉk)\hat{x}_k=\bar{x}_k+K_k(z_k-H_k\bar{x}_k)
Pk=(IKkHk)PˉkP_k=(I-K_kH_k)\bar{P}_k
K\mathbf{K}就是Kalman Gain,它衡量了“测量值”和“预测值”之间的权重比例,K\mathbf{K}越大,“测量值”所占权重越大。
从一维结果k=σ02σ02+σ12=11+σ12/σ02\mathbf{k}=\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2}=\frac{1}{1+\sigma_1^2/\sigma_0^2}可知,σ02\sigma_0^2越大,k\mathbf{k}越大。而当“预测值”的误差越大时,σ02\sigma_0^2越大。也就是说,当“预测值”的误差越大时,该公式将更信任“测量值”。