广播星历包包含了卫星一系列参数和必要的摄动改正数。当前的卫星轨道参数是根据前一段时间求出的轨道参数外推得到的,因此广播星历也叫预报星历。
导航文件示例:
简单介绍一下导航文件,导航文件由文件头与数据记录部分构成。具体数据格式介绍可参考《GPS测量与数据处理》第三版的281页。
文件头包含:
RINEX的版本号和观测类型;
创建本数据文件所采用的程序名称、单位名称及日期;
注释行;
历书中电离层参数:A0~A4;
历书中电离层参数:B0~B3(第五行第六行的参数可做电离层改正);
用于计算UTC时间的历书参数;A0,A1为多项式系数;T为UTC数据的参考时刻;W为UTC参考周数,为连续计数;
跳秒,GPS时与UTC时之差。
数据块包含:
第一行为卫星的PRN号和该卫星钟的参考时刻及其改正模型参数;
第2~8行为该卫星的广播轨道数据。
读取文件头信息:根据不同信息所处行列号依次读取即可。ion中先存储默认电离层参数,若导航文件中提供电离层参数,则重新存储电离层参数即可。
%电离层模型参数
ion=[ 0.1118E-07,-0.7451E-08,-0.5961E-07, 0.1192E-06;...
0.1167E+06,-0.2294E+06,-0.1311E+06, 0.1049E+07];
NAV_header.ion=ion;
NAV_header.RUNBY=filename(1:4);
%头文件读取
while(1)
linestream=fgetl(fileID);
%RINEX版本号
if(contains(linestream,'RINEX VERSION / TYPE'))
NAV_header.Rinex_version=str2double(linestream(6:9));
end
%结尾
if(contains(linestream,'END OF HEADER'))
break;
end
%观测单位
if(contains(linestream,'PGM / RUN BY / DATE'))
OBS_header.PGM=linestream(1:18);
OBS_header.DATE=linestream(41:57);
end
%跳秒
if(contains(linestream,'LEAP SECONDS'))
NAV_header.LEAPsec=str2double(linestream(5:6));
end
%电离层参数
if(contains(linestream,'ION ALPHA'))
ION_ALPHA=[str2num(linestream(4:14)),str2num(linestream(16:26)),str2num(linestream(28:38)),str2num(linestream(40:50))];
NAV_header.ion(1,:)=ION_ALPHA;
end
if(contains(linestream,'ION BETA'))
ION_BETA=[str2num(linestream(4:14)),str2num(linestream(16:26)),str2num(linestream(28:38)),str2num(linestream(40:50))]; %#ok<*ST2NM>
NAV_header.ion(2,:)=ION_BETA;
end
%改正数
if(contains(linestream,'DELTA-UTC: A0,A1,T,W'))
Delta_UTC.A0=str2num(linestream(4:22));
Delta_UTC.A1=str2num(linestream(23:41));
Delta_UTC.T =str2num(linestream(42:50));
Delta_UTC.W =str2num(linestream(51:59));
NAV_header.Delta_UTC= Delta_UTC;
end
end
导航数据读取: 根据不同参数所处位置读取即可,此部分较为简单,但需要注意各数据对应列数,以免出现错误。
while(1)
linestream=fgetl(fileID);
if(~strcmp(linestream(1:2),' '))
%读取导航文件数据块
NAV_body(i).prn=linestream(1:2); %#ok<*AGROW>
NAV_body(i).time.year=str2num(linestream(4:5))+2000;NAV_body(i).time.month=str2num(linestream(7:8));
NAV_body(i).time.day =str2num(linestream(10:11));NAV_body(i).time.hour=str2num(linestream(13:14));
NAV_body(i).time.min=str2num(linestream(16:17));NAV_body(i).time.sec=str2num(linestream(19:22));%%卫星钟时间
NAV_body(i).a0=str2num(linestream(23:41));NAV_body(i).a1=str2num(linestream(42:60));NAV_body(i).a2=str2num(linestream(61:79));%钟差,钟飘:频飘
linestream=fgetl(fileID);
NAV_body(i).AODE=str2num(linestream(4:22));NAV_body(i).Crs=str2num(linestream(23:41));NAV_body(i).deltan=str2num(linestream(42:60));NAV_body(i).M0=str2num(linestream(61:79));%数据龄期(AODE)轨道半径改正项(Crs,rad)平均角速度改正项(deltan)平近点角(MO,rad)
linestream=fgetl(fileID);
NAV_body(i).Cuc=str2num(linestream(4:22));NAV_body(i).e=str2num(linestream(23:41));NAV_body(i).Cus=str2num(linestream(42:60));NAV_body(i).SqrtA=str2num(linestream(61:79));%升交点角距改正项(Cuc,rad)轨道偏心率(e)升交点角距改正项(Cus,rad)轨道长半轴平方根(sqrtA)
linestream=fgetl(fileID);
NAV_body(i).Toe=str2num(linestream(4:22));NAV_body(i).Cic=str2num(linestream(23:41));NAV_body(i).OMEGA=str2num(linestream(42:60));NAV_body(i).Cis=str2num(linestream(61:79));%星历的参考时刻(TOE)轨道倾角的改正项(Cic,rad)升交点经度(OMEGA)轨道倾角改正项(Cis,rad)
linestream=fgetl(fileID);
NAV_body(i).i0=str2num(linestream(4:22));NAV_body(i).Crc=str2num(linestream(23:41));NAV_body(i).omega=str2num(linestream(42:60));NAV_body(i).deltaomega=str2num(linestream(61:79));%轨道倾角(0)轨道半径的改正项(Crc,m)近地点角距(omega,rad)升交点赤经变化(deltaomega,rad)
linestream=fgetl(fileID);
NAV_body(i).IDOT=str2num(linestream(4:22));NAV_body(i).C_A=str2num(linestream(23:41));NAV_body(i).GPSWEEK=str2num(linestream(42:60));NAV_body(i).L2P=str2num(linestream(61:79));%轨道倾角的变率(IDOT) L2频道C/A码标识 GPS时间周(GPS Week) L2P码标识
linestream=fgetl(fileID);
NAV_body(i).Sva=str2num(linestream(4:22));NAV_body(i).SVH=str2num(linestream(23:41));NAV_body(i).TGD=str2num(linestream(42:60));NAV_body(i).IODC=str2num(linestream(61:79));%卫星精度(SVA,m) 卫星健康(SVH)电离层延迟(TGD,s)星钟的数据质量(IODC)
linestream=fgetl(fileID);
NAV_body(i).TofLau=str2num(linestream(4:22));NAV_body(i).fit_int=str2num(linestream(23:41));NAV_body(i).Plus1=str2num(linestream(42:60));NAV_body(i).Plus2=str2num(linestream(61:79));%信息发射时间 拟合区间(h) 备用p1 备用p2
i=i+1;
end
if(feof(fileID))
fclose(fileID);
break;
end
end
数据读取结果展示