基于MATLAB的GNSS卫星位置的计算及精度分析
前言
为了研究GNSS卫星的广播星历的精度,需要获得GNSS卫星的坐标与实际位置的差值。使用MATLAB编程,实现提取广播星历参数和精密星历精确坐标的过程,并基于利用广播星历计算GNSS卫星位置的原理计算得到GNSS卫星的瞬时坐标。将计算得到的GNSS卫星瞬时坐标与编程提取到的同一时刻的精密星历中的精确坐标对比进行精度分析,进而得到GNSS卫星广播星历的精度。
提示:以下是本篇文章正文内容,下面案例可供参考
一、GNSS卫星坐标计算的程序实现
(1)利用stuct()函数建立空结构体,用以存储读取导航电文获取的参数,根据卫星计算原理的不同,结构体存储变量的数目也不同。
(2)从头文件结束标志‘END OF HEADER’开始,遍历存储导航电文,将每个卫星的参数赋给相应的结构体,同时使用str2num()函数将字符变为数值,方便后续计算。
(3)选取要计算的卫星,调用对应结构体里面的参数,作为输入参数赋给即将调用的函数 。函数,从而获得返回值,即卫星的坐标。可调用的函数有GPScucalation(),bdscaculation(),glonasscaculation()。
(4)将计算的卫星坐标统一放在一个结构体中,便于后续的精度分析。
1. 基于 Matlab 读取标准 RINEX 格式星历数据
计算GNSS卫星的瞬时位置需要用到卫星的广播星历,而广播星历多为RINEX格式。想要获得所需要的参数,还需要对RINEX 格式进一步处理。而使用matlab对RINEX数据进行处理的思路,是根据RINEX格式本身的特点,从特殊字符串‘END OF HEADER’头文件的结束标志开始,通过简单的循环语句,将星历数据存储进预先定义好的结构体中。具体代码实现如下:
(1)通过stuct()函数创建存储星历数据的空结构体
navdata=struct('prn',nan,'year',nan,'month',nan,'day',nan,'hour',nan,'min',nan,'sec',nan,'a0',nan,'a1',nan,'a2',nan,'aode',NaN,'crs',NaN,'dn',NaN,.'m0',NaN,'cuc',NaN,'e',NaN,'cus',NaN,'a',NaN,'toe'NaN,'cic',NaN,'om0',NaN,'cis',NaN,'i0',NaN,'crc',NaN,'w',NaN,'dom',NaN,'di',NaN,'cflg12',NaN,'weekno',NaN,'pflg12',NaN,'svaccuracy',NaN,'svhealth',NaN,'tgd',NaN,'aodc',NaN,'transmission', NaN,'s1',NaN,'s2',NaN,'s3',NaN);
所创建结构体的字段名与星历提供的参数有关,GPS卫星,GALILEO卫星与北斗卫星都可以采用这段函数来存放他们自己的星历数据,字符‘nan’是不为该字符指定任何一种格式。而glonass因为星历所提供的参数不同,创建结构体所用的字段名自然也不同,其创建结构体的代码如下:
navdata=struct('prn',nan,'year',nan,'month',nan,'day',nan,'hour',nan,'min',nan,'sec',nan,'sv1',nan,'sv2',nan,'utc',nan,'x',NaN,'u',NaN,'ax',NaN,'bn',NaN,'y',NaN,'v',NaN,'ay',NaN,'icd',NaN,'z',NaN,'w',NaN,'az',NaN,'age',NaN);
(2)打开导航电文后,通过简单的while循环,利用findstr()函数逐行查找特殊字符‘END OF HEADER’,获得读取数据的起始位置。因为GPS与GLONASS卫星的广播星历所采用的为rinex2.02的格式,所以可以在获取函数位置的同时,可以同时获取星历的行数,来计算星历中卫星的个数。GALILEO卫星与北斗卫星采用的为rinex3.02格式,可直接通过findstr()函数来获取起始位置,部分代码如下。
fid = fopen('rinex');
while 1
headlines = headlines+1;
line = fgetl(fid);
answer = findstr(line,'END OF HEADER');
if ~isempty(answer)
break;
end
end
while 1
noeph = noeph+1;
line = fgetl(fid);
if line == -1
break
end
end
noeph = noeph/8;
在计算glonass卫星个数时,因为星历文件只提供四行参数,所以应使用noeph = noeph/4语句。
(3)通过for循环使空结构体数组中能够存储获取GNSS卫星的星历数据。最后能通过简单的循环语句来读取调用各卫星星历数据。对于GPS与glonass卫星所采用的的rinex2.0格式星历文件,可以通过计算卫星数来建立一个简单的for循环,从而逐行获取数据,每8行或者4作为一组数据。而对于北斗与GALILEO卫星所采用的rinex3.02格式可通过findstr()函数匹配字符串寻找所需要的卫星参数,同样每8行可以作为一组数据。星历每列对应的数据作为提取的依据。部分代码如下:
for l = 1:head_lines
line = fgetl(fid);
end
for i = 1:noeph
line = fgetl(fid);
navdata(i).prn = str2num(line(1:2));
y = str2num(line(3:6));
if y >79
navdata(i).year = y+1900;
else
navdata(i).year = y+2000;
end
navdata(i).m = str2num(