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

📄 readon.cpp

📁 gps 卫星位置的计算
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		N_data[(i*36+10)+j_replace*4+4  ] = f1;
		N_data[(i*36+10)+j_replace*4+5  ] = f2;

		fprintf(fp_temp1,"7\t%20.11e %20.11e\n",
			N_data[(i*36+10)+j_replace*4+4  ],N_data[(i*36+10)+j_replace*4+5  ]);
		fprintf(fp_temp1,"*************************************************************\n");	 

			 //if(k==336)
			 //星历中的数据块的数目
		fgets(szBuf,MAX_BUF,flNavMsg);//继续读取一行(8)
		i++;
	}
	m_DIM=k;

	fprintf(fp_temp1,"********数据的维数为%d************\n",k);
	fclose(fp_temp1);

}

void CReadON::Cal_Sate_Coord(EPHEMERIS ephemeris,double OBS_GPStime,double* svpos)
{
	double   omega = 7.2921151467E-5;//地球自转角速度,弧度/秒
	double   mu    = 3.986004415e14;//地球引力常数
	double   Error = 1.0e-12;
	double   n;
	double   tk,mk,ek1,ek2,ek,es;
	double   vk,phik;
	double   deltau,deltar,deltai;
	double   uk,rk,ik;
	double   xk,yk;
	double   omegak;
//	double   Es1,u01,u1,r1,I1,x0,y0,u,r,i,x01,y01;
//	double   u0,fs,Es,as,es,L,L1;


	tk=ephemeris.Toe;	                          //参考历元
	//计算归化时间
	//归化时间是相对于星历参考时间Toe而言的
	//******************************* tk = ( t - toe ) ******************************
	tk  =  (OBS_GPStime - ephemeris.Toe);
	//如果观测历元与所提供的星历信息不属于同一个星期
	//这种情况应该较少出现

	
	if(tk >  302400.0) tk = tk - 604800.0;
	if(tk < -302400.0) tk = tk + 604800.0;

//	tk=0;
	
	//计算卫星运行的平均角速度n
	//****************************** n = (GM/a^3)^.5 + @n ***************************
	n = sqrt(mu)/(ephemeris.sqrt_of_A*ephemeris.sqrt_of_A*ephemeris.sqrt_of_A)
		+ ephemeris.Delta_n;
    
	//计算平近点角mk
	//****************************** Ms = M0 + n * ( t - toe ) **********************
	mk = ephemeris.M0 + n * tk;
	
	//迭代计算偏近点角ek
	//****************************** Es = Ms + es * SIN( Es ) ************************
	ek1 = mk;    //Es0
	do
	{
		ek2 = mk + ephemeris.e*sin(ek1);
		if( fabs(ek2-ek1) <= Error )   break;
		ek1 = ek2;
	}while(1); // should be 10e-10
	ek = ek1;// Es
	
	//计算真近点角vk(即卫星在轨道上距近地点的角度)
	//*********************** fs ******************************************************
//	if(Get_atan(cos(ek)-ephemeris.e,sqrt(1.0-ephemeris.e*ephemeris.e)*sin(ek),vk)==0)
//		;
//		return false;
	es=ephemeris.e;
	vk=atan((sqrt(1-es*es)*sin(ek))/(cos(ek)-es));
	//计算升交距角phik
	//***********************phik: u0 = fs + ws *******************************************
	phik = vk + ephemeris.omega;//EpheInfo->omega为近地点角距,即升交点和近地点的距离
	//得到了卫星在轨道上到升交点的距离
	
	//计算摄动改正
	//*********************** @u, @r, @i ******************************************** 
	deltau   = ephemeris.Cus*sin(2.0*phik) + ephemeris.Cuc*cos(2.0*phik);
	deltar   = ephemeris.Crc*cos(2.0*phik) + ephemeris.Crs*sin(2.0*phik);
	deltai   = ephemeris.Cic*cos(2.0*phik) + ephemeris.CIS*sin(2.0*phik);
	
	//*********************** u, r, i ************************************************
	uk = phik + deltau;//经过摄动改正的升交距角
	
	rk = (ephemeris.sqrt_of_A*ephemeris.sqrt_of_A)*(1.0-ephemeris.e*cos(ek))+deltar;
	                                 //经过摄动改正的卫星直径
	
	ik = ephemeris.i0 + deltai + ephemeris.I_DOT*tk;//改正轨道倾角

	//计算升交点经度,即升交点在WGS84坐标系下的经度,即轨道平面坐标系X轴和WGS84坐标系X轴的夹角
	//// compute omegak ,L
	omegak = ephemeris.OMEGA0+(ephemeris.OMEGA_DOT-omega)*tk 
		     - omega*ephemeris.Toe; 

	//计算卫星在轨道平面的位置
	//卫星失径*改正后的升交距角
	 xk   = rk*cos(uk); 
	 yk   = rk*sin(uk);
	//轨道平面坐标系的X轴指向升交点
	
	svpos[0] = xk*cos(omegak) - yk*cos(ik)*sin(omegak);   // satellite X
    svpos[1] = xk*sin(omegak) + yk*cos(ik)*cos(omegak);   // satellite Y
	svpos[2] = yk*sin(ik);								  // satellite Z


}


