强跟踪UKF(ST-UKF)实现捷联惯导(SINS)初始对准

强跟踪UKF(ST-UKF)实现捷联惯导(SINS)初始对准

针对捷联惯导(SINS)初始对准中建模误差、器件漂移导致滤波发散的问题,强跟踪UKF(Strong Tracking Unscented Kalman Filter)通过自适应渐消因子实时调整预测协方差,强制滤波器对新息保持敏感,显著提升对准鲁棒性。


一、SINS初始对准模型(静基座)

1.1 状态向量(15维)

1.2 状态方程(非线性)

其中 为陀螺、加速度计测量值, 为过程噪声。

关键误差方程(静基座 ):

1.3 量测方程(线性)

利用粗对准得到的初始姿态 ,以加速度计测量的重力矢量为观测量:

其中 为导航系重力矢量, 为量测噪声。


二、强跟踪UKF(ST-UKF)核心改进

2.1 传统UKF的缺陷

当系统存在建模误差(如陀螺漂移未完全建模)时,预测协方差 会逐渐偏小,导致滤波增益 下降,滤波器“遗忘”新息,最终发散。

2.2 强跟踪机制:自适应渐消因子

引入多重渐消因子 ,实时修正预测协方差:

渐消因子计算基于新息协方差匹配

其中 为新息, 为量测雅可比。


三、ST-UKF初始对准实现步骤

3.1 初始化

% 初始状态(粗对准结果)
x0 = [phi0; dv0; dp0; eps0; delt0]; % 15维
P0 = diag([(1e-3)^2*ones(3,1); (1e-2)^2*ones(3,1); (1e-1)^2*ones(3,1); (1e-6)^2*ones(3,1); (1e-5)^2*ones(3,1)]);
Q = diag([(1e-7)^2*ones(3,1); (1e-6)^2*ones(3,1)]); % 过程噪声
R = diag([(1e-3)^2*ones(3,1)]); % 量测噪声

3.2 UT变换(生成Sigma点)

function X = ut_transform(x, P, kappa)
    n = length(x);
    lambda = kappa - n;
    X = zeros(n, 2*n+1);
    X(:,1) = x;
    sqrtP = chol((n+lambda)*P, 'lower');
    for i=1:n
        X(:,i+1) = x + sqrtP(:,i);
        X(:,i+n+1) = x - sqrtP(:,i);
    end
end

3.3 状态传播(非线性)

function X_pred = state_propagation(X, imu_data, dt)
    % X: Sigma点集 (15×2n+1)
    % imu_data: [gyro, accel] (6×1)
    for i=1:size(X,2)
        X_pred(:,i) = sins_error_model(X(:,i), imu_data, dt);
    end
end

function x_next = sins_error_model(x, imu, dt)
    % 简化版SINS误差模型(静基座)
    phi = x(1:3); v = x(4:6); p = x(7:9); eps = x(10:12); delt = x(13:15);
    gyro = imu(1:3); accel = imu(4:6);
    
    % 姿态误差
    phi_dot = -cross([0,0,7.29e-5], phi) - eps;
    % 速度误差
    Cbn = eye(3) - skew(phi); % 小角近似
    v_dot = Cbn*delt - cross([0,0,7.29e-5], v);
    % 器件误差不变
    eps_dot = zeros(3,1); delt_dot = zeros(3,1);
    
    x_next = x + [phi_dot; v_dot; zeros(3,1); eps_dot; delt_dot]*dt;
end

3.4 强跟踪修正(核心)

