4. 状态估计基础:卡尔曼滤波原理、EKF、UKF简介

各位同学,欢迎来到状态估计这一章。说实话,这是整个自主降落系统里最核心、也最容易让人头疼的部分。我当年刚接触多旋翼时,看到卡尔曼滤波的公式也是一脸懵。但别怕,今天我用最接地气的方式,带大家把这几个滤波器搞明白。

4.1 为什么需要状态估计?

你想想看,无人机在降落过程中,传感器数据是直接能用的吗?

当然不是。GPS有噪声,IMU有漂移,视觉里程计偶尔会丢帧。每个传感器都有自己的脾气。我们需要一个「大脑」,把这些乱七八糟的数据融合起来,得到一个靠谱的估计值。

这个大脑,就是状态估计器。而卡尔曼滤波,是其中最经典、最实用的工具。

核心思想: 用预测 + 测量,得到最优估计。说白了,就是「我不完全相信传感器,也不完全相信模型,我取一个折中,而且这个折中是最优的」。

4.2 卡尔曼滤波(KF)原理

卡尔曼滤波适用于线性系统、高斯噪声的场景。我刚开始做飞控时,用的就是标准KF做高度融合。嗯,这里要注意,它有几个关键假设:

  • 系统是线性的
  • 噪声是高斯白噪声
  • 初始状态已知

它的工作流程,我习惯分成两步:预测和更新。

4.2.1 预测步骤

根据上一时刻的状态,预测当前时刻的状态。比如,我知道上一秒无人机在10米高度,速度是1m/s,那这一秒我猜它在11米左右。当然,这个预测有误差。

// 预测状态
x_pred = A * x_prev + B * u
// 预测协方差
P_pred = A * P_prev * A^T + Q

4.2.2 更新步骤

拿到传感器测量值后,修正预测值。比如,激光测距仪说现在是10.8米,那我们就结合预测和测量,算出一个最优值。

// 卡尔曼增益
K = P_pred * H^T * (H * P_pred * H^T + R)^(-1)
// 更新状态
x_est = x_pred + K * (z - H * x_pred)
// 更新协方差
P_est = (I - K * H) * P_pred

个人经验: 调参时,Q和R的比值决定了你更相信模型还是传感器。我曾经在调试时把R设得太小,结果无人机跟着噪声乱跳,差点炸机。后来我学乖了,先让Q大一点,让滤波器平滑些,再慢慢调。

4.3 扩展卡尔曼滤波(EKF)

现实世界哪有那么多线性系统?无人机降落时,视觉观测模型是非线性的,IMU的旋转也是非线性的。这时候,标准KF就不够用了。

EKF的思路很简单:把非线性函数线性化。怎么线性化?用泰勒展开,取一阶近似。

举个例子,假设我们有非线性函数 f(x) 和 h(x):

// 状态方程
x_k = f(x_{k-1}, u_k) + w_k
// 观测方程
z_k = h(x_k) + v_k

EKF的做法是:在估计点附近,计算雅可比矩阵,把f和h近似成线性函数。

避坑指南: 我曾经在视觉SLAM项目中,因为雅可比矩阵算错了,导致滤波器发散。检查了半天才发现是求导时漏了一项。所以,写EKF时,雅可比矩阵一定要手算一遍,别完全依赖自动求导。

EKF的流程和KF类似,只是把A和H换成了雅可比矩阵:

// 预测
x_pred = f(x_prev, u)
F = df/dx (雅可比矩阵)
P_pred = F * P_prev * F^T + Q

// 更新
H = dh/dx (雅可比矩阵)
K = P_pred * H^T * (H * P_pred * H^T + R)^(-1)
x_est = x_pred + K * (z - h(x_pred))
P_est = (I - K * H) * P_pred

4.4 无迹卡尔曼滤波(UKF)

EKF有个问题:线性化会引入误差。如果非线性很强,一阶近似就不够用了。这时候,UKF登场了。

UKF的思想很巧妙:我不去近似非线性函数,而是用一堆采样点(Sigma点)去逼近概率分布。说白了,就是「用点云代替解析解」。

4.4.1 Sigma点采样

根据当前状态的均值和协方差,生成2n+1个Sigma点(n是状态维度)。这些点能很好地代表原分布。

// 生成Sigma点
λ = α^2 * (n + κ) - n
X0 = x_mean
Xi = x_mean + sqrt((n+λ)*P)  (i=1..n)
Xi = x_mean - sqrt((n+λ)*P)  (i=n+1..2n)

4.4.2 预测与更新

把每个Sigma点通过非线性函数传播,然后加权平均得到预测值。更新时也是类似,用Sigma点计算协方差和卡尔曼增益。

我的建议: 如果你的系统非线性很强(比如大角度姿态估计),优先用UKF。它比EKF更鲁棒,而且不需要算雅可比矩阵。我在做视觉惯性里程计时,从EKF换成UKF后,精度提升了约15%。

4.5 三种滤波器的对比

特性 KF EKF UKF
适用系统 线性 弱非线性 强非线性
计算复杂度 较高
是否需要雅可比
精度 最优(线性) 一阶近似 二阶近似
实现难度 简单 中等 中等

4.6 知识体系总览

下面这张图,是我自己总结的三种滤波器选择逻辑。你一看就明白什么时候该用哪个。

状态估计滤波器选择流程图 系统是否线性? 是 → 使用标准卡尔曼滤波(KF) 非线性强吗? 弱 → 使用EKF 强 → 使用UKF 注:实际项目中,建议从EKF开始,遇到精度问题再升级到UKF

4.7 实战中的选择建议

说了这么多理论,到底怎么选?我给大家一个实战清单:

  • GPS + IMU融合: 用标准KF就够了,因为GPS位置和IMU加速度的关系是线性的。
  • 视觉惯性里程计(VIO): 推荐UKF。视觉观测模型是非线性的,UKF比EKF更稳定。
  • 自主降落中的高度估计: 如果只用激光测距,KF就行。如果融合视觉深度,建议UKF。

我的习惯: 先写一个标准KF框架,然后根据实际效果决定是否升级。不要一开始就上UKF,调试起来更复杂。记住,简单够用就好。

好了,状态估计的基础就讲到这里。这三种滤波器是后续视觉定位和自主降落的基石。下一节我们会把这些理论用到实际的降落场景中,到时候你会看到它们是如何协同工作的。


专注资料整理