kalman手工推导

卡尔曼滤波手工推导计算

由于上一版太简洁了,很多人私信说不懂,这次回归最原始的数学计算,用最根本的方法掌握卡尔曼滤波。

一、 核心思想与哲学:超越表象,洞悉本质

卡尔曼滤波的本质,是在充满噪声和不确定性的世界中,对一个随时间演化的动态系统内部状态进行最优估计的一种方法。它不是简单地“滤掉”噪声,而是动态地、递归地融合两种不完美的信息来源:

  1. 基于模型的预测 (Prediction/Prior Knowledge): 我们根据对系统动力学行为的理解(物理定律、运动学方程等),预测系统在下一时刻应该处于什么状态,以及这种预测的不确定性有多大。这代表了我们基于历史和模型的“先验”信念。
  2. 带有噪声的测量 (Measurement/Observation): 我们通过传感器等手段实际观测到的系统某些方面的量(可能不直接是状态本身),这些观测值不可避免地受到测量噪声的污染。这代表了来自现实世界的“证据”。

卡尔曼滤波的伟大之处在于,它提供了一个数学上最优(在线性高斯假设下,为最小均方误差估计 Minimum Mean Square Error, MMSE)的框架,来动态调整我们对这两者信息的信任程度,并将它们结合起来,生成一个比单独依赖任何一方都更精确、更可靠的“后验”状态估计。

其核心哲学可以概括为:

  • 承认不确定性: 世界是随机的,模型是不完美的,测量是有噪声的。卡尔曼滤波不回避不确定性,而是量化它、管理它、利用它。状态和测量都被视为随机变量,用概率分布(具体地,高斯分布)来描述。
  • 模型驱动的推断: 对系统行为的先验知识至关重要。一个好的动态模型是进行有效预测的基础。
  • 数据驱动的修正: 观测数据是检验和修正模型预测的依据。滤波过程就是用新的证据不断更新和完善我们的信念。
  • 递归性: 算法是迭代进行的。每一时刻的估计都基于上一时刻的估计和当前时刻的测量,不需要存储所有历史数据,这使得它非常高效,适合实时应用。
  • 最优性: 在特定假设下(线性系统、高斯噪声),卡尔曼滤波给出的估计在统计意义上是最好的。它最小化了估计误差的方差。

二、 数学基础:状态空间模型与概率描述

为了应用卡尔曼滤波,我们首先需要将系统用状态空间的形式来描述。这是一种强大的数学工具,可以将一个复杂的动态系统表示为一组一阶微分(连续时间)或差分(离散时间)方程。对于离散时间的卡尔曼滤波(更常用),其标准形式如下:

  1. 状态方程 (State Equation / Process Model): 描述系统状态如何随时间演化。

    \[x_k = A x_{k-1} + B u_{k-1} + w_{k-1} \]

    • \(x_k\): 系统在时刻 \(k\)状态向量 (State Vector)。这是我们真正关心但无法直接完美观测的内部变量(例如,位置、速度、温度等)。它是一个 \(n \times 1\) 的列向量。
    • \(x_{k-1}\): 系统在上一时刻 \(k-1\) 的状态向量。
    • \(A\): 状态转移矩阵 (State Transition Matrix) (\(n \times n\))。描述了如果没有控制输入和噪声,状态如何从 \(k-1\) 自然演变到 \(k\)。它体现了系统的内在动力学。
    • \(B\): 控制输入矩阵 (Control Input Matrix) (\(n \times p\))。描述了外部控制输入 \(u_{k-1}\) 如何影响状态的改变。
    • \(u_{k-1}\): 在时刻 \(k-1\) 施加的 控制向量 (Control Vector) (\(p \times 1\))。如果系统不受外部控制,此项可以省略。
    • \(w_{k-1}\): 过程噪声向量 (Process Noise Vector) (\(n \times 1\))。代表了模型未能完全捕捉的、驱动系统状态变化的随机扰动或不确定性(例如,未建模的力、参数的微小变化)。假设它是零均值高斯白噪声,其协方差矩阵\(Q\)。即 \(w_k \sim \mathcal{N}(0, Q)\)\(Q\) (\(n \times n\)) 描述了过程噪声的强度和各状态变量噪声之间的相关性。
  2. 观测方程 (Measurement Equation / Observation Model): 描述了我们如何通过传感器获得关于系统状态的信息。

    \[z_k = H x_k + v_k \]

    • \(z_k\): 在时刻 \(k\)观测向量 (Measurement Vector) (\(m \times 1\))。这是我们实际从传感器读到的值。
    • \(H\): 观测矩阵 (Observation Matrix) (\(m \times n\))。描述了系统的状态 \(x_k\) 如何映射到我们可以观测到的量 \(z_k\)。传感器可能只能观测到状态的一部分,或者观测到状态的线性组合。
    • \(v_k\): 观测噪声向量 (Measurement Noise Vector) (\(m \times 1\))。代表了传感器测量过程中的随机误差。假设它也是零均值高斯白噪声,其协方差矩阵\(R\)。即 \(v_k \sim \mathcal{N}(0, R)\)\(R\) (\(m \times m\)) 描述了测量噪声的强度和不同测量通道噪声之间的相关性。
    • 关键假设:过程噪声 \(w_k\) 和观测噪声 \(v_k\) 被认为是相互独立的,并且与系统状态 \(x_k\) 也独立。

