China University of Mining and Technology 《卫星导航定位算法与程序设计》
实验报告
学号:  07122825
姓名:王亚亚
班级:测绘12—1
指导老师:王潜心/张秋昭/刘志平
中国矿业大学环境与测绘学院
2015-07-01
实验一编程实现读取下载的星历
一、实验要求:
读取RINEX N 文件,将所有星历放到一个列表(数组)中。并输出和自己学号相关的卫星编号的星历文件信息。读取RINEX O文件,并输出指定时刻的观测信息。
二、实验步骤:
1、下载2014年的广播星历文件和观测值文件,下载地址如下:
ftp://cddis.v/gps/data/daily/2014/
2、要求每一位同学按照与自己学号后三位一致的年积日的数据文件和星历文件,站点的选择必须选择与姓氏首字母相同的站点的数据,以王小康同学为例,学号:07123077,需下载077那天的数据。有些同学的学号365<;后三位
<730,则取学号后三位-365,以姜平同学为例:学号10124455,下载455-
365=90 天的数据,有些同学的学号730<;后三位<=999,则取学号后三位-730,以万伟同学为例:
学号:07122854,则下载854-730 = 124天的数据。可以选择wnhu0124.14n wnhu0124.14o 根据上述要求我下载了2014年第95天的数据,选择其中的wsrt0950.14n和wsrt0950.14o星历文件。指定时刻(学号后五位对应在年积日对应的秒最相近时刻)的观测值信息如张良09123881,后五位23881,取23881-3600*6= 2281秒,6点38分01秒,最近的历元应该是6点38分00秒的数据。根据计算与我最接近的观测时刻为2014年4月5日6点20分30.00秒。
3、编程思路:
利用rinex函数读取星历文件中第14颗卫星的星历数据并输出显示。对数据执行762次循环到对应的2014年4月5日6点20分30.00秒,并输出观测值。
4、程序运行结果:
三、编程主要代码:
1、读写N 文件主函数代码: clc;%清除屏幕之前打过的代码
clear all ;%从内存中释放所有的内存变量和数组以及所有用户自定义的菜单栏, 菜单, 和窗口的定义。
close all ;%关闭当前及所有工作区中所有打开的数据库, 表, 和索引,并选择 1 号工作区 [filename,filepath]=uigetfile('*.14n','选择计算的输入文件');%打开窗口选取计算的输入文件 file=[filepath filename];%获得文件名 rinexe(file,'eph.dat');%函数rinexe 读取一个标准格式化导航信息文件
并重新格式化数据为21行列数等于卫星数的矩阵。
Eph = get_eph('eph.dat');%将存放在‘eph.dat ’中的导航电文数据提取出来,为计算卫星位置做准备,返回值-eph 星历矩阵,将读到的数据存入内存(注意:eph 星历矩阵,每颗卫星存放21个参数) Eph
[filename,filepath]=uiputfile('王亚亚-作业1读写N 导航文件.txt','选择一个路径对结果文件保存');%选择路径保存输出的结果文件 file=[filepath filename];%获取文件名 fid = fopen(file,'wt+');%文件有两种格式:二进制文件(b)和文本文件(t)。在Windows 下,打开文件的默认是二进制格式,如果要以文本方式打开,则必须在打方式中加上字符 't'。 fprintf(fid,'%c','      班级      姓名        学号        作业序号          主要内容    ');
fprintf(fid,'%c\n',' ');
fprintf(fid,'%c','    测绘12-1    王亚亚
07122825    上机实验作业一    读写N 导航文件 '); fprintf(fid,'%c\n',' '); for  k = 1: size(Eph,1)
p=num2str(Eph(k,44));%输出第14颗卫星的星历数据
fprintf(fid,'%c',p);%以一个字符输出    if  k == 1;
fprintf(fid,'%c','            %GPS 卫星PRN 编号'); end      if  k == 2;
fprintf(fid,'%c','              %GPS 卫星钟的漂移速度'); end
if  k == 3; fprintf(fid,'%c','        %参考时刻的升交点赤经M0'); end
if  k == 4; fprintf(fid,'%c','      %roota sqrt(A)( m1 / 2(根号下) ) 轨道长半轴的平方根'); end
if  k == 5; fprintf(fid,'%c','    %deltan Δn(rad /s) 平均运动修正量'); end
if  k == 6; fprintf(fid,'%c','      %ecc e 轨道偏心率'); end      if  k == 7;
fprintf(fid,'%c','        %omega ω(rad) 近地点的角距'); end
if  k == 8; fprintf(fid,'%c','    %cuc Cuc(rad) 纬度幅角的余弦调和项改正的振幅'); end
if  k == 9; fprintf(fid,'%c','    %cus Cus(radians) 纬度幅角的正弦调和项改正的振幅'); end
if k == 10; fprintf(fid,'%c',' %crc Crc(m) 轨道半径的余弦调和项改正的振幅');
end
if k == 11; fprintf(fid,'%c',' %crs Crs(m)轨道半径的正弦调和项改正的振幅'); end
if k == 12; fprintf(fid,'%c',' %i0 i0(rad) 轨道倾角'); end
if k == 13; fprintf(fid,'%c',' %idot i(rad/s)(IDOT) 轨道倾角变化率'); end
if k == 14; fprintf(fid,'%c',' %cic Cic(rad) 轨道倾角的余弦调和项改正的振幅'); end
if k == 15; fprintf(fid,'%c',' %cis
Cis(rad) 轨道倾角的正弦调和项改正的振幅'); end
if k == 16;
fprintf(fid,'%c',' %Omega0
Ω(rad)(OMEGA) 参考时刻的升交点的赤经'); end
if k == 17;
fprintf(fid,'%c',' %Omegadot Ω
(rad/s)(OMEGA DOT) 升交点赤经的变化率'); end
if k == 18;
fprintf(fid,'%c',' %toe TOE星历的参考时刻(GPS周内的秒数) 星历表参考历元'); end
if k == 19; fprintf(fid,'%c',' %af0 卫星钟的偏差(s)卫星钟偏差'); end
if k == 20; fprintf(fid,'%c',' %af1 卫星钟的漂移(s/s)'); end
if k == 21;
fprintf(fid,'%c',' %toe 存储TOE星历的参考时刻(GPS周内的秒数) 电文发送时刻'); end
fprintf(fid,'%c\n',' ');
end
fclose(fid);
2、读写O文件主函数代码:
clc;%清除屏幕之前打过的代码
clear all;%从内存中释放所有的内存变量和数组以及所有用户自定义的菜单栏, 菜单, 和窗口的定义。
close all;%关闭当前及所有工作区中所有打开的数据库, 表, 和索引,并选择1 号工作区% We identify the observation file and open it
我们确定观测文件并打开它
[filename,filepath]=uigetfile('*.14O','选择计算的输入的O文件');
file=[filepath filename];%文件名
fid1 = fopen(file,'rt');%r:读出观测文件ofile1,t:以文本的格式(因为fopen函数默认打开方式是二进制)
[Obs_types1, ant_delta1, ifound_types1, eof11] = anheader(file);%打开观测文件ofile1,从头文件中截取观测类型Obs_types1、天线参数的信息ant_delta1,以及标明是否寻到观测类型行ifound_types1、是否到文件尾的判定eof11 NoObs_types1 = size(Obs_types1,2)/2;%返回观测类型Obs_types1列数(1:行2:列)的
Obs_types1矩阵是1行14列:[C1P1P2L1L2D1D2] size(Obs_types1,2)值是14除以2得观测值类型个数是7种
Pos = [];
% There are 20 epochs of data in ofile1
SITE247J.01N文件中有20个历元的数据
for q = 1:761 %循环762次到对应的2014年4月5日6点20分30.0000000秒
[time1, dt1, sats1,eof1,datee] =
fepoch_0(fid1);
% [time1, dt1, sats1, eof1] =
fepoch_0(fid1);%通过函数fepoch_0调用观测文件SITE247J.01O,返回四个参数:time1:周内秒、dt1:接收机时钟的偏差( 单位为s, 为可选项)、sats1:卫星的PRN号矩阵、
eof1:返回是否到文件尾的标示符(1:结束0:未结束)
NoSv1 = size(sats1,1);%通过查看行向量sats1的长度,获取卫星个数
% We pick the observed P2 pseudoranges 我们获取观测的P2码伪距其中伪随机噪声码(PN)即测距码主要有精测距码(P码)和粗测距码(C/A码)两种。其中P码的码率
为10.23MHz、C/A码的码率为1.023MHz,长度为1023
obs1 = grabdata(fid1, NoSv1,
NoObs_types1); %输入观测文件名、观测卫星个数、观测卫星类型数。输出Obs矩阵,行:卫星个数、列:观测类型:C1 P1 P2 L1 L2 D1 D2
i = fobs_typ(Obs_types1,'P2');%在观测类型:C1 P1 P2 L1 L2 D1 D2查出‘P2’所在位置,并赋值给i
2.235646758400000e+07
end
[filename,filepath]=uiputfile('王亚亚-作业1读写O观测文件.txt','选择一个路径对结果文件保存');%选择路径保存输出的结果文件
file=[filepath filename];
fid = fopen(file,'wt+');%文件有两种格式:二进制文件(b)和文本文件(t)。在Windows下,打开文件的默认是二进制格式,如果要以文本方式打开,则必须在打方式中加上字符't'。
%fid = fopen('作业1.txt','wt+');%文件有两种格式:二进制文件(b)和文本文件(t)。在Windows 下,打开文件的默认是二进制格式,如果要以文本方式打开,则必须在打方式中加上字符't'。
fprintf(fid,'%c',' 班级姓名
学号作业序号主要内容');
fprintf(fid,'%c\n',' ');
fprintf(fid,'%c',' 测绘12-1 王亚亚07122825 上机实验作业一读写观测O文件');fprintf(fid,'%c\n',' ');
%fprintf(fid,'%8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n',datee');
for i=1:1%输出datee矩阵即时间
for j=1:6
fprintf(fid,'%d\t',datee(i,j));
if rem(i,1)==0 && rem(j,6)==0
fprintf(fid,'%c','%时间');
%fprintf(fid,'\r\n');
end
end
end
fprintf(fid,'%c\n',' ');
fprintf(fid,'%c',' L1 L2
C1 P1 P2 ');
fprintf(fid,'%c\n',' ');
for k=1:size(sats1,1);%卫星个数
f=sats1(k,1);
for i=1:1%输出obs1矩阵
for j=1:5
fprintf(fid,'%d\t',obs1(i,j));
if rem(i,1)==0 && rem(j,5)==0
fprintf(fid,'%s%d%s ','%读取的是',f','号卫星');
fprintf(fid,'\r\n');
end
end
end
end
fprintf(fid,'%c\n',' ');
fclose(fid);
3、主要函数代码及其注释:
fprintf格式
rinex函数代码:
function rinexe(ephemerisfile, outputfile)
fide = fopen(ephemerisfile); %fopen()函数功能是打开一个文件,在这里就是打开星历表文件
head_lines = 0; %头行赋值为0
while 1 % We skip header 我们跳过头行
那么while 1 其中1代表一个常量表达式,他永远不会等于0。所以,循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止。该循环用于跳过整个头文件head_lines = head_lines+1;%当跳出循环体的时候,head_lines存储了头文件的行数为多少
line = fgetl(fide); %fgetl()函数功能:在MATLAB中,该函数用于从文件中读取一行数据,并丢弃行末的换行符;读取一行后停

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。