%====本程序为捷联惯导的解算程序(由惯性器件的输出解算出飞行器的位置、速度、姿态信息)======
clear all;
close all;
clc;
deg_rad=pi/180; %由度转化成弧度
rad_deg=180/pi; %由弧度转化成度
%-------------------------------从源文件中读入数据----------------------------------
fid_read=fopen('IMUout.txt','r'); %path1_Den.dat 是由轨迹发生器产生的数据
[AllData NumofAllData]=fscanf(fid_read,'%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g',[17 inf]);
AllData=AllData';
NumofEachData=round(NumofAllData/17);
Time=AllData(:,1);
longitude=AllData(:,2); %经度 单位:弧度
latitude=AllData(:,3); %纬度 单位:弧度
High=AllData(:,4); %高度 单位:米
Ve=-AllData(:,6); % 东向、北向、天向速度 单位:米/妙
Vn=AllData(:,5);
Vu=AllData(:,7);
fb_x=AllData(:,9); %比力(fx,fy,fz)
fb_y=AllData(:,8); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系 单位:米/秒2
fb_z=-AllData(:,10); %右前上
pitch=AllData(:,11); %俯仰角(向上为正) 单位:弧度
head=-AllData(:,13); %偏航角(偏西为正)
roll=AllData(:,12); %滚转角(向右为正)
omigax=AllData(:,15); %陀螺输出(单位:弧度/秒,坐标轴的定义与比力的相同)
omigay=AllData(:,14);
omigaz=-AllData(:,16);
%-------------------------------程序初始化--------------------------------------
latitude0=latitude(1);
longitude0=longitude(1); %初始位置
High0=High(1);
Ve0=Ve(1);
Vn0=Vn(1); %初始速度
Vu0=Vu(1);
pitch0=pitch(1);
head0=head(1); %初始姿态
roll0=roll(1);
TimeEach=0.005; %周期 和仿真总时间
TimeAll=(NumofEachData-1)*TimeEach;
Omega_ie=0.7292115147E-4;%0.00007272205216643040; %地球自转角速度 单位:弧度每妙
g0=9.78;
%------------------------------导航解算开始--------------------------------------
%假设没有初始对准误差
pitch_err0=pitch0+0*deg_rad;
head_err0=head0+0*deg_rad;
roll_err0=roll0+0*deg_rad;
%初始捷联矩阵的计算 《捷联惯导系统》P63 旋转顺序 head - pitch - roll
%导航坐标系n为东北天方向 载体坐标系b为右前上 偏航角北偏西为正
Tbn(1,1)=cos(roll_err0)*cos(head_err0)-sin(roll_err0)*sin(pitch_err0)*sin(head_err0);
Tbn(1,2)=cos(roll_err0)*sin(head_err0)+sin(roll_err0)*sin(pitch_err0)*cos(head_err0);
Tbn(1,3)=-sin(roll_err0)*cos(pitch_err0);
Tbn(2,1)=-cos(pitch_err0)*sin(head_err0);
Tbn(2,2)=cos(pitch_err0)*cos(head_err0);
Tbn(2,3)=sin(pitch_err0);
Tbn(3,1)=sin(roll_err0)*cos(head_err0)+cos(roll_err0)*sin(pitch_err0)*sin(head_err0);
Tbn(3,2)=sin(roll_err0)*sin(head_err0)-cos(roll_err0)*sin(pitch_err0)*cos(head_err0);
Tbn(3,3)=cos(roll_err0)*cos(pitch_err0);
Tnb=Tbn';
%位置矩阵的初始化 《捷联惯导系统》P46 其中游动方位角 a=0 假使初始经纬度确知
Cne(1,1) = - sin(longitude0);
Cne(1,2) = cos(longitude0);
Cne(1,3) = 0;
Cne(2,1) = - sin(latitude0) * cos(longitude0);
Cne(2,2) = - sin(latitude0) * sin(longitude0);
Cne(2,3) = cos(latitude0);
Cne(3,1) = cos(latitude0) * cos(longitude0);
Cne(3,2) = cos(latitude0) * sin(longitude0);
Cne(3,3) = sin(latitude0);
Cen=Cne';
%初始四元数的确定 《捷联惯导系统》 P151-152 方法本身保证了q1^2+q2^2+q3^2+q4^2=1
q(2,1) = sqrt(abs(1.0 + Tnb(1,1) - Tnb(2,2) - Tnb(3,3))) / 2.0;
q(3,1) = sqrt(abs(1.0 - Tnb(1,1) + Tnb(2,2) - Tnb(3,3))) / 2.0;
q(4,1) = sqrt(abs(1.0 - Tnb(1,1) - Tnb(2,2) + Tnb(3,3))) / 2.0;
q(1,1) = sqrt(abs(1.0 - q(2,1) ^2 - q(3,1) ^2 - q(4,1) ^2));
% 判断q(1,1)的符号
flag_q11=cos(head_err0/2.0)*cos(pitch_err0/2.0)*cos(roll_err0/2.0)-sin(head_err0/2.0)*sin(pitch_err0/2.0)*sin(roll_err0/2.0);
if (flag_q11 >0) %此时q(1,1)取正
if (Tnb(3,2) < Tnb(2,3))
q(2,1) = - q(2,1);
end
if (Tnb(1,3) < Tnb(3,1))
q(3,1) = - q(3,1);
end
if (Tnb(2,1) < Tnb(1,2))
q(4,1) = - q(4,1);
end
else %此时q(1,1)取负 或0
q(1,1) = - q(1,1);
if (Tnb(3,2) > Tnb(2,3))
q(2,1) = - q(2,1);
end
if (Tnb(1,3) > Tnb(3,1))
q(3,1) = - q(3,1);
end
if (Tnb(2,1) > Tnb(1,2))
q(4,1) = - q(4,1);
end
end
%-------------------------迭代推算用到的参数的初始化------------------------
Wiee_e = 0;
Wiee_n = 0;
Wiee_u = Omega_ie;
Wiee = [Wiee_e Wiee_n Wiee_u]'; %地球速率在地球系中的投影 东-北-天
Lat_err(1)=latitude0;
Lon_err(1)=longitude0;
High_err(1)=High0;
Ve_err(1)=Ve0;
Vn_err(1)=Vn0;
Vu_err(1)=Vu0;
pitch_err(1)=pitch_err0;
head_err(1)=head_err0;
roll_err(1)=roll_err0;
Re=6378137.0;%6378245.0; %地球长轴 《惯性导航系统》 P28
e=0.0033528106647474807198455286185206; %地球扁率精确值
ee=0.00669437999014131699614;
%----------------------------迭代推算开始-----------------------------------
for i=1:NumofEachData
%----------------------------惯性仪表数据的获得------------------------
Wibb(1,1)=omigax(i); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系
Wibb(2,1)=omigay(i); %单位:弧度/妙
Wibb(3,1)=omigaz(i); %右前上
fb(1,1)=fb_x(i); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系
fb(2,1)=fb_y(i); %单位:米/秒2
fb(3,1)=fb_z(i); %右前上
%--------计算在姿态矩阵和位置矩阵更新时用到的参数------------------
RM=Re*(1.0-2.0*e+3.0*e*Cne(3,3)^2)+High_err(i); %《捷联惯导系统》 P233 P235
RN=Re*(1.0+e*Cne(3,3)^2)+High_err(i);
% RN=Re*(1-ee)/(sqrt(1-ee*sin(Lat_err(i))))^3+High_err(i);
% RM=Re/sqrt(1-ee*sin(Lat_err(i)))+High_err(i);
%实验当地重力加速度计算 《捷联惯导系统》P150 《惯性导航系统》 P35
g=g0*((1.0+0.0052884*Cne(3,3)^2)-0.0000059*(1-(1-2*Cne(3,3)^2)^2))*(1.0-2.0*High_err(i)/Re);
tmp_slat=sin(Lat_err(i))*sin(Lat_err(i));
Wien = Cne * Wiee; %地球速率在导航系中的投影
Wenn(1,1) = -Vn_err(i)/RM;
Wenn(2,1) = Ve_err(i)/RN; % <<惯性导航系统>> P45 考虑了地球转动的影响.
Wenn(3,1) = Ve_err(i)*tan(Lat_err(i))/RN; %计算Wenn(不太精确),更新速度和位置矩阵时用
Winn=Wien+Wenn;
Winb=Tbn*Winn;
Wnbb=Wibb-Winb; %姿态速率 在姿态更新时用到
fn=Tnb*fb; % x-y-z 东-北-天
% 速度的更新 《捷联惯导系统》 P30 33 东-北-天
difVe_err=fn(1,1)+(2*Wien(3,1)+Wenn(3,1))*Vn_err(i)-(2*Wien(2,1)+Wenn(2,1))*Vu_err(i);
difVn_err=fn(2,1)-(2*Wien(3,1)+Wenn(3,1))*Ve_err(i)+(2*Wien(1,1)+Wenn(1,1))*Vu_err(i);
difVu_err=fn(3,1)+(2*Wien(2,1)+Wenn(2,1))*Ve_err(i)-(2*Wien(1,1)+Wenn(1,1))*Vn_err(i)-g;
Ve_err(i+1)=Ve_err(i)+difVe_err*TimeEach;
Vn_err(i+1)=Vn_err(i)+difVn_err*TimeEach;
Vu_err(i+1)=Vu_err(i)+difVu_err*TimeEach;
High_err(i+1)=High_err(i)+Vu_err(i)*TimeEach;
% 位置矩阵的实时更新 《惯性导航系统》 P190
Cne(1,1)=Cne(1,1)+TimeEach*(Wenn(3,1)*Cne(2,1)-Wenn(2,1)*Cne(3,1));
Cne(1,2)=Cne(1,2)+TimeEach*(Wenn(3,1)*Cne(2,2)-Wenn(2,1)*Cne(3,2));
Cne(1,3)=Cne(1,3)+TimeEach*(Wenn(3,1)*Cne(2,3)-Wenn(2,1)*Cne(3,3));
Cne(2,1)=Cne(2,1)+TimeEach*(-Wenn(3,1)*Cne(1,1)+Wenn(1,1)*Cne(3,1));
Cne(2,2)=Cne(2,2)+TimeEach*(-Wenn(3,1)*Cne(1,2)+Wenn(1,1)*Cne(3,2));
Cne(2,3)=Cne(2,3)+TimeEach*(-Wenn(3,1)*Cne(1,3)+Wenn(1,1)*Cne(3,3));
Cne(3,1)=Cne(3,1)+TimeEach*(Wenn(2,1)*Cne(1,1)-Wenn(1,1)*Cne(2,1));
Cne(3,2)=Cne(3,2)+TimeEach*(Wenn(2,1)*Cne(1,2)-Wenn(1,1)*Cne(2,2));
Cne(3,3)=Cne(3,3)+TimeEach*(Wenn(2,1)*Cne(1,3)-Wenn(1,1)*Cne(2,3));
% Mat_Wenn(1,1)=0;
% Mat_Wenn(1,2)=Wenn(3,1);
% Mat_Wenn(1,3)=-Wenn(2,1); %Wenn的反对阵矩阵取负
% Mat_Wenn(2,1)=-Wenn(3,1); %这里位置矩阵的及时修正为: dCne/dt=Mat_Wenn*Cne
% Mat_Wenn(2,2)=0;
% Mat_Wenn(2,3)=Wenn(1,1);
% Mat_Wenn(3,1)=Wenn(2,1);
% Mat_Wenn(3,2)=-Wenn(1,1);
% Mat_Wenn(3,3)=0;
%
% Mat_Wenn=Mat_Wenn*Cne*TimeEach;
% Cne=Cne+Mat_Wenn;
Cen=Cne';
% 计算经纬度
Lat_err(i+1)=asin(Cne(3,3));
Lon_err(i+1)=atan(Cne(3,2)/Cne(3,1)); %这是经度的主值
if (Cne(3,1) < 0)
if (Lon_err(i+1) > 0)
Lon_err(i+1) = Lon_err(i+1) - pi;
else
Lon_err(i+1) = Lon_err(i+1) + pi;
end
end
% 四元数的及时修正 《惯性导航系统》 P194
% Mat_Wnbb=[ 0, -Wnbb(1,1), -Wnbb(2,1), -Wnbb(3,1);
% Wnbb(1,1), 0, Wnbb(3,1), -Wnbb(2,1);
% Wnbb(2,1), -Wnbb(3,1), 0, Wnbb(1,1);
% Wnbb(3,1),
没有合适的资源?快使用搜索试试~ 我知道了~
GPS量测数据仿真和惯性导航解算以及卡尔曼滤波在导航解算中的应用matlab代码.zip
共4个文件
m:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 112 浏览量
2024-02-28
21:25:55
上传
评论 1
收藏 13KB ZIP 举报
温馨提示
2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
资源推荐
资源详情
资源评论
收起资源包目录
GPS量测数据仿真和惯性导航解算以及卡尔曼滤波在导航解算中的应用matlab代码.zip (4个子文件)
GPS量测数据仿真和惯性导航解算以及卡尔曼滤波在导航解算中的应用matlab代码
Navigation.m 10KB
SINS_Out2.m 11KB
Kalmanfilter.m 9KB
GPSNoiseOut.m 3KB
共 4 条
- 1
资源评论
- 逍遥boy2024-04-28感谢大佬分享的资源,对我启发很大,给了我新的灵感。
Matlab科研辅导帮
- 粉丝: 3w+
- 资源: 7793
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功