核心变量解释:

  • 状态估计 (State Estimate):
    • \(\hat{x}_{k|k-1}\) (或 \(\hat{x}_k^-\)) : 先验状态估计 (Prior State Estimate)。基于 \(k-1\) 时刻的知识,对 \(k\) 时刻状态的预测值。
    • \(\hat{x}_{k|k}\) (或 \(\hat{x}_k\)) : 后验状态估计 (Posterior State Estimate)。结合了 \(k\) 时刻的测量值 \(z_k\) 后,对 \(k\) 时刻状态的更新(最优)估计值。这是滤波器的主要输出。
  • 误差协方差矩阵 (Error Covariance Matrix): 量化了状态估计的不确定性程度。
    • \(P_{k|k-1}\) (或 \(P_k^-\)) : 先验误差协方差矩阵 (Prior Error Covariance Matrix)。与 \(\hat{x}_k^-\) 相关的不确定性。\(P = E[(x - \hat{x})(x - \hat{x})^T]\)
    • \(P_{k|k}\) (或 \(P_k\)) : 后验误差协方差矩阵 (Posterior Error Covariance Matrix)。与 \(\hat{x}_k\) 相关的不确定性。通常 \(P_k\) 会比 \(P_k^-\) “小”(在矩阵意义下,例如行列式更小,迹更小),表示测量信息降低了不确定性。

三、 卡尔曼滤波算法:预测与更新的递归循环

卡尔曼滤波算法是一个两步过程的递归循环:预测 (Predict)更新 (Update)

初始化:
在开始滤波之前(\(k=0\)),需要提供初始的状态估计 \(\hat{x}_0\) 和初始的误差协方差矩阵 \(P_0\)。这代表了我们对系统初始状态的先验知识和不确定性。如果完全不确定,\(P_0\) 可以设为一个对角线元素很大的对角矩阵。

循环开始 (对于 \(k = 1, 2, 3, \dots\)):

1. 预测阶段 (Time Update / Predict)
目标:根据 \(k-1\) 时刻的后验估计 \(\hat{x}_{k-1}\)\(P_{k-1}\),预测 \(k\) 时刻的先验状态 \(\hat{x}_k^-\) 和其不确定性 \(P_k^-\)

  • (1a) 预测状态 (Project the state ahead):

    \[\hat{x}_k^- = A \hat{x}_{k-1} + B u_{k-1} \]

    解释:使用状态方程,将上一时刻的最优估计 \(\hat{x}_{k-1}\) 通过状态转移矩阵 \(A\) 向前传播,并考虑控制输入 \(u_{k-1}\) 的影响。这本质上是应用我们对系统动力学的理解。

  • (1b) 预测误差协方差 (Project the error covariance ahead):

    \[P_k^- = A P_{k-1} A^T + Q \]

    *解释:这步是理解卡尔曼滤波的关键之一。它描述了不确定性如何传播和增长。

    • \(A P_{k-1} A^T\): 这部分表示上一时刻的不确定性 \(P_{k-1}\) 如何通过系统动力学 \(A\) 传递到当前时刻。如果系统有放大效应(\(A\) 的元素大于1),不确定性会扩大;如果有缩小效应,则会减小。注意这里的 \(A^T\)\(A\) 的转置。
    • \(+ Q\): 这部分加入了过程噪声 \(w_{k-1}\) 带来的不确定性。即使我们对 \(k-1\) 的状态完全确定 (\(P_{k-1}=0\)),模型本身的不完美(由 \(Q\) 量化)也会在预测过程中引入新的不确定性。*

