卡尔曼滤波详解

这篇主要介绍卡尔曼滤波公式详细推导,使用示例参考卡尔曼滤波示例

Kalman Filter

简单介绍

主要讲解基本的卡尔曼滤波算法,有时候也说是离散或者线性卡尔曼滤波。

首先来看一个数学公式,这部分仅仅是给定一个思路,和最后实际算法无关。目前考虑到要估计当前系统的状态,而且有两个已知量,一个上一个状态的估计值以及当前状态的测量值,这两个都有一定的噪声,需要做的就是把这两个结合起来,很简单的思路就是按照比例相加得到当前状态的估计值:
X ^ k = K k ⋅ Z k + ( 1 − K k ) ⋅ X ^ k − 1 \hat{X}_k = K_k \cdot Z_k + (1 - K_k) \cdot \hat{X}_{k-1} X^k​=Kk​⋅Zk​+(1−Kk​)⋅X^k−1​

k k k 表示离散的状态量,可以把它简单的理解为离散的时间间隔。k=1 表示1ms,k=2 表示2ms;

X ^ k \hat{X}_k X^k​ 是对当前状态的估计值,希望利用上面的公式对每一个 k 都能得到一个较为准确的 X 的值;

Z k Z_k Zk​ 是对当前状态的测量值,当然这个值并不是绝对准确的,会有一定的误差噪声(如果绝对准确,直接用就可以了,也就没必要搞这个卡尔曼滤波算法了);

X ^ k − 1 \hat{X}_{k-1} X^k−1​ 是对上一状态的估计值,利用这个以及测量值对当前状态进行估计;

K k K_k Kk​ 是卡尔曼增益(kalman gain),在这里唯一未知的就是这个值,也是需要去求的值。当然可以直接设置值为0.5,但是这样比较暴力。最好的方式就是根据每一时刻的状态求一个当前状态最好的增益值,这样的话更好利用以前状态的估计值以及当前测量值来估计一个最优的当前值。

后面卡尔曼滤波算法就是按照上面思路利用上一状态以及测量值去估计当前状态,只不过模型要更加复杂。

基本模型

卡尔曼滤波的状态方程,利用线性随机差分方程(Linear Stochastic Difference equation)利用上一个系统状态估计当前系统状态(这里假设上一状态与下一一状态有某种线性关系,比如恒温环境的温度,匀速运动的速度等,但是因为现实环境的复杂,这种线性关系不是完全平滑的,也就是会有一些扰动):
x k = A x k − 1 + B u k − 1 + w x_k = Ax_{k-1} + Bu_{k-1}+w xk​=Axk−1​+Buk−1​+w
使用时一般忽略 u u u 控制输入,得到:
x k = A x k − 1 + w ( 1.1 ) x_k = Ax_{k-1} + w \qquad {(1.1)} xk​=Axk−1​+w(1.1)
加上对于当前状态的测量方程(简单来说就是测量值和状态值的线性函数):
z k = H x k + v ( 1.2 ) z_k = Hx_k + v \qquad {(1.2)} zk​=Hxk​+v(1.2)

k − 1 k-1 k−1 和 k k k 分别表示上一状态和当前状态;

x ∈ R n x \in R^n x∈Rn 表示要估计的状态;

A ∈ R n × n A \in R^{n \times n} A∈Rn×n 表示上一状态到当前状态的转换矩阵;

u ∈ R l u \in R^l u∈Rl 表示可选的控制输入,一般在实际使用中忽略;

B ∈ R n × l B \in R^{n \times l} B∈Rn×l 表示控制输入到当前状态的转换矩阵;

z ∈ R m z \in R^m z∈Rm 表示测量值;

H ∈ R m × n H \in R^{m \times n} H∈Rm×n 表示当前状态到测量的转换矩阵;

w ∈ R n w \in R^n w∈Rn 表示过程噪声,主要是从上一状态进入到当前状态时,会有许多外界因素的干扰;

