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

📄 ppt.cpp

📁 GPS 定位授时源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		}

		lA=TwoArrayAlloc(row,demention);
		lP=TwoArrayAlloc(row,row);
		lL0=TwoArrayAlloc(row,1);
		lDELTA=TwoArrayAlloc(demention,1);
		lQx =TwoArrayAlloc(demention,demention);

		RECPOS *recpos=new RECPOS[2];
		long double *ldRecClk=new long double[2];
	
	    recpos[0].xyz.lX=head.dapproxmiatexyz.lX,recpos[0].xyz.lY=head.dapproxmiatexyz.lY,
		recpos[0].xyz.lZ=head.dapproxmiatexyz.lZ;
		ldRecClk[0]=0;
		RECXYZ_BLH(recpos[0]);

		UTCCOVGPS(&obsrec[i].epohead.TIME,&gpst[i]);
		UTCTIME *Temtime=&obsrec[i].epohead.TIME;
		outPosFile<<setw(4)<<i+1<<"   "<<2000+Temtime->iYEAR<<"-"<<Temtime->iMONTH<<"-"<<setw(2)<<Temtime->iDAY;
	
		outPosFile<<" "<<setw(2)<<Temtime->iHOUR<<":"<<setw(2)<<Temtime->iMINUTE<<":"	<<setw(2)<<(int)Temtime->dSECOND<<"  ";

		printf("   Epoch %d     %d-%d-%d %d:%d:%d.\n",i+1,2000+Temtime->iYEAR,Temtime->iMONTH,Temtime->iDAY,Temtime->iHOUR,Temtime->iMINUTE,(int)Temtime->dSECOND);
		
		while(1)
		{	   
			   int j; 
			   int p=1; // input the value in Delta to IAmbiguity in each epoch
 			   for(j=0;j<num;j++)
			   {    
					
					if(j==4)
						int	csl=j;


				    int k=obsrec[i].eporec[j].iPRN-1;
				   //compute the weight of the different satellite
					lP[2*j][2*j]=1.0;
					lP[2*j+1][2*j+1]=Par.PseudoSTD/Par.PhaseSTD;

                    SATXYZ_AE(satpos[i*MAXNAVSAT+k],recpos[0]);  
					if(satpos[i*MAXNAVSAT+k].dE<30)
					{	lP[2*j][2*j]    *=sin(satpos[i*MAXNAVSAT+k].dE/180*PI);
						lP[2*j+1][2*j+1]*=sin(satpos[i*MAXNAVSAT+k].dE/180*PI);
					}
 					if(!obsrec[i].eporec[j].lOBS[obstype[P1]]||!obsrec[i]
						.eporec[j].lOBS[obstype[P2]])
					{   lP[2*j][2*j]=0;
						//lP[2*j+1][2*j+1]=0;
					}
					if(!obsrec[i].eporec[j].lOBS[obstype[L1]]||!obsrec[i]
						.eporec[j].lOBS[obstype[L2]])
					{   //lP[2*j][2*j]=0;
						lP[2*j+1][2*j+1]=0;
					}
					
//					if(BigResidual[j])
//						lP[j][j]=0;		
//  				if(obsrec[i].eporec[j].iCycleSlip==-1)
//  						lP[i][j]=0;
					//just  for phase  smooth  psudorange   					
				    //compute the various error correction
					if(!obsrec[i].eporec[j].lOBS[obstype[P1]]&&obsrec[i].eporec[j].lOBS[obstype[C1]])
						obsrec[i].eporec[j].lOBS[obstype[P1]]=obsrec[i].eporec[j].lOBS[obstype[C1]];
					long double ldiono;
					if(obsrec[i].eporec[j].lOBS[obstype[P1]]&&obsrec[i].eporec[j].lOBS[obstype[P2]])
						ldiono=-1.54573*(obsrec[i].eporec[j]
						.lOBS[obstype[P1]]-obsrec[i].eporec[j].lOBS[obstype[P2]]);// just for pseuorange
					else ldiono=0;
					
				    long double ldtrop=SIMPLEHOPFIELD(Par.TropModel,satpos[i*MAXNAVSAT+k].dE,
						PS,TS,RHS,recpos->blh);
			
					long double ldRelCor=0;			
					ldRelCor=RELATIVECORRECTION(satpos[i*MAXNAVSAT+k]); 
					//relative correction 
									
					long double ldSatCor=dSatClk[i*MAXNAVSAT+k]*VC;

										
    				if((i>0)&&(obsrec[i].eporec[j].iAmbSmoTime>=IAmbSmoLen))						
					{	PriJ=SEAPRN(obsrec[i-1].epohead.SatList,obsrec[i].eporec[j].iPRN);
						obsrec[i].eporec[j].lAmbiguity=obsrec[i-1].eporec[PriJ].lAmbiguity;		
					}	
					
				//	if(!obsrec[i].eporec[j].lOBS[obstype[P1]])
				//						obsrec[i].eporec[j].lOBS[obstype[P1]]=obsrec[i].eporec[j].lOBS[obstype[P2]];
				//					
				
					long double ldPseduRow=obsrec[i].eporec[j].lOBS[P1]
						+ldSatCor-ldRecClk[0]*VC-ldiono-ldtrop+ldRelCor;
					long double ldPhaseRow=obsrec[i].eporec[j].lOBS[L1]
						*VC/FREQ_L1+ldSatCor-ldRecClk[0]*VC+ldiono-ldtrop-ldRelCor;
					ldPhaseRow-=obsrec[i].eporec[j].lAmbiguity*VC/FREQ_L1;
					
				
					
					long double ldDistance=SSDistance(recpos[0].xyz.lX,recpos[0].xyz.lY
						,recpos[0].xyz.lZ,satpos[i*MAXNAVSAT+k].xyz.lX
						,satpos[i*MAXNAVSAT+k].xyz.lY,satpos[i*MAXNAVSAT+k].xyz.lZ);	
					long double lL[MAXCHA],lM[MAXCHA],lN[MAXCHA];
					
					
					if(Par.ModelHolding)
					{	lA[2*j][0]=1;
						lA[2*j+1][0]=1;}
					if(!Par.ModelHolding)
					{	
						lL[j]=(satpos[i*MAXNAVSAT+k].xyz.lX-recpos[0].xyz.lX)/ldDistance;
						lM[j]=(satpos[i*MAXNAVSAT+k].xyz.lY-recpos[0].xyz.lY)/ldDistance;
						lN[j]=(satpos[i*MAXNAVSAT+k].xyz.lZ-recpos[0].xyz.lZ)/ldDistance;				
						lA[j][0]=-lL[j];
						lA[j][1]=-lM[j];
						lA[j][2]=-lN[j];
						lA[j][3]=1     ;}

					
					for(int t=1;t<demention;t++)
					{	lA[2*j][t]=0;
						lA[2*j+1][t]=0;
					}
				
			//					
					if(obsrec[i].eporec[j].iAmbSmoTime<IAmbSmoLen)
					{	lA[2*j+1][p]=VC/FREQ_L1;p++;}
						
					
					lL0[2*j][0]  =ldPseduRow-ldDistance;
					lL0[2*j+1][0]=ldPhaseRow-ldDistance;
					
					obsrec[i].eporec[j].lPseudoRes=0;
					obsrec[i].eporec[j].lPhaseRes=0;
			   }
			LEASTSQUAREAJUST(lDELTA,lA,row,demention,1,lL0,lP,lQx);


			p=1;
			for(j=0;j<num;j++)
			{
				for(int k=0;k<demention;k++)
				{	obsrec[i].eporec[j].lPseudoRes += lA[2*j][k]*lDELTA[k][0];
					obsrec[i].eporec[j].lPhaseRes  += lA[2*j+1][k]*lDELTA[k][0];
				}
				
				if(obsrec[i].eporec[j].iAmbSmoTime<IAmbSmoLen)
				{	obsrec[i].eporec[j].lAmbiguity+=lDELTA[p][0];
					p++;}
				
				obsrec[i].eporec[j].lPseudoRes -= lL0[2*j][0];
				obsrec[i].eporec[j].lPhaseRes  -= lL0[2*j+1][0];
			
			//	if(fabs(lV[j])>=3*1)	
			//					BigResidual[j]=TRUE;
			
			}
			
	//		int recompute=0;
	//			for(j=0;j<num;j++)
	//				recompute+=BigResidual[j];
	//			
	//			if(recompute)
	//			{	for(j=0;j<num;j++)
	//					lV[j]=0;
	//				continue;
	//			}
			
			if(!Par.ModelHolding)
			{
				recpos[0].xyz.lX+=lDELTA[0][0];
				recpos[0].xyz.lY+=lDELTA[1][0];
				recpos[0].xyz.lZ+=lDELTA[2][0];
			}
		
		    ldRecClk[0]+=lDELTA[0][0]/VC;

			if((fabs(lDELTA[0][0])<0.1))
				break;	
		}	
		
	    dRawRecClk[i]   =ldRecClk[0];

		

		for(j=0;j<num;j++)
		{	
			if(!obsrec[i].eporec[j].iCycleFlag&&(obsrec[i].eporec[j].iAmbSmoTime<IAmbSmoLen))
			{	
				int time=obsrec[i].eporec[j].iAmbSmoTime;
				PriJ=SEAPRN(obsrec[i-1].epohead.SatList,obsrec[i].eporec[j].iPRN);
				obsrec[i].eporec[j].lAmbiguity=(1.0-1.0/time)*obsrec[i-1].eporec[PriJ].lAmbiguity+obsrec[i].eporec[j].lAmbiguity/time;
			}
						
		}

		
		//store the epoch receiver clock error to the dRawRecClk		
		if(!Par.ModelHolding)
		{	
			pPosXYZDif[0][i]=recpos[0].xyz.lX-head.dapproxmiatexyz.lX;
			pPosXYZDif[1][i]=recpos[0].xyz.lY-head.dapproxmiatexyz.lY;
			pPosXYZDif[2][i]=recpos[0].xyz.lZ-head.dapproxmiatexyz.lZ;
			outPosFile<<"  "<<setprecision(3)<<setw(7)
					  <<recpos[0].xyz.lX-head.dapproxmiatexyz.lX<<"  "<<setw(7)<<recpos[0].xyz.lY-head.dapproxmiatexyz.lY
					  <<"  "<<setw(7)<<recpos[0].xyz.lZ-head.dapproxmiatexyz.lZ;
			outPosFile<<"  "<<setprecision(4)<<setw(15)<<recpos[0].xyz.lX<<"  "<<setw(15)<<recpos[0].xyz.lY<<"  "<<setw(15)<<recpos[0].xyz.lZ;
		}
		
		outPosFile<<"  "<<setprecision(12)<<setw(16)<<ldRecClk[0]<<endl;
		
		//for(j=0;j<num;j++)
		//	outPosFile<<"             "<<obsrec[i].eporec[j].iPRN<<"  "<<obsrec[i].eporec[j].lPseudoRes<<"  "<<obsrec[i].eporec[j].lPhaseRes<<"  "<<obsrec[i].eporec[j].lAmbiguity<<endl;

		TwoArrayFree(lDELTA);
		TwoArrayFree(lA) ;
		TwoArrayFree(lL0);
		TwoArrayFree(lQx);
		TwoArrayFree(lP) ;
		delete[]recpos   ;
		delete[]ldRecClk ;

	}



	if(!Par.ModelHolding)
	{	outPosFile<<" X coordinate: ";
	GETPOSRMS(outPosFile,pPosXYZDif[0],TOTALOBSNUM);
	outPosFile<<" Y coordinate: ";
	GETPOSRMS(outPosFile,pPosXYZDif[1],TOTALOBSNUM);
	outPosFile<<" Z coordinate: ";
	GETPOSRMS(outPosFile,pPosXYZDif[2],TOTALOBSNUM);
	}
	
