MATLAB解析GPS数据程序
【精品】用MATLAB计算GPS卫星位置-最新文档资料

用M A T L A B计算G P S 卫星位置-最新文档资料用MATLAB计算GPS卫星位置GPS定位的基本原理简单来说就是在WGS-84空间直角坐标系中,确定未知点与GPS卫星的空间几何关系。
因此利用GPS 进行导航和测量时,卫星是作为位置已知的高空观测目标。
那么如何精确快速的解算出卫星在空间运行的轨迹即其轨道是实现未知点快速定位的关键。
1 标准格式RINEX格式简述在进行GPS数据处理时,由于接收机出自于不同厂家,所以厂家设计的数据格式也是五花八门的,但是在实际中,很多时候需要把来自不同型号的接收机的数据放在一块进行处理,这就需要数据格式的统一,为了解决这种矛盾,RINEX(英文全称为:The Receiver Independent Exchange Format)格式则应运而生,该格式存储数据的类型是文本文件,数据记录格式是独立于接收机的出自厂家和具体型号的。
由此可见,其特点是:由于是通用格式,所以可将不同型号接收机收集的数据进行统一处理,并且大多数大型数据处理软件都能够识别处理,此外也适用于多种型号的接收机联合作业,通用性很强。
RINEX标准文件里不是单一的一个文件,而是包括如下几种类型的文件[1]。
(1)观测数据文件(ssssdddf.yyo),记录的是GPS观测值信息,(OBServation data,简写OBS,为接收机记录的伪距、相位观测值;O文件,如XG012191.10O)。
(2)导航电文文件(ssssdddf.yyn),记录的是GPS卫星星历信息(NAVavigation data,简写NAV,记录实时发布的广播星历;N文件,如XG012191.10N)。
(3)气象数据文件(ssssdddf.yym),主要是在测站处所测定的气象数据(METerological data,简写MET,记录气象仪器观测的温、压、湿度状况;M文件,如XG012191.10M)。
(4)GLONASS导航电文文件(ssssdddf.yyg),记录的是地球同步卫星的导航电文。
GPS卫星轨道计算及其MATLAB仿真

