FunnyWii
FunnyWii
Published on 2024-12-03 / 22 Visits
0
0

学习Kalman Filter(自用版)

卡尔曼滤波是一种高效的递归(自回归)滤波器。能够从一系列的不完全包含噪声的测量中,估计动态系统的状态。卡尔曼滤波会根据各测量值在不同时间下的值,考虑各时间下的联合分布,再产生对未知变量的估计,因此会比只以单一测量值为基础的估计方式要准^{[1]}

卡尔曼滤波示例

示例1^{[2]}

简单来说,卡尔曼滤波就是有多个不确定的结果,经过分析、推理和计算,获得相对准确的结果。

假设一辆车,从原点出发以2m/s匀速自西向东直线运动t-1时刻位于原点正东6m处,t时刻雷达测得车距离原点东9m处。已知车匀速直线运动,运动模型方差 \theta_q^2=4(m^2),雷达距离方差 \theta_r^2=1(m^2)。问:当前小车距原点何处?或者问:小车距离原点何处可能性最大?

关于方差,一般方差的单位是测量值单位的平方。位置的单位为m时,那么其方差的单位应为m^2。方差的单位其实没有什么意义,而且此处方差的单位和平方米并非一个概念。

根据匀速直线运动方程,t时刻车应距离原点以东x_t=8m,称之为预测值。此模型并未考虑阻力和t-1时刻速度和t-1时刻位置准确性等因素。对于雷达测量的z_t=9m,称为观测值,由于测量仪器本身存在误差,也不完全准确。

那么如何利用预测值和观测值获取更准确的位置?一种方法是取两者均值,即二者均50%权重,结果为8.5m。但这并未利用二者的方差,方差越大代表结果可信度越低。因此方差越大的值,应该具有更低的权重。因此使用公式:

\frac{\theta^2_r}{\theta^2_r+\theta^2_q}\cdot x_t + \cfrac{\theta^2_q}{\theta^2_q + \theta^2_r} \cdot z_t = 8.8m

上述公式也是卡尔曼滤波最优值的更新公式。

示例2^{[5]}

假设一个车辆在时刻 t 的位置和速度状态 x_t

x_t = \begin{bmatrix} p_t \\ v_t \end{bmatrix}

其中位置p_t

p_t=p_{t-1}+v_{t-1}\times \Delta t + u_t \times \cfrac{\Delta t^2}{2}

速度状态v_t

v_t = v_{t-1} + u_t \times \Delta t

通过上面两个公式,可以看到 p_t 以及 v_t 是输入变量的线性组合。因此也可以写为矩阵格式。

\begin{bmatrix} p_t \\ v_t \end{bmatrix} = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \begin{bmatrix}p_{t-1} \\ v_{t-1} \end{bmatrix} + \begin{bmatrix} {\Delta t^2}/{2} \\ \Delta t \end{bmatrix} u_t
F_t = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} , B_t = \begin{bmatrix} {\Delta t^2}/{2} \\ \Delta t \end{bmatrix}

公式可以简化为卡尔曼滤波中第一个公式,即状态预测公式:

\hat{x}^-_t = F_t \hat{x}_{t-1} + B_tu_t

其中 F_t状态转移矩阵,表示如何从上一时刻 t-1 的状态来推测当前时刻的状态,B_t控制矩阵,表示控制量 u 如何作用于当前状态。上述 x\hat {} 表示这是一个估计值,^- 上标是 x 的上标而非 t 的,表示这个估计值是根据上一时刻的状态推测而来。在后面会根据观测量来修正 \hat{x}^-_t,然后才能得到最优估计值。

在KF中,不确定性用状态协方差矩阵 P 表示,为了让不确定性在时刻间传递,使用 P_t^- = FP_{t-1}F^T 来表示,即两边乘以状态转移矩阵 F。这是根据协方差矩阵的性质: cov(Ax, Bx) = Acov(x,x)B^T 得来的。为了表示预测模型本身的噪声,在后面再加入一个状态转移协方差矩阵 Q,即

P_t^- = FP_{t-1}F^T +Q

这也是卡尔曼滤波的第二个公式,表示不确定性在各个时刻间的传递。前两个公式是通过上一时刻的状态来预测当前时刻的状态。

然后,假设我们使用一个观测器,观测这个汽车的位置 z_t,即观测值。从汽车本身状态 x_tz_t,需要一个观测矩阵 H 来进行线性变换。

