导航与制导原理实验报告一.实验要求1.完成INS与GPS位置组合导航的仿真;2.画出组合导航后的位置误差、速度误差曲线;3.画出原始轨迹与组合导航后的轨迹比较图;(画图时弧度制单位要转换成度分秒制单位)4.结果分析5.提交纸版实验报告(附上代码)二.全局变量R=6378160;%地球半径(长半轴)f=1/298.3;%地球扁率wie=7.2921151467e-5;%地球自转角速率g0=9.7803267714;%重力加速度基础值deg=π/180;%角度min=deg/60;%角分sec=min/60;%角秒hur=3600;%小时dph=deg/hur;%度/时ts=0.1;%仿真采样时间三.组合导航仿真变量GPS_Sample_Rate=10;%GPS采样时间Runs=10;%由于随机误差,使用Kalman滤波时,应多次滤波,以求平均值Tg=3600;%陀螺仪Markov过程相关时间Ta=1800;%加速度计Markov过程相关时间四.KalmanFilter:估计状态初始值:Xk=zeros(18,1);估计协方差初始值:Pk=diag([min,min,min,0.5,0.5,0.5,30/Re,30/Re,30,0.1*dph,0.1*dph,0.1*dph,0.1*dph,0.1*dph,0.1*dph,1.e-3,1.e-3,1.e-3].^2);%18*18矩阵系统噪声方差:Qk=1e-6*diag([0.01,0.01,0.01,0.01,0.01,0.01,0.9780,0.9780,0.9780]).^2量测噪声方差:Rk=diag([1e-5,1e-5,10.3986]).^2系数矩阵F,G,H的表示,参考课件6.2.1。五.可能用到的公式(1)四元数Q的即时修正(符号⨂表示四元数乘法)式中nbnbxnbynbz0Tbbbb为向量扩展四元数,标量部分为0。(2)四元数Q的归一化(3)姿态矩阵nbC的计算(4)提取姿态角(5)比力的坐标变换(6)速度计算(7)地球速率及地理坐标系相对地球坐标系的转动角速率机体系相对于地理系的转动角速率在机体系中的投影(8)位置计算(9)主曲率半径(10)重力加速度(11)连续系统离散化公式(简化形式)其中,I是单位矩阵,T是仿真采样时间。六.数据文件说明dataWbibN.txt%叠加噪声的陀螺仪角速度输出dataFbibN.txt%叠加噪声的加速度计比力输出dataPos.txt%原始轨迹的位置数据(依次是纬度L,经度,高度h)dataVn.txt%原始轨迹的速度数据(依次是东速度、北速度、天速度)att0=[0;0;0.3491]%姿态解算矩阵初始值(依次是俯仰角,横滚角,航向角ψ)dataGPSposN.txt%叠加噪声的GPS位置数据(即等间隔采样原始轨迹的位置数据,采样间隔是10,即第10、20,……的数据,并叠加噪声)七.仿真流程图整个仿真过程流程图在整体仿真流程图中,Kalman滤波可以由子函数kalman_GPS_INS_correct.m进行。捷联解算可按照如下捷联解算流程图进行。八.实验思路根据上述两个流程图,要实现INS与GPS位置组合导航,需要在已给的INS导航代码中,加入当k为10的倍数时进行Kalman滤波,修正位置、速度数据环节,则添加代码如下(添加位置见完整程序):%添加程序[F,G,H]=GetConSis(vtC(:,k),posC(:,k),q_1,fn(:,k),Tg,Ta);%利用GetConSis得到F,G,H矩阵ifrem(k,10)~=0%判断k是否为10的倍数,若是则进行kalman滤波,修正。[E_att,E_pos,E_vn,Xk,Pk]=kalman_GPS_INS_correct(Xk,Qk,Pk,F,G,H,ts,Rk);%利用kalman_GPS_INS_correct进行kalman滤波elseZk=posC(:,k)-p_gps(:,(k)/10);[E_att,E_pos,E_vn,Xk,Pk]=kalman_GPS_INS_correct(Xk,Qk,Pk,F,G,H,ts,Rk,Zk);endattC(:,k)=attC(:,k)-E_att;posC(:,k)=posC(:,k)-E_pos;vtC(:,k)=vtC(:,k)-E_vn;%修正位置,速度数据九.完整代码及注释clc;clear;closeall;%捷联惯导更新仿真,四元数法,一阶近似算法,不考虑圆锥补偿和划桨补偿ts=0.1;%采样时间Re=6378160;%地球长半轴wie=7.2921151467e-5;%地球自转角速度f=1/298.3;%地球扁率g0=9.7803;%重力加速度基础值deg=pi/180;%角度min=deg/60;%角分sec=min/60;%角秒hur=3600;%小时dph=deg/hur;%度/小时%读取数据wbibS=dlmread('dataWbibN.txt');fbS=dlmread('dataFbibN.txt');posS=dlmread('dataPos.txt');vtetS=dlmread('dataVn.txt');p_gps=dlmread('dataGPSposN.txt');%统计矩阵初始化[mm,nn]=size(posS);posSta=zeros(mm,nn);vtSta=posSta;attSta=posSta;posC(:,1)=posS(:,1);%位置向量初始值vtC(:,1)=vtetS(:,1);%速度向量初始值attC(:,1)=[0;0;0.3491];%姿态解算矩阵初始值Qk=1e-6*diag([0.01,0.01,0.01,0.01,0.01,0.01,0.9780,0.9780,0.9780]).^2;%系统噪声方差矩阵Rk=diag([1e-5,1e-5,10.3986]).^2;%测量噪声方差Tg=3600*ones(3,1);%陀螺仪Markov过程相关时间Ta=1800*ones(3,1);%加速度计Markov过程相关时间%GPS_Sample_Rate=10;%GPS采样率太高效果也不好StaNum=10;%重复运行次数,用来求取统计平均值forOutLoop=1:StaNumPk=diag([min,min,min,0.5,0.5,0.5,30./Re,30./Re,30,0.1*dph,0.1*dph,0.1*dph,0.1*dph,0.1*dph,0.1*dph,1.e-3,1.e-3,1.e-3].^2);%初始估计协方差矩阵Xk=zeros(18,1);%初始状态%%N=size(posS,2);%j=1;fork=1:N-1si=sin(attC(1,k));ci=cos(attC(1,k));sj=sin(attC(2,k));cj=cos(attC(2,k));sk=sin(attC(3,k));ck=cos(attC(3,k));%k时刻姿态矩阵M=[cj*ck+si*sj*sk,ci*sk,sj*ck-si*cj*sk;-cj*sk+si*sj*ck,ci*ck,-sj*sk-si*cj*ck;-ci*sj,si,ci*cj];%Cnb矩阵q_1=[sqrt(abs(1.0+M(1,1)+M(2,2)+M(3,3)))/2.0;sign(M(3,2)-M(2,3))*sqrt(abs(1.0+M(1,1)-M(2,2)-M(3,3)))/2.0;sign(M(1,3)-M(3,1))*sqrt(abs(1.0-M(1,1)+M(2,2)-M(3,3)))/2.0;sign(M(2,1)-M(1,2))*sqrt(abs(1.0-M(1,1)-M(2,2)+M(3,3)))/2.0];fn(:,k)=M*fbS(:,k);%比力的坐标变换%添加程序[F,G,H]=GetConSis(vtC(:,k),posC(:,k),q_1,fn(:,k),Tg,Ta);%利用GetConSis得到F,G,H矩阵ifrem(k,10)~=0%判断k是否为10的倍数,若是则进行kalman滤波,修正。[E_att,E_pos,E_vn,Xk,Pk]=kalman_GPS_INS_correct(Xk,Qk,Pk,F,G,H,ts,Rk);%利用kalman_GPS_INS_correct进行kalman滤波elseZk=posC(:,k)-p_gps(:,(k)/10);[E_att,E_pos,E_vn,Xk,Pk]=kalman_GPS_INS_correct(Xk,Qk,Pk,F,G,H,ts,Rk,Zk);endattC(:,k)=attC(:,k)-E_att;posC(:,k)=posC(:,k)-E_pos;vtC(:,k)=vtC(:,k)-E_vn;%修正位置,速度数据%捷联惯导解算wnie=wie*[0;cos(posC(1,k));sin(posC(1,k))];%地球系相对惯性系的转动角速度在导航系(地理系)的投影%计算主曲率半径Rm=Re*(1-2*f+3*f*sin(posC(1,k))^2)+posC(3,k);Rn=Re*(1+f*sin(posC(1,k))^2)+posC(3,k);wnen=[-vtC(2,k)/(Rm+posC(3,k));vtC(1,k)/(Rn+posC(3,k));vtC(1,k)*tan(posC(1,k))/(Rn+posC(3,k))];%导航系相对地球系的转动角速度在导航系的投影g=g0+0.051799*sin(posC(1,k))^2-0.94114e-6*posC(3,k);%重力加速度gn=[0;0;-g];%导航坐标系的重力加速度wbnbC(:,k)=wbibS(:,k)-M\(wnie+wnen);%姿态角转动角速度计算q=1.0/2*qmul(q_1,[0;wbnbC(:,k)])*ts+q_1;%姿态四元数更新q=q/sqrt(q'*q);%四元数归一化%姿态角更新q11=q(1)*q(1);q12=q(1)*q(2);q13=q(1)*q(3);q14=q(1)*q(4);q22=q(2)*q(2);q23=q(2)*q(3);q24=q(2)*q(4);q33=q(3)*q(3);q34=q(3)*q(4);q44=q(4)*q(4);T=[q11+q22-q33-q44,2*(q23-q14),2*(q24+q13);2*(q23+q14),q11-q22+q33-q44,2*(q34-q12);2*(q24-q13),2*(q34+q12),q11-q22-q33+q44];attC(:,k+1)=[asin(T(3,2));atan(-T(3,1)/T(3,3));atan(T(1,2)/T(2,2))];%横滚角gamma修正ifT(3,3)0ifattC(2,k+1)0attC(2,k+1)=attC(2,k+1)+pi;elseattC(2,k+1)=attC(2,k+1)-pi;endend%航向角psi修正ifT(2,2)0ifT(1,2)0attC(3,k+1)=attC(3,k+1)+pi;elseattC(3,k+1)=attC(3,k+1)-pi;endendifabs(T(2,2))1.0e-20ifT(1,2)0attC(3,k+1)=pi/2.0;elseattC(3,k+1)=-pi/2.0;endend%速度更新vtC(:,k+1)=vtC(:,k)+ts*(fn(:,k)+gn-cross((2*wnie+wnen),vtC(:,k)));%位置更新posC(1,k+1)=posC(1,k)+ts*vtC(2,k)/(Rm+posC(3,k));%纬度posC(2,k+1)=posC(2,k)+ts*vtC(1,k)/((Rn+posC(3,k))*co