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点。怎么选?
- 第一个点:就是均值点本身。
- 剩下的点:沿着每个维度的主方向,往正负两边各走一步。步长由协方差矩阵和缩放参数决定。
我习惯用下面的公式来理解:
// 假设状态维度 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ᵢ_m 和 Wᵢ_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就学会了一半。