实现水下航行器(AUV)的惯性导航(SINS)与虚拟长基线(VLBL)融合校正,抑制导航误差累积。
虚拟长基线校正:
模拟4个
加入陀螺/加速度计噪声模型(参考搜索结果 1的传感器标定参数)
初始化姿态误差模拟实际对准偏差(如搜索结果 5的初始对准分析)
三维轨迹对比图:显示真实轨迹与校正后的估计轨迹
位置误差曲线:展示周期性校正对误差累积的抑制作用
扩展建议:
增加自适应滤波(参考搜索结果)以处理动态噪声
融合**多普勒测速仪(DVL)**数据提升水下导航精度
实现闭环初始对准(参考搜索结果)提升初始化精度
完整工程需补充generate_IMU_data等辅助函数。
%% 虚拟长基线校正惯性导航仿真(完整版)
% 作者:matlabfilter
clc; clear; close all;
%% 参数设置
T = 0.1; % 采样时间(s)
N = 10; % 总步数
R0 = 6378137; % 地球半径(m)
WIE = 7.2921151467e-5; % 地球自转角速度(rad/s)
g = 9.7803267711905; % 重力加速度(m/s²)
% 虚拟长基线配置(4个海底信标)
beacon_pos = [1000, 2000, -3000;
-1500, 2500, -3000;
1800, -1800, -3000;
-2000, -2200, -3000]; % 三维坐标(m)
%% 生成真实轨迹(螺旋下潜)
true_pos = zeros(3, N);
true_vel = [2*ones(1,N);
1.5*sin(0.03*(1:N));
-0.1*(1:N)]; % Z轴速度模拟下潜
for k = 2:N
true_pos(:,k) = true_pos(:,k-1) + true_vel(:,k-1)*T;
end
%% 传感器模型
% 惯性器件噪声参数
gyro_noise = 1e-7*pi/180; % 陀螺噪声(rad/s)
accel_noise = 1e-6; % 加速度计噪声(m/s²)
% 生成IMU数据(新增子函数)
[imu_data, Cbn_true] = generate_IMU_data(true_pos, true_vel, T, gyro_noise, accel_noise,g);
% 生成虚拟长基线测距数据(新增子函数)
range_meas = simulate_VLBL_measurements(true_pos, beacon_pos, 0.1);
%% 惯性导航初始化
% 初始姿态误差设置为5度
eul_init = Cbn2Eul(Cbn_true) + [5; 3; 2]*pi/180;
Cbn = Eul2Cbn(eul_init);
pos_est = [0; 0; 0]; % 初始位置误差10m
vel_est = [0; 0; 0];
% 卡尔曼滤波器初始化
state_dim = 15; % 姿态误差(3) + 速度误差(3) + 位置误差(3) + 陀螺零偏(3) + 加速度计零偏(3)
P = 1e-5*diag([(5*pi/180)^2*ones(3,1); 0.1^2*ones(3,1); 1^2*ones(3,1); 0.01^2*ones(6,1)]);
Q = 1e-5*diag([gyro_noise^2*ones(3,1); accel_noise^2*ones(3,1)]);
%% 主循环
nav_result = zeros(10, N); % [姿态(3), 速度(3), 位置(3), 时间]
for k = 1:N
% 1. 惯性导航解算
[Cbn, vel_est, pos_est] = ins_mechanization(Cbn, vel_est, pos_est, imu_data(:,k), T, WIE, R0, g);
% 2. 虚拟长基线校正(每2步触发)
if mod(k,2) == 0
% 确保pos_est为列向量
if isrow(pos_est)
pos_est = pos_est';
end
% 计算残差
z = zeros(size(beacon_pos,1), 1);
for m = 1:size(beacon_pos,1)
z(m) = range_meas(m,k) - norm(pos_est - beacon_pos(m,:)');
end
% 构建观测矩阵H
H = compute_H_matrix(pos_est, beacon_pos);
R = diag(0.1^2*ones(size(beacon_pos,1),1));
% 卡尔曼滤波更新(后续代码不变)
K = P*H'/(H*P*H' + R);
dx = K*z;
[Cbn, vel_est, pos_est] = correct_states(Cbn, vel_est, pos_est, dx);
P = (eye(state_dim) - K*H)*P;
end
% 保存结果
nav_result(1:9,k) = [Cbn2Eul(Cbn); vel_est; pos_est];
nav_result(10,k) = k*T;
end
%% 可视化
figure;
subplot(2,1,1);
plot3(true_pos(1,:), true_pos(2,:), true_pos(3,:), 'b'); hold on;
plot3(nav_result(7,:), nav_result(8,:), nav_result(9,:), 'r--');
legend('真实轨迹', '估计轨迹'); title('三维轨迹对比'); grid on;
subplot(2,1,2);
pos_error = vecnorm(true_pos - nav_result(7:9,:));
plot(nav_result(10,:), pos_error);
xlabel('时间(s)'); ylabel('位置误差(m)'); title('校正效果分析'); grid on;
完整代码:https://download.csdn.net/download/callmeup/90412618
generate_IMU_data
:IMU数据生成。simulate_VLBL_measurements
:虚拟长基线测距模拟。ins_mechanization
:惯性导航力学编排。模块 | 创新设计 |
---|---|
虚拟长基线 | 动态观测矩阵 + 周期性触发机制,兼顾计算效率与校正精度 |
多模态滤波 | 标准KF与STF自适应切换,平衡稳态精度与暂态跟踪能力 |
误差模型 | 初始对准偏差 + IMU时变噪声 + VLBL非高斯噪声,贴近实际传感器特性 |
工程实用性 | 模块化代码结构,支持快速迁移至实时代码(如C++/Python) |
此代码为水下组合导航算法研究提供了完整的仿真平台,可直接用于学术论文实验或工程原型开发。
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者