v ∈ R m v \in R^m v∈Rm 表示测量噪声,主要是任何测量仪器都会有一定的误差;

在上面转换矩阵 A A A B B B H H H w w w v v v 是随着状态变化的,在这里没有添加下标,假设是不变的。

上面提到的过程噪声 w w w 和测量噪声 v v v 假设是相互独立的(之间没有关系,无相互影响),且是高斯白噪声,意思是这些噪声在离散的状态上是没有关系的(互相独立的, 每个时刻的噪声都是独立的)且 服从高斯分布:
p ( w ) ∼ N ( 0 , Q ) ( 1.3 ) p ( v ) ∼ N ( 0 , R ) ( 1.4 ) Q = w w T R = v v T E ( w ) = 0 E ( v ) = 0

p(w)∼N(0,Q)(1.3)p(v)∼N(0,R)(1.4)Q=wwTR=vvTE(w)=0E(v)=0" role="presentation" style="position: relative;">p(w)p(v)QRE(w)E(v)∼N(0,Q)(1.3)∼N(0,R)(1.4)=wwT=vvT=0=0p(w)∼N(0,Q)(1.3)p(v)∼N(0,R)(1.4)Q=wwTR=vvTE(w)=0E(v)=0

p(w)p(v)QRE(w)E(v)​∼N(0,Q)(1.3)∼N(0,R)(1.4)=wwT=vvT=0=0​

Q ∈ R n × n Q \in R^{n \times n} Q∈Rn×n 表示过程噪声 w w w 的协方差矩阵,表示 w w w 向量元素之间的相关关系;

R ∈ R m × m R \in R^{m \times m} R∈Rm×m 表示测量噪声 v v v 的协方差矩阵,表示 v v v 向量元素之间的相关关系;

在上面协方差矩阵 Q Q Q R R R 是随着状态变化的,在这里假设是不变的。

推导过程

上面是给出了卡尔曼滤波的整体思路和基本模型,在这里一步步分解来看卡尔曼滤波的推导过程。首先确定了卡尔曼滤波的基本模型,那么下一步是怎样根据这个模型来不断求取后面的状态。

首先定义几个变量:

x ^ k ˉ \bar{\hat{x}_k} x^k​ˉ​ 加了一个负号上标,表示仅仅利用过程先验知识求出的当前状态的先验状态估计(a priori state estimate),不考虑过程噪声的情况下;

x ^ k \hat{x}_k x^k​ 表示利用测量值 z k z_k zk​ 求出的当前状态的后验状态估计(a posteriori state estimate),也是最终求得的状态;

需要注意的是,卡尔曼滤波的最终目标是求 x ^ k \hat{x}_k x^k​ ,这是对当前状态的最优估计。

根据上面的定义忽略过程噪声可以得到:
x ^ k ˉ = A x ^ k − 1 + B u k − 1 \bar{\hat{x}_k} = A\hat{x}_{k-1} + Bu_{k-1} x^k​ˉ​=Ax^k−1​+Buk−1​
通常都是忽略 u u u 这个可选的控制输入(以后加入该变量的话也是非常方便的):
x ^ k ˉ = A x ^ k − 1 ( 2.1 ) \bar{\hat{x}_k} = A\hat{x}_{k-1} \qquad {(2.1)} x^k​ˉ​=Ax^k−1​(2.1)
然后同理忽略测量噪声可以得到:
z k ˉ = H x ^ k ˉ

zk¯=Hx^k¯" role="presentation" style="position: relative;">zk¯=Hx^k¯zk¯=Hx^k¯

zk​ˉ​​=Hx^k​ˉ​​

z k ˉ \bar{z_k} zk​ˉ​ 表示忽略测量噪声根据当前先验状态得到的无噪声测量值。

那么很简单的可以用实际得到的测量值减去无噪声由上一状态预测的测量值:
z k ˙ = z k − z k ˉ = z k − H x ^ k ˉ

