卡尔曼滤波(Kalman Filter,KF)以贝叶斯滤波为理论基础,并通过假设状态量随机变量(以下简称状态量)、观测量均服从正态分布,假设过程噪声、观测噪声均服从均值为 0 的正态分布,以及假设状态转移函数和观测函数均为线性函数,实现对连续型随机过程的递推状态估计。简言之,卡尔曼滤波是在贝叶斯滤波框架下求解线性高斯问题。
在此前的文章《从概率到贝叶斯滤波》中,已经讲到贝叶斯滤波的先验概率密度函数、似然概率密度函数和后验概率密度函数:
(1) 先验概率密度函数
f X k − ( x ) = ∫ − ∞ + ∞ f Q k [ x − f ( v ) ] f X k − 1 + ( v ) d v f_{X_k}^-(x)=\int_{-\infty}^{+\infty}f_{Q_k}[x-f(v)]f_{X_{k-1}}^+(v)\mathrm{d}v fXk−(x)=∫−∞+∞fQk[x−f(v)]fXk−1+(v)dv
(2) 似然概率密度函数
f Y k ∣ X k ( y k ∣ x ) = f R k [ y k − h ( x ) ] f_{Y_k|X_k}(y_k \ | \ x) = f_{R_k}[y_k-h(x)] fYk∣Xk(yk ∣ x)=fRk[yk−h(x)]
(3) 后验概率密度函数
f X k + ( x ) = η k ⋅ f R k [ y k − h ( x ) ] ⋅ f X k − ( x ) f_{X_k}^+(x)=\eta_k·f_{R_k}[y_k-h(x)]·f_{X_k}^-(x) fXk+(x)=ηk⋅fRk[yk−h(x)]⋅fXk−(x)
其中,后验概率密度函数中的归一化常数 η k \eta_k ηk 为:
η k = { ∫ − ∞ + ∞ f R k [ y k − h ( x ) ] f X k − ( x ) d x } − 1 \eta_k=\left\{\int_{-\infty}^{+\infty}f_{R_k}[y_k-h(x)]f_{X_k}^-(x)\mathrm{d}x\right\}^{-1} ηk={∫−∞+∞fRk[yk−h(x)]fXk−(x)dx}−1
卡尔曼滤波以贝叶斯滤波为理论基础,并作了六个前提假设:
(1) 假设一:状态量服从正态分布
X ∼ N ( μ X , σ X 2 ) X \sim \mathcal{N}(\mu_X, \ \sigma_X^2) X∼N(μX, σX2)
(2) 假设二:观测量服从正态分布
Y ∼ N ( μ Y , σ Y 2 ) Y \sim \mathcal{N}(\mu_Y, \ \sigma_Y^2) Y∼N(μY, σY2)
(3) 假设三:过程噪声服从均值为 0 的正态分布
Q ∼ N ( 0 , σ Q 2 ) Q \sim \mathcal{N}(0, \ \sigma_Q^2) Q∼N(0, σQ2)
(4) 假设四:观测噪声服从均值为 0 的正态分布
Q ∼ N ( 0 , σ R 2 ) Q \sim \mathcal{N}(0, \ \sigma_R^2) Q∼N(0, σR2)
(5) 假设五:状态转移函数为线性函数
f ( X k ) = F ∗ X k − 1 + B ∗ u k f(X_k)=F*X_{k-1}+B*u_k f(Xk)=F∗Xk−1+B∗uk
其中, F F F 为状态转移比例项,对于单一状态量的卡尔曼滤波中, F F F 为一常数; B B B 为控制比例项, u k u_k uk 为控制量, B B B 和 u k u_k uk 的乘积可视为线性状态转移函数中的截距项。在简单的系统中,常常没有控制项 B B B 和 u k u_k uk。
(6) 假设六:观测函数为线性函数
h ( X k ) = H ∗ X k h(X_k)=H*X_k h(Xk)=H∗Xk
H H H 为观测比例项,对于单一状态量的卡尔曼滤波中, H H H 为一常数。
根据假设一, k − 1 k-1 k−1 时刻状态量 X k − 1 X_{k-1} Xk−1 服从均值为 μ k − 1 + \mu_{k-1}^+ μk−1+,方差为 σ k − 1 + 2 {\sigma_{k-1}^+}^2 σk−1+2 的正态分布:
X k − 1 ∼ N ( μ k − 1 + , σ k − 1 + 2 ) X_{k-1} \sim \mathcal{N}(\mu_{k-1}^+, \ {\sigma_{k-1}^+}^2) Xk−1∼N(μk−1+, σk−1+2)
X k − 1 X_{k-1} Xk−1 的后验概率密度函数为:
f X k − 1 + = 1 σ k − 1 + 2 π e − ( x − μ k − 1 + ) 2 2 σ k − 1 + 2 f_{X_{k-1}}^+=\frac{1}{\sigma_{k-1}^+\sqrt{2\pi}}e^{-\frac{(x-\mu_{k-1}^+)^2}{2{\sigma_{k-1}^+}^2}} fXk−1+=σk−1+2π1e−2σk−1+2(x−μk−1+)2
结合假设三与假设五,k 时刻状态量 X k X_k Xk 的先验概率密度函数为:
f X k − ( x ) = ∫ − ∞ + ∞ f Q k [ x − f ( v ) ] f X k − 1 + ( v ) d v = ∫ − ∞ + ∞ 1 σ Q k 2 π e − ( x − F ∗ v − B ∗ u k ) 2 2 σ Q k 2 ∗ 1 σ k − 1 + 2 π e − ( v − μ k − 1 + ) 2 2 σ k − 1 + 2 d v \begin{aligned} f_{X_k}^-(x) & = \int_{-\infty}^{+\infty}f_{Q_k}[x-f(v)]f_{X_{k-1}}^+(v)\mathrm{d}v \\ & = \int_{-\infty}^{+\infty}\frac{1}{\sigma_{Q_k}\sqrt{2\pi}}e^{-\frac{(x-F*v-B*u_k)^2}{2{\sigma_{Q_k}}^2}}*\frac{1}{\sigma_{k-1}^+\sqrt{2\pi}}e^{-\frac{(v-\mu_{k-1}^+)^2}{2{\sigma_{k-1}^+}^2}}\mathrm{d}v \end{aligned} fXk−(x)=∫−∞+∞fQk[x−f(v)]fXk−1+(v)dv=∫−∞+∞σQk2π1e−2σQk2(x−F∗v−B∗uk)2∗σk−1+2π1e−2σk−1+2(v−μk−1+)2dv
对于 f X k − ( x ) f_{X_k}^-(x) fXk−(x) 的推导,有三种方法:
这里使用 Mathematica 软件做符号推导,创建 WolframScript(.wls)脚本文件,创建 f X k − ( x ) f_{X_k}^-(x) fXk−(x) 公式:
其中, σ Q k 2 {\sigma_{Q_k}}^2 σQk2 表示 k 时刻过程噪声的方差; μ k − o n e + \mu_{k-one}^+ μk−one+ 表示 k − 1 k-1 k−1 时刻状态量的后验概率密度函数均值; σ k − o n e + 2 {\sigma_{k-one}^+}^2 σk−one+2 表示 k − 1 k-1 k−1 时刻状态量的后验概率密度函数方差。
运行代码进行化简,得到如下条件表达式结果:
条件表达式中的条件显然成立,整理表达式形式可知,先验概率密度函数 f X k − ( x ) f_{X_k}^-(x) fXk−(x) 为正态分布函数,均值和方差分别为:
μ k − = F ∗ μ k − 1 + + B ∗ u k (3.1) \mu_k^- = F*\mu_{k-1}^++B*u_k \tag{3.1} μk−=F∗μk−1++B∗uk(3.1)
σ k − 2 = F 2 ∗ σ k − 1 + 2 + σ Q k 2 (3.2) {\sigma_k^-}^2 = F^2*{\sigma_{k-1}^+}^2+{\sigma_{Q_k}}^2 \tag{3.2} σk−2=F2∗σk−1+2+σQk2(3.2)
结合假设四、假设六、公式 (3.1)、公式 (3.2),可知,k 时刻状态量 X k X_k Xk 的后验概率密度函数为:
f X k + ( x ) = η k ⋅ f R k [ y k − h ( x ) ] ⋅ f X k − ( x ) = η k ∗ 1 σ R k 2 π e − ( y k − H ∗ x ) 2 2 σ R k 2 ∗ 1 σ k − 2 π e − ( x − μ k − ) 2 2 σ k − 2 \begin{aligned} f_{X_k}^+(x) & = \eta_k·f_{R_k}[y_k-h(x)]·f_{X_k}^-(x) \\ & = \eta_k*\frac{1}{\sigma_{R_k}\sqrt{2\pi}}e^{-\frac{(y_k-H*x)^2}{2{\sigma_{R_k}}^2}}*\frac{1}{\sigma_{k}^-\sqrt{2\pi}}e^{-\frac{(x-\mu_{k}^-)^2}{2{\sigma_{k}^-}^2}} \end{aligned} fXk+(x)=ηk⋅fRk[yk−h(x)]⋅fXk−(x)=ηk∗σRk2π1e−2σRk2(yk−H∗x)2∗σk−2π1e−2σk−2(x−μk−)2
其中,归一化常数 η k \eta_k ηk 为:
η k = ∫ − ∞ ∞ 1 σ R k 2 π e − ( y k − H ∗ x ) 2 2 σ R k 2 ∗ 1 σ k − 2 π e − ( x − μ k − ) 2 2 σ k − 2 d x \eta_k=\int_{-\infty}^{\infty}\frac{1}{\sigma_{R_k}\sqrt{2\pi}}e^{-\frac{(y_k-H*x)^2}{2{\sigma_{R_k}}^2}}*\frac{1}{\sigma_{k}^-\sqrt{2\pi}}e^{-\frac{(x-\mu_{k}^-)^2}{2{\sigma_{k}^-}^2}}\mathrm{d}x ηk=∫−∞∞σRk2π1e−2σRk2(yk−H∗x)2∗σk−2π1e−2σk−2(x−μk−)2dx
创建 WolframScript(.wls)脚本文件,创建 f X k + ( x ) f_{X_k}^+(x) fXk+(x) 公式:
其中, σ R k 2 {\sigma_{R_k}}^2 σRk2 表示 k 时刻观测噪声的方差; y k y_k yk 表示 k 时刻观测量的取值。Simplify[]
函数的使用是为了简化结果。
运行代码进行化简,得到如下条件表达式结果:
条件表达式中的条件显然成立,整理表达式形式可知后验概率密度函数 f X k + ( x ) f_{X_k}^+(x) fXk+(x) 的均值和方差分别为:
μ k + = μ k − + K ∗ ( y k − H ∗ μ k − ) (3.3) \mu_k^+ = \mu_k^-+K*(y_k-H*\mu_k^-) \tag{3.3} μk+=μk−+K∗(yk−H∗μk−)(3.3)
σ k + 2 = ( 1 − K ∗ H ) ∗ σ k − 2 (3.4) {\sigma_k^+}^2 = (1-K*H)*{\sigma_k^-}^2 \tag{3.4} σk+2=(1−K∗H)∗σk−2(3.4)
μ k + \mu_k^+ μk+ 即 k 时刻状态量 X k X_k Xk 的后验估计 x ^ k + \hat{x}_k^+ x^k+。其中, K K K 被称为卡尔曼增益系数:
K = H ∗ σ k − 2 H 2 ∗ σ k − 2 + σ R k 2 (3.5) K=\frac{H*{\sigma_k^-}^2}{H^2*{\sigma_k^-}^2+{\sigma_{R_k}}^2} \tag{3.5} K=H2∗σk−2+σRk2H∗σk−2(3.5)
卡尔曼增益系数 K K K 可变形为:
K = H ∗ σ k − 2 H 2 ∗ σ k − 2 + σ R k 2 = H H 2 + σ R k 2 / σ k − 2 K=\frac{H*{\sigma_k^-}^2}{H^2*{\sigma_k^-}^2+{\sigma_{R_k}}^2} = \frac{H}{H^2+{\sigma_{R_k}}^2/{\sigma_k^-}^2} K=H2∗σk−2+σRk2H∗σk−2=H2+σRk2/σk−2H
当 σ R k 2 ≫ σ k − 2 {\sigma_{R_k}}^2 \gg {\sigma_k^-}^2 σRk2≫σk−2 时, K → 0 K\to0 K→0,故
μ k + = μ k − + K ∗ ( y k − H ∗ μ k − ) → μ k − \mu_k^+ = \mu_k^-+K*(y_k-H*\mu_k^-) \to \mu_k^- μk+=μk−+K∗(yk−H∗μk−)→μk−
此时,后验估计结果倾向于预测;
当 σ R k 2 ≪ σ k − 2 {\sigma_{R_k}}^2 \ll {\sigma_k^-}^2 σRk2≪σk−2 时, K → 1 H K\to\frac{1}{H} K→H1,故
μ k + = μ k − + K ∗ ( y k − H ∗ μ k − ) → y k H \mu_k^+ = \mu_k^-+K*(y_k-H*\mu_k^-) \to \frac{y_k}{H} μk+=μk−+K∗(yk−H∗μk−)→Hyk
此时,后验估计结果倾向于观测。
点击这里下载我的 WolframScript(.wls)脚本文件。
上文内容所描述的是一维的卡尔曼滤波,当状态量和观测量不再是单一的随机变量而是由多个随机变量组成的序列时,卡尔曼滤波中各个量的维数也将随之改变:
对应的五个公式演变为:
μ k − = F ∗ μ k − 1 + + B ∗ u k (4.1) \mu_k^- = F*\mu_{k-1}^++B*u_k \tag{4.1} μk−=F∗μk−1++B∗uk(4.1)
Σ k − = F ∗ Σ k − 1 + ∗ F T + Σ Q k (4.2) \Sigma_k^- = F*\Sigma_{k-1}^+*F^T+{\Sigma_{Q_k}} \tag{4.2} Σk−=F∗Σk−1+∗FT+ΣQk(4.2)
μ k + = μ k − + K ∗ ( y k − H ∗ μ k − ) (4.3) \mu_k^+ = \mu_k^-+K*(y_k-H*\mu_k^-) \tag{4.3} μk+=μk−+K∗(yk−H∗μk−)(4.3)
Σ k + = ( I − K ∗ H ) ∗ Σ k − (4.4) \Sigma_k^+ = (I-K*H)*\Sigma_k^- \tag{4.4} Σk+=(I−K∗H)∗Σk−(4.4)
K = Σ k − ∗ H T ∗ ( H ∗ Σ k − ∗ H T + Σ R k ) − 1 (4.5) K=\Sigma_k^-*H^T*(H*\Sigma_k^-*H^T+{\Sigma_{R_k}})^{-1} \tag{4.5} K=Σk−∗HT∗(H∗Σk−∗HT+ΣRk)−1(4.5)
公式 (4.3) 中 μ k + \mu_k^+ μk+ 即 k 时刻状态量 X k X_k Xk 的后验估计 x ^ k + \hat{x}_k^+ x^k+, y k − H ∗ μ k − y_k-H*\mu_k^- yk−H∗μk− 常被称为残差(Residual)或新息(Innovation);公式 (4.4) 中的 I I I 代表单位矩阵,维数为 n X × n X n_X \times n_X nX×nX。
从结果中还可以发现,外部控制项 B ∗ u k B*u_k B∗uk 通过影响先验估计均值间接影响了后验估计均值,但对后验估计方差没有影响。
卡尔曼滤波的应用实例可参考此前的学习文章《(十三)手把手教你写卡尔曼滤波器》,文章中的应用场景是使用激光雷达(Lidar)对匀速直线运动(Constant Velocity,CV)目标的测距过程。
博主工作中使用卡尔曼滤波对路口前的停止线(来自单目前向视觉)纵向距离进行了估计,系统模型抽象为匀加速直线运动(Constant Acceleration,CA),此时的状态转移函数 f ( x ) f(x) f(x) 中存在外部控制项 B ∗ u k B*u_k B∗uk,停止线纵向距离估计结果用于下游规划控制模块的纵向速度规划输入参考。