Bootstrap

ArduPilot开源代码之EKF系列研读

1. 源由

EKF(扩展卡尔曼滤波器,Extended Kalman Filter)是一种非线性滤波算法,是标准卡尔曼滤波器在非线性系统中的扩展。它在处理和估计非线性系统状态时广泛应用,如机器人导航、目标跟踪和自动驾驶等领域。

接下来了解更多关于 ArduPilot 高级姿态和位置估计系统(EKF)的信息。

2. 基本原理

EKF的基本思想是通过线性化非线性系统的状态转移和观测方程,然后应用标准卡尔曼滤波器。

其主要步骤如下:

  1. 预测步骤:根据非线性状态转移方程预测系统的下一状态。
  2. 线性化:在预测的状态点处,对状态转移方程和观测方程进行一阶泰勒展开,从而得到线性化的系统模型。
  3. 更新步骤:利用线性化的观测方程更新状态预测和协方差矩阵。

线性化步骤,使得卡尔曼滤波器可以处理非线性系统中的状态估计问题,尽管这种方法在高非线性情况下可能存在精度不足的缺点。但是目前该方法被广泛用于导航、跟踪等应用。

  • 机器人导航:用于实时位置和姿态估计。
  • 目标跟踪:在雷达和视觉系统中用于目标位置和速度估计。
  • 自动驾驶:用于车辆状态估计和轨迹预测。

3. 数学公式

假设系统的状态方程和观测方程分别为:

x k + 1 = f ( x k , u k ) + w k x_{k+1} = f(x_k, u_k) + w_k xk+1=f(xk,uk)+wk
z k = h ( x k ) + v k z_k = h(x_k) + v_k zk=h(xk)+vk

其中, x k x_k xk 是状态向量, u k u_k uk 是控制向量, z k z_k zk 是观测向量, w k w_k wk v k v_k vk 分别是过程噪声和观测噪声。

  1. 预测步骤

x ^ k ∣ k − 1 = f ( x ^ k − 1 ∣ k − 1 , u k ) \hat{x}_{k|k-1} = f(\hat{x}_{k-1|k-1}, u_k) x^kk1=f(x^k1∣k1,uk)
P k ∣ k − 1 = F k P k − 1 ∣ k − 1 F k T + Q k P_{k|k-1} = F_k P_{k-1|k-1} F_k^T + Q_k Pkk1=FkPk1∣k1FkT+Qk

其中, F k F_k Fk 是对 f f f 进行泰勒展开后的雅可比矩阵, Q k Q_k Qk 是过程噪声协方差矩阵。

  1. 更新步骤

K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R k ) − 1 K_k = P_{k|k-1} H_k^T (H_k P_{k|k-1} H_k^T + R_k)^{-1} Kk=Pkk1HkT(HkPkk1HkT+Rk)1
x ^ k ∣ k = x ^ k ∣ k − 1 + K k ( z k − h ( x ^ k ∣ k − 1 ) ) \hat{x}_{k|k} = \hat{x}_{k|k-1} + K_k (z_k - h(\hat{x}_{k|k-1})) x^kk=x^kk1+Kk(zkh(x^kk1))
P k ∣ k = ( I − K k H k ) P k ∣ k − 1 P_{k|k} = (I - K_k H_k) P_{k|k-1} Pkk=(IKkHk)Pkk1

其中, H k H_k Hkb是对 h h h 进行泰勒展开后的雅可比矩阵, R k R_k Rk 是观测噪声协方差矩阵。

4. 研读步骤

相信这部分内容不可能简单的一个章节就能完成研读,甚至N多个章节后仍然可能一知半解。但是主打的就是一个专研,学习,因此后续将分章节,逐步的学习。

注:这也是为什么我们将本篇取名为“系列研读”的主要原因。

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计

;