zk˙=zk−zk¯=zk−Hx^k¯" role="presentation" style="position: relative;">zk˙=zk−zk¯=zk−Hx^k¯zk˙=zk−zk¯=zk−Hx^k¯

zk​˙​​=zk​−zk​ˉ​=zk​−Hx^k​ˉ​​

z k ˙ \dot{z_k} zk​˙​ 表示实际测量值(包含了上面提到的各种干扰即过程噪声以及测量噪声)减去无噪声测量值,一般被叫做measurement innovation 或者是 residual,表示预测的测量值和实际测量值的差异。实际得到是过程噪声和测量噪声对当前测量值的影响(当然也会影响当前状态),也就是包含了 w w w 和 v v v 的情况。

现在得到了一个无噪声的状态的估计 x ^ k ˉ \bar{\hat{x}_k} x^k​ˉ​,以及一个噪声变量 z k ˙ \dot{z_k} zk​˙​。根据经验来说把这两个值按照一定的方式整合起来就可以得到后验状态估计。卡尔曼滤波中采用按照比例组合的方式(其实对于下面的公式在数学上有严格的证明过程,但是仅仅是使用卡尔曼滤波就不去深究了):
x ^ k = x ^ k ˉ + K k z k ˙ = x ^ k ˉ + K k ( z k − H x ^ k ˉ ) ( 2.2 )

x^k=x^k¯+Kkzk˙=x^k¯+Kk(zk−Hx^k¯)(2.2)" role="presentation" style="position: relative;">x^k=x^k¯+Kkzk˙=x^k¯+Kk(zk−Hx^k¯)(2.2)x^k=x^k¯+Kkzk˙=x^k¯+Kk(zk−Hx^k¯)(2.2)

x^k​​=x^k​ˉ​+Kk​zk​˙​=x^k​ˉ​+Kk​(zk​−Hx^k​ˉ​)(2.2)​

K k ∈ R n × m K_k \in R^{n \times m} Kk​∈Rn×m 表示卡尔曼增益(gain)或者均化系数(blending factor)。

到这里,有了上面的公式(2.2),为了得到 x ^ k \hat{x}_k x^k​,其他参数都是已知的,目前需要把每个状态的 K k K_k Kk​ 求出来,这里定义先验和后验估计误差:
e k ˉ ≡ x k − x ^ k ˉ e k ≡ x k − x ^ k \bar{e_k} \equiv x_k - \bar{\hat{x}_k} \\ e_k \equiv x_k - \hat{x}_k ek​ˉ​≡xk​−x^k​ˉ​ek​≡xk​−x^k​
对应的误差协方差矩阵为:
P k ˉ = E [ e k ˉ e ˉ k T ] P k = E [ e k e k T ] \bar{P_k} = E[\bar{e_k}\bar{e}_{k}^T] \\ P_k = E[e_ke_{k}^T] Pk​ˉ​=E[ek​ˉ​eˉkT​]Pk​=E[ek​ekT​]
然后为了使后验状态估计 x ^ k \hat{x}_k x^k​ 最优,那么目标就是最小化后验状态估计的误差协方差矩阵 P k P_k Pk​ 值。

后验误差

根据公式(1.1),(2.2),(1.2),(2.1)可以得到:
e k = x k − x ^ k = x k − ( x ^ k ˉ + K k ( z k − H x ^ k ˉ ) ) = x k − ( x ^ k ˉ + K k ( ( H x k + v ) − H x ^ k ˉ ) ) = x k − x ^ k ˉ − K k H x k − K k v + K k H x ^ k ˉ = ( I − K k H ) ( x k − x ^ k ˉ ) − K k v = ( I − K k H ) e k ˉ − K k v

