⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rinexnav.cpp

📁 GPS 定位授时源码
💻 CPP
字号:


#include "RinexNav.h"
#include "stdAfx.h"
#include "GlobleDefine.h"
#include "fstream.h"
#include "TimeCorTran.h"
#include "math.h"
#include "ErrorCorrection.h"

void READNAV(ifstream inNavFile,ofstream outPosFile,NAVHEAD header,NAV *nav,int &TOTALNAVNUM)
{
	char str[81];
	CString s;
	//char *p;

	do 
	{ 
	 inNavFile.getline(str,81,'\n');
     if(strstr(str,"ION ALPHA")){
     
		 s=str;
	   header.dIONalph0=atof(s.Mid(5,12));
       header.dIONalph1=atof(s.Mid(17,12));
       header.dIONalph2=atof(s.Mid(29,12));
       header.dIONalph3=atof(s.Mid(41,12));
	}
	if(strstr(str,"ION BETA")){
		 s=str;
       header.dIONbelta0=atof(s.Mid(5,12));
       header.dIONbelta1=atof(s.Mid(17,12));
       header.dIONbelta2=atof(s.Mid(29,12));
       header.dIONbelta3=atof(s.Mid(41,12));}
	if(strstr(str,"DELTA-UTC")){
		 s=str;
       header.dA0=atof(s.Mid(5,19));
       header.dA1=atof(s.Mid(24,19));
       header.lseconds=(long)atoi(s.Mid(43));
       header.lweek=(long)atof(s.Mid(52));} 
	if(strstr(str,"LEAP SECONDS")){
         s=str; 
		 header.iLEAPSECONDS =atoi(s.Mid(4));}
	}while(!strstr(str,"END OF HEADER"));

	//du  ji lu  wen  jian
   //if((nav=new NAV[200])==NULL)
    // cerr<<"Error allocating memory!"<<endl;

    int i=0,len;
  
    while(1)
	{ //if((nav=new NAV[200])==NULL)
	    //cerr<<"Error allocating memory!"<<endl;
		
depart:;	
	if(inNavFile.peek()==EOF)
			break; 	
	if(inNavFile.getline(str,81,'\n')&&(len=strlen(str)))

		{     s=str;
	nav[i].iPRN=atoi(s.Mid(0,2));
    nav[i].UTC.iYEAR=atoi(s.Mid(2,3));
    nav[i].UTC.iMONTH=atoi(s.Mid(5,3));
    nav[i].UTC.iDAY=atoi(s.Mid(8,3));
	nav[i].UTC.iHOUR=atoi(s.Mid(11,3));
    nav[i].UTC.iMINUTE=atoi(s.Mid(14,3));
    nav[i].UTC.dSECOND=atof(s.Mid(17,5));;
    nav[i].dDELTASV=atof(s.Mid(22,19));
    nav[i].dDELTASV1=atof(s.Mid(41,19));
    nav[i].dDELTASV2=atof(s.Mid(60,19));

		}
if(len==0)
goto depart;
		// BROADCAST ORBIT -1 
	if(inNavFile.getline(str,81,'\n')&&(len=strlen(str)))
		             {s=str;                
				nav[i].dIODE	 =(long)atof(s.Mid(3,19));          		
				nav[i].dcrs	 =atof(s.Mid(22,19));                 		
				nav[i].dDeltaN=atof(s.Mid(41,19));                		
				nav[i].dM0	 =atof(s.Mid(60,19));                 		
			}                                                  		
			// BROADCAST ORBIT -2                              		
	if(	inNavFile.getline(str,81,'\n')&&(len=strlen(str)))                   	
		           {s=str;                                       
			nav[i].dcuc	=atof(s.Mid(3,19));                   	 		
			nav[i].dE	=atof(s.Mid(22,19));                    	 		
			nav[i].dcus	=atof(s.Mid(41,19));                  	 		
			nav[i].dRoota =atof(s.Mid(60,19));                	 		
		}                                                   			
		// BROADCAST ORBIT -3                               			
   	if(	inNavFile.getline(str,81,'\n')&&(len=strlen(str)))               	 			
		         {s=str;                                          
		    nav[i].dtoe	=(long)atof(s.Mid(3,19));//*zxf     	 			
		    nav[i].dcic	=atof(s.Mid(22,19));                	 			
			nav[i].dOMEGA	=atof(s.Mid(41,19));            	    	
			nav[i].dcis		=atof(s.Mid(60,19));            	    	
				}                                                   	
				// BROADCAST ORBIT -4                               	
   	if(	inNavFile.getline(str,81,'\n')&&(len=strlen(str)))           				
		         {s=str;                                        
		                                                				
		nav[i].DI0		 =atof(s.Mid(3,19));              				
		nav[i].dcrc		 =atof(s.Mid(22,19));             				
		nav[i].dOmega	 =atof(s.Mid(41,19));             				
		nav[i].dOMEGADOT =atof(s.Mid(60,19));         				
		 }                                              			  
					// BROADCAST ORBIT -5  
	if(	inNavFile.getline(str,81,'\n')&&(len=strlen(str)))                          			
		           {s=str;                                                 
			nav[i].dIDOT		=atof(s.Mid(3,19));                        			
			nav[i].lWEEK		=(short)atof(s.Mid(41,19));//*zxf          			
		}                                                            			
		// BROADCAST ORBIT -6                                        			
   if(	inNavFile.getline(str,81,'\n')&&(len=strlen(str)))            				
		         {s=str;                                       
		nav[i].iACCURACY =atoi(s.Mid(3,19));           				
		nav[i].iHEALTH  =atoi(s.Mid(22,19));           				
		nav[i].dTGD	=(double)atof(s.Mid(41,19));  }             				
            // BROADCAST ORBIT -7                          
   if(inNavFile.getline(str,81,'\n')&&(len=strlen(str))) 
              s=str;
   else
	   continue;
      
       
       i++;
	   if(i==163)
		   continue;
	   TOTALNAVNUM=i;
	}
   	//delete[]nav; 
}