2. 更新阶段 (Measurement Update / Correct)
目标:利用 \(k\) 时刻的实际测量值 \(z_k\) 来修正(更新)预测阶段得到的先验估计 \(\hat{x}_k^-\)\(P_k^-\),得到更精确的后验估计 \(\hat{x}_k\)\(P_k\)

  • (2a) 计算卡尔曼增益 (Compute the Kalman Gain):

    \[K_k = P_k^- H^T (H P_k^- H^T + R)^{-1} \]

    *解释:卡尔曼增益 \(K_k\) 是整个滤波器的灵魂! 它是一个 \(n \times m\) 的矩阵,充当一个动态调整的权重。它决定了我们应该在多大程度上相信测量残差 (Measurement Residual / Innovation) \((z_k - H \hat{x}_k^-)\)

    • \(H \hat{x}_k^-\): 这是基于先验状态估计 \(\hat{x}_k^-\),我们预测会得到的测量值。
    • \(z_k - H \hat{x}_k^-\): 这就是测量残差(或称新息),即实际测量值与预测测量值之间的差异。它包含了关于状态真实偏差的新信息。
    • \(H P_k^- H^T\): 这部分是将先验状态估计的不确定性 \(P_k^-\) 映射到测量空间的不确定性。
    • \(H P_k^- H^T + R\): 这是测量残差的协方差,即预测测量值的不确定性 (\(H P_k^- H^T\)) 和实际测量噪声的不确定性 (\(R\)) 的总和。
    • \((H P_k^- H^T + R)^{-1}\): 对总的测量不确定性求逆。
    • \(K_k\) 的直观理解:
      • 如果测量噪声很大 (\(R\) 很大),则 \((H P_k^- H^T + R)\) 很大,其逆很小,导致 \(K_k\) 较小。这意味着我们不太信任当前的测量值 \(z_k\),更多地依赖于预测 \(\hat{x}_k^-\)
      • 如果先验估计的不确定性很大 (\(P_k^-\) 很大),则 \(P_k^-\)\((H P_k^- H^T + R)\) 都可能较大,但 \(P_k^-\) 在分子, \(H P_k^- H^T\) 在分母中一项。相对而言,\(K_k\) 会倾向于变大(特别是当 \(H\) 能有效观测状态时)。这意味着我们不太信任先验预测,而更愿意根据新的测量值进行大幅修正。
      • \(K_k\) 是在预测不确定性 (\(P_k^-\)) 和测量不确定性 (\(R\)) 之间做出的最优权衡
  • (2b) 更新状态估计 (Update estimate with measurement):

    \[\hat{x}_k = \hat{x}_k^- + K_k (z_k - H \hat{x}_k^-) \]

    解释:这是滤波器的核心修正步骤。后验状态估计 \(\hat{x}_k\) 等于先验估计 \(\hat{x}_k^-\) 加上一个修正项。修正项是卡尔曼增益 \(K_k\) 乘以测量残差。增益 \(K_k\) 决定了残差在多大程度上影响状态的修正。

  • (2c) 更新误差协方差 (Update the error covariance):

    \[P_k = (I - K_k H) P_k^- \]

    *解释:这是更新后状态估计 \(\hat{x}_k\) 的不确定性。

    • \((I - K_k H)\): 这个因子通常(但不总是)会“缩小”协方差矩阵 \(P_k^-\)。直观上,因为我们引入了新的测量信息 \(z_k\),我们对状态的了解增加了,所以不确定性应该降低。\(I\) 是单位矩阵 (\(n \times n\))。
    • 这个公式计算简单,但在数值计算上可能不稳定(可能导致 P 不再保持对称或半正定)。一个更稳健(但计算稍复杂)的等价形式是 Joseph Form:

      \[P_k = (I - K_k H) P_k^- (I - K_k H)^T + K_k R K_k^T \]

      这个形式能更好地保证 \(P_k\) 的对称性和半正定性。*

循环结束。 得到的 \(\hat{x}_k\)\(P_k\) 将作为下一个时刻 \(k+1\) 的输入 (\(\hat{x}_{k|k}\) 成为 \(\hat{x}_{k+1|k}\) 的基础,\(P_{k|k}\) 成为 \(P_{k+1|k}\) 的基础),如此递归进行。