void CReadON::Read_G_Header(FILE *flNavMsg)
{
	GLO_G_HEADER  HEADER;
	fgets(szBuf,MAX_BUF,flNavMsg);
	
	FILE*		fp_temp;
	fp_temp	=	fopen("G-Header-Check.txt","w");

   ///////////////////////////////////////////////////////////////////
   //             读版本  char HEADER.Version[5]
   ///////////////////////////////////////////////////////////////////
	if(strstr(szBuf,"RINEX"))
		sscanf(szBuf,"%s",HEADER.Version);
//		sscanf(szBuf,"%s",HEADER.FileType);

	fprintf(fp_temp,"************************************\n");
	fprintf(fp_temp,"The G-Rinex version:   %s\n",HEADER.Version);
//	fprintf(fp_temp,"The N-Rinex type:      %s\n",HEADER.FileType);


Begin:;

	fgets(szBuf,MAX_BUF,flNavMsg);	
	
	////////////////////////////////////////////////////////////////////
	//                读CORR TO SYSTEM TIME  
	////////////////////////////////////////////////////////////////////
	if(strstr(szBuf,"CORR TO SYSTEM TIME"))
	{
		DtoE(szBuf);
		sscanf(szBuf,"%d %d %d %lf",
			&HEADER.year,		                                 
			&HEADER.month,										
			&HEADER.day,											
			&HEADER.Time);

        fprintf(fp_temp,"The corr to system time:  %d\t%d\t%d\t%e\n",
			HEADER.year,		                                 
			HEADER.month,										
			HEADER.day,											
			HEADER.Time);

		goto Begin;
	}

	if(strstr(szBuf,"END OF HEADER"))
	{
	
		fprintf(fp_temp,"End of Header!\n");
		fprintf(fp_temp,"************************************\n");

		goto EndHead;
	}

	goto Begin;

EndHead:;

	fclose(fp_temp);


}


int CReadON::Get_SP3_Dimension(FILE *fp_SP3)
{	
	do {
		fgets (szBuf, MAX_BUF, fp_SP3);
		strMid (szBuf, azBuf, 0, 1);
		strTrim (azBuf, mzBuf);
		if (!strcmp (mzBuf, "*")) 
	        	m_DIM++;
		
	}while (!feof (fp_SP3));

	fclose(fp_SP3);

	return	m_DIM; 
}

void CReadON::Read_SP3_Data(FILE *fp_SP3, CSingleDoubleArray& S_data,SP3_EPHEMERIS ephemeris,int &m_DIM)
{	

	int	i,j;
	i=0;

	double f1, f2, f3, f4;
	int		num=0;

	char	sign;


	FILE* fp_temp;
	fp_temp=fopen("SP3-Data-Check.txt","w");

	do {
		fgets (szBuf, MAX_BUF, fp_SP3);
		strMid (szBuf, azBuf, 0, 3);
		strTrim (azBuf, mzBuf);
	}while ((strcmp (mzBuf, "*  ")));

	while(!feof(fp_SP3))
	{

		fprintf(fp_temp,"*************第 %d 个数据*****************\n",i+1);
		sscanf(szBuf, "%c %d %d %d %d %d %lf",&sign,&ephemeris.year, &ephemeris.month,
			   &ephemeris.day, &ephemeris.hour, &ephemeris.minute, &ephemeris.second);
 		fprintf(fp_temp,"time:%d-%d-%d %d:%d:%lf \n", ephemeris.year, ephemeris.month,
			   ephemeris.day, ephemeris.hour, ephemeris.minute, ephemeris.second);
		S_data[i * 146]		=	ephemeris.year;
		S_data[i * 146 + 1]	=	ephemeris.month;
		S_data[i * 146 + 2]	=	ephemeris.day;
		S_data[i * 146 + 3]	=	ephemeris.hour;
		S_data[i * 146 + 4]	=	ephemeris.minute;
		S_data[i * 146 + 5]	=	ephemeris.second;
		for(j = 0; j < 28 ; j++)
		{
			fgets (szBuf, MAX_BUF, fp_SP3);
			sscanf(szBuf, "%c %d %lf %lf %lf %lf",&sign,&num,&f1, &f2, &f3, &f4);
			S_data[ i*146 + j * 5 + 6]		= (double)num;
			S_data[ i*146 + j * 5 + 7]		= f1;
			S_data[ i*146 + j * 5 + 8]		= f2;
			S_data[ i*146 + j * 5 + 9]		= f3;
			S_data[ i*146 + j * 5 + 10]		= f4;

			fprintf(fp_temp,"%2.0f %15.7lf %15.7lf %15.7lf %15.7lf\n", //num,f1,f2,f3,f4
				S_data[ i*146 + j * 5 + 6],S_data[ i*146 + j * 5 + 7], S_data[ i*146 + j * 5 + 8], 
				S_data[ i*146 + j * 5 + 9], S_data[ i*146 + j * 5 + 10]);

		}
		fprintf(fp_temp,"*************************************************************\n");	 
		do {
			fgets (szBuf, MAX_BUF, fp_SP3);
			strMid (szBuf, azBuf, 0, 3);
			strTrim (azBuf, mzBuf);
			if (!strcmp (mzBuf, "EOF")) 
				break;
		}while (strcmp (mzBuf, "*  "));
		
//		strMid (szBuf, azBuf, 0, 3);
//		strTrim (azBuf, mzBuf);
//		if (!strcmp (mzBuf, "EOF")) 
//			break;
			i++;
	}
	
	fprintf(fp_temp,"********数据的维数为%d************\n",m_DIM);
	fclose(fp_temp);

}