//计算t 时刻卫星的位置和速度
void GETSVPOSFROMNAV(double t,NAV *nav,SATPOS &satpos)
{	//double omega = 7.2921151467E-5   ;//地球自转角速度
	//double mu=3.986005e14;    //地球引力常数 Earth constant , unit m^3/s^2
	double n0,n;              // mean rate of angle 
	double tk, mk, ek1, ek2, ek;
	double Error=1.0e-12;
	double vk, phik;
	double deltau,deltar,deltai;
	double uk, rk, ik;
	double xk, yk;
	double omegak;
   
	double omegae=7.2921151467e-5;  // earth self round rate of angle    
    satpos.time.dWEEKSECONDS=t;
  // compute SV mean rate of angle 
	n0 = sqrt(mu) / (nav->dRoota* nav->dRoota * nav->dRoota);//计算平均角速度
	n  = n0 + nav->dDeltaN ;//改正平均角速度

  //compute time tk 计算从需要时刻到参考时刻的时间差
	tk = satpos.time.dWEEKSECONDS - nav->dtoe;
	if(tk > 302400) tk -= 604800;
	else if(tk < -302400) tk +=604800;
	//shi jisuan  shi ke  yu Toe bu  chao  guo 3.5 tian

	// compute mean anomoly at measure time 计算平近点角
	mk = nav->dM0  + n * tk;

   //computer ek 迭代计算偏近点角 
	ek1 = mk;
	do
	{
		ek2 = mk + nav->dE * sin(ek1);
		if(fabs(ek2-ek1)<=Error ) break;
		ek1=ek2;
	}while(1);
	ek=ek1;

	// computer vk  计算真近点角
	vk = Get_atan(cos(ek)-nav->dE,sqrt(1.0-nav->dE *nav->dE)*sin(ek));

	// compute phik 计算纬度参数 
	phik = vk + nav->dOmega ;

    // compute deltau,deltar,deltai 周期改正项 
	deltau = nav->dcuc * cos(2.0*phik) + nav->dcus *sin(2.0*phik) ;
	deltar = nav->dcrc * cos(2.0*phik) + nav->dcrs *sin(2.0*phik) ;
	deltai = nav->dcic * cos(2.0*phik) + nav->dcis *sin(2.0*phik) ;

	// computer uk, rk and ik 计算改正后的纬度参数,向经和倾角 
	uk = phik +deltau;
	rk = nav->dRoota *nav->dRoota * (1.0-nav->dE * cos(ek)) + deltar ;
	ik = nav->DI0 + deltai + nav->dIDOT * tk ;

	//compute xk,yk 计算卫星在轨道平面内的坐标 
	xk = rk * cos(uk);
	yk = rk * sin(uk);

	///compute omegak 改正升交点的经度 
	omegak = nav->dOMEGA + (nav->dOMEGADOT - omegae)*tk -omegae * nav->dtoe ;

	//compute X,Y,Z 计算卫星在地固系WGS84中的坐标
	satpos.xyz.lX = xk * cos(omegak) - yk * cos(ik) *sin(omegak) ;
	satpos.xyz.lY = xk * sin(omegak) + yk * cos(ik) *cos(omegak) ;
	satpos.xyz.lZ = yk * sin(ik) ;
	satpos.iPRN=nav->iPRN;

	//compute the dX,dY,dZ of the satelite
	double Es1,u01,u1,r1,I1,x0,y0,u,r,i,x01,y01;
	double u0,fs,Es,es,as,L,L1;

	fs = vk  ;
	u0 = phik;
	Es = ek  ;
	es = nav->dE;
	as = nav->dRoota * nav->dRoota;
	u  = uk;
	r  = rk;
	i  = ik;
	x0 = xk;
	y0 = yk;
	L  = omegak;

    Es1 = ( n )/(1.0 - es*cos(Es));  // FORMULA WRONG HERE
	u01 = sqrt((1+es)/(1-es))*((cos(fs/2.0)*cos(fs/2.0))/(cos(Es/2)*cos(Es/2)))*Es1;
	u1  = (1+2*nav->dcus*cos(2*u0) - 2*nav->dcuc*sin(2*u0))*u01;
	r1  = as*es*sin(Es)*Es1+2*(nav->dcrs*cos(2*u0)-nav->dcrc*sin(2*u0))*u01;
	I1  = nav->dIDOT + 2*(nav->dcis*cos(2*u0)-nav->dcic*sin(2*u0))*u01;
	L1  = nav->dOMEGADOT - omega;
	
	x01 = cos(u)*r1-r*sin(u)*u1;
	y01 = sin(u)*r1+r*cos(u)*u1;
	
//	*drel=-2*sqrt(mu*nav->roota)/SPEED_OF_LIGHT*nav->e*sin(ek);
//	*drel=-2*sqrt(mu*as)/SPEED_OF_LIGHT*nav->e*sin(ek);

	//nav->satvel[0]=cos(L)*x01-sin(L)*cos(i)*y01-(x0*sin(L)+y0*cos(L)*cos(i))*L1+y0*sin(L)*sin(i)*I1;
	//nav->satvel[1]=sin(L)*x01+cos(L)*cos(i)*y01+(x0*cos(L)-y0*sin(L)*cos(i))*L1-y0*cos(L)*sin(i)*I1;
	//nav->satvel[2]=    0     +sin(i)*       y01+            0                  +y0*cos(i)*       I1;                      

    satpos.Dotxyz.lX=cos(L)*x01-sin(L)*cos(i)*y01-(x0*sin(L)+y0*cos(L)*cos(i))*L1+y0*sin(L)*sin(i)*I1;
	satpos.Dotxyz.lY=sin(L)*x01+cos(L)*cos(i)*y01+(x0*cos(L)-y0*sin(L)*cos(i))*L1-y0*cos(L)*sin(i)*I1;
	satpos.Dotxyz.lZ=    0     +sin(i)*       y01+            0                  +y0*cos(i)*       I1;                      
	
	satpos.time.lGPSWEEK = nav->lWEEK;
	// add GPSWEEK in 2007.4.26
}