四、 卡尔曼滤波的假设与局限性(深度思考)

理解卡尔曼滤波的强大之处,同样需要深刻认识其赖以成立的假设及其局限性:

  1. 线性系统假设 (Linearity): 状态方程和观测方程都必须是线性的(\(x\)\(z\) 分别是 \(x_{k-1}\)/\(u_{k-1}\)\(x_k\) 的线性函数)。这是最核心的假设。现实世界中许多系统是非线性的。
    • 突破与扩展: 对于非线性系统,发展出了扩展卡尔曼滤波 (Extended Kalman Filter, EKF),它通过在当前估计点对非线性函数进行泰勒级数展开,取一阶项来进行线性化近似。但EKF可能因线性化误差导致性能下降甚至发散。更先进的方法如无迹卡尔曼滤波 (Unscented Kalman Filter, UKF),通过选取一组“Sigma点”并通过非线性函数传递,然后重构高斯分布,通常能提供比EKF更好的性能,尤其是在强非线性情况下。还有粒子滤波 (Particle Filter)等更通用的方法,适用于任意非线性、非高斯系统,但计算复杂度显著增加。
  2. 高斯噪声假设 (Gaussian Noise): 过程噪声 \(w_k\) 和测量噪声 \(v_k\) 都必须服从高斯分布。卡尔曼滤波的最优性(MMSE)严格依赖于此。高斯分布的特性(线性变换后仍为高斯,易于用均值和协方差描述)是算法简洁性的关键。
    • 现实挑战: 实际噪声可能不是高斯的(例如,脉冲噪声、多峰分布)。
    • 应对: 如果偏离高斯性不严重,KF仍可能给出不错的次优估计。对于严重偏离的情况,可能需要非高斯滤波方法(如粒子滤波)。
  3. 噪声统计特性已知且固定: 需要精确知道噪声协方差矩阵 \(Q\)\(R\)。且假设它们不随时间变化(或变化已知)。
    • 现实挑战: \(Q\)\(R\) 的精确值往往难以获得,通常需要根据经验或实验数据进行调优 (Tuning)。滤波器的性能对 \(Q\)\(R\) 的选择非常敏感。错误的 \(Q\)\(R\) 会导致次优甚至发散的结果。
    • 应对: 发展出了自适应卡尔曼滤波 (Adaptive Kalman Filter) 技术,尝试在线估计 \(Q\)\(R\)。这是一个活跃的研究领域。
  4. 噪声零均值与不相关性: 假设噪声 \(w_k\)\(v_k\) 的均值为零,并且它们之间以及各自在不同时刻之间都是不相关的(白噪声)。
    • 现实挑战: 噪声可能存在偏置(非零均值),或者存在时间相关性(有色噪声)。
    • 应对: 可以通过增广状态向量将偏置纳入估计,或者通过状态增广或预白化技术处理有色噪声。

五、 卡尔曼滤波的深刻意义与创新价值

  • 信息融合的范式: 它提供了一种将来自不同来源、具有不同不确定性的信息进行最优融合的通用框架,这种思想超越了具体的应用,影响了数据融合、机器学习等多个领域。
  • 不确定性量化的重要性: 强调了对不确定性(用协方差矩阵表示)进行显式建模和传播的必要性,这对于做出可靠的决策至关重要。
  • 递归估计的效率: 无需存储和处理全部历史数据,使得在线实时处理成为可能,极大地扩展了其应用范围。
  • 理论与实践的桥梁: 它建立在坚实的概率论和优化理论基础上,同时又具有清晰的算法步骤和广泛的实际应用价值,是理论指导实践的典范。
  • 启发后续创新: 其局限性激发了EKF, UKF, 粒子滤波等一系列更先进的滤波技术的发展,不断拓展着状态估计能力的边界。

六、 笔算卡尔曼滤波实例:追踪一个匀速运动的物体

让我们通过一个极其简化的例子,来手动计算卡尔曼滤波的步骤。假设我们追踪一个在一维直线上运动的物体,我们关心它的 位置 (\(p\))速度 (\(v\))

