1. 状态估计与卡尔曼滤波基础
状态估计是工程领域中的核心问题之一,它解决的是如何从带有噪声的观测数据中推断出系统的真实状态。想象一下你在驾驶一辆自动驾驶汽车,GPS定位存在误差,雷达和摄像头测量也不完全准确,这时候就需要状态估计算法来"猜"出车辆的真实位置和速度。
卡尔曼滤波(Kalman Filter, KF)正是为解决这类问题而生的。它由Rudolf Kalman在1960年提出,本质上是一种最优递归估计算法——"最优"体现在最小化估计误差的协方差,"递归"意味着它不需要保存所有历史数据,只需前一时刻的估计结果就能进行当前估计。
提示:卡尔曼滤波的两个关键假设是线性系统和高斯噪声。当这两个条件满足时,KF能给出最优估计。但现实世界往往是非线性的,这就衍生出了EKF、UKF等变种算法。
基础KF包含两个主要步骤:
- 预测步(Predict):根据系统模型预测当前状态
- 更新步(Update):结合观测值修正预测
数学表达上,KF用以下五个方程描述:
matlab复制% 预测步
x_pred = F * x_prev; % 状态预测
P_pred = F * P_prev * F' + Q; % 协方差预测
% 更新步
K = P_pred * H' / (H * P_pred * H' + R); % 卡尔曼增益计算
x_update = x_pred + K * (z - H * x_pred); % 状态更新
P_update = (I - K * H) * P_pred; % 协方差更新
其中F是状态转移矩阵,H是观测矩阵,Q和R分别是过程噪声和观测噪声的协方差矩阵。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 非线性滤波的挑战与解决方案
2.1 扩展卡尔曼滤波(EKF)原理
当系统存在非线性时,标准KF不再适用。EKF的解决思路是对非线性函数进行一阶泰勒展开:
matlab复制% 非线性状态转移函数f和观测函数h的雅可比矩阵
F_jac = jacobian(f, x);
H_jac = jacobian(h, x);
然后在这些线性化点附近应用标准KF公式。我在实际项目中曾用EKF估计无人机姿态,发现当初始估计偏差较大时,线性化误差会导致滤波器发散。一个实用技巧是:
经
