一、系统模型与参数设置
%% 系统参数定义
global dt;
dt = 0.1; % 时间步长(s)
T = 100; % 仿真总时长(s)
t = 0:dt:T-dt;
% 状态向量维度定义(位置误差、速度误差、姿态误差、传感器偏差)
state_dim = 15; % [lat_err, lon_err, alt_err, vn_err, ve_err, vd_err, roll_err, pitch_err, yaw_err, gyro_bias_x, gyro_bias_y, gyro_bias_z, accel_bias_x, accel_bias_y, accel_bias_z]
% 初始状态与协方差
x0 = zeros(state_dim,1); % 初始误差状态
P0 = diag([0.1^2, 0.1^2, 0.01^2, 0.01^2, 0.01^2, 0.01^2, 0.001^2, 0.001^2, 0.001^2, 0.0001^2, 0.0001^2, 0.0001^2, 0.0001^2, 0.0001^2, 0.0001^2]);二、核心算法实现
1. 状态转移方程
function x_pred = state_transition(x, dt)
% 提取状态变量
[lat_err, lon_err, alt_err, vn_err, ve_err, vd_err, roll_err, pitch_err, yaw_err, ...
gyro_bx, gyro_by, gyro_bz, accel_bx, accel_by, accel_bz] = x;
% 地球参数
g0 = 9.78049; % 重力加速度(m/s²)
Re = 6378137; % 地球半径(m)
omega_ie = 7.292115e-5; % 地球自转角速度(rad/s)
% 姿态更新(四元数法)
q = quat_from_euler([roll_err, pitch_err, yaw_err]);
C_nb = quat2dcm(q);
% 加速度计测量模型
f_b = [0; 0; g0] + C_nb' * [accel_bx; accel_by; accel_bz] + [0; 0; -9.81];
% 运动学方程
vn_pred = vn_err + (f_b(1)/m + g0*sin(yaw_err)) * dt;
ve_pred = ve_err + (f_b(2)/m - g0*cos(yaw_err)) * dt;
vd_pred = vd_err + f_b(3)/m * dt;
% 位置更新(NED坐标系)
lat_pred = lat_err + (vn_pred * sin(yaw_err) + ve_pred * cos(yaw_err)) * dt / Re;
lon_pred = lon_err + (ve_pred * sin(yaw_err) - vn_pred * cos(yaw_err)) * dt / (Re * cos(lat_err));
alt_pred = alt_err + vd_pred * dt;
% 误差状态更新
x_pred = [lat_pred, lon_pred, alt_pred, vn_pred, ve_pred, vd_pred, ...
roll_err, pitch_err, yaw_err, gyro_bx, gyro_by, gyro_bz, accel_bx, accel_by, accel_bz]';
end2. 观测方程(GPS位置测量)
function z = observation_model(x, truth)
% 真实位置与估计位置差异
dx = truth(1) - x(1);
dy = truth(2) - x(2);
dz = truth(3) - x(3);
z = [dx; dy; dz] + mvnrnd([0;0;0], diag([10^2,10^2,30^2]))';
end三、EKF滤波实现
%% EKF滤波初始化
x_est = x0;
P_est = P0;
% 过程噪声协方差(INS误差模型)
Q = diag([0.01^2, 0.01^2, 0.001^2, 0.001^2, 0.001^2, 0.001^2, 0.0001^2, 0.0001^2, 0.0001^2, 0.00001^2, 0.00001^2, 0.00001^2, 0.00001^2, 0.00001^2, 0.00001^2]);
% 观测噪声协方差(GPS测量噪声)
R = diag([10^2, 10^2, 30^2]);
%% 仿真循环
truth = generate_ground_truth(T); % 生成真实轨迹
[ins_data, gps_data] = simulate_sensors(truth, Q, R); % 生成带噪声的传感器数据
est_states = zeros(size(truth));
for k = 1:T/dt
% 预测步骤
x_pred = state_transition(x_est, dt);
P_pred = F * P_est * F' + Q; % F为状态转移矩阵
% 更新步骤
z = observation_model(x_pred, truth(:,k));
K = P_pred * H' / (H * P_pred * H' + R);
x_est = x_pred + K * (z - H * x_pred);
P_est = (eye(size(P_pred)) - K*H) * P_pred;
est_states(:,k) = x_est;
end四、辅助函数实现
1. 真实轨迹生成
function truth = generate_ground_truth(T)
% 生成螺旋上升轨迹(示例)
t = 0:0.1:T;
truth = zeros(3,length(t));
for i = 1:length(t)
truth(1,i) = 0.1*sin(0.1*t(i));
truth(2,i) = 0.1*cos(0.1*t(i));
truth(3,i) = 0.05*t(i);
end
end2. 传感器噪声模拟
function [ins_data, gps_data] = simulate_sensors(truth, Q, R)
N = length(truth);
ins_data = zeros(15,N);
gps_data = zeros(3,N);
% INS误差模拟
for i = 1:N
ins_data(:,i) = truth(:,i) + mvnrnd(zeros(15,1), Q)';
end
% GPS位置测量模拟
for i = 1:N
gps_data(:,i) = truth(:,i) + mvnrnd(zeros(3,1), R)';
end
end五、性能评估与可视化
%% 结果分析
figure;
subplot(3,1,1);
plot(t, truth(1,:), 'b', t, est_states(1,:), 'r--');
title('纬度误差对比');
xlabel('时间(s)'); ylabel('误差(m)');
subplot(3,1,2);
plot(t, truth(2,:), 'b', t, est_states(2,:), 'r--');
title('经度误差对比');
subplot(3,1,3);
plot(t, truth(3,:), 'b', t, est_states(3,:), 'r--');
title('高度误差对比');
%% 误差统计
mae_lat = mean(abs(est_states(1,:) - truth(1,:)));
rmse_lat = sqrt(mean((est_states(1,:) - truth(1,:)).^2));
disp(['纬度MAE: ', num2str(mae_lat), ' m | RMSE: ', num2str(rmse_lat)]);参考代码 INS/GPS组合导航仿真代码 www.youwenfan.com/contentsfa/59875.html
六、关键改进方向
多传感器融合
- 添加地磁传感器数据融合(需扩展状态向量)
- 实现多普勒测速仪(DVL)辅助定位
动态模型优化
- 引入车辆运动学约束(如自行车模型)
- 考虑地球曲率与重力异常修正
实时性优化
- 采用平方根卡尔曼滤波降低计算量
- 使用GPU加速大规模矩阵运算
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。