【组合导航】GNSS与惯性及多传感器组合导航附matlab代码

简介: 【组合导航】GNSS与惯性及多传感器组合导航附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

本文是一种GNSS组合导航方法及装置,该方法包括:S1.使用惯性导航系统与GNSS的组合导航系统进行组合导航,输出导航信息,姿态角信息;S2.接收姿态角信息,并使用多GNSS定姿定向系统计算方位角信息,输出计算得到的方位角信息;S3.组合导航系统接收计算得到的方位角信息进行更新,输出更新后的导航信息.本发明具有实现方法简单,能够实现惯性/GNSS组合导航与多GNSS定姿定向的双向融合,且导航精度高且收敛速度快等优点.

⛄ 部分代码


clear all; close all; tic;

% 3DTraj_0528_04是一段动态数据

inputDataPath = strcat('.\data', '\', '3DTraj_220422_01.mat');

load(inputDataPath);

rng(1233, 'twister');


% 创建陀螺和加计,设置其误差参数并生成imu测量误差

G1 = Gyroscope();

G1.ts = 0.01;

G1.bias = 0.04 * [1; 1; 1] * Unit.degPerHour;

G1.noiseDensity = 0.01 * [1; 1; 1] * Unit.degPerSqhour;

gyroMeasErr = G1.generateError(trueValue.epoch);

A1 = Accelerometer();

A1.ts = 0.01;

A1.bias = 100 * [1; 1; 1] * Unit.ug;

A1.noiseDensity = 100 * [1; 1; 1] * Unit.ugPerSqhz;

accelMeasErr = A1.generateError(trueValue.epoch);


% 生成带误差的全局位置和速度

DVL = SensorDVL(); % 两次采样的间隔为1s

DVL.ts = 1;

DVL.velocityNoise = 0.1 * [1; 1; 1];

DVLVelMeasErr= DVL.generateError(trueValue.epoch, trueValue.ts);

DVLVel = zeros(trueValue.epoch,3);

for k = 1:1:trueValue.epoch

   DVLVel(k,:) = ( anglezxy2dcm(trueValue.attitude(k,2:4)')' * trueValue.velocity(k,2:4)' )';

   

   %加故障

%     if (k > 10000)&&(k < 12000)

%         DVLVel(k,:) = DVLVel(k,:) + [5, 0, 0];

%     end

end

DVLVelMeas = DVLVel(:, 1:3) + DVLVelMeasErr(:, 2:4);



% 初始化导航参数

% C_b_n = anglezxy2dcm(trueValue.attitude(1, 2:4)' + [6; 6; 6] * Unit.angleSec );

C_b_n = anglezxy2dcm(trueValue.attitude(1, 2:4)'+ [0.01; 0.01; 0.1] * Unit.deg );

vel = trueValue.velocity(1, 2:4)'+ [0.01; 0.01; 0];

pos = trueValue.position(1, 2:4)'+ [2/WGS84Parameter.Re, 2/WGS84Parameter.Re, 2];


% 创建状态和量测模型

stateModel = StateModelSINS15Dim(0.01); % 离散化步长是0.01s

measModel = MeasModelSINS15DimWithDVL();


% 创建一个Kalamn滤波器

kf = KalmanFilter();

kf.X = zeros(15, 1);

kf.P = diag([[8, 8, 8] * Unit.angleSec,...

           [0.1, 0.1, 0.1],...

           [5/WGS84Parameter.Re, 5/ WGS84Parameter.Re, 5],...

           [0.01, 0.01, 0.01] * Unit.degPerHour,...

           [100, 100, 100] * Unit.ug])^2;

kf.Q = diag([[0.01, 0.01, 0.01] * Unit.degPerSqhour,...

           [100, 100, 100] * Unit.ugPerSqhz])^2;    

kf.R = diag([0.15, 0.15, 0.15])^2;


% 预分配存储空间

epoch = trueValue.epoch;

calAtt = zeros(epoch - 10, 3);  calVel = zeros(epoch - 10, 3);  calPos = zeros(epoch - 10, 3);

errAtt = zeros(epoch - 10, 3);  errVel = zeros(epoch - 10, 3);  errPos = zeros(epoch - 10, 3);


for k = 1:1:epoch - 10

   kk = k+1;

   w_ib_b = trueValue.w(k, 2:4)' + gyroMeasErr(k, 2:4)';

   f_ib_b = trueValue.a(k, 2:4)' + accelMeasErr(k, 2:4)';

   

   [C_b_n, vel, pos] = insUpdateENU(C_b_n, vel, pos, w_ib_b, f_ib_b, trueValue.ts);

   

   stateModel.setParameter(C_b_n, vel, pos, f_ib_b);

   stateModel.update();

   kf.Phi = stateModel.transitionMatrix;

   kf.Gamma = stateModel.noiseDriveMatrix;

   kf.stateUpdate();

   

   if mod(k, 10) == 0

       

%         vv1(kk,:) = ( C_b_n* DVLVelMeas(kk, :)')';    % 此处验证了 问题应该出现在将DVL速度转换到导航系中

%         vv2(kk,:) = (anglezxy2dcm(trueValue.attitude(kk,2:4)')* DVLVelMeas(kk, :)')';

%         vv3(kk,:) = trueValue.velocity(kk,2:4);

       

      measModel.setParameter(vel, DVLVelMeas(kk, :)', C_b_n);

      measModel.update();

      kf.dZ = measModel.innovation;

%        AAA = kf.dZ

      kf.H = measModel.measurementMatrix;

      kf.measurementUpdate();

     

      C_b_n = anglezxy2dcm(kf.X(1:3)) * C_b_n;

      vel = vel - kf.X(4:6);

      pos = pos - kf.X(7:9);

      kf.zero(1,2,3,4,5,6,7,8,9);

   end

   

   calAtt(k, :) = dcm2anglezxy(C_b_n)';

   calVel(k, :) = vel';

   calPos(k, :) = pos';

   

   errAtt(k, :) = standarlizePRYAngle(calAtt(k, :) - trueValue.attitude(kk, 2:4));

   errVel(k, :) = calVel(k, :) - trueValue.velocity(kk, 2:4);

   errPos(k, :) = calPos(k, :) - trueValue.position(kk, 2:4);


end


%% 绘图

t = 0.01:0.01:0.01*(epoch - 10);


figure(1)      %  真实轨迹图

plot3(trueValue.position(:, 3)/Unit.deg, trueValue.position(:, 2)/Unit.deg,trueValue.position(:, 4),'b-','linewidth',2.0);

axis tight; grid on;

xlabel('经度 / deg'); ylabel('纬度 / deg'); zlabel('高度 / m');hold on;

plot3(trueValue.position(1, 3)/Unit.deg, trueValue.position(1, 2)/Unit.deg,...

   trueValue.position(1, 4), 'r*');

legend( '真实轨迹','起点');


figure

subplot(311)

plot(t,errAtt(:, 1) / Unit.deg);

title('姿态误差');

subplot(312)

plot(t,errAtt(:, 2) / Unit.deg);

subplot(313)

plot(t,errAtt(:, 3) / Unit.deg);


figure

subplot(311)

plot(t,errVel(:, 1));

title('速度误差');

subplot(312)

plot(t,errVel(:, 2));

subplot(313)

plot(t,errVel(:, 3));


figure

subplot(311)

plot(t,errPos(:, 1) * WGS84Parameter.Re, 'linewidth', 2.0); hold on;

ylabel('北向误差 / m');

title('位置误差');

subplot(312)

plot(t,errPos(:, 2) * (WGS84Parameter.Re * cos(45*Unit.deg)), 'linewidth', 2.0); hold on;

ylabel('东向误差 / m');

subplot(313)

plot(t,errPos(:, 3), 'linewidth', 2.0); hold on;

ylabel('天向误差 / m');




mean( abs(errVel(:, 1)) )

mean( abs(errVel(:, 2)) )

mean( abs(errVel(:, 3)) )


toc;

⛄ 运行结果

⛄ 参考文献

[1] 万年红, 王雪蓉. 基于边缘特征点的全景图像拼接算法[J]. 温州大学学报:自然科学版, 2016(1):10.

[2] 格鲁夫, P. D. ). GNSS与惯性及多传感器组合导航系统原理[M]. 国防工业出版社, 2011.

[3] 苏景岚. 车载视觉/INS/GNSS多传感器融合定位定姿算法研究[D]. 武汉大学, 2019.

[4] 胡恩伟. 基于MEMS多传感器数据融合的惯性组合导航系统算法设计与实现[D]. 重庆大学.

[5] PaulD.Groves. GNSS与惯性及多传感器组合导航系统原理.第2版[M]. 国防工业出版社, 2015.

[6] 格鲁夫练军想, 唐康华, 潘献飞. GNSS与惯性及多传感器组合导航系统原理 : Principles of GNSS, inertial, and multisensor integrated navigation systems[M]. 国防工业出版社, 2015.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
5月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
240 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
5月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
144 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
6月前
|
传感器 算法
基于无线传感器网络的MCKP-MMF算法matlab仿真
MCKP-MMF算法是一种启发式流量估计方法,用于寻找无线传感器网络的局部最优解。它从最小配置开始,逐步优化部分解,调整访问点的状态。算法处理访问点的动态影响半径,根据带宽需求调整,以避免拥塞。在MATLAB 2022a中进行了仿真,显示了访问点半径请求变化和代价函数随时间的演变。算法分两阶段:慢启动阶段识别瓶颈并重设半径,随后进入周期性调整阶段,追求最大最小公平性。
基于无线传感器网络的MCKP-MMF算法matlab仿真
|
5月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
113 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
6月前
|
传感器 监控 算法
基于虚拟力优化的无线传感器网络覆盖率matlab仿真
**摘要:** 本文探讨了基于虚拟力优化提升无线传感器网络(WSNs)覆盖率的方法。通过在MATLAB2022a中仿真,显示了优化前后网络覆盖率对比及收敛曲线。虚拟力优化算法模拟物理力,以优化传感器节点布局,防止重叠并吸引至目标区域,同时考虑墙壁碰撞。覆盖计算利用平面扫描法评估圆形和正方形传感器的覆盖范围。算法通过迭代优化网络性能,以提高WSNs的监控能力。
|
6月前
|
传感器 算法
基于无线传感器网络的LC-DANSE波束形成算法matlab仿真
摘要: 此MATLAB程序对比了LC-DANSE与LCMV波束形成算法在无线传感器网络中的性能,基于SNR和MSE指标。测试在MATLAB 2022a环境下进行。核心代码涉及权重更新迭代,用于调整传感器节点权重以增强目标信号。LC-DANSE是分布式自适应算法,关注多约束条件下的噪声抑制;LCMV则是经典集中式算法,侧重单个期望信号方向。两者在不同场景下各有优势。程序结果显示SNR和MSE随迭代变化趋势,并保存结果数据。
|
8月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
8月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
8月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)

热门文章

最新文章