ek=xk−x^k=xk−(x^k¯+Kk(zk−Hx^k¯))=xk−(x^k¯+Kk((Hxk+v)−Hx^k¯))=xk−x^k¯−KkHxk−Kkv+KkHx^k¯=(I−KkH)(xk−x^k¯)−Kkv=(I−KkH)ek¯−Kkv" role="presentation" style="position: relative;">ek=xk−x^k=xk−(x^k¯+Kk(zk−Hx^k¯))=xk−(x^k¯+Kk((Hxk+v)−Hx^k¯))=xk−x^k¯−KkHxk−Kkv+KkHx^k¯=(I−KkH)(xk−x^k¯)−Kkv=(I−KkH)ek¯−Kkvek=xk−x^k=xk−(x^k¯+Kk(zk−Hx^k¯))=xk−(x^k¯+Kk((Hxk+v)−Hx^k¯))=xk−x^k¯−KkHxk−Kkv+KkHx^k¯=(I−KkH)(xk−x^k¯)−Kkv=(I−KkH)ek¯−Kkv

ek​​=xk​−x^k​=xk​−(x^k​ˉ​+Kk​(zk​−Hx^k​ˉ​))=xk​−(x^k​ˉ​+Kk​((Hxk​+v)−Hx^k​ˉ​))=xk​−x^k​ˉ​−Kk​Hxk​−Kk​v+Kk​Hx^k​ˉ​=(I−Kk​H)(xk​−x^k​ˉ​)−Kk​v=(I−Kk​H)ek​ˉ​−Kk​v​
所以带入展开可得:
e k e k T = [ ( I − K k H ) e k ˉ − K k v ] [ ( I − K k H ) e k ˉ − K k v ] T = ( I − K k H ) e k ˉ e k ˉ T ( I − K k H ) T − K k v e k ˉ T ( I − K k H ) T − ( I − K k H ) e k ˉ v T K k T + K k v v T K k T

ekekT=[(I−KkH)ek¯−Kkv][(I−KkH)ek¯−Kkv]T=(I−KkH)ek¯ek¯T(I−KkH)T−Kkvek¯T(I−KkH)T−(I−KkH)ek¯vTKkT+KkvvTKkT" role="presentation" style="position: relative;">ekeTk=[(I−KkH)ek¯−Kkv][(I−KkH)ek¯−Kkv]T=(I−KkH)ek¯ek¯T(I−KkH)T−Kkvek¯T(I−KkH)T−(I−KkH)ek¯vTKTk+KkvvTKTkekekT=[(I−KkH)ek¯−Kkv][(I−KkH)ek¯−Kkv]T=(I−KkH)ek¯ek¯T(I−KkH)T−Kkvek¯T(I−KkH)T−(I−KkH)ek¯vTKkT+KkvvTKkT

ek​ekT​​=[(I−Kk​H)ek​ˉ​−Kk​v][(I−Kk​H)ek​ˉ​−Kk​v]T=(I−Kk​H)ek​ˉ​ek​ˉ​T(I−Kk​H)T−Kk​vek​ˉ​T(I−Kk​H)T−(I−Kk​H)ek​ˉ​vTKkT​+Kk​vvTKkT​​
又 e k ˉ \bar{e_k} ek​ˉ​ 是 z 1 , ⋯   , z k − 1 z_{1} , \cdots , z_{k - 1} z1​,⋯,zk−1​ 的线性函数,和当前 z k z_k zk​ 无关,所以:

E ( e k ˉ v T ) = 0 E ( v e k ˉ T ) = 0 E(\bar{e_k}v^T) = 0 \\ E(v\bar{e_k}^T) = 0 E(ek​ˉ​vT)=0E(vek​ˉ​T)=0

带入整理得到:
P k = E [ e k e k T ] = ( I − K k H ) P k ˉ ( I − K k H ) T + K k R K k T = P k ˉ − K k H P k ˉ − P k ˉ H T K k T + K k H P k ˉ H T K k T + K k R K k T

Pk=E[ekekT]=(I−KkH)Pk¯(I−KkH)T+KkRKkT=Pk¯−KkHPk¯−Pk¯HTKkT+KkHPk¯HTKkT+KkRKkT" role="presentation" style="position: relative;">Pk=E[ekeTk]=(I−KkH)Pk¯(I−KkH)T+KkRKTk=Pk¯−KkHPk¯−Pk¯HTKTk+KkHPk¯HTKTk+KkRKTkPk=E[ekekT]=(I−KkH)Pk¯(I−KkH)T+KkRKkT=Pk¯−KkHPk¯−Pk¯HTKkT+KkHPk¯HTKkT+KkRKkT

