单点定位程序说明(优选.)
- 格式:doc
- 大小:118.00 KB
- 文档页数:4
GPS 单点定位程序流程、计算流程读取RINEX O 文件,读取一个历元观测值epoch数据预处理根据epoch 中的卫星号和历元时刻T R 在ephlst 查找相应的卫星星历, 准则 T R TOE 3600.0S 。
对论改正;d )对卫星位置X Si T Si进行地球自转改正,得到e )根据X W i T Si 和测站概略位置X r 计算卫星和测站的几何距离 R Sf )根据几何距离R Si求信号传播时间1SR S/c 。
1、读取RINEX N 文件,将所有星历放到一个列表(数组) ep hist 中。
2、 3、 4、 程序初始化, 置测站概略位置为 X r ,接收机钟差初值dt r 。
X OX r cdt r OXO YO第一次迭代,取X O ZOcdt5、选择epoch 中一颗卫星S i 观测值,设其伪距为S& 计算卫星S i 的信号发射的概略时刻T s方法如下: a )卫星S i 的信号传播时间:SS iO/c dt r dt Si ;dt Si 为卫星钟差,需要进行相b )卫星S i 的信号发射时刻: T ST RS iOc )卫星S i 在T Si 时刻的位置 X ST SiX SYZ SiTTSiT S ;17、 8、 10、 11、 12、g )如果107,则退出迭代。
T ,Sih )否则S 1Si,回带到b )进行迭代。
求卫星s 方向余弦b Si^R ^,b 1SY Y S求卫星s 在观测方程式中的余数项:其中:T RlSiSiR Si c dt Sid trop Si——卫星S 的伪距观测值; 卫星S i 到测站的几何距离; —以米表示的卫星S i 的钟差; 对流层延迟改正量,单位米,用简化的R Si — c dt Sdtro pd iono - D RTCM1S即为卫星信号发射时刻。
Z Z S,b 3S 1d iono D R TCMhop field 模型计算;电离层延迟改正量,单位米,采用无电离层伪距组合观测值时,此项为 —对伪距的差分改正值,此处为 0;选择epoch 中下一颗卫星S j 观测值,设其伪距为 重复第6—9步,计算每颗卫星的系数和余数项 将所有卫星的系数组成误差方程, x,y,z,cdt rS j为未知参数进行求解,形式应该是:AX Li 0,1,L 0;b20b: MbjTx y z cdtl S 0 l S 1 LlS i,svnum求解法方程刃 A TPA 1 A TPL,求出定位结果13、14、15、16、XYX i ZcdtrX0Y0Z0Cdt r0xxcdt与X o进行比较,判断位置差值,a)如果各分量差值>0.001m,则令X ob)若小于则退出迭代。
绝对单点定位的计算流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!绝对单点定位的计算流程一、准备工作阶段。
在进行绝对单点定位计算之前,需做好充分准备。
GPS原理与应用实验题目:GPS单点定位专业:测绘工程班级:12-01学号:2012212600姓名:王威指导教师:陶庭叶时间:2014.11目录一、实验目的 (3)二、实验原理 (3)三、实验内容 (3)四、实验效果图 (9)五、实验总结 (9)一.实验目的1.深入了解单点定位的计算过程;2.加强单点定位基本公式和误差方程式,法线方程式的记忆;3.通过上机调试程序加强动手能力的培养。
二.实验原理一个接收机接受三个火三个以上卫星信号,得出卫星坐标和伪距,利用间接平差计算接收机的坐标。
三.实验内容1.程序流程图2、实验数据3、实验程序代码Private Sub Command1_Click()CommonDialog1.Filter = "TXT files|*.txt|" CommonDialog1.FilterIndex = 1CommonDialog1.ShowOpenOpen monDialog1.FileName For Input As #1 Do While Not EOF(1)Line Input #1, Texttextbuff = textbuff + Text + vbCrLfLoopClose #1kk = MSFlexGrid1.Rows - 1Dim aReDim a(kk - 1)a = Split(textbuff, vbCrLf)For j = 1 To kkMSFlexGrid1.TextMatrix(j, i) = a(j - 1 + 5 * (i - 1)) Next iNext jFor k = 1 To kkMSFlexGrid1.TextMatrix(k, 0) = "第" & k & "个点" Next kMSFlexGrid1.TextMatrix(0, 1) = "X"MSFlexGrid1.TextMatrix(0, 2) = "Y"MSFlexGrid1.TextMatrix(0, 3) = "Z"MSFlexGrid1.TextMatrix(0, 4) = "伪距" MSFlexGrid1.TextMatrix(0, 5) = "钟差"End SubPrivate Sub Command2_Click()kk = MSFlexGrid1.Rows - 1X0 = 0: Y0 = 0: Z0 = 0c = 299792458Dim a()ReDim a(kk - 1, 3)Dim ll()ReDim ll(kk - 1, 0)For i = 1 To kkl = (MSFlexGrid1.TextMatrix(i, 1) - X0) / Sqr((MSFlexGrid1.TextMatrix(i, 1) - X0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 2) - Y0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 3) - Z0) ^ 2)m = (MSFlexGrid1.TextMatrix(i, 2) - Y0) / Sqr((MSFlexGrid1.TextMatrix(i, 1) - X0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 2) - Y0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 3) - Z0) ^ 2)n = (MSFlexGrid1.TextMatrix(i, 3) - Z0) / Sqr((MSFlexGrid1.TextMatrix(i, 1) - X0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 2) - Y0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 3) - Z0) ^ 2)a(i - 1, 0) = la(i - 1, 1) = ma(i - 1, 2) = na(i - 1, 3) = -1lk = MSFlexGrid1.TextMatrix(i, 4) - Sqr((MSFlexGrid1.TextMatrix(i, 1) - X0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 2) - Y0) ^ 2 + (MSFlexGrid1.TextMatrix(i, 3) - Z0) ^ 2) + c * MSFlexGrid1.TextMatrix(i, 5)ll(i - 1, 0) = lkNext igzs = xc(qiuni(xc(zz(a), a)), xc(zz(a), ll))X0 = X0 - gzs(0, 0)Y0 = Y0 - gzs(1, 0)Z0 = Z0 - gzs(2, 0)j = j + 1Next iiText2.Text = "X=" & X0 & vbCrLf & vbCrLf & "Y=" & Y0 & vbCrLf & vbCrLf & "Z=" & Z0V = jian(ll, xc(a, gzs))zjl = xc(zz(V), V)σ0 = Sqr(zjl(0, 0)) / (kk - 3)Qx = qiuni(xc(zz(a), a))Text3.Text = "σX=" & σ0 * Sqr(Qx(0, 0)) & vbCrLf & vbCrLf & "σY=" & σ0 * Sqr(Qx(1, 1)) & vbCrLf & vbCrLf & "σZ=" & σ0 * Sqr(Qx(2, 2))End SubPrivate Sub Form_Load()MSFlexGrid1.ColWidth(1) = 1300MSFlexGrid1.ColWidth(2) = 1300MSFlexGrid1.ColWidth(3) = 1300MSFlexGrid1.ColWidth(4) = 1300Text2.Text = ""Text3.Text = ""End SubPublic Function jian(m, n)Dim i, j As IntegerIf UBound(m, 1) <> UBound(n, 1) Or UBound(m, 2) <> UBound(n, 2) Then MsgBox ("请确认输入数组是否可以相减!")ElseDim c()ReDim c(UBound(m, 1), UBound(n, 2))For i = 0 To UBound(c, 1)For j = 0 To UBound(c, 2)c(i, j) = m(i, j) - n(i, j)Next jNext ijian = cEnd IfEnd Function'矩阵的转置Public Function zz(a)Dim i As Integer, j As Integer, t As Integer, b()If UBound(a, 1) = UBound(a, 2) ThenFor i = 0 To UBound(a, 1)For j = 0 To UBound(a, 2)t = a(i, j)a(i, j) = a(j, i)a(j, i) = tEnd IfNext jNext izz = aElseReDim b(UBound(a, 2), UBound(a, 1))For i = 0 To UBound(a, 2)For j = 0 To UBound(a, 1)b(i, j) = a(j, i)Next jNext izz = bEnd IfEnd Function'两矩阵相乘Public Function xc(a, b)Dim i As Integer, j As Integer, k As Integer If UBound(a, 2) <> UBound(b, 1) ThenMsgBox ("这两个矩阵不能够相乘") Exit FunctionEnd IfReDim sd(UBound(a, 1), UBound(b, 2)) For i = 0 To UBound(a, 1)For j = 0 To UBound(b, 2)For k = 0 To UBound(b, 1)sd(i, j) = sd(i, j) + a(i, k) * b(k, j)Next kNext jNext ixc = sdEnd FunctionPublic Function qiuni(a)Dim c, m%, n%, p#, l%, i%, j%, ab#m = UBound(a, 1)n = UBound(a, 2)If m <> n ThenMsgBox ("该矩阵不可逆!!!")Exit FunctionEnd IfReDim c(m, 2 * n + 1)For i = 0 To mFor j = 0 To nc(i, j) = a(i, j)Next jNext iFor i = 0 To mFor j = m + 1 To 2 * m + 1 c(i, j) = 0Next jNext ii = 0For j = m + 1 To 2 * m + 1 c(i, j) = 1i = i + 1Next jFor k = 0 To nIf c(k, k) = 0 ThenFor i = k + 1 To nIf c(i, k) <> 0 ThenGoTo thisEnd IfNext iIf i = n + 1 ThenMsgBox ("该矩阵不可逆!!!") Exit FunctionEnd Ifthis:For j = 0 To 2 * m + 1p = c(k, j)c(k, j) = c(i, j)c(i, j) = pNext jEnd Ifab = 1# / c(k, k)For j = 0 To 2 * m + 1c(k, j) = c(k, j) * abNext jFor i = 0 To nIf i <> k ThenFor j = 0 To 2 * m + 1If j <> k Thenc(i, j) = c(i, j) - c(i, k) * c(k, j)End IfNext jc(i, k) = 0End IfNext iNext kFor i = 0 To mFor j = 0 To ma(i, j) = c(i, j + n + 1) a(i, j) = Round(a(i, j), 4) Next jNext iqiuni = aEnd Function四.实验结果图五.实验总结此次实验让我深入了解单点定位的计算过程,加强了对单点定位基本公式和误差方程式,法线方程式的记忆。
RTKLIB源码解析(⼀)——单点定位(pntpos.c)RTKLIB源码解析(⼀)——单点定位(pntpos.c)标签: GNSS RTKLIB 单点定位前段时间⼀直忙着写毕业论⽂,所以也没有太多时间来阅读 RTKLIB源码,最近好⽍把 pntpos中的相关代码看了⼀遍,知道了 RTKLIB是如何实现单点伪距定位的。
这⾥把每⼀个函数都做成了⼩卡⽚的形式,每个函数⼤都包含函数签名、所在⽂件、功能说明、参数说明、处理过程、注意事项和我的疑惑这⼏个部分,介绍了阅读代码时我⾃⼰的看法和疑惑。
所以希望诸位看官能帮忙解答我的疑惑,与我交流,也希望能帮助后来也有需要阅读 RTKLIB源码的⼈,给他们多提供⼀份思路。
总⽽⾔之,既为⼈,也为⼰。
这份⽂档是使⽤ Cmd Markdown完成的,在作业部落上其格式显式的⾮常完整,但是在博客园中⽬录、代码块和流程图似乎都没有显⽰出来,所以这⾥也贴上本⽂在作业部落上的链接,对格式“零容忍”的同学请移步那⾥。
⽬录pntposint pntpos (const obsd_t *obs, int n, const nav_t *nav, const prcopt_t *opt, sol_t *sol,double *azel, ssat_t *ssat, char *msg)所在⽂件:pntpos.c功能说明:依靠多普勒频移测量值和伪距来进⾏单点定位,给出接收机的位置、速度和钟差参数说明:函数参数,8个:obsd_t *obs I observation dataint n I number of observation datanav_t *nav I navigation dataprcopt_t *opt I processing optionssol_t *sol IO solutiondouble *azel IO azimuth/elevation angle (rad) (NULL: no output)ssat_t *ssat IO satellite status (NULL: no output)char *msg O error message for error exit返回类型:int O (1:ok,0:error)调⽤关系:如⽆特别说明,本⽂所出现的流程图中,纵向代表时间上的先后调⽤顺序,横向代表层次上的逐级调⽤顺序。
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);。
单点定位设备小博士使用流程
一、翻页键:
1按动此键将循环显示各个主页面2从某种操作中退出到主页面电源键:
1持续按住此键将开机或关机。
2短时间按下此键将打开或关闭背景光。
二、上下键:
1在各页面或菜单中,上下移动光标。
2在卫星状态页面中,调节屏幕显示对比度
3在航迹导航页面中,放大或缩小比例尺。
4在罗盘导航页面中,查看各种数据。
输入键:
1激活光标所在选项。
2确认菜单选项。
3在可以进行输入操作的地方输入数据。
ATTENTION:etrex(小博士)被设计为左手握机并操作,但用右手也可以很好地握机和操作,这取决于您的个人习惯。
将接收机拿到室外开阔的地点,显示屏向使其内置天线朝向开阔的天空。
按住电源您将看到欢迎画面,随后进入“卫星状态ATTENTION:当您第一次使用该设备时,置,以后将只需要15-45秒时间来定位。
当足够的卫星被锁定时,页面顶部的窗口航”,如果您的“小博士”无法接收到足够如您正在室内或者当前的GPS卫星信号很好。
GPS单点定位算法及实现GPS单点定位算法是通过接收来自卫星的信号,通过计算接收信号到达时间差以及接收信号强度等信息,确定自身的位置坐标。
常见的GPS单点定位算法包括最小二乘法定位算法、加权最小二乘法定位算法、无拓扑算法等。
最小二乘法定位算法是一种基本的GPS定位算法,通过最小化测量误差的平方和,求得位置坐标最优解。
该算法假设接收器没有任何误差,并且卫星几何结构是已知的。
具体实现步骤如下:1.收集卫星信息:获取可见卫星的位置和信号强度信息。
2.数据预处理:对接收信号进行滤波和数据处理,例如去除离群点、噪声滤除等。
3.卫星定位计算:根据接收器和可见卫星之间的距离和相对几何关系,计算每颗卫星与接收器之间的距离。
4.平面定位计算:根据卫星位置和距离信息,使用最小二乘法求取接收器的经度和纬度。
5.高度定位计算:根据卫星位置和距离信息,使用最小二乘法或其他方法求取接收器的高度。
加权最小二乘法定位算法在最小二乘法定位算法的基础上加入对测量数据的加权处理,以提高定位精度。
加权最小二乘法定位算法的实现步骤与最小二乘法定位算法类似,只是在卫星定位计算和平面定位计算中,对每个测量值进行加权处理。
无拓扑算法是一种基于统计的定位算法,不需要事先知道接收器和卫星的几何关系,而是通过分析多个卫星的信息来确定接收器的位置。
其实现步骤如下:1.收集卫星信息:获取可见卫星的位置和信号强度信息。
2.数据预处理:对接收信号进行滤波和数据处理,例如去除离群点、噪声滤除等。
3.卫星选择:选择可见卫星中信号强度最强的几颗卫星。
4.定位计算:根据已选择的卫星信息,使用统计模型或其他算法计算接收器的位置。
1.数据采集与处理:获取和处理接收信号、卫星信息和测量数据,对数据进行有效的滤波和预处理。
2.算法选择与优化:根据定位精度和计算效率的要求,选择合适的算法,并进行算法优化和参数调整。
3.数据处理与结果可视化:对定位结果进行处理和分析,可通过地图等方式可视化结果,以便用户更直观地了解定位情况。
GPS 单点定位程序流程、计算流程读取RINEX N 文件,将所有星历放到一个列表(数组) ephlst 中。
数据预处理根据epoch 中的卫星号和历元时刻T R 在ephlst 查找相应的卫星星历,1、 2、 读取RINEX 以件,读取一个历元观测值epoch3、 4、 准则T R TOE3600.0s 。
程序初始化,置测站概略位置为X r ,接收机钟差初值dt r 。
X oX 0 X YdtZ 第一次迭代,取X 。
o cdt r 00 05、选择epoch 中一颗卫星S i 观测值,设其伪距为 S6、计算卫星§的信号发射的概略时刻T*方法如下:a )卫星S i 的信号传播时间:0S Si / c dt r dt Si ;dt Si 为卫星钟差,需要进行相对论改正;b )卫星S i 的信号发射时刻:T S T RSi;c )卫星S i在T Si 时刻的位置X ST SiX SY SiZ Sid )对卫星位置X Si T Si 进行地球自转改正,得到Xje )根据X W i T Si 和测站概略位置X r 计算卫星和测站的几何距离 R Sf )根据几何距离R Si 求信号传播时间IS R S /cg ) 如果/ o S 10 7,则退出迭代。
T 1SiT R :即为卫星信号发射时刻h )否则0siSi,回带到b )进行迭代。
7、 求卫星§方向余弦V V siVW S77Ss入入 I S 丫丫 sZZ s At o'S —,b iS ,炬’S,b ; 1R iR S R S8、 求卫星S 在观测方程式中的余数项:其中:Si ——卫星S j 的伪距观测值;R Si ——卫星S 到测站的几何距离;c dt S 以米表示的卫星S i 的钟差;d trop ——对流层延迟改正量,单位米,用简化的hopfield 模型计算;diono ——电离层延迟改正量,单位米,采用无电离层伪距组合观测值时,此项为 0;D RTCM ——对伪距的差分改正值,此处为 0;10、 重复第6— 9步,计算每颗卫星的系数和余数项11、 将所有卫星的系数组成误差方程,以x,y,z,cdt r为未知参数进行求解,形式应该是:AX Lb S 0 t 1So 玻。
GPS单点定位程序文档说明一程序说明本程序的基本功能是利用测站接收机获取的观测文件(O文件),结合相应历元下的卫星导航文件(N文件)来计算测站点在WGS-84坐标系下的坐标。
所用编程语言为C++,编程环境为VC++6.0。
二单历元卫星坐标计算流程图三程序设计流程图四程序模块说明(一)对类的说明1.PointPosition类double GetDelta_t(CommonTime Toe,CommonTime Toc);用于计算两个历元时刻的时间间隔CoorCartesian ComputeSatCoor(double Tk,OneNavData oneNaveData);利用导航数据计算卫星坐标Bool GetPreciseSatCoor(CommonTimeObsTime,CoorCartesian&Sitecoor , CoorCartesian &Satcoor,OneNavData oneNavData,double SatClkBais);通过迭代得到新号发送时刻的卫星坐标double ComputeSatClkBias(double SendTime_Tk,OneNavData oneNavData);计算卫星的钟差改正Factor ComputeFactors(CoorCartesian &Sitecoor, CoorCartesian &Satcoor, double &satClkBias,double &Tr, double TropDelay, double ionDelay, double p1);计算组建法方程需要的各个元素double ComputeTropDelay(CoorCartesian SatCoor,CoorCartesian SitCoor);计算对流层误差double ComputeIonDelay(const double L1,const double L2);计算电离层误差2.ReadObsData类ReadObsFile(const string& FileName);ObsFileHeader ReadObsHeader(const string &FileName);读取观测文件的头文件部分EntirObsData ReadObsData(const string &FileName);读取观测文件的数据部分3.ReadNavData类NavFileHeader ReadNavHeader(const string &FileName);读取导航文件的头文件部分AllNavData ReadNavData(const string &FileName);读取导航文件的数据部分OneNavData SelectEpochNavData(AllNavData allNavData,string SatPrn,CommonTime ObsTime)查找并获取要计算的观测历元下的导航数据(二)程序模块的连接关系1.分别用文件流打开相应的观测数据文件和星历文件;2.调用ReadObsFile.ReadObsHeader()读取观测文件头文件;3.调用ReadObsFile.ReadObsData()按照观测历元读取观测数据;4调用ReadNavFile.ReadNavHeader()读取导航文件的头文件部分;5调用ReadNavFile.ReadNavData()读取导航文件的数据部分;6 利用循环并调用ReadNavFile.SelectEpochNavData()获取观测历元的导航数据7 调用puteSatCoor()计算卫星坐标8利用puteFactor()计算法方程的各个元素9迭代得到结果。
卫星导航定位算法与程序设计_单点定位程序流程单点定位是卫星导航中最基本的应用,其基本思路是通过接收多颗卫星发送的信号,计算出接收点的位置。
下面是单点定位的程序流程,包括信号接收、时间同步、伪距测量、卫星位置计算和接收点位置计算等过程。
1.信号接收首先,需要接收卫星发送的信号。
接收设备通常包括天线、前端放大器和接收机等部分。
天线用于接收来自卫星的信号,并将其转化为电信号。
前端放大器用于增强信号的强度。
接收机用于解调信号,并转化为数字信号。
2.时间同步接收到的信号包含了卫星发射时的时间信息。
根据信号传播的速度,可以计算信号传播的时间,从而获取卫星发送信号的时刻。
由于信号传播时间非常短(大约为纳秒级别),所以需要高精度的时钟和时间同步技术来确保准确性。
3.伪距测量根据接收到的时间信息,可以计算接收点到卫星的距离,称为伪距。
计算伪距需要考虑信号传播的时间以及信号在大气中的传播速度变化等因素。
此外,由于信号在传播过程中会受到噪声、多径效应等干扰,需要进行滤波和信号处理等技术来提高测量的准确性。
4.卫星位置计算卫星的位置信息是通过星历数据进行描述的。
星历数据包含了卫星的轨道参数、时刻信息等。
根据接收到的伪距数据,可以通过解算的方法计算出卫星的位置。
解算的方法有很多种,常用的有最小二乘法、扩展卡尔曼滤波等。
通过解算,可以得到每颗卫星的位置坐标。
5.接收点位置计算根据接收到多颗卫星的位置信息和伪距数据,可以通过三角测量的方法计算出接收点的位置坐标。
三角测量的原理是利用多个已知位置的点,通过测量到这些点的距离,计算出目标点的位置。
根据接收点到不同卫星的伪距数据,可以得到多个方程,通过求解这些方程可以计算出接收点的坐标。
6.坐标转换和精度提高计算出接收点的坐标后,可以进行坐标转换,将其转化为地理坐标或其他坐标系。
此外,由于测量误差和卫星位置误差等因素,单点定位的精度一般较低。
为了提高精度,可以采用差分定位、精密定位等方法。
静态精密单点定位使用指南
第一步:先连接天线,再连接电源,连接串口线。
第二步:打开GPS数据采集软件。
打开之后将会弹出界面,如下图所示:
第三步:选择串口号。
在“配置”组合框中单击“串口号”右边的下拉按钮,并在下拉表框里选择与连接串口线时对应的串口号。
以“COM1”为例,如下图所示:
第四步:选择波特率。
请单击“波特率”右边的下拉按钮,并在下拉列表框里选择波特率。
以“9600”为例,如下图所示:
第五步:选择GPS类型。
请单击“波特率”右边的下拉按钮,并在下拉列表框里选择GPS 类型。
以“NovAtelEMV-3”为例,如下图所示:
第六步:选择采样周期。
请单击“采样周期”右边的下拉按钮,并在下拉列表框里选择采样周期。
以“0.2”为例,如下图所示。
第七步:选择采集的数据文件路径。
默认下的文件路路径为:“c: \ test \”。
也可以单击“文件路径”右边的“浏览”按钮。
然后在列表中选择采集的数据文件路径。
如下图所示:
第八步:文件路径设置结束之后,单击“开始接受”按钮,程序开始运行,采集数据。
如下图所示:。
科技与创新┃Science and Technology&Innovation ·52·2021年第07期文章编号:2095-6835(2021)07-0052-02GNSS单点定位的程序实现及分析冯鹏睿,徐泮林,高明超(山东科技大学测绘科学与工程学院,山东青岛266590)摘要:在全球卫星导航系统(GNSS)数据处理领域,伪距单点定位是经常涉及的问题,并广泛应用于实时位置导航、提供RTK实时卫星位置及钟差等场合。
基于Microsoft Visual studio编程环境,自主开发了具有单点定位基本功能的程序算法,该程序可以计算观测时段内任意时刻的卫星瞬时坐标,可根据精度强弱度(PDOP)值对参与单点定位的卫星进行预处理,获取尽可能准确的批历元或某特定历元的单点定位坐标,并验证了问题解决的正确性和程序编写的合理性。
关键词:GNSS;单点定位;广播星历;程序实现中图分类号:P228.4文献标志码:A DOI:10.15913/ki.kjycx.2021.07.0171引言全球定位系统(GPS)为GNSS最具代表性的部分,很多国内外学者都专注于此领域的研究,伪距单点定位技术发展已经相当成熟。
但查阅已发表的文献发现,伪距单点定位程序的编写在相当多的文献中仅是一笔带过,许多文献都并未对程序进行详细的解读,这给学习GPS编程中遇到问题的读者带来了很大的困扰,需要额外浪费大量的研究时间去摸索程序的编写。
因此,自主开发改进程序设计,实现GPS 单点定位的各项功能显得尤为重要。
2GPS定位的时间系统和坐标系统2.1GPS时间系统GPS时是全球定位系统GPS使用的一种时间系统。
它是由GPS的地面监控系统和GPS卫星中的原子钟建立、维持的一种原子时,其起点为1980-01-06T00:00:00。
在起始时刻,GPS时与UTC对齐,这两种时间系统所给出的时间是相同的。
由于UTC存在跳秒,经过一段时间后,这两种时间系统中就会相差n个整秒,n是这段时间内UTC的积累跳秒数,随时间的变化而变化。
GPS单点定位的原理与方法GPS单点定位的原理和方法GPS单点定位是指在协议地球坐标系中直接确定观测站相对于坐标原点(地球质心)绝对坐标的一种方法。
它的基本原理是以GPS卫星和用户接收机天线之间的距离(或距离差)观测量为基础,根据已知的卫星瞬时坐标来确定接收机天线所对应的点位,即观测站的位置。
绝对定位和相对定位在观测方式、数据处理、定位精度以及应用范围等方面均有原则区别。
GPS采用单程测距原理,实际观测的站星距离均含有卫星钟和接收机钟同步差的影响(伪距)。
卫星钟差可根据导航电文中给出的有关钟差参数加以修正,而接收机的钟差一般难以预料。
通常将其作为一个未知参数,在数据处理中与观测站坐标一并求解。
一个观测站实时求解4个未知数,至少需要4个同步伪距观测值,即4颗卫星。
绝对定位可根据天线所处的状态分为动态绝对定位和静态绝对定位。
无论动态还是静态,所依据的观测量都是所测的站星伪距。
根据观测量的性质,伪距有测码伪距和测相伪距,绝对定位相应分为测码伪距绝对定位和测相伪距绝对定位。
动态绝对定位中,测码伪距动态绝对定位法是当仅观测4颗卫星时,解算是唯一的。
如果同步观测的卫星数nj大于4颗时,则需利用最小二乘法平差求解。
而利用测相伪距进行动态定位一般无法实时求解,因为获得动态实时解的关键在于能否预先或在运动中可靠地确定载波相位观测值的整周未知数。
因此,实时动态定位中主要采用测码伪距为观测量的方法。
静态绝对定位时,观测站是固定的,可以于不同历元同步观测不同卫星,取得充分多的伪距观测量,通过最小二乘平差提高定位精度。
但如果观测的时间较长,接收机钟差的变化往往不能忽略。
同样,测相伪距静态绝对定位也存在一些问题。
在进行静态绝对定位时,我们需要应用测相伪距法。
由于存在整周不确定性,为了获得更为准确的定位结果,我们需要进行至少3个不同历元对4颗相同卫星的同步观测。
测相伪距观测量精度高,因此可以获得较高的定位精度。
但是,卫星轨道误差和大气折射误差等因素仍会影响定位精度。
xxxx集团单点登录技术方案目录1. xxxx集团系统建设现状 (3)1.1. Web应用系统 (3)1.2. C/S应用系统 (4)1.3. SSL VPN系统 (4)2. xxxx集团单点登录系统需求 (5)2.1. 一站式登录需求 (5)3. SSO(单点登录)技术简介 (6)3.1. 修改应用程序SSO方案 (6)3.2. 即插即用SSO方案 (7)3.3. 两种SSO方案比较 (7)3.4. 惠普SSO (8)3.4.1. 惠普SSO开发背景 (8)3.4.2. 惠普SSO的功能 (8)3.4.3. 惠普SSO的特点 (10)3.4.4. 惠普SSO结构 (11)4. xxxx集团单点登录技术方案 (12)4.1. 应用系统中部署惠普SSO单点登录 (12)4.1.1. 解决全局的单点登录 (13)4.1.2. 应用系统的整合 (14)4.1.3. 用户如何过渡到使用单点登录 (15)4.1.4. 管理员部署业务系统单点登录功能 (15)4.1.5. 建立高扩展、高容错单点登录环境 (17)4.1.6. 建立稳定、安全、高速网络环境 (17)4.2. 定制工作 (18)4.2.1. SSL VPN结合 (18)4.2.2. 密码同步 (18)5. 项目实施进度 (19)5.1. 基本安装配置 (19)5.2. 配置认证脚本 (19)5.3. 总体进度 (20)6. 硬件清单 (21)7. 软件清单 (22)1.xxxx集团系统建设现状xxxx集团有限责任公司(以下简称集团公司)管理和运营省内11个民用机场,以及20多个关联企业(全资子公司、控股企业、参股企业)。
现有的信息系统主要有生产运营系统和管理信息系统,其中生产运营系统包括机场生产运营管理系统、中小机场生产运营管理系统、离港系统、航显系统、广播系统、安检信息管理系统、控制区证件管理系统等,管理信息系统主要有财务系统、OA系统、邮件系统、资产管理系统、决策支持系统、网站信息发布审批系统、视频点播系统等。
GPS单点定位的原理与方法GPS(全球定位系统)单点定位是通过利用卫星信号来计算接收器的位置坐标的一种定位方法。
其原理基于三角测量和卫星轨道测量,具体包括以下几个步骤:1.卫星发射信号:GPS系统由一组人造卫星组成,这些卫星在地球上方不断绕行。
每颗卫星都向地面发射微波信号,包含了卫星的精确位置信息和时间信息。
2.接收器接收信号:GPS接收器是我们手持设备或车载设备中的组成部分,能够接收卫星发射的信号。
至少接收到4个卫星的信号时,GPS接收器开始进行定位计算。
信号的接收通常会受到建筑物、树木、峡谷等遮挡物的干扰。
3.信号时间测量:GPS接收器接收到卫星信号后,会测量信号从卫星发射到接收器接收的时间,根据信号的传播速度得出卫星和接收器之间的距离。
4.三角测量定位:至少接收到4个卫星信号后,GPS接收器会通过三角测量计算出接收器与各个卫星之间的距离差,进而确定接收器所在的位置。
5.计算接收器位置:根据接收器与至少4个卫星之间的距离差,GPS接收器可以利用三角测量原理计算出接收器的空间坐标,即经度、纬度和海拔高度。
6.位置纠正:单点定位的结果通常会受到多种误差的影响,如大气延迟、钟差、多普勒效应等。
为了提高定位的精确度,还需要纠正这些误差。
纠正方法包括差分GPS、RTK(实时动态定位)等。
除了上述的基本原理之外,GPS单点定位还可以通过改进方法来提高定位的精确度。
以下是几种常用的方法:1.多星定位:通过接收更多的卫星信号来计算接收器位置,增加多星定位的可靠性和精度。
2.差分GPS:差分GPS是通过两个或多个接收器同时接收卫星信号,其中一个接收器已知位置,用来纠正目标接收器的误差。
这样可以提高定位的精确度。
3.后处理:将接收器记录到的GPS信号数据回传到办公室,在计算机上进行后期处理,利用更复杂的算法和精确的星历文件来提高定位精度。
4.RTK定位:实时动态定位是一种高精度的GPS定位方法,利用地基台接收器和流动台接收器之间的无线通信,可以实现毫米级的定位精度。
GPS单点定位程序文档说明
一程序说明
本程序的基本功能是利用测站接收机获取的观测文件(O文件),结合相应历元下的卫星导航文件(N文件)来计算测站点在WGS-84坐标系下的坐标。
所用编程语言为C++,编程环境为VC++6.0。
二单历元卫星坐标计算流程图
三程序设计流程图
四程序模块说明
(一)对类的说明
1.PointPosition类
double GetDelta_t(CommonTime Toe,CommonTime Toc);
用于计算两个历元时刻的时间间隔
CoorCartesian ComputeSatCoor(double Tk,OneNavData oneNaveData);
利用导航数据计算卫星坐标
Bool GetPreciseSatCoor(CommonTimeObsTime,CoorCartesian&Sitecoor , CoorCartesian &Satcoor,OneNavData oneNavData,double SatClkBais);
通过迭代得到新号发送时刻的卫星坐标
double ComputeSatClkBias(double SendTime_Tk,OneNavData oneNavData);
计算卫星的钟差改正
Factor ComputeFactors(CoorCartesian &Sitecoor, CoorCartesian &Satcoor, double &satClkBias,double &Tr, double TropDelay, double ionDelay, double p1);
计算组建法方程需要的各个元素
double ComputeTropDelay(CoorCartesian SatCoor,CoorCartesian SitCoor);
计算对流层误差
double ComputeIonDelay(const double L1,const double L2);
计算电离层误差
2.ReadObsData类
ReadObsFile(const string& FileName);
ObsFileHeader ReadObsHeader(const string &FileName);
读取观测文件的头文件部分
EntirObsData ReadObsData(const string &FileName);
读取观测文件的数据部分
3.ReadNavData类
NavFileHeader ReadNavHeader(const string &FileName);
读取导航文件的头文件部分
AllNavData ReadNavData(const string &FileName);
读取导航文件的数据部分
OneNavData SelectEpochNavData(AllNavData allNavData,string SatPrn,CommonTime ObsTime)
查找并获取要计算的观测历元下的导航数据
(二)程序模块的连接关系
1.分别用文件流打开相应的观测数据文件和星历文件;
2.调用ReadObsFile.ReadObsHeader()读取观测文件头文件;
3.调用ReadObsFile.ReadObsData()按照观测历元读取观测数据;
4调用ReadNavFile.ReadNavHeader()读取导航文件的头文件部分;
5调用ReadNavFile.ReadNavData()读取导航文件的数据部分;
6 利用循环并调用ReadNavFile.SelectEpochNavData()获取观测历元的导航数据
7 调用puteSatCoor()计算卫星坐标
8利用puteFactor()计算法方程的各个元素
9迭代得到结果。
五程序的不足之处
1.程序较多的出现类调其他类中的方法,从而类的独立性较差。
2.在坐标系统中,只进行了空间直角坐标系和大地坐标系的转换,空间直角坐
标系和测站坐标系的转换,没有完全整理坐标转换。
3.计算的精度较低。
4.只利用GPS卫星的观测数据并没有利用Glonass卫星的观测数据,从而使数
据为得到充分利用。
最新文件---------------- 仅供参考--------------------已改成word文本--------------------- 方便更改。