MATLAB解析GPS数据程序

合集下载

【精品】用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仿真

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数据处理教程

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实现与分析

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实现与分析

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仿真

伪距观测方程变化为:
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单点定位程序

利用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高程拟合中的应用
基于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 高程拟合插值高程异常。

读取GPS观测数据O文件的matlab编程

读取GPS观测数据O文件的matlab编程

function HeadO=ReadObsHead[fname,fpath]=uigetfile('*.*O','选择一个O文件'); HeadO.O_filename=strcat(fpath,fname);fid=fopen(HeadO.O_filename,'rt');if (fid==-1)msgbox('文件不存在','警告','warn');return;endk=0;while(1)s=fgets(fid);if (strfind(s,'RINEX VERSION'))HeadO.Rtype=str2double(s(6:10));elseif(strfind(s,'APPROX POSITION XYZ'))HeadO.XYZ(1)=str2double(s(1:14));HeadO.XYZ(2)=str2double(s(15:28));HeadO.XYZ(3)=str2double(s(29:42));elseif (strfind(s,'MARKER NAME'))HeadO.staname=s(1:4);elseif (strfind(s,'MARKER NUMBER'))HeadO.stanum=s(1:4);elseif (strfind(s,'# / TYPES OF OBSERV'))HeadO.PRNtype='G';HeadO.nObstype=str2double(s(6));for i=1:HeadO.nObstypeHeadO.Obs{i}={s(i*6+5:i*6+6)};endelseif (strfind(s,'SYS / # / OBS TYPES'))k=k+1;HeadO.PRNtype(k)=char(s(1));HeadO.nObstype(k)=str2double(s(5:6));if(HeadO.nObstype(k)>13)for i=1:13HeadO.Obs{k,i}=s(i*4+4:i*4+6);ends=fgets(fid);for i=1:HeadO.nObstype(k)-13HeadO.Obs{k,i+13}=s(i*4+4:i*4+6);endelsefor i=1:HeadO.nObstype(k)HeadO.Obs{k,i}=s(i*4+4:i*4+6);endendelseif (strfind(s,'END OF HEADER'))break;endend下面为读取数据程序,供参考% Read RINEX Observation Datanepoch=0;nobs=0;nlli=0;rnx.epoch=[];rnx.obs=[];rnx.lli=[];while 1if feof(fid)==1,break,endline=fgetl(fid);if isempty(deblank(line)),break,endif version < 3 % Version 2 RINEX% get epoch flag and number of satellitesEpStr=line(1:26);EpFlg=sscanf(line(27:29),'%d');NumSat=sscanf(line(30:32),'%d');if EpFlg>1% epoch flags% 0 - o.k.% 1 - power failure between previous and current epoch% event flags (epoch flag continued)% 2 - start moving antenna% 3 - new site occupation (end of kinematic data); at least a record % with a new marker name must follow% 4 - new header info follows% 5 - external event (epoch is significant)% 6 - cycle slip records follow (same format as observations)%% the number of records which follow is given by NumSatfor i=1:NumSatline=fgetl(fid);endcontinueend% get epoch timet=sscanf(EpStr,'%f',6)';if t(1) < 80t(1)=2000+t(1);elset(1)=1900+t(1);end%keyboard%-adaption rvbree 25112008---% date = datenum(t(1),t(2),t(3)); % The serial date numbers from 1-Jan-0000 to the day of observation% gpsweek = fix((date - datenum(1980,1,6))/7);% secsinweek = (date - datenum(1980,1,6) - gpsweek*7)*24*3600 + t(4)*3600 + t(5)*60 + t(6);%% EpTime = secsinweek;% GPSW = gpsweek;%EpTime=datenum(t(1),t(2),t(3),t(4),t(5),t(6));%----end adaption-----------------------------------------%EpTime=datenum(t(1),t(2),t(3),t(4),t(5),t(6));% read optional clock error *** we do not need the clock error ***% ClkOffset = sscanf(line(69:end),'%f');% get satellite id's% - sprn contains the 3letter codes for the satellites% - prn contains the universal satellite id'ssprn=line(33:min(end,68));for j=2:ceil(NumSat/12)line2=fgetl(fid);sprn=[sprn line2(33:min(end,68))];endprn=rxsatnum(sprn);% get the observations, lli and snr for all satellitesobs=zeros(NumSat,NumRxObs);for i=1:NumSatline=fgetl(fid);line=[line blanks(80-length(line))];for j=2:ceil(NumRxObs/5)line2=fgetl(fid);line=[line line2 blanks(80-length(line2))];end% get the observationsp=0;for j=1:NumRxObsobsi=sscanf(line(p+ 1:p+14),'%f');% test for missing observationsif isempty(obsi) | obsi==0, obsi=NaN;, endobs(i,j)=obsi;p=p+16;end% get the lli (loss of lock indicator) for carrier phase datafor jj=1:length(icarrier)j=icarrier(jj);flg=double(line((j-1)*16+15))-48;if rem(flg,2)nlli=nlli+1;rnx.lli(nlli,1:4)=[ nepoch+1 prn(i) nobs+i j];end% *** we don't do the snr flag yet, should replace S1 and S2 if not present ***%snr=sscanf(line(p+16:p+16),'%d');endend。

运用matlab计算gps卫星的坐标位置

运用matlab计算gps卫星的坐标位置