Pk​=E[ek​ekT​]​=(I−Kk​H)Pk​ˉ​(I−Kk​H)T+Kk​RKkT​=Pk​ˉ​−Kk​HPk​ˉ​−Pk​ˉ​HTKkT​+Kk​HPk​ˉ​HTKkT​+Kk​RKkT​​
合并 K k K_k Kk​ 项目:
P k = P k ˉ − P k ˉ H T ( H P k ˉ H T + R ) − 1 H P k ˉ + [ K k − P k ˉ H T ( H P k ˉ H T + R ) − 1 ] ( H P k ˉ H T + R ) [ K k − P k ˉ H T ( H P k ˉ H T + R ) − 1 ] T

Pk=Pk¯−Pk¯HT(HPk¯HT+R)−1HPk¯+[Kk−Pk¯HT(HPk¯HT+R)−1](HPk¯HT+R)[Kk−Pk¯HT(HPk¯HT+R)−1]T" role="presentation" style="position: relative;">Pk=Pk¯−Pk¯HT(HPk¯HT+R)−1HPk¯+[Kk−Pk¯HT(HPk¯HT+R)−1](HPk¯HT+R)[Kk−Pk¯HT(HPk¯HT+R)−1]TPk=Pk¯−Pk¯HT(HPk¯HT+R)−1HPk¯+[Kk−Pk¯HT(HPk¯HT+R)−1](HPk¯HT+R)[Kk−Pk¯HT(HPk¯HT+R)−1]T

Pk​​=Pk​ˉ​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1HPk​ˉ​+[Kk​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1](HPk​ˉ​HT+R)[Kk​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1]T​

具体合并的过程其实利用最基本的矩阵运算就可以解决,这里主要是矩阵运算可能不那么直观,如果把它想象成正常的以 K k K_k Kk​
为未知数的一元二次方程,可能就很好理解了。首先我们目标是合并 K k K_k Kk​ 项,先考虑二次项部分: K k H P k ˉ H T K k T + K k R K k T = K k ( H P k ˉ H T + R ) K k T

KkHPk¯HTKkT+KkRKkT=Kk(HPk¯HT+R)KkT" role="presentation" style="position: relative;">KkHPk¯HTKTk+KkRKTk=Kk(HPk¯HT+R)KTkKkHPk¯HTKkT+KkRKkT=Kk(HPk¯HT+R)KkT

Kk​HPk​ˉ​HTKkT​+Kk​RKkT​​=Kk​(HPk​ˉ​HT+R)KkT​​ 然后把剩余的两个一次项添加上面合并好的二次项里面,为了抵消上面中间项 H P k ˉ H T + R H\bar{P_k}H^T + R HPk​ˉ​HT+R,所以在添加的时候会额外乘以一个 ( H P k ˉ H T + R ) − 1 (H\bar{P_k}H^T + R)^{-1} (HPk​ˉ​HT+R)−1,然后直接就合并好了所有的 K k K_k Kk​ 项: [ K k − P k ˉ H T ( H P k ˉ H T + R ) − 1 ] ( H P k ˉ H T + R ) [ K k − P k ˉ H T ( H P k ˉ H T + R ) − 1 ] T \left[ K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1}\right ](H\bar{P_k}H^T + R)\left[K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} \right ]^T [Kk​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1](HPk​ˉ​HT+R)[Kk​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1]T 当然这里还有个问题是上面合并项里面会多出来一下之前不存在的项,把上面合并好的公式展开然后减去最开始的 K k K_k Kk​
项,得到了不包含 K k K_k Kk​ 项的一些补偿项,这样把补偿项添加回去就完成了。

