4、无迹变换的核心思想:用固定数量的Sigma点近似概率分布,而非线性化函数

好,咱们今天聊点硬核的。无迹卡尔曼滤波(UKF)之所以能在多传感器融合里站稳脚跟,说白了就是靠这个“无迹变换”。很多新手一上来就盯着公式看,结果越看越晕。我当年也是这么过来的。

其实你想想看,无迹变换的核心思想特别简单:我不去硬解那个非线性函数,而是用一堆精心挑选的点,去“模拟”概率分布经过变换后的样子。嗯,就是这么回事。

4.1 为什么非要“无迹”?

传统的扩展卡尔曼滤波(EKF)是怎么做的?它把非线性函数在均值点附近做一阶泰勒展开,说白了就是“线性化”。这招在弱非线性下还行,一旦遇到强非线性,比如大角度旋转、剧烈加速,误差就大了去了。

我在做无人机室内定位项目时遇到过这种情况:用EKF融合IMU和UWB,结果姿态估计在快速转弯时直接飘了。后来换成UKF,问题迎刃而解。为什么?因为EKF是在“猜”函数长什么样,而UKF是在“看”点怎么分布。

核心区别一句话:

  • EKF:线性化函数 → 近似整个变换
  • UKF:采样点 → 近似概率分布

4.2 Sigma点:那“固定数量”的点是怎么选的?

无迹变换的精髓,就是选那么几个“代表点”。这些点叫Sigma点。数量是固定的,通常是 2n+1 个,其中 n 是状态向量的维度。

举个例子,如果你的状态是二维的(比如位置x和y),那就选5个Sigma点。怎么选?

  1. 第一个点:就是均值点本身。
  2. 剩下的点:沿着每个维度的主方向,往正负两边各走一步。步长由协方差矩阵和缩放参数决定。

我习惯用下面的公式来理解:

// 假设状态维度 n = 2
// 均值 μ,协方差 P
// 缩放参数 λ = α²(n + κ) - n

// 第0个Sigma点
χ₀ = μ

// 第1到第n个Sigma点(正方向)
χᵢ = μ + sqrt((n + λ) * P) 的第i列

// 第n+1到第2n个Sigma点(负方向)
χᵢ = μ - sqrt((n + λ) * P) 的第(i-n)列

你看,就这么简单。这些点完美保留了原分布的均值和协方差信息。

我的小技巧:

参数α一般取一个很小的正数(比如0.001),控制点的散布范围。κ通常取0或3-n。β用来引入高阶项信息,对高斯分布取2效果最好。这些参数我踩过不少坑,建议你从默认值开始调。

4.3 这些点怎么“近似”概率分布?

选好Sigma点之后,我们把每个点都扔进非线性函数 f(·) 里算一遍。得到一组新的点:

// 每个Sigma点经过非线性变换
yᵢ = f(χᵢ)   // i = 0, 1, ..., 2n

然后,对这组新点做加权平均和加权协方差计算:

// 变换后的均值
y_mean = Σ(Wᵢ_m * yᵢ)

// 变换后的协方差
P_y = Σ(Wᵢ_c * (yᵢ - y_mean)(yᵢ - y_mean)ᵀ)

这里的 Wᵢ_mWᵢ_c 是权重,也是事先算好的。你不需要每次都推导,直接用标准公式就行。

为什么会这样?因为对于任何非线性函数,只要Sigma点能代表原分布,那这些点经过变换后的统计量,就能很好地近似真实变换后的分布。这是无迹变换最漂亮的地方——不需要求导,不需要雅可比矩阵

4.4 无迹变换 vs 蒙特卡洛方法

你可能想问:那为什么不直接用蒙特卡洛方法,撒几千个点?

嗯,这里要注意。蒙特卡洛方法确实更通用,但计算量太大。在嵌入式系统里,你哪有那么多算力去撒几千个点?无迹变换只用 2n+1 个点,就能达到三阶精度(对高斯分布而言)。

方法 采样点数 精度 计算量
EKF(线性化) 0(解析) 一阶
无迹变换 2n+1 三阶(高斯)
蒙特卡洛 数千 可调

说白了,无迹变换就是在精度和计算量之间,找到了一个黄金平衡点。

4.5 避坑指南

我曾经踩过的坑:

  • 协方差矩阵非正定:计算 sqrt(P) 时,如果P不是正定矩阵,会报错。解决办法是加一个小量 εI 到对角线上。
  • 参数α选太大:会导致Sigma点离均值太远,非线性效应被放大。我一般从0.001开始试。
  • 忘记归一化权重:权重之和必须为1,否则均值会偏。这个细节容易忽略。

4.6 小结

无迹变换的核心,就是“用点代替函数”。它不跟你玩泰勒展开那一套,而是直接采样、变换、加权。这个方法在多传感器融合里特别实用,尤其是当你面对IMU、GPS、视觉里程计这些非线性很强的传感器时。

下一章,我会带你看看无迹变换在UKF里具体怎么用,以及它如何帮我们搞定状态预测和更新。到时候你会发现,理解了无迹变换,UKF就学会了一半。