在卡尔曼滤波器原理之基本思想(二)中,分析了完整的基本思想和推导过程,这里抽点时间就上次遗留的问题及实际使用中会碰到的问题做下分析。这里会直接取上述博客中的结论,如果看起来比较吃力的话,可以先去熟悉一下。先直接把卡尔曼滤波器的主要步骤拿过来:
[egin{array}{l}
{f{G}}(n) = {f{F}}(n + 1,n){f{K}}(n,n -
1){{f{C}}^H}(n){[{f{C}}(n){f{K}}(n,n - 1){{f{C}}^H}(n) +
{{f{Q}}_2}(n)]^{ - 1}} \
alpha (n) = y(n) - {f{C}}(n)hat x(n|{{f{y}}_{n - 1}}) \
hat x(n + 1|{{f{y}}_n}) = {f{F}}(n + 1,n)hat x(n|{{f{y}}_{n - 1}}) + {f{G}}(n)alpha (n) \
{f{K}}(n) = {f{K}}(n,n - 1) - {f{F}}(n,n + 1){f{G}}(n){f{C}}(n){f{K}}(n,n - 1) \
{f{K}}(n + 1,n) = {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
end{array}]
看起来还是有点过于复杂,这里再把Riccati递归方程稍变化一下,整理如下:
[egin{array}{l}
{f{K}}(n + 1,n) = {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
{f{G}}(n) = {f{F}}(n + 1,n){f{K}}(n,n - 1){{f{C}}^H}(n){[{f{C}}(n){f{K}}(n,n - 1){{f{C}}^H}(n) + {{f{Q}}_2}(n)]^{ - 1}} \
alpha (n) = y(n) - {f{C}}(n)hat x(n|{{f{y}}_{n - 1}}) \
hat x(n + 1|{{f{y}}_n}) = {f{F}}(n + 1,n)hat x(n|{{f{y}}_{n - 1}}) + {f{G}}(n)alpha (n) \
{f{K}}(n) = [{f{I}} - {{f{G}}_n}{{f{C}}_n}]{{f{K}}_{n - 1}} \
end{array}]
另外,还有一个问题,涉及到最初对状态方程进行建模的问题,由于假设系统当前状态只前一个状态和过程噪声有关$x(n + 1) = {f{F}}(n + 1,n)x(n) + {v_1}(n)$,很多情况下,这并不符合实际情况,通常当前状态还与当前系统的状态输入有关$x(n + 1) = {f{F}}(n + 1,n)x(n) + {f{B}}u(n) + {v_1}(n)$,这里$u(n)$表示影响系统当前状态的输入因素,现在来看一看,当考虑系统状态输入时,状态协方差方程有什么变化。对新的状态方程两边取期望。
[Eleft[ {x(n + 1)} ight] = {f{F}}(n + 1,n)Eleft[ {x(n)} ight] + {f{B}}u(n)]
于是,新的状态协方差可以表示为
[egin{array}{l}
{f{K}}(n + 1,n) = left[ {x(n + 1) - Eleft[ {x(n + 1)}
ight]}
ight]{left[ {x(n + 1) - Eleft[ {x(n + 1)}
ight]}
ight]^T} \
= left[ {{f{F}}(n + 1,n)x(n) + {f{B}}u(n) + {v_1}(n) - Eleft[ {x(n + 1)}
ight]}
ight]{left[ {{f{F}}(n + 1,n)x(n) + {f{B}}u(n) + {v_1}(n) - Eleft[ {x(n + 1)}
ight] - Eleft[ {x(n + 1)}
ight]}
ight]^T} \
= left[ {{f{F}}(n + 1,n)left( {x(n) - Eleft[ {x(n)}
ight]}
ight) + {v_1}(n)}
ight]{left[ {{f{F}}(n + 1,n)left( {x(n) - Eleft[ {x(n)}
ight]}
ight) + {v_1}(n)}
ight]^T} \
= {f{F}}(n + 1,n)left( {x(n) - Eleft[ {x(n)}
ight]}
ight){left( {x(n) - Eleft[ {x(n)}
ight]}
ight)^T}{f{F}}{(n + 1,n)^T} + {{f{Q}}_1}(n) + {f{F}}(n + 1,n)left( {x(n) - Eleft[ {x(n)}
ight]}
ight){v_1}{(n)^T} + {v_1}(n){left[ {{f{F}}(n + 1,n)left( {x(n) - Eleft[ {x(n)}
ight]}
ight)}
ight]^T} \
= {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
end{array}]
也就是说,即便当前状态有输入信号的影响,其协方差依然与没有输入信号时是一样的,这个方程也称为Lyapunov方程,学过系统控制的朋友可能会比较熟悉一些。因此,当考虑系统输入时,重新整理卡尔曼滤波器更新过程
[egin{array}{l}
{f{K}}(n + 1,n) = {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
{f{G}}(n) = {f{F}}(n + 1,n){f{K}}(n,n - 1){{f{C}}^H}(n){[{f{C}}(n){f{K}}(n,n - 1){{f{C}}^H}(n) + {{f{Q}}_2}(n)]^{ - 1}} \
alpha (n) = y(n) - {f{C}}(n)hat x(n|{{f{y}}_{n - 1}}) \
hat x(n + 1|{{f{y}}_n}) = {f{F}}(n + 1,n)hat x(n|{{f{y}}_{n - 1}}) + {f{B}}u(n) + {f{G}}(n)alpha (n) \
{f{K}}(n) = [{f{I}} - {{f{G}}_n}{{f{C}}_n}]{{f{K}}_{n - 1}} \
end{array}]
以上即为kalman滤波器更换新公式,基本上到这里对原理的分析就可以结束了。另外,发现kalman滤波器的更新过程网络上或者一些书中还有一套不同的符号表达,这里也列出出来,方便做对比(符号表达不同,意义一致)
[egin{array}{l}
{x_k} = {F_{k - 1}}{x_{k - 1}} + {G_{k - 1}}{u_{k - 1}} + {w_{k - 1}}\
{y_k} = {H_k}{x_k} + {v_k}
end{array}]
[egin{array}{l}
P_k^ - = {F_{k - 1}}P_{k - 1}^ + F_{k - 1}^T + {Q_{k - 1}}\
{K_k} = P_k^ - H_k^T{left( {{H_k}P_k^ - H_k^T + {R_k}}
ight)^{ - 1}}\
hat x_k^ - = {F_{k - 1}}hat x_k^ + + {G_{k - 1}}{u_{k - 1}}\
hat x_k^ + = hat x_k^ - + {K_k}left( {y - {H_k}hat x_k^ - }
ight)\
P_k^ + = left( {I - {K_k}{H_k}}
ight)P_k^ - {left( {I - {K_k}{H_k}}
ight)^T} + {K_k}{R_k}K_k^T\
= (I - {K_k}{H_k})P_k^ - \
= {left[ {{{left( {P_k^ - }
ight)}^{ - 1}} + H_k^TR_k^{ - 1}{K_k}}
ight]^{ - 1}}
end{array}]