第二章:经典跟踪滤波器——卡尔曼滤波原理、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)、粒子滤波入门

各位同学,咱们今天聊聊跟踪滤波器的“四大金刚”。

做雷达跟踪,说白了就是跟噪声斗智斗勇。目标明明在动,你测回来的数据却像喝醉了酒——东倒西歪。怎么办?滤波。

我个人习惯把滤波器比作“数据按摩师”。它把粗糙的测量值,揉捏成平滑的轨迹。今天这四种滤波器,就是按摩界的不同流派。咱们一个一个看。

2.1 卡尔曼滤波:一切的基础

卡尔曼滤波,简称KF。它是所有跟踪算法的老祖宗。1960年提出,到现在60多年了,依然活跃在一线。

它的核心思想就五个字:预测+更新。

核心公式(离散线性系统):

预测步:
  x̂(k|k-1) = F·x̂(k-1|k-1) + B·u(k)
  P(k|k-1) = F·P(k-1|k-1)·Fᵀ + Q

更新步:
  K(k) = P(k|k-1)·Hᵀ·(H·P(k|k-1)·Hᵀ + R)⁻¹
  x̂(k|k) = x̂(k|k-1) + K(k)·(z(k) - H·x̂(k|k-1))
  P(k|k) = (I - K(k)·H)·P(k|k-1)

看着公式多,其实就两件事:先猜目标下一步到哪,再用测量值修正这个猜测。

我在项目中遇到过一个问题:Q矩阵(过程噪声)设得太小,滤波器“太自信”,结果目标一机动就丢了。后来我学乖了,Q矩阵宁可设大一点,让滤波器保持“谦虚”。

避坑指南:

我曾经在调试某型雷达时,发现滤波发散。查了两天,最后发现是P矩阵初始化设成了零矩阵。记住:P(0)不能为零,否则卡尔曼增益永远为零,滤波器根本不工作。

2.2 扩展卡尔曼滤波(EKF):对付非线性

现实世界哪有那么多线性系统?目标做圆周运动,雷达测距测角,全是非线性。这时候KF就歇菜了。

EKF的思路很粗暴:把非线性函数线性化。怎么线性化?求导,用泰勒展开取一阶项。

EKF核心改动:

预测步:
  x̂(k|k-1) = f(x̂(k-1|k-1), u(k))   // 非线性状态转移
  P(k|k-1) = F_j·P(k-1|k-1)·F_jᵀ + Q  // F_j是f的雅可比矩阵

更新步:
  K(k) = P(k|k-1)·H_jᵀ·(H_j·P(k|k-1)·H_jᵀ + R)⁻¹  // H_j是h的雅可比矩阵
  x̂(k|k) = x̂(k|k-1) + K(k)·(z(k) - h(x̂(k|k-1)))
  P(k|k) = (I - K(k)·H_j)·P(k|k-1)

说白了,就是把非线性函数在估计点附近“掰直”,然后用KF那一套。

你想想看,这样做有什么问题?对,近似有误差。如果非线性很强,一阶近似就不够用了。我见过有人用EKF做纯角度跟踪,目标稍微远一点,滤波就发疯。为什么?因为角度测量的非线性太强,雅可比矩阵算出来都是病态的。

注意:EKF要求系统模型可微。如果你的模型有跳变、有死区,EKF会很难受。我曾经在项目中遇到一个带饱和特性的执行器,EKF直接发散。后来换了UKF才搞定。

2.3 无迹卡尔曼滤波(UKF):不线性化,直接采样

EKF的线性化近似,说白了有点“糙”。UKF换了个思路:我不近似函数,我近似概率分布。

怎么近似?用一组确定的采样点(Sigma点)来代表状态分布。把这些点通过非线性函数传过去,再统计输出点的均值和协方差。

UKF核心步骤:

1. 生成Sigma点(2n+1个点,n是状态维数)
   χ₀ = x̂
   χᵢ = x̂ + (√((n+λ)P))ᵢ, i=1..n
   χᵢ = x̂ - (√((n+λ)P))ᵢ₋ₙ, i=n+1..2n

2. 通过非线性函数传播
   γᵢ = f(χᵢ)