上面的式子中前两项不包含 K k K_k Kk​ 因子,所以如果要最小化 P k P_k Pk​,只需:
K k − P k ˉ H T ( H P k ˉ H T + R ) − 1 = 0 K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} = 0 Kk​−Pk​ˉ​HT(HPk​ˉ​HT+R)−1=0
所以得到:
K k = P k ˉ H T ( H P k ˉ H T + R ) − 1 ( 2.5 ) K_k = \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} \qquad {(2.5)} Kk​=Pk​ˉ​HT(HPk​ˉ​HT+R)−1(2.5)
然后可以得到:
P k = ( I − K k H ) P k ˉ ( 2.4 ) P_k = (I-K_kH)\bar{P_k} \qquad {(2.4)} Pk​=(I−Kk​H)Pk​ˉ​(2.4)

先验误差

带入上面的公式(1.1),(2.1)可以得到:
e k ˉ = x k − x ^ ˉ k = ( A x k − 1 + w ) − ( A x ^ k − 1 ) = A ( x k − 1 − x ^ k − 1 ) + w = A e k − 1 + w

ek¯=xk−x^¯k=(Axk−1+w)−(Ax^k−1)=A(xk−1−x^k−1)+w=Aek−1+w" role="presentation" style="position: relative;">ek¯=xk−x^¯k=(Axk−1+w)−(Ax^k−1)=A(xk−1−x^k−1)+w=Aek−1+wek¯=xk−x^¯k=(Axk−1+w)−(Ax^k−1)=A(xk−1−x^k−1)+w=Aek−1+w

ek​ˉ​​=xk​−x^ˉk​=(Axk−1​+w)−(Ax^k−1​)=A(xk−1​−x^k−1​)+w=Aek−1​+w​
所以带入展开可得:
e k ˉ e ˉ k T = ( A e k − 1 + w ) ( A e k − 1 + w ) T = A e k − 1 e k − 1 T A T + w w T + w e k − 1 T A T + A e k − 1 w T

ek¯e¯kT=(Aek−1+w)(Aek−1+w)T=Aek−1ek−1TAT+wwT+wek−1TAT+Aek−1wT" role="presentation" style="position: relative;">ek¯e¯Tk=(Aek−1+w)(Aek−1+w)T=Aek−1eTk−1AT+wwT+weTk−1AT+Aek−1wTek¯e¯kT=(Aek−1+w)(Aek−1+w)T=Aek−1ek−1TAT+wwT+wek−1TAT+Aek−1wT

ek​ˉ​eˉkT​​=(Aek−1​+w)(Aek−1​+w)T=Aek−1​ek−1T​AT+wwT+wek−1T​AT+Aek−1​wT​

又因为:
E ( e k − 1 w T ) = 0 E ( w e k − 1 T ) = 0 E(e_{k-1}w^T) = 0 \\ E(we_{k-1}^T) = 0 E(ek−1​wT)=0E(wek−1T​)=0

然后可以得到:
P k ˉ = E [ e k ˉ e ˉ k T ] = A P k − 1 A T + Q ( 2.3 ) \bar{P_k} = E[\bar{e_k}\bar{e}_{k}^T] = AP_{k-1}A^T + Q \qquad {(2.3)} Pk​ˉ​=E[ek​ˉ​eˉkT​]=APk−1​AT+Q(2.3)

基本分析

从上面的公式可以看出来,如果过程误差 P k ˉ = 0 \bar{P_k} = 0 Pk​ˉ​=0 ,那么 K k = 0 K_k = 0 Kk​=0 ,可以 得到 x ^ k = x ^ k ˉ = A x ^ k − 1 \hat{x}_k = \bar{\hat{x}_k} = A\hat{x}_{k-1} x^k​=x^k​ˉ​=Ax^k−1​ ,完全相信以前估计的值,这样就是为啥不能设置 P 0 = 0 P_0 = 0 P0​=0 。当然给 Q Q Q 赋值可能能解决这个问题,而且不能设置太小,这样手动引入较大的过程误差,估计结果很不平滑,后面示例3也会讲解。对于 R R R 的变化对结果的作用后面的示例会介绍,同理 R R R 设置太大也会导致这样的结果。在这种情况下,如果初始时设置的不正确,整个估计都是错误的。