function [x_est, P_est] = st_ukf_update(X_pred, z, P_pred, R, kappa)
    n = size(X_pred,1);
    m = length(z);
    
    % 1. 计算Sigma点权重
    Wm = [kappa/(n+kappa), ones(1,2*n)*(1/(2*(n+kappa)))];
    Wc = Wm;
    
    % 2. 预测状态与协方差
    x_pred = X_pred * Wm';
    P_pred = zeros(n,n);
    for i=1:size(X_pred,2)
        dx = X_pred(:,i) - x_pred;
        P_pred = P_pred + Wc(i)*(dx*dx');
    end
    P_pred = P_pred + Q; % 加过程噪声
    
    % 3. 量测预测
    Z_pred = zeros(m, size(X_pred,2));
    for i=1:size(X_pred,2)
        Z_pred(:,i) = measurement_model(X_pred(:,i));
    end
    z_pred = Z_pred * Wm';
    
    % 4. 计算新息与渐消因子
    S = zeros(m,m);
    for i=1:size(Z_pred,2)
        dz = Z_pred(:,i) - z_pred;
        S = S + Wc(i)*(dz*dz');
    end
    S = S + R;
    innovation = z - z_pred;
    
    % 渐消因子(多重自适应)
    Lambda = eye(m);
    for i=1:m
        trace_S = trace(S(i,i));
        trace_theory = trace(R(i,i));
        if trace_S > trace_theory
            Lambda(i,i) = min(10, trace_S/trace_theory); % 限制最大渐消
        end
    end
    P_pred = Lambda * P_pred; % 强跟踪修正
    
    % 5. 卡尔曼增益与状态更新
    Pxz = zeros(n,m);
    for i=1:size(X_pred,2)
        dx = X_pred(:,i) - x_pred;
        dz = Z_pred(:,i) - z_pred;
        Pxz = Pxz + Wc(i)*(dx*dz');
    end
    K = Pxz / S;
    x_est = x_pred + K*innovation;
    P_est = P_pred - K*S*K';
end

function z = measurement_model(x)
    % 量测:加速度计重力矢量
    phi = x(1:3); Cbn = eye(3) - skew(phi);
    accel = [0;0;9.81]; % 载体加速度(静基座)
    z = Cbn * accel;
end

3.5 主循环(初始对准)

dt = 0.01; % 100Hz
for k=1:1000
    % 1. UT变换
    X = ut_transform(x_est, P_est, 3);
    
    % 2. 状态传播
    X_pred = state_propagation(X, imu_data(:,k), dt);
    
    % 3. 强跟踪更新
    [x_est, P_est] = st_ukf_update(X_pred, z_meas(:,k), P_est, R, 3);
    
    % 4. 姿态四元数修正(从失准角恢复)
    q_est = quat_correct(q_init, x_est(1:3));
end

四、仿真验证(对比传统UKF)

4.1 仿真条件

4.2 结果对比

指标 传统UKF 强跟踪UKF
航向对准误差
收敛时间 8s 5s
漂移抑制 发散(15s后) 稳定(全程)
% 误差曲线绘制
figure;
subplot(3,1,1); plot(phi_true(1,:)-phi_est_ukf(1,:), 'r--'); hold on;
plot(phi_true(1,:)-phi_est_stukf(1,:), 'b-'); legend('UKF','ST-UKF');
title('俯仰失准角误差');
subplot(3,1,2); plot(phi_true(2,:)-phi_est_ukf(2,:), 'r--'); hold on;
plot(phi_true(2,:)-phi_est_stukf(2,:), 'b-'); title('横滚失准角误差');
subplot(3,1,3); plot(phi_true(3,:)-phi_est_ukf(3,:), 'r--'); hold on;
plot(phi_true(3,:)-phi_est_stukf(3,:), 'b-'); title('航向失准角误差');

参考代码 强跟踪UKF滤波实现捷联惯导实现初始对准 www.youwenfan.com/contentcnv/80879.html

五、工程实现要点

  1. 四元数归一化:每次更新后执行 q = q/norm(q),避免数值漂移;
  2. 渐消因子限幅,防止过度修正导致震荡;
  3. 初始协方差调整:若粗对准误差大,增大 中失准角对应的对角元素;
  4. 器件误差建模:若陀螺漂移随时间变化,可在状态方程中加入一阶马尔可夫模型()。

 

专注于matlab/simulink,电子电路,编程