1. 系统定义

  • 状态向量: \(x = \left[ \begin{array}{c} p \\ v \end{array} \right]\) (位置, 速度) - 注意:原文本的 \(^T\) 表示列向量,这里直接用列向量表示。如果需要明确是列向量的转置,则写为 \(x^T = \begin{pmatrix} p & v \end{pmatrix}\)。通常状态向量默认为列向量。
  • 时间步长: \(\Delta t = 1\)
  • 状态方程: 假设物体近似匀速运动,但速度可能受微小随机加速度影响。
    \(p_k = p_{k-1} + v_{k-1} \Delta t\)
    \(v_k = v_{k-1}\)
    写成矩阵形式 \(x_k = A x_{k-1} + w_{k-1}\) (无控制输入 \(B=0\))

    \[A = \left[ \begin{array}{cc} 1 & \Delta t \\ 0 & 1 \end{array} \right] = \left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right] \]

  • 过程噪声: 假设随机加速度 \(a\) 服从均值为0,方差为 \(\sigma_a^2 = 0.1^2 = 0.01\) 的高斯分布。它对位置和速度的影响可以通过 \(w_{k-1}\) 体现。一个常用的模型是认为噪声在 \(\Delta t\) 时间内持续作用:
    \(\Delta p = 0.5 a (\Delta t)^2\)
    \(\Delta v = a \Delta t\)
    这导致过程噪声协方差矩阵 \(Q\) 为(这里使用简化的离散白噪声加速度模型对应的Q形式):
    \(Q = E[w w^T] = E\left[ \left[ \begin{array}{c} 0.5 a (\Delta t)^2 \\ a \Delta t \end{array} \right] \left[ \begin{array}{cc} 0.5 a (\Delta t)^2 & a \Delta t \end{array} \right] \right]\)

    \[Q = \left[ \begin{array}{cc} (\Delta t)^4 / 4 & (\Delta t)^3 / 2 \\ (\Delta t)^3 / 2 & (\Delta t)^2 \end{array} \right] \sigma_a^2 \]

    \[Q = \left[ \begin{array}{cc} 1/4 & 1/2 \\ 1/2 & 1 \end{array} \right] \times 0.01 = \left[ \begin{array}{cc} 0.0025 & 0.005 \\ 0.005 & 0.01 \end{array} \right] \]

  • 观测方程: 假设我们只能直接测量物体的位置,且测量有噪声。
    \(z_k = H x_k + v_k\)

    \[H = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \]

    (我们只观测状态向量的第一个元素:位置)
  • 测量噪声: 假设测量噪声 \(v_k\) 是均值为0,方差为 \(\sigma_p^2 = 1^2 = 1\) 的高斯噪声。由于只有一个测量值,\(R\) 是一个标量:
    \(R = [\sigma_p^2] = [1]\)

2. 初始化 (k=0)

  • 初始状态估计: 假设我们猜测物体初始位置在 \(p=0\),初始速度为 \(v=0\)

    \[\hat{x}_0 = \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] \]

  • 初始误差协方差: 假设我们对初始状态非常不确定,给一个较大的协方差。

    \[P_0 = \left[ \begin{array}{cc} 100 & 0 \\ 0 & 100 \end{array} \right] \]

    (位置和速度的初始方差都很大,且假设初始不相关)