基本公式

最后得到了上面的上面(2.1)-(2.5)五个方程式,是经典的卡尔曼滤波的五个基本公式,利用这五个公式就可以完成卡尔曼滤波的求解过程。根据迭代过程分成两个方程集合,一个是time update方程,一个是measurement update方程,如下:

Time Update Measurement Update
x ^ k ˉ = A x ^ k − 1 \bar{\hat{x}_k} = A\hat{x}_{k-1} x^k​ˉ​=Ax^k−1​ K k = P k ˉ H T ( H P k ˉ H T + R ) − 1 K_k = \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} Kk​=Pk​ˉ​HT(HPk​ˉ​HT+R)−1
P k ˉ = A P k − 1 A T + Q \bar{P_k} = AP_{k-1}A^T + Q Pk​ˉ​=APk−1​AT+Q x ^ k = x ^ k ˉ + K k ( z k − H x ^ k ˉ ) \hat{x}_k = \bar{\hat{x}_k} + K_k(z_k - H\bar{\hat{x}_k}) x^k​=x^k​ˉ​+Kk​(zk​−Hx^k​ˉ​)
P k = ( I − K k H ) P k ˉ P_k = (I - K_kH)\bar{P_k} Pk​=(I−Kk​H)Pk​ˉ​

迭代过程

得到上面的基本公式以后,就可以计算计算后面的状态,但是公式中有一些参数是未知的,需要定义,如下:

u u u 变量一般来说是被忽略的;

A A A , B B B , H H H 上面提到对于每个状态 k k k 都是相同的,同时大部分情况下都是单位矩阵(复杂的计算这里不考虑,由具体应用决定);

R R R 一般来说是相对简单可以求到的,就是仪器的噪声协方差;

Q Q Q 就很难直接的获得,也没有特定的方法,一般是系统过程比较稳定,也就是没有过程噪声;

z z z 所有状态的的测量值都是由仪器测量得到的是已知的;

对于 R R R 和 Q Q Q 的取值来说不是特别重要,虽然可能这两个参数估计的不是很准确(不可能符合纯粹的高斯或者正太分布),但是实际情况中卡尔曼滤波算法也可以得到整的比较准确态估计,但是需要记住的是:

The better you estimate the noise parameters, the better estimates you get.

那么这样只需要传入基本的 x ^ 0 \hat{x}_0 x^0​ 和 P 0 P_0 P0​ 就可以了,一般来说需要进行指定。对于 x ^ 0 \hat{x}_0 x^0​ 来说不需要什么技巧,因为随着卡尔曼滤波算法的运行, x x x 会逐渐的收敛。但是对于 P 0 P_0 P0​ ,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的 x ^ 0 \hat{x}_0 x^0​ 是系统最优的,从而使算法不能收敛。

算法迭代过程如下图(其中 u u u 控制输入一般是忽略的):

参考

  1. Kalman Filter For Dummies
  2. Greg Welch, Gary Bishop, “An Introduction to the Kalman Filter”, University of North Carolina at Chapel Hill Department of Computer Science, 2001
  3. 一个应用实例详解卡尔曼滤波及其算法实现
  4. 卡尔曼滤波算法–核心公式推导导论
(0)