在这里,x_tz_t 的维度可以不同,z_t 的观测值只有位置即1个维度,但是 x_t 包含了两个维度,因此可以假设 H = [1 \quad 0],当 x_t 和矩阵 H 相乘可以得到标量 z_t。可以得到公式 z_t=Hx_t +v,由于观测值也存在误差,因此引入了观测噪声 v,其协方差矩阵用观测噪声方差矩阵 R 来表示。

根据上面得到的 \hat{x}^-_t,得到最优估计值公式(第四个公式,第三个公式在后面):

\hat{x}_t = \hat{x}^-_t + K_t(z_t - H \hat{x}^-_t)

公式中 z_t - H \hat{x}^-_t 表示实际观测值预测的观测值残差

残差是指观察值与模型估计值之间的差

K_t 为卡尔曼系数,其作用是权衡 预测状态协方差 P 和 观察值协方差 R 的大小来决定预测模型与观察模型的权重。以及把残差的表现形式从观察域转换到状态域。

卡尔曼系数的计算公式(第三个公式)为:

K_t=P_t^-H^T(HP_t^-H^T + R)^{-1}

最后,更新最佳估计值的噪声分布(第五个公式),留给下一轮迭代使用:

P_t = (I-K_tH)P_t^-

状态的不确定性是减小的,下一轮迭代中由于传递噪声的引入,不确定性又会增大。KF就是在不确定性变化中寻找平衡。

原理推导

(线性)卡尔曼滤波的应用基于以下三个假设前提:

  • 当前时刻状态只和上一时刻状态有关。
  • 模型和系统均满足线性关系。
  • 引入的噪声符合高斯分布。

对于和多时刻状态有关、非线性、非高斯问题,不能简单地使用卡尔曼滤波。

先说明一下卡尔曼滤波中涉及到的各个值:

  • 真实值 True Value:系统状态的实际情况,一般是未知的。要知道就用不着KF了。如:车辆的真实速度30kph。
  • 观测值 Measurement:通过传感器或其他手段获取的信息,但是会存在误差。如:速度传感器获取的速度28kph。
  • 预测值 Prediction:根据上一时刻的估计值和系统动态模型预测到当前时刻的状态,也会存在误差。如:根据上一时刻估计的速度和加速度,预测得到当前时刻的速度。上一时刻估计值Estimation为29kph,加速度为0,那么预测车速仍为29kph。
  • 估计值 Estimation:卡尔曼滤波的输出,基于观测值Measurement和预测值Prediction的加权,目的是尽可能接近真实值True Value。如:根据观测值Measurement和预测值Prediction加权,估计值Estimation计算为28.5kph。

过程模型:

x_k=Fx_{k-1}+Bu_{k-1}+w_k

测量模型:

z_k = Hx_k + v_k

x_k 表示 k 时刻真实值,即待估计值。如位置、速度等。

x_{k-1} 表示 k-1 时刻的真实值。

u_{k-1} 表示 k-1 时刻的控制输入量,如加速度

w_k 表示过程噪声,p(w_k) \sim N(0,Q),即符合均值为0,协方差矩阵为Q的高斯噪声分布。

z_k 表示 k 时刻的观测值,如雷达或GPS测量结果,维度可能和 x_k 相同,也可能不同,如 x_k 包含位置和速度,但是测量结果只有位置信息。

v_k 表示测量噪声,和 w_k 类似,p(v_k) \sim N(0,R)

FBH分别表示状态转移矩阵,控制矩阵,观测转移矩阵。

卡尔曼滤波黄金五条公式

预测

\hat{x}_k^-= F \hat{x}_{k-1} + Bu_k \tag1
P_k^- = FP_{k-1}F^T +Q \tag2

更新

K_k = \cfrac{P_k^-H^T}{HP^-_kH^T +R} \tag3
\hat{x}_k = \hat{x}^-_k + K_k(z_k - H\hat{x}^-_k) \tag4
P_k = (I-K_kH)P^-_k \tag5

参考文章

[1] 卡尔曼滤波 - 维基百科,自由的百科全书

[2] 深入浅出理解卡尔曼滤波【实例、公式、代码和图】 - 知乎

[3] Kalman滤波通俗理解+实际应用_卡尔曼滤波应用实例-CSDN博客

[4] 【卡尔曼滤波器】5_直观理解与二维实例【包含完整的EXCEL代码】_哔哩哔哩_bilibili

[5] 卡尔曼滤波器的原理以及在matlab中的实现_哔哩哔哩_bilibili


Comment