EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 行者~ABC 于 2020-1-7 13:25 编辑 + }1 Y8 ?* }% K, }3 v0 U, _: @
! X$ j M0 M, g7 ]+ B* |2 O6 T' T7 F; n5 D+ c& W! _. {
什么是卡尔曼滤波?
1 B/ m) T j3 h" E你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。
' F! i/ r0 }4 S6 Q1 y在连续变化的系统中使用卡尔曼滤波是非常理想的,它具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),并且速度很快,很适合应用于实时问题和 嵌入式系统。
- A& J2 ^6 f4 `- f2 v在Google上找到的大多数关于实现卡尔曼滤波的数学公式看起来有点晦涩难懂,这个状况有点糟糕。实际上,如果以正确的方式看待它,卡尔曼滤波是非常简单和容易理解的,下面我将用漂亮的图片和色彩清晰的阐述它,你只需要懂一些基本的概率和矩阵的知识就可以了。
7 G/ D. M0 I' _$ i我们能用卡尔曼滤波做什么?
8 f1 q* D$ w: j用玩具举例:你开发了一个可以在树林里到处跑的小机器人,这个机器人需要知道它所在的确切位置才能导航。
0 a3 K$ R g. Y8 P$ F3 f
3 t/ K9 S2 P U3 _2 t1 E. [/ u) g1 b0 U. j
注意这个状态只是关于这个系统基本属性的一堆数字,它可以是任何其它的东西。在这个例子中是位置和速度,它也可以是一个容器中液体的总量,汽车发动机的温度,用户手指在触摸板上的位置坐标,或者任何你需要跟踪的信号。 % o" C; ?; C) t! [; D7 W2 c
这个机器人带有GPS,精度大约为10米,还算不错,但是,它需要将自己的位置精确到10米以内。树林里有很多沟壑和悬崖,如果机器人走错了一步,就有可能掉下悬崖,所以只有GPS是不够的。 ) R' h- W7 `. b& i, S$ ~/ ]. Y
或许我们知道一些机器人如何运动的信息:例如,机器人知道发送给电机的指令,知道自己是否在朝一个方向移动并且没有人干预,在下一个状态,机器人很可能朝着相同的方向移动。当然,机器人对自己的运动是一无所知的:它可能受到风吹的影响,轮子方向偏了一点,或者遇到不平的地面而翻倒。所以,轮子转过的长度并不能精确表示机器人实际行走的距离,预测也不是很完美。
) q6 d3 [. g# s5 KGPS 传感器告诉了我们一些状态信息,我们的预测告诉了我们机器人会怎样运动,但都只是间接的,并且伴随着一些不确定和不准确性。但是,如果使用所有对我们可用的信息,我们能得到一个比任何依据自身估计更好的结果吗?回答当然是YES,这就是卡尔曼滤波的用处。
- z" U0 ]7 k, u. g- j* x卡尔曼滤波是如何看到你的问题的
2 z. ^8 F& F D; }& \+ \( o下面我们继续以只有位置和速度这两个状态的简单例子做解释。
5 _' \3 K# r1 p9 T# @我们并不知道实际的位置和速度,它们之间有很多种可能正确的组合,但其中一些的可能性要大于其它部分: $ I: Q6 f( b+ l1 T/ u+ p& ~
& k, f0 v5 t0 _. f& U% S& C
卡尔曼滤波假设两个变量(位置和速度,在这个例子中)都是随机的,并且服从高斯分布。每个变量都有一个均值 μ,表示随机分布的中心(最可能的状态),以及方差 ![]() ,表示不确定性。 ! R0 a# A; ^; `! r% m
h+ W; ^3 W$ A; J6 p在上图中,位置和速度是不相关的,这意味着由其中一个变量的状态无法推测出另一个变量可能的值。下面的例子更有趣:位置和速度是相关的,观测特定位置的可能性取决于当前的速度:
/ i) ? m( X5 s2 l# T$ N; h: J; C. s5 n8 _: r, ~- S8 a
这种情况是有可能发生的,例如,我们基于旧的位置来估计新位置。如果速度过高,我们可能已经移动很远了。如果缓慢移动,则距离不会很远。跟踪这种关系是非常重要的,因为它带给我们更多的信息:其中一个测量值告诉了我们其它变量可能的值,这就是卡尔曼滤波的目的,尽可能地在包含不确定性的测量数据中提取更多信息! ) s: w$ w* H1 F4 p5 u+ v
0 U3 H) r$ M8 S1 ~: _. V
使用矩阵来描述问题
' B' r+ R# ?2 U' y) {! i" h' A% m$ o) j- M2 r& L0 \
9 f& D- a2 f& S4 h% H4 c" Q4 n8 l, j0 M' i$ J. p
(当然,在这里我们只用到了位置和速度,实际上这个状态可以包含多个变量,代表任何你想表示的信息)。接下来,我们需要根据当前状态(k-1 时刻)来预测下一状态(k 时刻)。记住,我们并不知道对下一状态的所有预测中哪个是“真实”的,但我们的预测函数并不在乎。它对所有的可能性进行预测,并给出新的高斯分布。
5 Z7 k9 G* o: |' y1 h" f |5 J; i2 v
4 |+ }3 k# d9 A. d
! ^- _, p9 ]7 |! U7 Q# V2 q+ ]! d% Q7 W! F$ `9 \% v/ | T
它将我们原始估计中的每个点都移动到了一个新的预测位置,如果原始估计是正确的话,这个新的预测位置就是系统下一步会移动到的位置。那我们又如何用矩阵来预测下一个时刻的位置和速度呢?下面用一个基本的运动学公式来表示: 2 a9 m9 d5 O5 _9 I
) M) s8 u4 ]( W& _; `, w6 i' b8 h现在,我们有了一个预测矩阵来表示下一时刻的状态,但是,我们仍然不知道怎么更新协方差矩阵。此时,我们需要引入另一个公式,如果我们将分布中的每个点都乘以矩阵 A,那么它的协方差矩阵 ![]() 会怎样变化呢?很简单,下面给出公式: ( Q J6 L& h9 h) N
) X( V6 {- ^* G9 Z' i0 m% ]: }1 f外部控制量 4 v1 O8 n7 `) ?% Z
我们并没有捕捉到一切信息,可能存在外部因素会对系统进行控制,带来一些与系统自身状态没有相关性的改变。
& ]' `$ M( o3 h: F/ u* E$ t4 z* {* K以火车的运动状态模型为例,火车司机可能会操纵油门,让火车加速。相同地,在我们机器人这个例子中,导航软件可能会发出一个指令让轮子转向或者停止。如果知道这些额外的信息,我们可以用一个向量 ![]() 来表示,将它加到我们的预测方程中做修正。 4 o: A, o1 n/ B5 L, U/ C9 b, w4 e
假设由于油门的设置或控制命令,我们知道了期望的加速度 ![]() ,根据基本的运动学方程可以得到: 0 ?) w- ^' _* a( y/ H
; f" H! h0 V. W- j( _* l3 r8 A
% L4 |2 n& W- ?7 K; G% z7 o2 Z" Z外部干扰 / i0 E1 U5 \4 g) ^( j g
如果这些状态量是基于系统自身的属性或者已知的外部控制作用来变化的,则不会出现什么问题。 9 p. C# E+ _3 C/ ]) s
但是,如果存在未知的干扰呢?例如,假设我们跟踪一个四旋翼飞行器,它可能会受到风的干扰,如果我们跟踪一个轮式机器人,轮子可能会打滑,或者路面上的小坡会让它减速。这样的话我们就不能继续对这些状态进行跟踪,如果没有把这些外部干扰考虑在内,我们的预测就会出现偏差。
; s+ ?# Z( v% f4 {. d' l8 @在每次预测之后,我们可以添加一些新的不确定性来建立这种与“外界”(即我们没有跟踪的干扰)之间的不确定性模型:
& w% f, F+ V6 @( M7 |% m& S- M6 g, i
% u) j! g! o$ |这产生了具有不同协方差(但是具有相同的均值)的新的高斯分布。
4 l! P2 C* S& D5 ~2 g$ H S
7 t4 b+ _: b+ p- j" W+ E. U
% h) H" N" o+ O- U5 E5 W' f/ {, J! l" K0 S. d$ O
用测量值来修正估计值
& f0 Y0 Y: L9 K; [我们可能会有多个传感器来测量系统当前的状态,哪个传感器具体测量的是哪个状态变量并不重要,也许一个是测量位置,一个是测量速度,每个传感器间接地告诉了我们一些状态信息。
1 w! X' L/ F; K( k8 p' V
+ l- \: f( l0 n. k' P& J1 R- x5 W [+ {. U* c: p
卡尔曼滤波的一大优点就是能处理传感器噪声,换句话说,我们的传感器或多或少都有点不可靠,并且原始估计中的每个状态可以和一定范围内的传感器读数对应起来。 # ~$ c h& J, e0 u
从测量到的传感器数据中,我们大致能猜到系统当前处于什么状态。但是由于存在不确定性,某些状态可能比我们得到的读数更接近真实状态。
; t& N: `" e. X% v% o+ W% s" b2 c我们必须在预测值(粉红色)和传感器测量值(绿色)之间找到最优解。
6 R) q2 B' H a+ g, [1 Z! y那么,我们最有可能的状态是什么呢?对于任何可能的读数 ![]() ,有两种情况:(1)传感器的测量值;(2)由前一状态得到的预测值。如果我们想知道这两种情况都可能发生的概率,将这两个高斯分布相乘就可以了。
+ N2 z; s7 y3 A3 N" |7 h: o
( V1 R- Q- B# w* S* h剩下的就是重叠部分了,这个重叠部分的均值就是两个估计最可能的值,也就是给定的所有信息中的最优估计。
' x7 T% U: X: p6 f# [瞧!这个重叠的区域看起来像另一个高斯分布。
# X$ u3 w1 c) [ f9 N/ ~+ q( l! \/ U w0 I# ?& M* [
如你所见,把两个具有不同均值和方差的高斯分布相乘,你会得到一个新的具有独立均值和方差的高斯分布!下面用公式讲解。 1 n8 o# Q* G% \& F* x. y
融合高斯分布 - e' Y* P2 U( c6 d6 L0 e
* |4 U0 c" B0 \0 G
+ j$ Z4 K! a% Y T
2 f) i- h9 J9 D# N: Q* ~- U
/ L! W4 @' ~1 R A( N, Z2 D" h0 ^3 W& V% b* F, _
* b3 b0 `9 z. C4 Y: E总结
! @2 b- E* I: p- h0 ~" N以上所有公式中,你只需要用到式(7)、(18)、(19)。(如果忘了的话,你可以根据式(4)和(15)重新推导一下)
7 t' e+ I: \, t! w, u! {我们可以用这些公式对任何线性系统建立精确的模型,对于非线性系统来说,我们使用扩展卡尔曼滤波,区别在于EKF多了一个把预测和测量部分进行线性化的过程。
( `1 _* @# m o0 n8 F |