运用matlab计算gps卫星的坐标位置clearclcformat longtp=input('tp=');toc=input('toc=');a0=input('a0=');a1=input('a1=');a2=input('a2=');toe=input('toe=');M0=input('M0=');a=input('长半径a=');deltan=input('卫星平均角速度之差deltan=');e=input('e=');w=input('w=');Cuc=input('Cuc=');Cus=input('Cus=');Cic=input('Cic=');Cis=input('Cis=');Crc=input('Crc=');Crs=input('Crs=');i0=input('i0=');I=input('轨道倾角变化率I=');OM0=input('OM0=');OM=input('升交点赤径变化率OM=');tt=a0+a1*(tp-toc)+a2*(tp-toc);t=tp-tt;tk=t-toe;u=3.986005e14;n0=(sqrt(u))/(a*a*a);n=n0+deltan;Mk=M0+n*tk;{n=MK;ek0=0;ek1=n+e*sin(ek0);ek2=n+e*sin(ek1);EK=ek2;}Dk=1;Ek=0;n1=0;while abs(Ek-Dk)>0.0000000001n1=n1+1;Ek=Dk;Dk=Mk+e*sin(Ek);endEk=Dk;Vk=atan((sqrt(1-e*e)*sin(Ek)/(cos(Ek)-e)); if sin(Ek)>0 & cos(Ek)-e<0Vk=pi-Vk;elseif sin(Ek)<0 & cos(Ek)-e<0Vk=pi+Vk;elseif sin(Ek)<0 & cos(Ek)-e>0Vk=2*pi-Vk;endFaik=Vk+w;SigmaU=Cuc*cos(2*Faik)+Cus*sin(2*Faik); SigmaR=Crc*cos(2*Faik)+Crs*sin(2*Faik);SigmaI=Cic*cos(2*Faik)+Cis*sin(2*Faik);Uk=Faik+SigmaU;Rk=a*(1-e*cos(Ek))+SigmaR;Ik=i0+SigmaI+I*tk;X0=Rk*cos(Uk);Y0=Rk*sin(Uk);we=7.29211567e-5;OMK=OM0+(OM-we)*tk-we*toe;Xk=X0*cos(OMK)-Y0*cos(Ik)*sin(OMK);Yk=X0*sin(OMK)+Y0*cos(Ik)*cos(OMK);Zk=Y0*sin(Ik);disp(['卫星钟差改正dt=',num2str(tt)])disp(['归化时刻tk=',num2str(tk)])disp(['平均运行角速度n=',num2str(n)])disp(['卫星平近点角Mk=',num2str(Mk)])disp(['偏近点角Ek=',num2str(Ek)])disp(['真近点角Vk=',num2str(Vk)])disp(['升交距角Faik=',num2str(Faik)])disp(['摄动改正项SigmaU=',num2str(SigmaU)]) disp(['摄动改正项SigmaR=',num2str(SigmaR)]) disp(['摄动改正项SigmaI=',num2str(SigmaI)]) disp('经过摄动改正项:')disp(['升交距角Uk=',num2str(Uk)])disp(['卫星矢径Rk=',num2str(Rk)])disp(['轨道倾角Ik=',num2str(Ik)])disp('卫星在轨道平面坐标系的坐标')disp(['X0=',num2str(X0)])disp(['Y0=',num2str(Y0)])disp(['观测时刻升交点经度OMK=',num2str(OMK)]) disp('卫星在地心固定坐标系中的直角坐标')disp(['Xk=',num2str(Xk)]) disp(['Yk=',num2str(Yk)]) disp(['Zk=',num2str(Zk)])。

MATLAB解析GPS数据程序文件

MATLAB解析GPS数据程序文件

% 注:本程序可直接在MATLAB 2017a 中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_execute = 100; % 执行次数num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)Timedelay = 0.2; % 用于延时读取串口数据BaudRate = 38400; % 读取数据的波特率Terminator = 'CR';num_MaxTry = 5; %打开串口的最多尝试次数BytesAvailableFcnCount = 1000;%% 设置参数% delete(instrfindall); % 串口打开失败时使用此句% delete(s);clear s % 串口打开失败时使用此句serial3 = serial('COM3');% 串口设置serial3.BytesAvailableFcnMode = 'byte';% serial3.InputBufferSize = 38400; % 输出波特率serial3.BaudRate = BaudRate; % 读入波特率% serial3.OutputBufferSize = 1024;serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;serial3.ReadAsyncMode = 'continuous';serial3.Terminator = Terminator;%% 打开串口count_opentimes = 1;while contains(serial3.status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains(serial3.status,'open') < 1disp('open 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);returnStrData = 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;endendendend% 得到具体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;GPS_Data_titudeDir = 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;GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.GPSState = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.SatelliteNum = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.altitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_tmp.Time.hour = Time(1:2);GPS_Data_tmp.Time.min = Time(3:4);GPS_Data_tmp.Time.sec = Time(5:6);GPS_Data_lisec = Time(8:10);GPS_Data_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度GPS_Data_tmp.Longitude.min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000);% UTC时间转换为时间hour = GPS_Data_tmp.Time.hour;if str2num(hour)+8 >= 24GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24);elseGPS_Data_tmp.Time.hour = num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNGSA(str_tab)index = strfind(str_tab,',');count = 1;GPS_Data_tmp.LocationMode = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.CurState = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.PRN = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.PDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.VDOP = 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; GPS_Data_tmp.LocationState = 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;GPS_Data_titudeDir = 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;GPS_Data_tmp.LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.speed = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.TrueDir = 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; GPS_Data_tmp.MagneticAngle = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.MagneticDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_tmp.Time.hour = Time(1:2);GPS_Data_tmp.Time.min = Time(3:4);GPS_Data_tmp.Time.sec = Time(5:6);GPS_Data_lisec = Time(8:10);GPS_Data_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000);GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度GPS_Data_tmp.Longitude.min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000);GPS_Data_tmp.DATE.day = Date(1:2);GPS_Data_tmp.DATE.month = Date(3:4);GPS_Data_tmp.DATE.year = Date(5:6);% UTC时间转换为时间hour = GPS_Data_tmp.Time.hour;if str2num(hour)+8 >= 24GPS_Data_tmp.Time.hour = num2str(str2num(hour)+8-24);elseGPS_Data_tmp.Time.hour = num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNVTG(str_tab)index = strfind(str_tab,',');count = 1;GPS_Data_tmp.TrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.ReferenceTrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.RelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.ReferenceRelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.step = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.stepflag = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp.velocity = 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;GPS_Data_titudeDir = 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;GPS_Data_tmp.LongitudeDir = 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;GPS_Data_tmp.LocationState = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_titude.degree = Latitude(1:2); % 纬度GPS_Data_titude.min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_titude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000);GPS_Data_tmp.Longitude.degree = Longitude(1:3); % 经度GPS_Data_tmp.Longitude.min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp.Longitude.sec = num2str(floor(tmp));GPS_Data_lisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp.DATE.day = Date(1:2);GPS_Data_tmp.DATE.month = Date(3:4);GPS_Data_tmp.DATE.year = Date(5:6);end% 更新获取到的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)% 用不到的数据可以注释掉if isfield(GPS_Data_tmp,'Time') == 1GPS_Data.Time.hour = GPS_Data_tmp.Time.hour;GPS_Data.Time.min = GPS_Data_tmp.Time.min;GPS_Data.Time.sec = GPS_Data_tmp.Time.sec;GPS_lisec = GPS_Data_lisec;endif isfield(GPS_Data_tmp,'DATE') == 1GPS_Data.DATE.day = GPS_Data_tmp.DATE.day;GPS_Data.DATE.month = GPS_Data_tmp.DATE.month;GPS_Data.DATE.year = GPS_Data_tmp.DATE.year;endif isfield(GPS_Data_tmp,'Latitude') == 1GPS_titude.degree = GPS_Data_titude.degree;GPS_titude.min = GPS_Data_titude.min;GPS_titude.sec = GPS_Data_titude.sec;GPS_lisec = GPS_Data_lisec;endif isfield(GPS_Data_tmp,'LatitudeDir') == 1GPS_titudeDir = GPS_Data_titudeDir;endif isfield(GPS_Data_tmp,'Longitude') == 1GPS_Data.Longitude.degree = GPS_Data_tmp.Longitude.degree; GPS_Data.Longitude.min = GPS_Data_tmp.Longitude.min;GPS_Data.Longitude.sec = GPS_Data_tmp.Longitude.sec;GPS_lisec = GPS_Data_lisec; endif isfield(GPS_Data_tmp,'LongitudeDir') == 1GPS_Data.LongitudeDir = GPS_Data_tmp.LongitudeDir;endif isfield(GPS_Data_tmp,'GPSState') == 1GPS_Data.GPSState = GPS_Data_tmp.GPSState;endif isfield(GPS_Data_tmp,'SatelliteNum') == 1GPS_Data.SatelliteNum = GPS_Data_tmp.SatelliteNum;endif isfield(GPS_Data_tmp,'speed') == 1GPS_Data.speed = GPS_Data_tmp.speed;endif isfield(GPS_Data_tmp,'velocity') == 1GPS_Data.velocity = GPS_Data_tmp.velocity;endif isfield(GPS_Data_tmp,'LocationState') == 1GPS_Data.LocationState = GPS_Data_tmp.LocationState;endif isfield(GPS_Data_tmp,'altitude') == 1GPS_Data.altitude = GPS_Data_tmp.altitude;endif isfield(GPS_Data_tmp,'CurState') == 1GPS_Data.CurState = GPS_Data_tmp.CurState;endif isfield(GPS_Data_tmp,'LocationMode') == 1GPS_Data.LocationMode = GPS_Data_tmp.LocationMode;endif isfield(GPS_Data_tmp,'HDOP') == 1GPS_Data.HDOP = GPS_Data_tmp.HDOP;endif isfield(GPS_Data_tmp,'VDOP') == 1GPS_Data.VDOP = GPS_Data_tmp.VDOP;endif isfield(GPS_Data_tmp,'PDOP') == 1GPS_Data.PDOP = GPS_Data_tmp.PDOP;endif isfield(GPS_Data_tmp,'TrueDir') == 1GPS_Data.TrueDir = GPS_Data_tmp.TrueDir;endif isfield(GPS_Data_tmp,'MagneticAngle') == 1GPS_Data.MagneticAngle = GPS_Data_tmp.MagneticAngle;endif isfield(GPS_Data_tmp,'MagneticDir') == 1GPS_Data.MagneticDir = GPS_Data_tmp.MagneticDir;endif isfield(GPS_Data_tmp,'ReferenceTrueDir') == 1GPS_Data.ReferenceTrueDir = GPS_Data_tmp.ReferenceTrueDir;endif isfield(GPS_Data_tmp,'RelativeDir') == 1GPS_Data.RelativeDir = GPS_Data_tmp.RelativeDir;endif isfield(GPS_Data_tmp,'ReferenceRelativeDir') == 1GPS_Data.ReferenceRelativeDir = GPS_Data_tmp.ReferenceRelativeDir; endif isfield(GPS_Data_tmp,'step') == 1GPS_Data.step = GPS_Data_tmp.step;endif isfield(GPS_Data_tmp,'stepflag') == 1GPS_Data.stepflag = GPS_Data_tmp.stepflag;endif isfield(GPS_Data_tmp,'PRN') == 1GPS_Data.PRN = GPS_Data_tmp.PRN;endend% 显示相关GPS数据function show_GPS_Data(GPS_Data)DataAndTime = sprintf('20%02s-%02s-%02s %02s:%02s:%02s:%03s',...GPS_Data.DATE.year,GPS_Data.DATE.month,GPS_Data.DATE.day,...GPS_Data.Time.hour,GPS_Data.Time.min,GPS_Data.Time.sec,GPS_lise c);Location = sprintf(' %s:%02s°%02s′%03s″%04s,%s:%02s°%02s′%03s″%04s',...GPS_titudeDir,GPS_titude.degree,GPS_titude.min,GPS_Data.L atitude.sec,GPS_lisec,...GPS_Data.LongitudeDir,GPS_Data.Longitude.degree,GPS_Data.Longitude.min,GPS_D ata.Longitude.sec,GPS_lisec);% Others = sprintf('GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s',...%GPS_Data.GPSState,GPS_Data.SatelliteNum,GPS_Data.speed,GPS_Data.velocity,GPS _Data.LocationState);% show_Message_str(strcat(DataAndTime,Location,Others));show_Message_str(strcat(DataAndTime,Location));end% 初始化GPS数据结构体function GPS_Data = GPS_Init()GPS_Data.Time.hour = '0';GPS_Data.Time.min = '0';GPS_Data.Time.sec = '0';GPS_lisec = '0';GPS_Data.DATE.day = '29';GPS_Data.DATE.month = '8';GPS_Data.DATE.year = '18';GPS_titude.degree = '0'; % 纬度GPS_titude.min = '0';GPS_titude.sec = '0';GPS_lisec = '0';GPS_titudeDir = 'N';GPS_Data.Longitude.degree = '0'; % 经度GPS_Data.Longitude.min = '0';GPS_Data.Longitude.sec = '0';GPS_lisec = '0';GPS_Data.LongitudeDir = 'E';GPS_Data.GPSState = '0'; % GPS状态,0:未定位;1:无差分定位;2:带差分定位;3:无效GPS;6:正在估算GPS_Data.SatelliteNum = '0'; % 可用卫星数目GPS_Data.speed = '0';GPS_Data.velocity = '0';GPS_Data.LocationState = 'V';GPS_Data.altitude = '0'; % 海拔高度GPS_Data.CurState = '1'; % 当前状态,1:无定位信息;2:2D;3:3DGPS_Data.LocationMode = 'A'; % 定位模式,'A':自动,'M':手动GPS_Data.HDOP = '0.5'; % 水平精度因子GPS_Data.VDOP = '0.5'; % 垂直精度因子GPS_Data.PDOP = '0.5'; % 综合位置精度因子GPS_Data.TrueDir = '0'; % 方位角GPS_Data.MagneticAngle = '0'; % 磁偏角GPS_Data.MagneticDir = 'E'; % 磁偏角参考方向,E/W(东西经)GPS_Data.ReferenceTrueDir = 'T'; % 真实方向的参考方向,T:正北参照系 GPS_Data.RelativeDir = '0'; % 相对方向GPS_Data.ReferenceRelativeDir = 'M'; % M:磁北参照系GPS_Data.step = '0'; % 步长GPS_Data.stepflag = 'N';GPS_Data.PRN = '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。

如何使用Matlab进行卫星导航与定位

如何使用Matlab进行卫星导航与定位

如何使用Matlab进行卫星导航与定位卫星导航与定位是一门广泛应用于航空、航海、地理信息系统等领域的技术。

在这个时代,人们越来越依赖全球定位系统(GPS)来获取准确的位置信息。

而Matlab作为一种功能强大的数学软件工具,可以帮助我们进行卫星导航与定位的模拟和算法设计。

本文将介绍如何使用Matlab进行卫星导航与定位的相关内容。

在开始之前,我们需要明确一些基础知识。

首先,我们需要了解GPS工作的原理。

GPS系统主要由卫星、地面控制站和接收器三部分组成。

卫星发送信号,接收器接收并计算信号传播的时间差来确定位置。

其次,我们需要了解GPS的信号类型。

GPS信号包括C/A码和P码两种类型,其中C/A码用于民用接收器,P码用于军用接收器。

最后,我们需要了解GPS的误差来源。

GPS的定位误差主要来自多普勒效应、大气延迟、钟差等因素。

使用Matlab进行卫星导航与定位需要用到一些特定的工具和函数。

首先,我们需要导入相应的工具箱。

Matlab提供了GPS工具箱和导航工具箱,可以帮助我们进行相关的计算和模拟。

在导入工具箱之后,我们可以使用相关函数进行卫星导航与定位的模拟和计算。

例如,可以使用gpscoordinates函数来计算卫星的位置信息,使用gps2utc函数来进行时间转换等。

在进行卫星导航与定位的模拟和计算之前,我们需要准备相关的数据。

首先,我们需要获取卫星的星历数据。

星历数据包括卫星的位置、速度和加速度等信息,可以帮助我们计算卫星的轨道和位置。

其次,我们需要获取接收器的观测数据。

观测数据包括接收器接收到的信号的时间和信号的强度等信息,可以帮助我们计算信号传播的时间差和定位误差。

最后,我们需要获取地球的几何形状数据。

地球的几何形状数据包括地球的椭球体参数和地球的地理坐标系等信息,可以帮助我们进行地球坐标和地理位置的转换。

在得到所需的数据之后,我们就可以开始使用Matlab进行卫星导航与定位的模拟和计算了。

GPS基本原理及其Matlab仿真第4章GPS卫星的导航定位信号

GPS基本原理及其Matlab仿真第4章GPS卫星的导航定位信号

第4章 GPS卫星的导航定位信号
这里,自相关性是指两个结构相同的码序列的相关程度, 它由自相关函数描述。为了说明这一问题,可将随机噪声码序 列u(t)平移k个码元,获得具有相同结构的新的码序列u(t)。 比 较这两个码序列,假定它们的对应码元中,码值(0或1)相同 的码元个数为Su,而码元相异的码元个数为Du,那么两者之差 Su-Du与两者之和Su+Du(即码元总数)的比值,即定义为随机 噪声码序列的自相关函数,用符号R(t)表示:
(4-2)
Tu(2r1)tuNutu
(4-3)
式中,Nu也称为码长。
第4章 GPS卫星的导航定位信号
由于移位寄存器不容许出现全“0”状态,因此2r-1码元
中,“1”的个数总比“0”的个数多一个。这样,当两个周期
相同的m序列其对应码元完全对齐时,自相关系数R(t)=1,而
在其他情况则有
R(t)1 1 Nu 2r 1
载 f 频 L2
120F
fL2 /1200 fL2 /120 fL2 /24552000
第4章 GPS卫星的导航定位信号
4.2 GPS卫星的测距码信号
4.2.1 码的基本概念
码是一种表达信息的二进制数及其组合, 是一组二进制的 数码序列。例如,对0,1,2,3取两位二进制数的不同组合表 示为:00,01,10,11。这些二进制数的组合形式称之为码。 其中每一位二进制数称为1个码元或1比特(bit);每个码均含 有两个二进制数,即两个码元或两个比特。比特是码的度量单 位,也是信息量的度量单位。如果将各种信息,例如声音、 图 像以及文字等,按某种预定的规则表示为二进制数的组合形式, 则这一过程就称为编码,也就是信息的数字化。
第4章 GPS卫星的导航定位信号

MATLAB解析GPS数据程序

MATLAB解析GPS数据程序

% 注:本程序可直接在MATLAB 2017a 中运行%该脚本文件用于学习GPS数据的读取,需要做其她用途请自行修改代码%本脚本文件的前面几行代码就是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_execute = 100; % 执行次数num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)Timedelay = 0、2; % 用于延时读取串口数据BaudRate = 38400; % 读取数据的波特率Terminator = 'CR';num_MaxTry = 5; %打开串口的最多尝试次数BytesAvailableFcnCount = 1000;%% 设置参数% delete(instrfindall); % 串口打开失败时使用此句% delete(s);clear s % 串口打开失败时使用此句serial3 = serial('COM3');% 串口设置serial3、BytesAvailableFcnMode = 'byte';% serial3、InputBufferSize = 38400; % 输出波特率serial3、BaudRate = BaudRate; % 读入波特率% serial3、OutputBufferSize = 1024;serial3、BytesAvailableFcnCount = BytesAvailableFcnCount;serial3、ReadAsyncMode = 'continuous';serial3、Terminator = Terminator;%% 打开串口count_opentimes = 1;while contains(serial3、status,'closed') > 0 && count_opentimes < num_MaxTry fopen(serial3); %打开串口count_opentimes = count_opentimes+1;endif contains(serial3、status,'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; GPS_Data_tmp、LatitudeDir = 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;GPS_Data_tmp、LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、GPSState = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、SatelliteNum = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、altitude = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_tmp、Time、hour = Time(1:2);GPS_Data_tmp、Time、min = Time(3:4);GPS_Data_tmp、Time、sec = Time(5:6);GPS_Data_tmp、Time、millisec = Time(8:10);GPS_Data_tmp、Latitude、degree = Latitude(1:2); % 纬度GPS_Data_tmp、Latitude、min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Latitude、sec = num2str(floor(tmp));GPS_Data_tmp、Latitude、millisec = num2str((tmp-floor(tmp))*10000);GPS_Data_tmp、Longitude、degree = Longitude(1:3); % 经度GPS_Data_tmp、Longitude、min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Longitude、sec = num2str(floor(tmp));GPS_Data_tmp、Longitude、millisec = num2str((tmp-floor(tmp))*10000); % UTC时间转换为北京时间hour = GPS_Data_tmp、Time、hour;if str2num(hour)+8 >= 24GPS_Data_tmp、Time、hour = num2str(str2num(hour)+8-24);elseGPS_Data_tmp、Time、hour = num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNGSA(str_tab)index = strfind(str_tab,',');count = 1;GPS_Data_tmp、LocationMode = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、CurState = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、PRN = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、PDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、HDOP = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、VDOP = 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; GPS_Data_tmp、LocationState = 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;GPS_Data_tmp、LatitudeDir = 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;GPS_Data_tmp、LongitudeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、speed = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、TrueDir = 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; GPS_Data_tmp、MagneticAngle = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、MagneticDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_tmp、Time、hour = Time(1:2);GPS_Data_tmp、Time、min = Time(3:4);GPS_Data_tmp、Time、sec = Time(5:6);GPS_Data_tmp、Time、millisec = Time(8:10);GPS_Data_tmp、Latitude、degree = Latitude(1:2); % 纬度GPS_Data_tmp、Latitude、min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Latitude、sec = num2str(floor(tmp));GPS_Data_tmp、Latitude、millisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp、Longitude、degree = Longitude(1:3); % 经度GPS_Data_tmp、Longitude、min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Longitude、sec = num2str(floor(tmp));GPS_Data_tmp、Longitude、millisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp、DATE、day = Date(1:2);GPS_Data_tmp、DATE、month = Date(3:4);GPS_Data_tmp、DATE、year = Date(5:6);% UTC时间转换为北京时间hour = GPS_Data_tmp、Time、hour;if str2num(hour)+8 >= 24GPS_Data_tmp、Time、hour = num2str(str2num(hour)+8-24);elseGPS_Data_tmp、Time、hour = num2str(str2num(hour)+8);endendfunction GPS_Data_tmp = GNVTG(str_tab)index = strfind(str_tab,',');count = 1;GPS_Data_tmp、TrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、ReferenceTrueDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、RelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、ReferenceRelativeDir = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、step = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、stepflag = str_tab(index(count)+1:index(count+1)-1);count=count+1;GPS_Data_tmp、velocity = 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;GPS_Data_tmp、LatitudeDir = 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;GPS_Data_tmp、LongitudeDir = 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;GPS_Data_tmp、LocationState = str_tab(index(count)+1:index(count+1)-1);count=count+1;% other = str_tab(index(count)+1:end);% 进一步处理GPS_Data_tmp、Latitude、degree = Latitude(1:2); % 纬度GPS_Data_tmp、Latitude、min = Latitude(3:4);tmp = str2double(Latitude(6:9));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Latitude、sec = num2str(floor(tmp));GPS_Data_tmp、Latitude、millisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp、Longitude、degree = Longitude(1:3); % 经度GPS_Data_tmp、Longitude、min = Longitude(4:5);tmp = str2double(Longitude(7:10));tmp = tmp*6/1000; % tmp = tmp/10000*60;GPS_Data_tmp、Longitude、sec = num2str(floor(tmp));GPS_Data_tmp、Longitude、millisec = num2str((tmp-floor(tmp))*10000); GPS_Data_tmp、DATE、day = Date(1:2);GPS_Data_tmp、DATE、month = Date(3:4);GPS_Data_tmp、DATE、year = Date(5:6);end% 更新获取到的相关数据function GPS_Data = Updata_GPU_Data(GPS_Data,GPS_Data_tmp)% 用不到的数据可以注释掉if isfield(GPS_Data_tmp,'Time') == 1GPS_Data、Time、hour = GPS_Data_tmp、Time、hour;GPS_Data、Time、min = GPS_Data_tmp、Time、min;GPS_Data、Time、sec = GPS_Data_tmp、Time、sec;GPS_Data、Time、millisec = GPS_Data_tmp、Time、millisec;endif isfield(GPS_Data_tmp,'DATE') == 1GPS_Data、DATE、day = GPS_Data_tmp、DATE、day;GPS_Data、DATE、month = GPS_Data_tmp、DATE、month;GPS_Data、DATE、year = GPS_Data_tmp、DATE、year;endif isfield(GPS_Data_tmp,'Latitude') == 1GPS_Data、Latitude、degree = GPS_Data_tmp、Latitude、degree;GPS_Data、Latitude、min = GPS_Data_tmp、Latitude、min;GPS_Data、Latitude、sec = GPS_Data_tmp、Latitude、sec;GPS_Data、Latitude、millisec = GPS_Data_tmp、Latitude、millisec;endif isfield(GPS_Data_tmp,'LatitudeDir') == 1GPS_Data、LatitudeDir = GPS_Data_tmp、LatitudeDir;endif isfield(GPS_Data_tmp,'Longitude') == 1GPS_Data、Longitude、degree = GPS_Data_tmp、Longitude、degree; GPS_Data、Longitude、min = GPS_Data_tmp、Longitude、min;GPS_Data、Longitude、sec = GPS_Data_tmp、Longitude、sec;GPS_Data、Longitude、millisec = GPS_Data_tmp、Longitude、millisec; endif isfield(GPS_Data_tmp,'LongitudeDir') == 1GPS_Data、LongitudeDir = GPS_Data_tmp、LongitudeDir;endif isfield(GPS_Data_tmp,'GPSState') == 1GPS_Data、GPSState = GPS_Data_tmp、GPSState;endif isfield(GPS_Data_tmp,'SatelliteNum') == 1GPS_Data、SatelliteNum = GPS_Data_tmp、SatelliteNum; endif isfield(GPS_Data_tmp,'speed') == 1GPS_Data、speed = GPS_Data_tmp、speed;endif isfield(GPS_Data_tmp,'velocity') == 1GPS_Data、velocity = GPS_Data_tmp、velocity;endif isfield(GPS_Data_tmp,'LocationState') == 1GPS_Data、LocationState = GPS_Data_tmp、LocationState; endif isfield(GPS_Data_tmp,'altitude') == 1GPS_Data、altitude = GPS_Data_tmp、altitude;endif isfield(GPS_Data_tmp,'CurState') == 1GPS_Data、CurState = GPS_Data_tmp、CurState;endif isfield(GPS_Data_tmp,'LocationMode') == 1GPS_Data、LocationMode = GPS_Data_tmp、LocationMode; endif isfield(GPS_Data_tmp,'HDOP') == 1GPS_Data、HDOP = GPS_Data_tmp、HDOP;endif isfield(GPS_Data_tmp,'VDOP') == 1GPS_Data、VDOP = GPS_Data_tmp、VDOP;endif isfield(GPS_Data_tmp,'PDOP') == 1GPS_Data、PDOP = GPS_Data_tmp、PDOP;endif isfield(GPS_Data_tmp,'TrueDir') == 1GPS_Data、TrueDir = GPS_Data_tmp、TrueDir;endif isfield(GPS_Data_tmp,'MagneticAngle') == 1GPS_Data、MagneticAngle = GPS_Data_tmp、MagneticAngle;endif isfield(GPS_Data_tmp,'MagneticDir') == 1GPS_Data、MagneticDir = GPS_Data_tmp、MagneticDir;endif isfield(GPS_Data_tmp,'ReferenceTrueDir') == 1GPS_Data、ReferenceTrueDir = GPS_Data_tmp、ReferenceTrueDir;endif isfield(GPS_Data_tmp,'RelativeDir') == 1GPS_Data、RelativeDir = GPS_Data_tmp、RelativeDir;endif isfield(GPS_Data_tmp,'ReferenceRelativeDir') == 1GPS_Data、ReferenceRelativeDir = GPS_Data_tmp、ReferenceRelativeDir; endif isfield(GPS_Data_tmp,'step') == 1GPS_Data、step = GPS_Data_tmp、step;endif isfield(GPS_Data_tmp,'stepflag') == 1GPS_Data、stepflag = GPS_Data_tmp、stepflag;endif isfield(GPS_Data_tmp,'PRN') == 1GPS_Data、PRN = GPS_Data_tmp、PRN;endend% 显示相关GPS数据function show_GPS_Data(GPS_Data)DataAndTime = sprintf('20%02s-%02s-%02s %02s:%02s:%02s:%03s',、、、GPS_Data、DATE、year,GPS_Data、DATE、month,GPS_Data、DATE、day,、、、GPS_Data、Time、hour,GPS_Data、Time、min,GPS_Data、Time、sec,GPS_Data、Time、millisec);Location =sprintf(' %s:%02s°%02s′%03s″%04s,%s:%02s°%02s′%03s″%04s',、、、GPS_Data、LatitudeDir,GPS_Data、Latitude、degree,GPS_Data、Latitude、min,GPS_Data、Latitude、sec,GPS_Data、Latitude、millisec,、、、GPS_Data、LongitudeDir,GPS_Data、Longitude、degree,GPS_Data、Longitude、min,GPS_Data、Longitude、sec,GPS_Data、Longitude、millisec);% Others = sprintf('GPSState:%s,SatelliteNum:%02s,Speed:%03s,Velocity:%s,LocationState:%s',、、、% GPS_Data、GPSState,GPS_Data、SatelliteNum,GPS_Data、speed,GPS_Data、velocity,GPS_Data、LocationState);% show_Message_str(strcat(DataAndTime,Location,Others));show_Message_str(strcat(DataAndTime,Location));end% 初始化GPS数据结构体function GPS_Data = GPS_Init()GPS_Data、Time、hour = '0';GPS_Data、Time、min = '0';GPS_Data、Time、sec = '0';GPS_Data、Time、millisec = '0';GPS_Data、DATE、day = '29';GPS_Data、DATE、month = '8';GPS_Data、DATE、year = '18';GPS_Data、Latitude、degree = '0'; % 纬度GPS_Data、Latitude、min = '0';GPS_Data、Latitude、sec = '0';GPS_Data、Latitude、millisec = '0';GPS_Data、LatitudeDir = 'N';GPS_Data、Longitude、degree = '0'; % 经度GPS_Data、Longitude、min = '0';GPS_Data、Longitude、sec = '0';GPS_Data、Longitude、millisec = '0';GPS_Data、LongitudeDir = 'E';GPS_Data、GPSState = '0'; % GPS状态,0:未定位;1:无差分定位;2:带差分定位;3:无效GPS;6:正在估算GPS_Data、SatelliteNum = '0'; % 可用卫星数目GPS_Data、speed = '0';GPS_Data、velocity = '0';GPS_Data、LocationState = 'V';GPS_Data、altitude = '0'; % 海拔高度GPS_Data、CurState = '1'; % 当前状态,1:无定位信息;2:2D;3:3DGPS_Data、LocationMode = 'A'; % 定位模式,'A':自动,'M':手动GPS_Data、HDOP = '0、5'; % 水平精度因子GPS_Data、VDOP = '0、5'; % 垂直精度因子GPS_Data、PDOP = '0、5'; % 综合位置精度因子GPS_Data、TrueDir = '0'; % 方位角GPS_Data、MagneticAngle = '0'; % 磁偏角GPS_Data、MagneticDir = 'E'; % 磁偏角参考方向,E/W(东西经)GPS_Data、ReferenceTrueDir = 'T'; % 真实方向的参考方向,T:正北参照系 GPS_Data、RelativeDir = '0'; % 相对方向GPS_Data、ReferenceRelativeDir = 'M'; % M:磁北参照系GPS_Data、step = '0'; % 步长GPS_Data、stepflag = 'N';GPS_Data、PRN = '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。

GPS软件接收机的CMatlab实现

GPS软件接收机的CMatlab实现
天线 硬 件 RF降频至IF A/ D转换 信号采集 和传输 软 件
用户接
图1.2 GPS软件接收机原理图 Fig 1.2 A fundamental GPS software receiver
1 .2
GPS 软件接收机的研究意义
GPS软件接收机产生的背景主要有: 1. 未来将可能出现的新的基于卫星的导航系统。例如,欧洲的加利略计划 (Galileo Project),日本的QZSS计划(QZSS Project)。 2. 更多的研究重点将会集中在接收机的信号处理算法上。
保密□,在 本学位论文属于 不保密□。 (请在以上方框内打“√” )
年解密后适用本授权书。
学位论文作者签名:鲍雍荣
指导教师签名:陈佳品
日期: 2007 年 1 月 20 日
日期:2007
年 1 月 20 日
第一章 绪论
上海交通大学硕士学位论文
第一章 绪论
GPS 系统是由美国国防部的陆海空三军在 70 年代联合研制的新型卫星导航 系统,它的英文名称是“Navigation Satellite Timing And Ranging / Global Positioning System”,其意为“卫星测时测距导航全球定位系统”,简称 GPS 系统。该系统是以卫星为基础的无线电导航定位系统,具有全能性(陆地海洋航 空和航天)、全球性、全天候连续性和实时性的导航定位和定时的功能,能为各 类用户提供精密的三维坐标、速度和时间。 GPS 系统由三部分组成,GPS 空间部分、地基监控站和 GPS 用户接收机部分, 如图 1.1 所示。
1
第一章 绪论
上海交通大学硕士学位论文
地基监控站:地基监控站由分布在全球的一个主控站,三个注入站和五个监 测站组成。 GPS 用户接收机部分:GPS 接收机可以捕获到按一定卫星高度截止角所选择 的待测卫星的信号,并跟踪这些卫星的运行,对所接收到的 GPS 信号进行变换、 放大和处理,以便测量出 GPS 信号从卫星到接收机天线的传播时间,解译出 GPS 卫星所发送的导航电文,实时地计算出测站的三维位置,甚至三维速度和时间。

用MATLAB计算GPS卫星位置-最新文档资料

用MATLAB计算GPS卫星位置-最新文档资料

用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),记录的是地球同步卫星的导航电文。

如何使用MATLAB进行地理数据处理和分析

如何使用MATLAB进行地理数据处理和分析

如何使用MATLAB进行地理数据处理和分析引言:地理数据处理和分析是地理学研究的核心部分。

随着计算机技术的迅速发展和数据采集的普及,地理数据处理和分析的工具也在不断地演进。

其中,MATLAB作为一种强大的数值计算和数据可视化的工具,在地理数据处理和分析中发挥了重要的作用。

本文将介绍如何使用MATLAB进行地理数据处理和分析的基本方法和技巧。

一、数据获取和处理1. 数据获取地理数据的获取可以通过多种途径,如传感器采集、卫星遥感、无人机摄影等。

这些数据在获取后需要进行预处理,将其转换为MATLAB可以处理的格式。

通常情况下,地理数据是以栅格图像或矢量数据的形式存在的,可以通过MATLAB支持的地理信息系统工具箱进行读取和处理。

2. 数据导入和转换在将地理数据导入到MATLAB中进行处理之前,需要先将数据转换为MATLAB所支持的格式,如栅格图像可以转换为矩阵,矢量数据可以转换为表格。

这可以通过使用MATLAB的相关函数和工具箱实现,比如Matlab自带的函数imread可以将图像数据导入到MATLAB中。

3. 数据质量控制和清洗地理数据通常会存在一些质量问题,如噪声、无效值等。

在进行数据分析前,需要对数据进行质量控制和清洗。

MATLAB提供了一系列的函数和工具箱,可以帮助我们实现数据清洗,如detectOutliers函数可以用于检测异常值,filter函数可以用于滤波等。

二、数据可视化地理数据通常具有空间分布的特点,因此,对地理数据进行可视化是非常重要的。

在MATLAB中,可以使用各种绘图函数和工具箱进行地理数据的可视化,如plot函数可以绘制二维地理数据的曲线图,scatter函数可以绘制地理数据的散点图,geoshow函数可以绘制地理数据的地图等。

1. 二维数据可视化对于二维地理数据,可以使用MATLAB的绘图函数plot进行可视化。

比如,可以使用plot函数绘制气温随时间变化的曲线图,从而分析气温的变化趋势。

利用Matlab进行轨迹分析和运动跟踪的技术

利用Matlab进行轨迹分析和运动跟踪的技术

利用Matlab进行轨迹分析和运动跟踪的技术引言Matlab是一种强大的科学计算软件,不仅在工程、数学等领域广泛应用,而且在轨迹分析和运动跟踪方面也具有很高的实用性。

本文将介绍利用Matlab进行轨迹分析和运动跟踪的技术,包括轨迹数据处理、运动模式分析、运动参数提取等内容。

一、轨迹数据处理轨迹数据是进行轨迹分析和运动跟踪的基础。

常见的轨迹数据来源包括GPS定位、摄像头监控等。

在Matlab中,可以通过导入轨迹数据文件的方式获取数据。

常见的轨迹数据文件格式包括txt、csv等。

在导入轨迹数据后,需要对数据进行预处理。

预处理的目的是去除噪声、填补缺失值等。

Matlab提供了丰富的数据处理函数,可以实现轨迹数据的滤波、插值等操作。

例如,可以使用平滑滤波函数smooth对轨迹数据进行平滑处理,提高数据的质量。

二、运动模式分析运动模式是指轨迹数据中反映的不同运动行为。

通过对运动模式的分析,可以研究物体的运动规律、判断异常行为等。

在Matlab中,可以通过聚类算法来实现运动模式的分析。

常见的聚类算法包括K-means算法、DBSCAN算法等。

K-means算法是一种常用的聚类算法,可以将数据分为不同的簇。

在轨迹分析中,可以将轨迹数据的坐标信息作为输入,利用K-means算法将轨迹数据聚类成不同的运动模式。

通过运动模式分析,我们可以获得物体在不同时间段的运动模式信息。

这些信息可以帮助我们了解物体的运动规律、预测运动趋势等。

三、运动参数提取除了运动模式,我们还可以从轨迹数据中提取出一些运动参数。

这些运动参数可以用于进一步分析和研究。

在Matlab中,可以利用轨迹数据的速度、加速度等信息,计算并提取出各种运动参数。

例如,可以通过对轨迹数据进行微分操作,得到速度信息。

速度是描述物体运动快慢的重要指标,可以用于分析物体的加速度变化、运动稳定性等。

此外,还可以通过对速度数据进行积分操作,得到位移信息。

位移是描述物体运动位置变化的指标,可以用于分析运动轨迹的长度、曲率等。

MATLAB解析GPS数据程序

MATLAB解析GPS数据程序

% 注:本程序可直接在MATLAB 2017a 中运行%该脚本文件用于学习GPS数据的读取,需要做其他用途请自行修改代码%本脚本文件的前面几行代码是要设置的一些参数%默认使用COM3(需视情况修改)%波特率设为GPS模块默认的38400%下面为程序源码clearnum_execute = 100; % 执行次数num_SingleRead = 150; %单次从串口读取的字节数(最好设置足够大(最低大概设为80),保证单次读取的数据包含一条完整的GPS数据)Timedelay = 0.2; % 用于延时读取串口数据BaudRate = 38400; % 读取数据的波特率Terminator = 'CR';num_MaxTry = 5; %打开串口的最多尝试次数BytesAvailableFcnCount = 1000;%% 设置参数% delete(instrfindall); % 串口打开失败时使用此句% delete(s);clear s % 串口打开失败时使用此句serial3 = serial('COM3’);% 串口设置serial3。

BytesAva ilableFcnMode = 'byte’;% serial3。

InputBufferSize = 38400;%输出波特率serial3。

BaudRate = BaudRate;%读入波特率% serial3。

OutputBufferSize = 1024;serial3.BytesAvailableFcnCount = BytesAvailableFcnCount;serial3.ReadAsyncMode = ’continuous’;serial3。

Terminator = Terminator;%% 打开串口count_opentimes = 1;while contains(serial3。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档