GPS卫星轨道计算及其MATLAB仿真黎奇,白征东,李帅,陈波波(清华大学地球空间信息研究所,北京 100084)一、程序设计思路1. 读取RINEX文件(注意:文件路径)2. 计算测量日周积秒(测量日的格里历→GPST)3. 按卫星轨道计算步骤计算WGS-84坐标系坐标(内插)4. 按需要将WGS-84坐标系下坐标转换为所需坐标系坐标5. 画图输出二、n 文件说明及读取程序参考时刻oe t 的RINEX 格式的 “”广播星历文件具体如下:(加粗部分为本次轨道化Ω,率i ,弧度/秒4-22)标svacc ,米)收到的卫星信号解,秒)文件名:RinexNreader.m 输 入:文件地址,卫星编号三、计算测量日的周积秒文件名:GCtoGPS.m (其中调用函数:GCtoJD.m)输入:指定公历的年、月、日、时、分、秒文件名:GCtoJD.m输 入:指定公历的 年、月、日四、GPS 卫星轨道计算步骤及计算程序1. 计算卫星运动的平均角速度n平均角速度()03n =经摄动参数n ∆改正后的平均角速度0n n n =+∆3#61-79),n ∆(2#42-60);14323.98600510/GM m s =⨯ 2. 计算归化时间k t说明:①广播星历是oe t 时刻的,对应的轨道参数也是oe t 时刻的,而观测时间在t 时刻,显然oe t t <。
所以,要想获得t 时刻的轨道参数,需要知道t 与oe t 之间的差值即k t 。
以此,按照oe t 时刻轨道参数,外推t 时刻轨道参数。
②k t 的起算时间是星期六/星期日子夜0点,当302400k t s >时,604800k t s -;当302400k t s <-时,+604800k t s 。
(604800s=1周) =k oe t t t -,且604800302400604800302400k k k k k k t t t t t t =-⎧⎨=+⎩> <-已知:oe t (1#4-21)3. 计算观测时刻的平近点角k M0k k M M nt =+已知:0M (2#61-79),n (见1),k t (见2) 4. 计算观测时刻的偏近点角k Esin k k k E M e E =+已知:k M (见3),e (3#23-41)方法:迭代解算,设初值0k k E M =,迭代2次基本收敛。
MATLAB技术GPS数据处理教程

MATLAB技术GPS数据处理教程导言GPS(全球定位系统)以其高精度的定位功能在各个领域得到广泛应用。
在我们的日常生活中,GPS定位已经成为了司空见惯的技术,无论是导航系统、运输管理还是环境监测等。
本文旨在介绍使用MATLAB技术处理GPS数据的方法和技巧,帮助读者更好地利用现有的GPS数据进行分析和应用。
一、GPS数据处理的基本概念在开始介绍MATLAB技术处理GPS数据之前,我们首先需要了解一些GPS数据处理的基本概念。
GPS接收器通过接收卫星发射的信号来计算接收器与卫星之间的距离,进而确定接收器的位置。
GPS数据通常包括接收器的经纬度坐标、时间戳和位置精度等信息。
二、数据准备与读取要处理GPS数据,首先需要准备好相应的数据文件。
通常,GPS数据会以文本文件(如CSV或TXT)的形式进行存储。
在MATLAB中,可以使用load或readtable函数来读取存储在文本文件中的GPS数据,并将其转换为MATLAB中的矩阵或表格形式,方便进行后续的处理。
三、数据预处理与清洗在进行GPS数据处理之前,常常需要对数据进行预处理和清洗,以去除异常值和噪音,确保数据的准确性。
MATLAB提供了一系列的函数和工具箱,例如数据滤波技术、异常值检测算法等,可以用于数据的预处理和清洗。
此外,还可以利用MATLAB内置的绘图工具对数据进行可视化,快速发现异常数据。
四、数据分析与可视化数据处理的核心在于数据分析和可视化。
MATLAB提供了丰富的函数和工具箱,可以对GPS数据进行多维度的分析和可视化。
例如,可以利用MATLAB的统计工具箱对数据进行统计分析,找出数据中的趋势和规律。
同时,也可以使用MATLAB的绘图函数绘制位置轨迹图、速度图以及加速度图等,直观地展示数据的空间和时序特征。
五、轨迹重建与预测GPS数据处理的另一个重要应用是轨迹重建和预测。
基于历史GPS数据,我们可以通过建立合适的模型,使用MATLAB的预测函数对未来的轨迹进行预测。
GPS载波、伪码的matlab实现与分析

GPS 载波、伪码的matlab 实现与分析一、伪码生成及分析1、1 生成M 序列和Gold 码序列① 由于本原多项式分别为[2 0 1 1]和[2 4 1 1] (八进制)。
从而知道两M 序列的生成多项式为1031X X ++和10832X X X X 1++++。
此部分的程序设计思路为:先为两个十位移位寄存器赋初值(全1);后利用循环,每次把寄存器的输出放到M 序列储存器中,从而获得M 序列。
② 第一个Gold 码,使用第一个移位寄存器的第十级输出和第二个寄存器的第2级、第6级作为抽头的输出进行异或,异或的过程也在上部的循环中完成,每次异或的结果存于Gold 寄存器。
第二个Gold 码的生成与第一个类似,只是改为第二个寄存器的第3级、第7级作为抽头.1、2 对生成的伪随机码进行分析① 利用xcorr 函数对以上生成的两个M 序列分别进行自相关和互相关运算,其中需要将两M 序列进行双极性变换(xcorr 函数的要求)。
并画出自相关、互相关函数图像。
② 后利用FFT 函数,求取以上自相关函数的功率谱,并画出图像。
图像如下:图1③图像分析:由上图可验证,M序列作为近似白噪声的伪随机序列,其自相关函数近于冲击函数;互相关函数幅值近于0;功率谱密度函数是自相关函数的傅里叶变换,所以幅值近于常数1。
但在图像中有较多毛刺,与理想的图像有较大差别,可能是由于xcorr函数造成。
④利用xcorr函数对以上生成的两个Gold码序列分别进行自相关和互相关运算,其中需要将两Gold码序列进行双极性变换(xcorr 函数的要求)。
并画出自相关、互相关函数图像。
图像如下:图2图像分析:由上图可验证,Gold 码序列作为近似白噪声的伪随机序列,其自相关函数近于冲击函数;互相关函数幅值近于0。
但在图像中有较多毛刺,与理想的图像有较大差别,可能是由于xcorr 函数造成。
二、生成混沌序列并得到跳频序列2、1 生成混沌序列的原始序列① 采用Logistic (2n 1n X 2-1X ⨯=+)映射,设定初值为0.121381和0.121380,分别迭代50次,从而获得两个混沌序列。
GPS载波、伪码的matlab实现与分析

GPS 载波、伪码的matlab 实现与分析一、伪码生成及分析1、1 生成M 序列和Gold 码序列① 由于本原多项式分别为[2 0 1 1]和[2 4 1 1] (八进制)。
从而知道两M 序列的生成多项式为1031X X ++和10832X X X X 1++++。
此部分的程序设计思路为:先为两个十位移位寄存器赋初值(全1);后利用循环,每次把寄存器的输出放到M 序列储存器中,从而获得M 序列。
② 第一个Gold 码,使用第一个移位寄存器的第十级输出和第二个寄存器的第2级、第6级作为抽头的输出进行异或,异或的过程也在上部的循环中完成,每次异或的结果存于Gold 寄存器。
第二个Gold 码的生成与第一个类似,只是改为第二个寄存器的第3级、第7级作为抽头.1、2 对生成的伪随机码进行分析① 利用xcorr 函数对以上生成的两个M 序列分别进行自相关和互相关运算,其中需要将两M 序列进行双极性变换(xcorr 函数的要求)。
并画出自相关、互相关函数图像。
② 后利用FFT 函数,求取以上自相关函数的功率谱,并画出图像。
图像如下:图1③图像分析:由上图可验证,M序列作为近似白噪声的伪随机序列,其自相关函数近于冲击函数;互相关函数幅值近于0;功率谱密度函数是自相关函数的傅里叶变换,所以幅值近于常数1。
但在图像中有较多毛刺,与理想的图像有较大差别,可能是由于xcorr函数造成。
④利用xcorr函数对以上生成的两个Gold码序列分别进行自相关和互相关运算,其中需要将两Gold码序列进行双极性变换(xcorr 函数的要求)。
并画出自相关、互相关函数图像。
图像如下:图2图像分析:由上图可验证,Gold 码序列作为近似白噪声的伪随机序列,其自相关函数近于冲击函数;互相关函数幅值近于0。
但在图像中有较多毛刺,与理想的图像有较大差别,可能是由于xcorr 函数造成。
二、生成混沌序列并得到跳频序列2、1 生成混沌序列的原始序列① 采用Logistic (2n 1n X 2-1X ⨯=+)映射,设定初值为0.121381和0.121380,分别迭代50次,从而获得两个混沌序列。
GPS用户位置求解Matlab仿真

伪距观测方程变化为:
j axjx ayjy azjz cu
(7)
把方程组(2)中的每个方程线性化,得到下面的线性方程组:
1 ax1x ay1y az1z cu
2
ax 2 x
a y 2 y
az 2 z
c u
非常接近真实坐标(xu, yu, zu)时才有效。如果(x, y, z)太大,需要用本次计算得出的坐 标(xu, yu, zu)作为下一次计算的估计坐标(x0, y0, z0),重新迭代上述计算过程,直到计算得 到的(x, y, z)的值比较小为止。
二、Matlab 程序代码
下面 Matlab 程序完成利用伪距测量用户位置的 Matlab 仿真计算。 1、主程序
function Prange=CalculatePseudoRange(SatellitePosition,UserPosition) %计 算机模拟伪距测量
c=3e5;
%光速,单位:km/s;
DeltaT=1e-4; %钟差为 1e-4 数量级秒,假设卫星钟间时钟一致,DeltaT=Tu-Ts;钟差不
%时钟差初始值
Wxyz=SatellitePosNew; %卫星位置坐标
Error=1000;
ComputeTime=0;
while (Error>0.01) && (ComputeTime<1000) %开始迭代运算
ComputeTime=ComputeTime+1;
R=ones(1,VisSatNum);
f
(x0 , y0 , z0 )
f
(x0 , y0 , z0 ) x x0
利用MATLAB编制的GPS单点定位程序

function t=TimetoJD(Y,M,D,h,f,s)if(Y>=80)Y=Y+1900;elseY=Y+2000;endif M<=2Y=Y-1;M=M+12;endJD=fix(365.25*Y)+fix(30.6001*(M+1))+D+h/24+f/1440+s/24/3600+1720981.5;t=JD-2444244.5;function [head,obs]=ReadObsData%读接收机观测数据文件%HeadODat :a structure stores header information if o-file% .ApproXYZ[3]; //approximate coordinate% .interval; //intervals of two adjacent epochs% .SiteName; //point name% .Ant_H; //antenna height% .Ant_E; //east offset of the antenna center% .Ant_N; //north offset of then antenna center% .TimeOB; //first epoch time in modifuied Julian time% .TimeOE; //last epoch time in modifuied Julian time% .SumOType; //number of types of observables% .SumOO[SumOType]; //type of observables 0-L1,1-L2,2-C1,3-P1,4-P2,5-D1,6-D2,%ObsODat :a structure stores observables by one and one epoch% .TimeOEpp[2]; //reciever time of epoch% .SatSum; //number of satellites% .SatCode[SatSum]; //satellites' PRN% .Obs_FreL1[SatSum];% .Obs_FreL2[SatSum];% .Obs_RangeC1[SatSum];% .Obs_RangeP1[SatSum];% .Obs_RangeP2[SatSum];global HeadODat;global ObsODat;[fname,fpath]=uigetfile('*.*','选择一个O文件');O_filename=strcat(fpath,fname);fid1=fopen(O_filename,'rt');if (fid1==-1)msgbox('file invalide','warning','warn');return;end%将文件头数据存入结构体HeadODat中t=0;while(t<100)s=fgets(fid1);t=t+1;L=size(s,2);if L<81s(L+1:81)=' ';endinstrS=s(61:81);%测站点近似坐标if strncmp(instrS,'APPROX POSITION XYZ',19)HeadODat.ApproXYZ=zeros(1,3);HeadODat.ApproXYZ(1,1)=str2num(s(1:14));HeadODat.ApproXYZ(1,2)=str2num(s(15:28));HeadODat.ApproXYZ(1,3)=str2num(s(29:42));%历元间隔;elseif strncmp(instrS,'INTERVAL',8)HeadODat.interval=str2num(s(5:11));%测站点号elseif strncmp(instrS,'MARKER NAME',11)HeadODat.SiteName=s(1:4)%天线中心改正elseif strncmp(instrS,'ANTENNA: DELTA H/E/N',20)HeadODat.Ant_H=str2num(s(1:14));HeadODat.Ant_E=str2num(s(15:28));HeadODat.Ant_N=str2num(s(29:42));%第一个历元时间elseif strncmp(instrS,'TIME OF FIRST OBS',17)year=str2num(s(1:6));month=str2num(s(7:12));day=str2num(s(13:18));hour=str2num(s(19:24));minute=str2num(s(25:30));second=str2num(s(31:42));HeadODat.TimeOB=TimetoJD(year,month,day,hour,minute,second);%最后一个历元时间elseif strncmp(instrS,'TIME OF LAST OBS',16)year=str2num(s(1:6));month=str2num(s(7:12));day=str2num(s(13:18));hour=str2num(s(19:24));minute=str2num(s(25:30));second=str2num(s(31:42));HeadODat.TimeOE=TimetoJD(year,month,day,hour,minute,second);%观测值类型elseif strncmp(instrS,'# / TYPES OF OBSERV',19)HeadODat.SumOType=str2num(s(1:6));HeadODat.SumOO=ones(1,HeadODat.SumOType)*-1;for k=1:HeadODat.SumOTypef=s(k*6+5:k*6+6);if strcmp(f,'L1')HeadODat.SumOO(1,k)=0;elseif strcmp(f,'L2')HeadODat.SumOO(1,k)=1;elseif strcmp(f,'C1')HeadODat.SumOO(1,k)=2;elseif strcmp(f,'P1')HeadODat.SumOO(1,k)=3;elseif strcmp(f,'P2')HeadODat.SumOO(1,k)=4;elseif strcmp(f,'D1')HeadODat.SumOO(1,k)=5;elseif strcmp(f,'D2')HeadODat.SumOO(1,k)=6;endend%头文件结束elseif strncmp(instrS,'END OF HEADER',13)break;elsecontinue;endend%观测数据结构体%观测数据结构t=0;while ~feof(fid1)%每个历元的第一行数据,时间和观测到的卫星号s=fgets(fid1);t=t+1;year=str2num(s(1:3));month=str2num(s(4:6));day=str2num(s(7:9));hour=str2num(s(10:12));minute=str2num(s(13:15));second=str2num(s(16:26));%历元时间ObsODat(t).TimeOEp=[year,month,day,hour,minute,second];ObsODat(t).TimeOEpp=TimetoJD(year,month,day,hour,minute,second);%该历元观测到的卫星数ObsODat(t).SatSum=str2num(s(30:32));%该历元观测到的卫星号ObsODat(t).SatCode=zeros(1,ObsODat(t).SatSum);ObsODat(t).Obs_FreL1=zeros(1,ObsODat(t).SatSum);ObsODat(t).Obs_FreL2=zeros(1,ObsODat(t).SatSum);ObsODat(t).Obs_RangeC1=zeros(1,ObsODat(t).SatSum);ObsODat(t).Obs_RangeP1=zeros(1,ObsODat(t).SatSum);ObsODat(t).Obs_RangeP2=zeros(1,ObsODat(t).SatSum);for k=1:ObsODat(t).SatSumf=s(31+k*3:32+k*3);ObsODat(t).SatCode(1,k)=str2num(f);end%每个历元的观测数据,按卫星号先后顺序分行存for k=1:ObsODat(t).SatSums=fgets(fid1);%判断一个卫星的观测数据是否分两行存储,如果为两行,则再读入一行if HeadODat.SumOType>5sg=fgets(fid1);s=strcat(s,sg);endL=size(s,2);%补充数据长度if L<HeadODat.SumOType*16s(L+1:HeadODat.SumOType*16)=' ';end%对观测数据判断其类型,并存储到相应的数组中for j=1:HeadODat.SumOTypestemp=s(j*16-15:j*16);stemp=deblank(stemp);if isempty(stemp)continue;endstempNum=str2num(stemp);stempLength=size(stempNum,2);if stempLength>1stempNum=stempNum(1,1);endif HeadODat.SumOO(1,j)==0ObsODat(t).Obs_FreL1(1,k)=stempNum;elseif HeadODat.SumOO(1,j)==1ObsODat(t).Obs_FreL2(1,k)=stempNum;elseif HeadODat.SumOO(1,j)==2ObsODat(t).Obs_RangeC1(1,k)=stempNum;elseif HeadODat.SumOO(1,j)==3ObsODat(t).Obs_RangeP1(1,k)=stempNum;elseif HeadODat.SumOO(1,j)==4ObsODat(t).Obs_RangeP2(1,k)=stempNum;elsecontinue;endend%完成一个卫星的所有观测数据存储end%完成一个历元的数据存储end%完成所有历元的数据存储head=HeadODat;obs=ObsODat;returnfunction EphDat=ReadGpsDataglobal EphDatEphDat=struct;[filename,pathname]=uigetfile('*.**N','读取GPS广播星历文件'); fid1=fopen(strcat(pathname,filename),'rt');if(fid1==-1)msgbox('Input File or Path is not correct','warning ','warn');return;endwhile(1)temp=fgetl(fid1);header=findstr(temp,'END OF HEADER');if(~isempty(header))break;endendi=1;while(1)temp=fgetl(fid1);break;endEphDat(i).PRN=str2double(temp(1:2));year=str2double(temp(3:5));EphDat(i).toc=TimetoJD(year,str2double(temp(6:8)),str2double(temp(9:11)),str2double(temp(12: 14)),str2double(temp(15:17)),str2double(temp(18:22)));EphDat(i).a0=str2num(temp(23:41));EphDat(i).a1=str2num(temp(42:60));EphDat(i).a2=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).idoe=str2num(temp(4:22));EphDat(i).Crs=str2num(temp(23:41));EphDat(i).dn=str2num(temp(42:60));EphDat(i).M0=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).Cuc=str2num(temp(4:22));EphDat(i).e=str2num(temp(23:41));EphDat(i).Cus=str2num(temp(42:60));EphDat(i).sqa=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).toe=str2num(temp(4:22));EphDat(i).Cic=str2num(temp(23:41));EphDat(i).omg0=str2num(temp(42:60));EphDat(i).Cis=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).i0=str2num(temp(4:22));EphDat(i).Crc=str2num(temp(23:41));EphDat(i).w=str2num(temp(42:60));EphDat(i).omg=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).iDot=str2num(temp(4:22));EphDat(i).cflgl2=str2num(temp(23:41));EphDat(i).weekno=str2num(temp(42:60));EphDat(i).pflgl2=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).svacc=str2num(temp(4:22));EphDat(i).svhlth=str2num(temp(23:41));EphDat(i).tgd=str2num(temp(42:60));EphDat(i).aodc=str2num(temp(61:79));temp=fgetl(fid1);EphDat(i).ttm=str2num(temp(4:22));if(i~=1) %删除重复数据if (EphDat(i-1).PRN~=EphDat(i).PRN)break;elseif abs(EphDat(i-1).toc-EphDat(i).toc)<0.001i=i - 1;endendendi=i + 1;endfunction DDDWformat longclear allticglobal HeadODat;global ObsODat;global EphDat;%先读N文件,再读O文件EphDat=ReadGpsData;[HeadODat,ObsODat]=ReadObsData;%多个历元加权平均求测站点坐标N = size(EphDat,2);c=299792458;epochNUM=size(ObsODat,2);%观测数据的个数Xk0=HeadODat.ApproXYZ(1,1); %测站点的近似坐标Yk0=HeadODat.ApproXYZ(1,2);Zk0=HeadODat.ApproXYZ(1,3);for k=1:epochNUMtr=ObsODat(k).TimeOEp;%历元接收数据时间Snum=ObsODat(1,k).SatSum; %该历元观测到的卫星数if Snum<4break; %去除无解的历元endCode=ObsODat(k).SatCode;%该历元观测到的卫星号组R=ObsODat(k).Obs_RangeC1 ; %取出C1观测值,列向量%卫星发射时间的迭代计算for j=1:Snumif R(j) == 0continue;endt=TimetoJD(tr(1),tr(2),tr(3),tr(4),tr(5),tr(6));t2 = mod(t,7)*24*3600;%gps second%卫星钟差dd=-1;for i=1:Nif(EphDat(i).PRN==Code(j)&abs(t-EphDat(i).toc)<0.0417*2)%读入时间相近的星历文件a0= EphDat(i).a0;a1=EphDat(i).a1;a2= EphDat(i).a2;toe=EphDat(i).toe;dt=a0+(t2-toe)*a1+(t2-toe)^2*a2;%卫星钟差dd=1;break;endendif dd==-1msgbox('没有相关星历文件');return;endtt = tr;ts = tr(6) - R(j)/c;%用秒进行迭代sign = 1;while(sign>1E-8)tt(6) = ts;[Xs1,Ys1,Zs1]= CalPos(Code(j),tt);ss1 = sqrt((Xk0-Xs1)^2+(Yk0-Ys1)^2+(Zk0-Zs1)*(Zk0-Zs1));%卫星位置加地球自转改正qe=0.000072921151467; %地球自转角速度delt=ss1/c;Rotation=[cos(qe*delt),sin(qe*delt),0;-sin(qe*delt),cos(qe*delt),0;0,0,1];h=Rotation*[Xs1;Ys1;Zs1] ;Xs=h(1);Ys=h(2);Zs=h(3);ss = sqrt((Xk0-Xs)^2+(Yk0-Ys)^2+(Zk0-Zs)*(Zk0-Zs));ts = tr(6)-ss/c;sign = norm(ts-tt(6));endaxk = (Xk0-Xs)/ss;ayk = (Yk0-Ys)/ss;azk = (Zk0-Zs)/ss;EAB=CAL2POL(Xk0,Yk0,Zk0,Xs,Ys,Zs);if j==1A = [axk,ayk,azk,1];L = R(j)-ss++c*dt-2.47/(sin(EAB)+0.0121);elseA = [A;axk,ayk,azk,1]; %构造误差方程L = [L;(R(j)-ss++c*dt)-2.47/(sin(EAB)+0.0121)];%常数项endendif Snum==4dx=inv(A)*L;aaaa(k).Q=inv(A'*A);Px(k) = 1/aaaa(k).Q(1,1);Py(k) = 1/aaaa(k).Q(2,2);Pz(k) = 1/aaaa(k).Q(3,3);xchange(k) = dx(1);ychange(k) = dx(2);zchange(k) = dx(3);elseif Snum > 4dx = inv(A'*A)*A'*L; %构造法方程并求解aaaa(k).Q=inv(A'*A);Px(k) = 1/aaaa(k).Q(1,1);Py(k) = 1/aaaa(k).Q(2,2);Pz(k) = 1/aaaa(k).Q(3,3);xchange(k) = dx(1);ychange(k) = dx(2);zchange(k) = dx(3);endendXp=sum(Px.*(Xk0+xchange))/sum(Px)Yp=sum(Py.*(Yk0+ychange))/sum(Py)Zp=sum(Pz.*(Zk0+zchange))/sum(Pz)figure(1);subplot(3,1,1);plot(xchange,'black--');subplot(3,1,2);plot(ychange,'black--');subplot(3,1,3);plot(zchange,'black--');tocfunction [x,y,z]= CalPos(PRN,time)global EphDatt1=TimetoJD(time(1),time(2),time(3),time(4),time(5),time(6));t2=TimetoJD(time(1),time(2),time(3),0,0,0);if isempty(EphDat)EphDat=ReadGpsData;endsz=size(EphDat,2);gg=0;%判断最近的时间for i=1:szif(EphDat(i).PRN==PRN & abs(EphDat(i).toc-t1)<0.0417*2)G=EphDat(i);gg=1;break;endendt3=t2-G.weekno*7;% 减整周数t=t3*24*3600+time(4)*3600+time(5)*60+time(6);%化为GPS秒u=3.986004418E+14; %地球引力常数we=7.2921151467E-5; %地球自转速度a=G.sqa^2; %地球长半轴n0=sqrt(u/a^3); %计算的平运动tk=t-G.toe; %从参考历元开始的时间if tk>=302400tk=tk-604800;elseif tk<-302400tk=tk + 604800;endn=n0+G.dn; %改正后的运动Mk=G.M0+n*tk;Ek=Mk; %偏近点角弧度for i=1:4Ek=Mk+G.e*sin(Ek);endfk=2*atan((sqrt((1+G.e)/(1-G.e))*tan(Ek/2))); %真近点角if(fk<0)fk=fk+2*pi;endcosf=(cos(Ek)-G.e)/(1-G.e*cos(Ek));sinf=(sqrt(1-G.e^2)*sin(Ek))/(1-G.e*cos(Ek));uk=fk+G.w; %升交角矩及轨道摄动改正项iuk=G.Cuc*cos(2*uk)+G.Cus*sin(2*uk);irk=G.Crc*cos(2*uk)+G.Crs*sin(2*uk);iik=G.Cic*cos(2*uk)+G.Cis*sin(2*uk);uk=uk+iuk ; %改正后的升角距r=a*(1-G.e*cos(Ek))+irk; %改正后的地心相径i=G.i0+iik+G.iDot*tk; %改正后的倾角xx=r*cos(uk); %在轨道面中的位置yy=r*sin(uk);omg=G.omg0+(G.omg-we)*tk-we*G.toe; %改正后的升交点经度x=xx*cos(omg)-yy*cos(i)*sin(omg);y=xx*sin(omg)+yy*cos(i)*cos(omg);z=yy*sin(i);CalPos=[x,y,z];%打印结果% x=num2str(x,'%12.6f');% y=num2str(y,'%12.6f');% z=num2str(z,'%12.6f');% fprintf('卫星号PRN:%2.0f',PRN); fprintf('\n');% fprintf('时间time:%4.0f%4.0f%4.0f%4.0f%4.0f%4.1f',time); fprintf('\n');% fprintf('所求卫星在地心坐标系中的空间坐标为:\n');% fprintf('X = ');fprintf(x,'\n');fprintf('m\n');% fprintf('Y = ');fprintf(y,'\n');fprintf('m\n');% fprintf('Z = ');fprintf(z,'\n');fprintf('m\n');%returnfunction EAB=CAL2POL(X,Y,Z,XB,YB,ZB)format longL=atan(Y/X);R=sqrt(X*X+Y*Y+Z*Z);a=6378137;e=sqrt(0.0066943799013);seta=atan(Z/sqrt(X*X+Y*Y));B=asin(sqrt((a*a-R*R*cos(seta)*cos(seta))/(a*a-R*R*cos(seta)*cos(seta)*e*e)))B1=atan(tan(seta)*(1+a*e*e*sin(B)/Z/sqrt(1-e*e*sin(B)*sin(B))));while abs(B1-B)>0.01*pi/180/3600B=B1;B1=atan(tan(seta)*(1+a*e*e*sin(B)/Z/sqrt(1-e*e*sin(B)^2)));endH=R*cos(seta)/cos(B)-(a/sqrt(1-e*e*sin(B)*sin(B)));L=L*180/pi;B=B*180/pi;DX=XB-X;DY=YB-Y;DZ=ZB-Z;NB=-sin(B)*cos(L)*DX-sin(B)*sin(L)*DY+cos(B)*DZ; EB=-sin(L)*DX+cos(L)*DY;UB=cos(B)*cos(L)*DX+cos(B)*sin(L)*DY+sin(B)*DZ; SAB=sqrt(NB*NB+UB*UB+EB*EB);EAB=asin(UB/SAB);。
基于Matlab的数据处理方法在GPS高程拟合中的应用

基于Matlab的数据处理方法在GPS高程拟合中的应用
基于Matlab的数据处理方法在GPS高程拟合中的应用
在分析GPS高程异常拟合模型实质的基础上,结合工程实例,顾及地球重力场的空间连续性特点,运用Matlab中的拟合插值函数Griddata 等进行高程异常数据处理,并与常规采用的平面及二次曲面拟合成果进行比较.计算表明,将Matlab的数值计算及图形处理能力运用于区域GPS高程异常拟合,相对传统拟合方法,数据处理方式简洁,计算工作量少,成果精度可靠,并能立体表现高程异常的空间分布特征.
作者:陈本富王贵武沈慧郭先春作者单位:陈本富(河海大学,土木工程学院,江苏,南京,210098;东华理工大学,地测学院,江西,抚州,344000)
王贵武(昆明市规划局,云南,昆明650032)
沈慧(云南省电子工业研究所,云南,昆明,650031)
郭先春(东华理工大学,地测学院,江西,抚州,344000)
刊名:昆明理工大学学报(理工版)ISTIC PKU英文刊名:JOURNAL OF KUNMING UNIVERSITY OF SCIENCE AND TECHNOLOGY(SCIENCE AND TECHNOLOGY)年,卷(期):2009 34(5) 分类号:P228.4 关键词:Matlab Griddata函数 GPS 高程拟合插值高程异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
% 注:本程序可直接在MATLAB 2017a 中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_execute = 100; % 执行次数num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)Timedelay = ; % 用于延时读取串口数据BaudRate = 38400; % 读取数据的波特率Terminator = 'CR';num_MaxTry = 5; %打开串口的最多尝试次数BytesAvailableFcnCount = 1000;%% 设置参数% delete(instrfindall); % 串口打开失败时使用此句% delete(s);clear s % 串口打开失败时使用此句serial3 = serial('COM3');% 串口设置= 'byte';% = 38400; % 输出波特率= BaudRate; % 读入波特率% = 1024;= BytesAvailableFcnCount;= 'continuous';= Terminator;%% 打开串口count_opentimes = 1;while contains,'closed') > 0 && count_opentimes < num_MaxTryfopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains,'open') < 1disp('open com failed!');returnend%% 读取并处理数据% 初始化GPS_Data = GPS_Init();while(num_execute > 0)GPS_DataStrs = fread(serial3,num_SingleRead,'char'); %一次读出10个字符GPS_DataStrs = reshape(GPS_DataStrs,1,[]);GPS_DataStrs = split_str2strs(GPS_DataStrs);GPS_Data_tmp = get_GPS_specificData(GPS_DataStrs);GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp);show_GPS_Data(GPS_Data);pause(Timedelay); % 延时num_execute = num_execute-1;end% fprintf(s,'abcd'); %给串口的发送数据% fscanf(s); %从串口的接收缓存读数据%% 关闭串口并删除相关数据fclose(serial3); %关闭串口delete(serial3);clear serial3%%%将字符串根据'\r\n'划分成多个子字符串,同时去掉首尾无用的残余字符串function out_strs = split_str2strs(StrData)if contains(class(StrData),'char')uint8(StrData);endrecord = get_pos_enterflag(StrData);if StrData(1) == uint8('$') %开头为'$'的情况flag_start = 1;elseif size(record,2) > 0flag_start = record(1)+2;elseout_strs = cell(0,0);returnendendif StrData(end) == 13flag_end = length(StrData)-1;elseif size(record,2) > 0flag_end = record(end)-1;endendif flag_start >= flag_endout_strs = cell(0,0);returnendStrData = StrData(flag_start:flag_end); % 截取有效数据,方便下面划分子字符串record = get_pos_enterflag(StrData);num_strs = size(record,2)+1;out_strs = cell(num_strs,1);if num_strs > 1out_strs{1,1} = char(StrData(1:record(1)-1));if num_strs == 2out_strs{num_strs,1} = char(StrData(record(1)+2:end));elsefor i = 2 : num_strs-1out_strs{i,1} = char(StrData(record(i-1)+2:record(i)-1)); endout_strs{num_strs,1} = char(StrData(record(i)+2:end));endelseout_strs{1,1} = char(StrData);end% 得到字符串中'\r\n'在字符串中的位置(实际为'\r'的位置)function record = get_pos_enterflag(data)record = []; % 记录回车符号位置for ii = 1 : length(data)-1if data(ii) == 13if data(ii+1) == 10record = [record,ii];ii = ii+1;endendendendend% 得到具体GPS结构体数据function GPS_Data_tmp = get_GPS_specificData(StrsData) GPS_Data_tmp = [];num_str = size(StrsData,1);for i = 1 : num_strstr_tab = StrsData{i,1};if contains(str_tab,'GGA') > 0GPS_Data_tmp = GNGGA(str_tab);elseif contains(str_tab,'GSA') > 0GPS_Data_tmp = GNGSA(str_tab);elseif contains(str_tab,'GSV') > 0GPS_Data_tmp = GNGSV(str_tab);elseif contains(str_tab,'RMC') > 0GPS_Data_tmp = GNRMC(str_tab);elseif contains(str_tab,'VTG') > 0GPS_Data_tmp = GNVTG(str_tab);elseif contains(str_tab,'GLL') > 0GPS_Data_tmp = GNGLL(str_tab);endendend% GPS字符串解析function GPS_Data_tmp = GNGGA(str_tab)index = strfind(str_tab,',');count = 1;Time = str_tab(index(count)+1:index(count+1)-1);count=count+1;Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理= Time(1:2);= Time(3:4);= Time(5:6);= Time(8:10);= Latitude(1:2); % 纬度= Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);= Longitude(1:3); % 经度= Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);% UTC时间转换为北京时间hour = if str2num(hour)+8 >= 24= num2str(str2num(hour)+8-24);else= num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNGSA(str_tab)index = strfind(str_tab,',');count = 1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1; = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);endfunction GPS_Data_tmp = GNGSV(str_tab)% 此语句为与卫星有关的信息(包括卫星方位,卫星编号)% 暂时用不着,不处理GPS_Data_tmp = [];endfunction GPS_Data_tmp = GNRMC(str_tab)index = strfind(str_tab,',');count = 1;Time = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Date = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理= Time(1:2);= Time(3:4);= Time(5:6);= Time(8:10);= Latitude(1:2); % 纬度= Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);= Longitude(1:3); % 经度= Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);= Date(1:2);= Date(3:4);= Date(5:6);% UTC时间转换为北京时间hour = if str2num(hour)+8 >= 24= num2str(str2num(hour)+8-24);else= num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNVTG(str_tab)index = strfind(str_tab,',');count = 1;= str_tab(index(count)+1:index(count+1)-1);count=count+1; = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1; = str_tab(index(count)+1:index(count+1)-1);count=count+1; % other = str_tab(index(count)+1:end);endfunction GPS_Data_tmp = GNGLL(str_tab)index = strfind(str_tab,',');count = 1;Latitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Longitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;Date = str_tab(index(count)+1:index(count+1)-1);count=count+1;= str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理= Latitude(1:2); % 纬度= Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);= Longitude(1:3); % 经度= Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;= num2str(floor(tmp));= num2str((tmp-floor(tmp))*10000);= Date(1:2);= Date(3:4);= Date(5:6);end% 更新获取到的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp) % 用不到的数据可以注释掉if isfield(GPS_Data_tmp,'Time') == 1= = = = endif isfield(GPS_Data_tmp,'DATE') == 1= = = endif isfield(GPS_Data_tmp,'Latitude') == 1= = = = endif isfield(GPS_Data_tmp,'LatitudeDir') == 1= ;endif isfield(GPS_Data_tmp,'Longitude') == 1= = = = endif isfield(GPS_Data_tmp,'LongitudeDir') == 1= ;endif isfield(GPS_Data_tmp,'GPSState') == 1= ;endif isfield(GPS_Data_tmp,'SatelliteNum') == 1 = ;endif isfield(GPS_Data_tmp,'speed') == 1= ;endif isfield(GPS_Data_tmp,'velocity') == 1= ;endif isfield(GPS_Data_tmp,'LocationState') == 1 = ;endif isfield(GPS_Data_tmp,'altitude') == 1= ;endif isfield(GPS_Data_tmp,'CurState') == 1= ;endif isfield(GPS_Data_tmp,'LocationMode') == 1 = ;endif isfield(GPS_Data_tmp,'HDOP') == 1= ;endif isfield(GPS_Data_tmp,'VDOP') == 1= ;endif isfield(GPS_Data_tmp,'PDOP') == 1= ;endif isfield(GPS_Data_tmp,'TrueDir') == 1= ;endif isfield(GPS_Data_tmp,'MagneticAngle') == 1= ;endif isfield(GPS_Data_tmp,'MagneticDir') == 1= ;endif isfield(GPS_Data_tmp,'ReferenceTrueDir') == 1 = ;endif isfield(GPS_Data_tmp,'RelativeDir') == 1= ;endif isfield(GPS_Data_tmp,'ReferenceRelativeDir') == 1= ;endif isfield(GPS_Data_tmp,'step') == 1= ;endif isfield(GPS_Data_tmp,'stepflag') == 1= ;endif isfield(GPS_Data_tmp,'PRN') == 1= ;endend% 显示相关GPS数据function show_GPS_Data(GPS_Data)DataAndTime = sprintf('20%02s-%02s-%02s %02s:%02s:%02s:%03s',...Location =sprintf(' %s:%02s°%02s′%03s″%04s,%s:%02s°%02s′%03s″%04s',..., , Others = sprintf('GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s',... % ,,,,;% show_Message_str(strcat(DataAndTime,Location,Others));show_Message_str(strcat(DataAndTime,Location));end% 初始化GPS数据结构体function GPS_Data = GPS_Init()= '0';= '0';= '0';= '0';= '29';= '8';= '18';= '0'; % 纬度= '0';= '0';= '0';= 'N';= '0'; % 经度= '0';= '0';= '0';= 'E';= '0'; % GPS状态,0:未定位;1:无差分定位;2:带差分定位;3:无效GPS;6:正在估算= '0'; % 可用卫星数目= '0';= '0';= 'V';= '0'; % 海拔高度= '1'; % 当前状态,1:无定位信息;2:2D;3:3D = 'A'; % 定位模式,'A':自动,'M':手动= ''; % 水平精度因子= ''; % 垂直精度因子= ''; % 综合位置精度因子= '0'; % 方位角= '0'; % 磁偏角= 'E'; % 磁偏角参考方向,E/W(东西经)= 'T'; % 真实方向的参考方向,T:正北参照系= '0'; % 相对方向= 'M'; % M:磁北参照系= '0'; % 步长= 'N';= '01'; % 正在使用的卫星PRN码编号end% 可实现静态显示输出内容(防止输出内容不同换行) function show_Message_str(strData)persistent CurMessage;if isempty(CurMessage)CurMessage = '';endfprintf(1,repmat('\b',1,numel(CurMessage))); fprintf(1,'%s',strData);CurMessage = strData;end。