3. 第一次迭代 (k=1)

  • 假设测量值: 假设在 \(k=1\) 时刻,我们测得位置 \(z_1 = 0.8\)

  • 预测阶段 (Time Update)

    • (1a) 预测状态:

      \[\hat{x}_1^- = A \hat{x}_0 = \left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] = \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] \]

      (基于初始猜测,预测物体仍在原点且速度为0)
    • (1b) 预测误差协方差:
      \(P_1^- = A P_0 A^T + Q\)
      \(A^T = \left[ \begin{array}{cc} 1 & 0 \\ 1 & 1 \end{array} \right]\)
      \(A P_0 = \left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{cc} 100 & 0 \\ 0 & 100 \end{array} \right] = \left[ \begin{array}{cc} 100 & 100 \\ 0 & 100 \end{array} \right]\)
      \(A P_0 A^T = \left[ \begin{array}{cc} 100 & 100 \\ 0 & 100 \end{array} \right] \left[ \begin{array}{cc} 1 & 0 \\ 1 & 1 \end{array} \right] = \left[ \begin{array}{cc} 100 \cdot 1 + 100 \cdot 1 & 100 \cdot 0 + 100 \cdot 1 \\ 0 \cdot 1 + 100 \cdot 1 & 0 \cdot 0 + 100 \cdot 1 \end{array} \right] = \left[ \begin{array}{cc} 200 & 100 \\ 100 & 100 \end{array} \right]\)
      \(P_1^- = \left[ \begin{array}{cc} 200 & 100 \\ 100 & 100 \end{array} \right] + \left[ \begin{array}{cc} 0.0025 & 0.005 \\ 0.005 & 0.01 \end{array} \right]\)

      \[P_1^- = \left[ \begin{array}{cc} 200.0025 & 100.005 \\ 100.005 & 100.01 \end{array} \right] \]

      (预测的不确定性大大增加了,尤其是位置的不确定性,因为包含了速度不确定性的传播)
  • 更新阶段 (Measurement Update)

    • (2a) 计算卡尔曼增益: \(K_1 = P_1^- H^T (H P_1^- H^T + R)^{-1}\)
      \(H^T = \left[ \begin{array}{c} 1 \\ 0 \end{array} \right]\)
      \(P_1^- H^T = \left[ \begin{array}{cc} 200.0025 & 100.005 \\ 100.005 & 100.01 \end{array} \right] \left[ \begin{array}{c} 1 \\ 0 \end{array} \right] = \left[ \begin{array}{c} 200.0025 \\ 100.005 \end{array} \right]\)
      \(H P_1^- = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \left[ \begin{array}{cc} 200.0025 & 100.005 \\ 100.005 & 100.01 \end{array} \right] = \left[ \begin{array}{cc} 200.0025 & 100.005 \end{array} \right]\)
      \(H P_1^- H^T = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \left[ \begin{array}{c} 200.0025 \\ 100.005 \end{array} \right] = 200.0025\)
      \(H P_1^- H^T + R = 200.0025 + 1 = 201.0025\)
      \((H P_1^- H^T + R)^{-1} = 1 / 201.0025 \approx 0.004975\)

      \[K_1 = \left[ \begin{array}{c} 200.0025 \\ 100.005 \end{array} \right] \times 0.004975 \approx \left[ \begin{array}{c} 0.995 \\ 0.498 \end{array} \right] \]

      (卡尔曼增益 \(K_1\) 是一个 \(2 \times 1\) 向量。注意位置对应的增益接近1,速度对应的增益约0.5。因为我们直接测量位置,所以测量对位置估计的影响很大;对速度估计的影响是间接的,通过位置和速度的关联 \(P_1^-(1,2)\) 体现)

    • (2b) 更新状态估计: \(\hat{x}_1 = \hat{x}_1^- + K_1 (z_1 - H \hat{x}_1^-)\)
      \(H \hat{x}_1^- = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] = 0\) (预测测量值为0)
      \(z_1 - H \hat{x}_1^- = 0.8 - 0 = 0.8\) (测量残差)
      \(\hat{x}_1 = \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] + \left[ \begin{array}{c} 0.995 \\ 0.498 \end{array} \right] \times 0.8\)

      \[\hat{x}_1 \approx \left[ \begin{array}{c} 0 \\ 0 \end{array} \right] + \left[ \begin{array}{c} 0.796 \\ 0.398 \end{array} \right] = \left[ \begin{array}{c} 0.796 \\ 0.398 \end{array} \right] \]

      (后验估计:位置被修正到接近测量值0.8,速度也被修正为非零值约0.4。这是因为卡尔曼滤波认为,如果物体真的在0.8的位置(而不是预测的0),那么它很可能具有一定的速度才能到达那里)

    • (2c) 更新误差协方差: \(P_1 = (I - K_1 H) P_1^-\)
      \(K_1 H = \left[ \begin{array}{c} 0.995 \\ 0.498 \end{array} \right] \left[ \begin{array}{cc} 1 & 0 \end{array} \right] = \left[ \begin{array}{cc} 0.995 & 0 \\ 0.498 & 0 \end{array} \right]\)
      \(I - K_1 H = \left[ \begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array} \right] - \left[ \begin{array}{cc} 0.995 & 0 \\ 0.498 & 0 \end{array} \right] = \left[ \begin{array}{cc} 0.005 & 0 \\ -0.498 & 1 \end{array} \right]\)
      \(P_1 = \left[ \begin{array}{cc} 0.005 & 0 \\ -0.498 & 1 \end{array} \right] \left[ \begin{array}{cc} 200.0025 & 100.005 \\ 100.005 & 100.01 \end{array} \right]\)
      \(P_1 \approx \left[ \begin{array}{cc} 0.005 \times 200.0025 + 0 \times 100.005 & 0.005 \times 100.005 + 0 \times 100.01 \\ -0.498 \times 200.0025 + 1 \times 100.005 & -0.498 \times 100.005 + 1 \times 100.01 \end{array} \right]\)
      \(P_1 \approx \left[ \begin{array}{cc} 1.00 & 0.50 \\ -99.60 + 100.005 & -49.80 + 100.01 \end{array} \right]\)

      \[P_1 \approx \left[ \begin{array}{cc} 1.00 & 0.50 \\ 0.40 & 50.21 \end{array} \right] \]

      (后验协方差 \(P_1\)。注意对角线元素(方差)显著减小了!位置方差从预测的约200减小到约1,速度方差从约100减小到约50。这表明测量信息极大地降低了我们对状态的不确定性。非对角元素(协方差)也发生了变化,反映了更新后位置和速度估计误差之间的相关性)
      *(如果使用 Joseph form 会得到相同结果,且更稳定)