3. 计算预测均值和协方差
   x̂⁻ = ΣWᵢᵐ·γᵢ
   P⁻ = ΣWᵢᶜ·(γᵢ - x̂⁻)(γᵢ - x̂⁻)ᵀ + Q

4. 更新步类似,用测量函数再传一次

UKF的好处是:不需要算雅可比矩阵。对于强非线性系统,UKF的精度通常比EKF高一个数量级。

我记得有一次做无人机跟踪,目标做大过载机动。EKF跟丢了三次,换成UKF后稳稳的。为什么?因为UKF能捕捉到非线性变换后的真实均值和协方差,而EKF只是线性近似。

个人经验:UKF的计算量大约是EKF的2-3倍。如果你的系统非线性不强,或者计算资源紧张,EKF仍然是好选择。别盲目追求“高级”。

2.4 粒子滤波(PF):终极武器

前面三种滤波器,都假设噪声是高斯分布。如果噪声是非高斯的?比如多模态分布、重尾分布?这时候粒子滤波上场。

粒子滤波的思想更直接:用一堆随机粒子来近似后验概率。每个粒子代表一个可能的状态,粒子越密集的地方,概率越大。

粒子滤波核心流程:

1. 初始化:生成N个粒子,权重均为1/N
2. 预测:每个粒子按状态方程传播
3. 更新:根据测量值计算每个粒子的权重
4. 重采样:去掉权重小的粒子,复制权重大的粒子
5. 估计:加权平均得到状态估计

说白了,粒子滤波就是“广撒网,重点捕捞”。粒子数越多,精度越高,但计算量也越大。

我在项目中用过粒子滤波做多目标跟踪。场景是:两个目标交叉飞行,雷达回波混在一起。卡尔曼滤波直接懵了,因为后验分布是双峰的。粒子滤波却能同时跟踪两个峰,效果很好。

注意:粒子滤波的计算量很大。N=1000的粒子滤波,计算量大约是UKF的100倍。实时系统慎用。我曾经在嵌入式平台上试过,帧率直接掉到1Hz。后来优化到N=200,勉强能用。

2.5 四种滤波器对比

滤波器 适用场景 优点 缺点 计算量
KF 线性高斯系统 简单、快速、最优 只适用于线性 O(n³)
EKF 弱非线性高斯系统 实现简单,应用广泛 线性化误差,需算雅可比 O(n³)
UKF 强非线性高斯系统 精度高,无需雅可比 计算量稍大 O(n³)
PF 非线性非高斯系统 适用任意分布 计算量大,粒子退化 O(N·n²)

2.6 知识体系总览

下面这张图,是我自己画的四种滤波器的关系图。你一看就明白:

经典跟踪滤波器知识体系 跟踪滤波器 卡尔曼滤波 (KF) 扩展卡尔曼 (EKF) 无迹卡尔曼 (UKF) 粒子滤波 (PF) 线性高斯系统 最优解,计算最快 弱非线性高斯系统 需计算雅可比矩阵 强非线性高斯系统 Sigma点采样,精度高 非线性非高斯系统 粒子近似,计算量大 发展关系:KF → EKF/UKF → PF 复杂度递增,适用性递增 选择建议 线性用KF,弱非线性用EKF,强非线性用UKF,非高斯用PF 计算资源有限时,优先考虑KF和EKF

2.7 实战中的选择策略

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

  • 线性系统、计算资源紧张 → 无脑KF
  • 弱非线性、模型可微 → EKF,实现简单
  • 强非线性、高斯噪声 → UKF,精度优先
  • 非高斯噪声、多模态分布 → PF,但要做好计算量评估

我个人习惯是:先用KF试试,不行就上UKF。EKF我反而用得少,因为算雅可比矩阵太容易出错。有一次我算错了一个偏导数,整个团队排查了三天。从那以后,能用UKF的地方我绝不用EKF。

避坑指南:

我曾经在项目中遇到一个情况:UKF和EKF结果差不多,但UKF计算量大了两倍。后来发现,系统的非线性其实很弱,EKF完全够用。所以,别迷信“高级算法”。先分析你的系统非线性程度,再选滤波器。

好了,四种滤波器的核心内容就这些。记住:没有最好的滤波器,只有最合适的滤波器。下一章咱们聊聊多目标跟踪中的数据关联问题——那才是真正的“坑”。

可可精品资料库