void GETFINALSVPOSFRONAV(long double &t,int &iPRN ,int inear,NAV *nav,SATPOS &satpos,long double &obsx,long double &obsy,long double &obsz)
{ 	double ts,ts0;
	double distance;
	double x1=0;
	double y1=0;
	double z1=0;
	ts=t-0.075;
	do{
   ts0=ts;
   GETSVPOSFROMNAV(ts0,nav+inear,satpos);
   distance=SSDistance(obsx,obsy,obsz,satpos.xyz.lX,satpos.xyz.lY,satpos.xyz.lZ); 
   if((!obsx)||(!obsy)||(!obsz))
	   break;
   ts=t-distance/VC;
	}while(fabs(ts-ts0)>0.0000001);
	//注:不能太小,否则迭代不出来
    //return(inear);
	Earthrotation(t-ts0,&satpos);
}

int  FindNearToe(double dEPOCH,int iPRN,long lTotalsatnum,NAV *nav) 
 {
	   double mintimespan=1000000000;
	   int iFindneartoe=0;
       for(int i=0;i<lTotalsatnum;i++)
	   {
		   if(iPRN==nav[i].iPRN)
		   {
			   double tempmin=fabs(nav[i].dtoe-dEPOCH);
			   if(tempmin<mintimespan)
			   {
				   iFindneartoe=i;
				   mintimespan=tempmin;
			   }
		   }
	   }
	   return(iFindneartoe);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -