扩展卡尔曼滤波EKF
时间: 2025-01-09 13:46:29 浏览: 1
### 扩展卡尔曼滤波(EKF)原理
扩展卡尔曼滤波是一种用于非线性系统的状态估计技术,它基于标准卡尔曼滤波进行了改进以适应非线性的动态系统和观测模型。对于非线性函数,EKF采用泰勒级数展开的方式,在当前最佳估计点附近近似这些非线性关系为线性形式[^1]。
具体来说,当处理非线性过程方程 \( \mathbf{x}_{k} = f(\mathbf{x}_{k-1},\mathbf{u}_k)+w_k \) 和测量方程 \( z_k=h(\mathbf{x}_k)+v_k\) 时,其中\( w_k \) 是过程噪声而 \( v_k \) 表示测量误差,则可以通过雅可比矩阵计算局部导数值来进行预测与更新操作:
#### 预测阶段
\[ \hat{\mathbf{x}}^-_k=f(\hat{\mathbf{x}}_{k-1},\mathbf{u}_k)\quad (1)\]
\[ P^{-}_k=F_kP_{k-1}{F^{T}_k}+Q_k\qquad(2)\]
这里 \( F_k=\frac{\partial f}{\partial x}| _{{\hat {\mathbf {x}}} _{k-1},{\mathbf {u}} _k}\),即在给定点处求得的过程模型关于状态变量的一阶偏微分;\( Q_k \)代表过程噪音协方差矩阵。
#### 更新/校正阶段
\[ K_k=P^{-}_kH^{T}(HP^{-}_kH^{T}+R)^{-1}\qquad(3)\]
\[ \hat{\mathbf{x}}_k=\hat{\mathbf{x}}^{-}_k+K_k(z_k-h(\hat{\mathbf{x}}^{-}_k))\quad(4)\]
\[ P_k=(I-K_kH)P^{-}_k(I-K_kH)^{T}+KRK^{T}\qquad(5)\]
上述公式中的 \( H=\left.\dfrac{\partial h}{\partial x}\right|_{\hat{\mathbf{x}}^{-}_k}\), 它是在估计的状态向量位置上对观察模型取一阶偏导的结果; 而 \( R \) 则表示观测量的不确定性程度或者说测量噪声的协方差矩阵.
### 实现方法
针对实际应用场合下的传感器数据融合问题,比如姿态解算中涉及到的角度变化率由陀螺仪提供,而绝对方向信息则来自加速度计和磁力计读数的情况,可以构建如下所示的时间迭代估计流程:
```python
import numpy as np
def ekf_predict(x_hat_prev, u, A, B, Q):
"""Predict step of the Extended Kalman Filter."""
# Predict state and covariance matrix
x_pred = A @ x_hat_prev + B @ u
# Compute Jacobian matrices at predicted point
F = compute_jacobian_f(x_pred, u)
P_pred = F @ P_prev @ F.T + Q
return x_pred, P_pred
def ekf_update(x_pred, y_meas, C, R, P_pred):
"""Update step of the Extended Kalman Filter."""
# Measurement prediction from model
y_model = predict_measurement(x_pred)
# Compute residual between measurement & its expectation under current estimate
res = y_meas - y_model
# Calculate Jacobians needed for update equations
H = compute_jacobian_h(x_pred)
S = H @ P_pred @ H.T + R
K = P_pred @ H.T @ np.linalg.inv(S)
# Update estimated state vector using gain factor times innovation term
x_estimated = x_pred + K @ res
I_KH = np.eye(len(K)) - K @ H
P_updated = I_KH @ P_pred @ I_KH.T + K @ R @ K.T
return x_estimated, P_updated
```
此代码片段展示了如何在一个简单的Python环境中执行一次完整的EKF循环,包括预测和更新两个主要步骤。注意这里的`compute_jacobian_f`, `predict_measurement`, 及 `compute_jacobian_h` 函数需根据具体的物理场景定义相应的数学表达式来完成。
### 应用实例
一个典型的应用案例是对惯性导航系统(INU)内的多源传感设备所采集的数据进行同步处理并得到更精确的姿态角度输出。例如,在飞行器控制系统里,通过组合使用IMU内部集成的各种类型的敏感元件——如三轴加速计、陀螺仪以及电子罗盘等装置获取的信息,借助于EKF算法能够有效地消除各单独信号中存在的随机波动成分,进而提高整体定位精度和服务质量[^3].
阅读全文