相关推荐

  • 【强基固本】卡尔曼滤波器

    转载来源:https://longaspire.github.io/blog/卡尔曼滤波/ Kalman Filter (KF) 是一个高效的递归滤波器,它可以实现从一系列的噪声观测中,估计动态系统的 ...

  • 基于MATLAB&SIMULINK开发自动驾驶系统第五讲之扩展卡尔曼滤波

    当物体运动遵循非线性状态方程或测量值是状态的非线性函数时,使用扩展卡尔曼滤波器.一个简单的例子是,当物体的状态或测量值是以球面坐标计算的,如方位角.海拔和范围. 5.1状态更新模型 扩展的卡尔曼滤波公 ...

  • 【译】图解卡尔曼滤波(Kalman Filter)

    译者注:这恐怕是全网有关卡尔曼滤波最简单易懂的解释,如果你认真的读完本文,你将对卡尔曼滤波有一个更加清晰的认识,并且可以手推卡尔曼滤波.原文作者使用了漂亮的图片和颜色来阐明它的原理(读起来并不会因公式 ...

  • 基于MATLAB&SIMULINK开发自动驾驶系统第四讲之线性卡尔曼滤波

    卡尔曼滤波是目前行业中做感知算法和感知融合算法必用的算法,因此小明师兄和大家一起来学习一下. 当使用卡尔曼滤波器跟踪物体时,会使用一连串的探测量或测量量来构建物体运动的模型.物体运动是由物体状态的变化 ...

  • 卡尔曼滤波最完整公式推导

    作者丨东林钟声@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/341440139 编辑丨极市平台 极市导读 卡尔曼滤波能够很好地从带有噪声的数据过程中估计状态,而且卡 ...

  • 胎元命宫详解

    胎元命宫详解 胎元命宫 8.1 胎元 胎, 指人受精怀胎的月份. 其起法是: 人生月后紧接着这个月的天干与生月后第三个月的地支相配, 就为胎元. 如1998年八月生人, 八月为辛酉, 辛后一干是壬, ...

  • 批八字算婚姻详解

    批八字算婚姻详解 很多人喜欢在孩子一出生的时候就给他们算一下八字,因为他们相信孩子的八字和命运是相对注定了的,通过算命之后可以顺利的避免一些可能在生活中遇到的一些问题和坎坷,也可以顺利度过一些&quo ...

  • 电视选购12个重要参数详解,看完你就是专家,附:爆款推荐

    本内容来源于@什么值得买APP,观点仅代表作者本人 |作者:白云上的鱼 创作立场声明:分享电视选购知识,重要参数详解,轻松搞定电视选购. 目前电视的选择太多太多了,品牌百花齐放琳琅满目,各种高科技加成 ...

  • 倪海厦:病是问出来的|问诊十法详解

    倪海厦,美国经方中医,被喻为当代少见的"命.相.卜.山.医"五术兼备之旷世奇人. (倪师)中医的问诊十个法则 我们经方家的问诊非常重要,因此有必要为读者说明一下,如何找经方家看病, ...

  • 为何医生让他把氨氯地平换成缬沙坦?药师详解两类降压药的好与坏

    硝苯地平.氨氯地平.缬沙坦.氯沙坦等等,这些降压药都是高血压患者常用的降压药.从名字中也可以看出这些降压药属于两类不同的降压药,一种是地平类,即为钙离子拮抗剂(CCB),另外一种是沙坦类,即为血管紧张 ...

  • 几何探究类压轴题:精编20例及详解

    成才路上 初中精品学习资料 104篇原创内容 公众号 / END /

  • 高考物理11类重点题型全解析! 附经典例题&详解

    高考理科综合卷中,物理部分选择题有单项和双项选择题两种题型.从最近几年的试题看: 4道单项选择难度低,考查的考点相对稳定且相对单一,涉及的知识点主要有共点力平衡.热力学第一定律.气体状态方程.分子动理 ...

  • 【同步讲练】七年级下册:二元一次方程组七种典型例题详解,一次解决应用问题!

    【同步讲练】七年级下册:二元一次方程组七种典型例题详解,一次解决应用问题!

  • 行书基础笔法详解,以兰亭序为例,建议收藏学习

    学好行书 4篇原创内容 公众号 欢迎您查看行书名帖 在行书的书写中,我们一方面要注意其字形,另一方面更要注意笔画的写法,因为笔画是字的基本构成元素.因此,把握好每个笔画的写法是最为重要的一个学习环节. ...