// process the clock error record 

 	if(PreClk.Makername)
	{	int EpoPerGroup=10;        //clock  devided to groups
		int ClkNum=TOTALOBSNUM/EpoPerGroup;
		long double * lGroupClk=new long double[ClkNum];
		Clk30SecTo5Min(outClkFile,dRawRecClk,lGroupClk,ClkNum,EpoPerGroup);
		GETWCLKRMS(outClkFile,dRawRecClk,PreClk.pRecClk,PreClk.pDifToReference,ClkNum);
	//	outClkFile<<" The true value of clock from the IGS CLK Precise clock files are :"<<endl;

	//	for (i=0;i<MAXCLKRECORDS;i++)
	//			outClkFile<<setw(4)<<i<<"  "<<setw(12)<<PreClk.pRecClk[i].lClk[0]<<endl;
		delete[]lGroupClk;
	}
	
	if(!CORRECTCLK(TOTALOBSNUM,dRawRecClk,dCorrecedRecclk))
	{	printf(" The clock has dected with clock jump by TRIP-T \n     We correct the jump with our software.\n ");
		outClkFile<<" After the clock jump being detected and corrected :"<<endl;
		GETCLKRMS(outClkFile,dCorrecedRecclk,TOTALOBSNUM);
	}
	else 
		GETCLKRMS(outClkFile,dRawRecClk,TOTALOBSNUM);
	

/************************************************************************/
    delete[]iEpoNumofSat;
	SatObsRecDesTroy(SatObsRec);
	
	delete[]dRawRecClk;
	delete[]dCorrecedRecclk;   
	
	delete[]satpos;
	delete[]dSatClk;
	delete[]gpst;	

//	delete[]SatObsRec;   //have deleted before in SatObsRecDesTroy
	delete[]obsrec;

	delete[]PreClk.pDifToReference;
	delete[]PreClk.pRecClk;
	delete[]PreClk.pSavClk;
	TwoArrayFree(pPosXYZDif);


    inObsFile.close();

    outPosFile.close();
	outPosFile.close();
	outClkFile.close();
	
	return 1;
}





















⌨️ 快捷键说明

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