void CReadON::Read_G_Data(FILE *flNavMsg, double *G_data,G_EPHEMERIS ephemeris,int &m_DIM)
{
	int i,j,k=0;
	i=0;


 	//读取RINEX文件中所有的卫星的星历数据存放在内存中
	//用于存放:年,月,日期,小时,分钟

	//读取过程中存放每行中的四个数字
	double f1, f2, f3, f4;
	FILE* fp_temp;
	fp_temp=fopen("G-Data-Check.txt","w");
	
	fgetpos(flNavMsg,&pos);
	
	while (!feof (flNavMsg)) 
	{
		
		{	for (j=0; j<=3; j++) 
				fgets (szBuf, MAX_BUF, flNavMsg);
			if(feof (flNavMsg))
				break;
			k++;
		}
	}

	fsetpos(flNavMsg,&pos);

	
	//没有到文件末尾之前
	fgets(szBuf,MAX_BUF,flNavMsg);
	while(!feof(flNavMsg))
	{
		DtoE(szBuf);
		sscanf(szBuf, "%d %d %d %d %d %d %lf %lf %lf %lf",
			     &ephemeris.m, &ephemeris.year ,&ephemeris.month, &ephemeris.day,&ephemeris.hour, &ephemeris.minute,
				 &ephemeris.second, &f1, &f2, &f3);

		fprintf(fp_temp,"*************第 %d 个数据*****************\n",i+1);
		fprintf(fp_temp,"改正前:m-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
			     ephemeris.m, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
				 ephemeris.second, f1, f2, f3);

		//check time value
		if(ephemeris.second == 60.0) { ephemeris.second = 0.0; ephemeris.minute  +=1; }
	    if(ephemeris.minute == 60 ) { ephemeris.minute =  0; ephemeris.hour +=1; }
		if(ephemeris.hour == 24) { ephemeris.hour = 0; ephemeris.day  +=1; }
		//k
		G_data[i*22+0] = ephemeris.m;
		G_data[i*22+1] = ephemeris.year;
		G_data[i*22+2] = ephemeris.month;
		G_data[i*22+3] = ephemeris.day;
		G_data[i*22+4] = ephemeris.hour;
	    G_data[i*22+5] = ephemeris.minute;
			 
	    G_data[i*22+6] = ephemeris.second;//second
	    G_data[i*22+7] = f1;			//
		G_data[i*22+8] = f2;			//
		G_data[i*22+9] = f3;			//

		fprintf(fp_temp,"改正后:m-%d %d %d %d %d %d %lf %.11e %.11e %.11e\n",
			     ephemeris.m, ephemeris.year ,ephemeris.month, ephemeris.day,ephemeris.hour, ephemeris.minute,
				 ephemeris.second, f1,f2,f3);

		int j_replace=0;	 
	    //读取其他三行
		for(j=0; j<3; j++)
		 {
			fgets(szBuf,MAX_BUF,flNavMsg);
			DtoE(szBuf);
			sscanf( szBuf, "%lf %lf %lf %lf", &f1, &f2, &f3, &f4);
			G_data[(i*22+10)+j*4]	= f1;
			G_data[(i*22+10)+j*4+1] = f2;
			G_data[(i*22+10)+j*4+2] = f3; 
			G_data[(i*22+10)+j*4+3] = f4;
			j_replace=j;

			fprintf(fp_temp,"%d\t%20.11e %20.11e %20.11e %20.11e\n", 
				j+1,G_data[(i*22+10)+j*4], G_data[(i*22+10)+j*4+1], 
				G_data[(i*22+10)+j*4+2], G_data[(i*22+10)+j*4+3]);

		}

		fprintf(fp_temp,"*************************************************************\n");	 


			 //星历中的数据块的数目
		fgets(szBuf,MAX_BUF,flNavMsg);//继续读取一行
		i++;
	}
	m_DIM=k;

	fprintf(fp_temp,"********数据的维数为%d************\n",k);
	fclose(fp_temp);


}

⌨️ 快捷键说明

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