
三维机动目标跟踪在无人驾驶和无人机避障领域一直是个头疼的问题。目标突然加减速、
急转弯时,单一运动模型根本 hold 不住。最近在 Matlab 里折腾了个 IMM+UKF 的组合方
案,实测发现比传统 EKF 靠谱不少,这里把核心思路和踩过的坑捋一捋。
先看模型配置——IMM 的核心在于多模型并行。这里选了 CV(匀速)和 CS(当前统计)
两个模型玩混搭。CV 模型的状态向量是[px,py,pz,vx,vy,vz],转移矩阵对角线塞满 1 和 Δt
,典型的匀速直线套路。但遇到蛇皮走位的目标,CS 模型就要接管了:加速度项用修正
瑞利分布建模,自适应调整过程噪声。
关键代码片段看这里:
```matlab
function [x_hat,P_hat]=imm_mixing(x_est,P_est,mu,model_trans)
r = size(x_est,2);
c_joint = mu * model_trans;
mu_ij = model_trans .* (mu' ./ c_joint);
% 状态混合
x_mixed = zeros(size(x_est));
for j=1:r
x_mixed(:,j) = sum(x_est .* mu_ij(:,j)',2);
end
```
这段处理模型概率混合的计算,mu_ij 计算转移权重时容易出维度对不齐的坑。特别是当
模型数量变化时,model_trans 矩阵的转置顺序要特别注意。
滤波器的选择上,EKF 在三维空间里雅可比矩阵算到怀疑人生。特别是当俯仰角超过 90
度时,欧拉角参数化直接爆炸。改用 UKF 后,Sigma 点生成反而更省事:
```matlab
function [sigma] = ut_sigma(x,P,alpha,beta,kappa)
n = length(x);
lambda = alpha^2*(n + kappa) - n;
U = chol((n + lambda)*P);
sigma = zeros(n,2*n+1);
sigma(:,1) = x;
for k=1:n
sigma(:,k+1) = x + U(:,k);
sigma(:,k+n+1) = x - U(:,k);
end
```