4. 第二次迭代 (k=2)

  • 假设测量值: 假设在 \(k=2\) 时刻,我们测得位置 \(z_2 = 1.9\)

  • 输入: 使用 \(k=1\) 的结果:\(\hat{x}_1 \approx \left[ \begin{array}{c} 0.796 \\ 0.398 \end{array} \right]\)\(P_1 \approx \left[ \begin{array}{cc} 1.00 & 0.50 \\ 0.40 & 50.21 \end{array} \right]\)

  • 预测阶段 (Time Update)

    • (2a) 预测状态:

      \[\hat{x}_2^- = A \hat{x}_1 = \left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{c} 0.796 \\ 0.398 \end{array} \right] = \left[ \begin{array}{c} 0.796 + 0.398 \\ 0.398 \end{array} \right] = \left[ \begin{array}{c} 1.194 \\ 0.398 \end{array} \right] \]

    • (2b) 预测误差协方差:
      \(P_2^- = A P_1 A^T + Q\)
      \(A P_1 = \left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{cc} 1.00 & 0.50 \\ 0.40 & 50.21 \end{array} \right] = \left[ \begin{array}{cc} 1.40 & 50.71 \\ 0.40 & 50.21 \end{array} \right]\)
      \(A P_1 A^T = \left[ \begin{array}{cc} 1.40 & 50.71 \\ 0.40 & 50.21 \end{array} \right] \left[ \begin{array}{cc} 1 & 0 \\ 1 & 1 \end{array} \right] = \left[ \begin{array}{cc} 1.40+50.71 & 50.71 \\ 0.40+50.21 & 50.21 \end{array} \right] = \left[ \begin{array}{cc} 52.11 & 50.71 \\ 50.61 & 50.21 \end{array} \right]\) (近似计算,保留两位小数)
      \(P_2^- = \left[ \begin{array}{cc} 52.11 & 50.71 \\ 50.61 & 50.21 \end{array} \right] + \left[ \begin{array}{cc} 0.0025 & 0.005 \\ 0.005 & 0.01 \end{array} \right]\)

      \[P_2^- \approx \left[ \begin{array}{cc} 52.11 & 50.72 \\ 50.62 & 50.22 \end{array} \right] \]

  • 更新阶段 (Measurement Update)

    • (2a) 计算卡尔曼增益: \(K_2 = P_2^- H^T (H P_2^- H^T + R)^{-1}\)
      \(P_2^- H^T = \left[ \begin{array}{cc} 52.11 & 50.72 \\ 50.62 & 50.22 \end{array} \right] \left[ \begin{array}{c} 1 \\ 0 \end{array} \right] = \left[ \begin{array}{c} 52.11 \\ 50.62 \end{array} \right]\)
      \(H P_2^- H^T = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \left[ \begin{array}{c} 52.11 \\ 50.62 \end{array} \right] = 52.11\)
      \(H P_2^- H^T + R = 52.11 + 1 = 53.11\)
      \((H P_2^- H^T + R)^{-1} = 1 / 53.11 \approx 0.0188\)

      \[K_2 = \left[ \begin{array}{c} 52.11 \\ 50.62 \end{array} \right] \times 0.0188 \approx \left[ \begin{array}{c} 0.980 \\ 0.952 \end{array} \right] \]

      (这次速度对应的增益也变得很大,因为预测的速度不确定性 \(P_2^-(2,2)\) 相对较大,且位置和速度的协方差 \(P_2^-(1,2)\) 也很大)

    • (2b) 更新状态估计: \(\hat{x}_2 = \hat{x}_2^- + K_2 (z_2 - H \hat{x}_2^-)\)
      \(H \hat{x}_2^- = \left[ \begin{array}{cc} 1 & 0 \end{array} \right] \left[ \begin{array}{c} 1.194 \\ 0.398 \end{array} \right] = 1.194\)
      \(z_2 - H \hat{x}_2^- = 1.9 - 1.194 = 0.706\)
      \(\hat{x}_2 = \left[ \begin{array}{c} 1.194 \\ 0.398 \end{array} \right] + \left[ \begin{array}{c} 0.980 \\ 0.952 \end{array} \right] \times 0.706\)

      \[\hat{x}_2 \approx \left[ \begin{array}{c} 1.194 \\ 0.398 \end{array} \right] + \left[ \begin{array}{c} 0.692 \\ 0.672 \end{array} \right] = \left[ \begin{array}{c} 1.886 \\ 1.070 \end{array} \right] \]

      (新的测量值 1.9 再次修正了位置估计,使其更接近 1.9。同时,由于物体位置比预测的提前了(1.9 vs 1.194),滤波推断出物体的速度可能比之前估计的要快,将速度从 0.398 大幅提升到 1.070)

    • (2c) 更新误差协方差: \(P_2 = (I - K_2 H) P_2^-\)
      \(K_2 H = \left[ \begin{array}{c} 0.980 \\ 0.952 \end{array} \right] \left[ \begin{array}{cc} 1 & 0 \end{array} \right] = \left[ \begin{array}{cc} 0.980 & 0 \\ 0.952 & 0 \end{array} \right]\)
      \(I - K_2 H = \left[ \begin{array}{cc} 1-0.980 & 0 \\ -0.952 & 1 \end{array} \right] = \left[ \begin{array}{cc} 0.020 & 0 \\ -0.952 & 1 \end{array} \right]\)
      \(P_2 = \left[ \begin{array}{cc} 0.020 & 0 \\ -0.952 & 1 \end{array} \right] \left[ \begin{array}{cc} 52.11 & 50.72 \\ 50.62 & 50.22 \end{array} \right]\)
      \(P_2 \approx \left[ \begin{array}{cc} 0.020 \times 52.11 & 0.020 \times 50.72 \\ -0.952 \times 52.11 + 50.62 & -0.952 \times 50.72 + 50.22 \end{array} \right]\)
      \(P_2 \approx \left[ \begin{array}{cc} 1.04 & 1.01 \\ -49.61 + 50.62 & -48.28 + 50.22 \end{array} \right]\)

      \[P_2 \approx \left[ \begin{array}{cc} 1.04 & 1.01 \\ 1.01 & 1.94 \end{array} \right] \]

      (再次看到,测量信息使得误差协方差显著减小。位置方差 \(P_2(1,1)\) 保持在1左右(主要受测量噪声R=1限制),速度方差 \(P_2(2,2)\) 从预测的约50急剧下降到约1.94。位置和速度估计误差呈现出较强的正相关性 \(P_2(1,2) \approx 1.01\))

持续进行... 这个过程会一直持续下去,每一轮都利用新的测量值来优化状态估计,并更新对估计不确定性的量化。随着时间的推移,如果模型和噪声假设合理,卡尔曼滤波通常会收敛,即误差协方差矩阵 \(P_k\) 会达到一个稳态值,状态估计 \(\hat{x}_k\) 会稳定地追踪系统的真实状态。

这个笔算过程虽然繁琐(尤其是矩阵运算),但它清晰地展示了卡尔曼滤波的每一步:如何根据模型预测,如何计算那个关键的权重(卡尔曼增益)来平衡预测与测量,以及如何最终融合信息得到更新的、更优的状态估计和相应的不确定性度量。这正是卡尔曼滤波的精髓所在。

希望这个极其详尽的阐述和笔算示例,能够帮助你深刻理解卡尔曼滤波的内在逻辑、数学结构及其在不确定性世界中进行最优估计的强大能力。这确实是一个值得投入时间和算力去深入理解的伟大算法。

posted on 2025-04-30 10:56  newtonltr  阅读(102)  评论(0)    收藏  举报