logo资料库

根据导航电文计算卫星瞬时坐标.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
//基本广播星历块 struct EPHEMERISBLOCK //每小时一个卫星对应一个基本星历块 { //PRN 号 int i1PRN; double f8a0,f8a1,f8a2;//时间改正数 //六个轨道参数 double f8IODE,f8Crs,f8Deltan,f8M0;// ORBIT - 1 double f8Cuc,f8e,f8Cus,f8SqrtA;// ORBIT - 2 double f8Toe,f8Cic,f8OMEGA,f8Cis;// ORBIT - 3 double f8i0,f8Crc,f8omega,f8OMEGAdot;// ORBIT - 4 double f8IDOT,f8GpsWeekNumber,f8L2C,f8L2P;// ORBIT - 5 double f8SatAccuracy,f8SatHealth,f8TGD,f8IODC;// ORBIT - 6 }; void CGPS0168View::OnGps() { // TODO: Add your command handler code here CString str; CFileDialog dlg(TRUE,".06n","*.06n",OFN_HIDEREADONLY,"GPS 文 件 (*.06)|*.06n",NULL); if (dlg.DoModal()==IDOK) { str=dlg.GetFileName(); } int i4HeadLineNum = 0; //打开文件 CStdioFile pfEph; BOOL IsEn = pfEph.Open(str, CFile::modeRead); if(!IsEn) return ; //读入头文件 CString strLine; while(IsEn) { IsEn = pfEph.ReadString(strLine); i4HeadLineNum++; int index = strLine.Find("END OF HEADER"); if( -1 != index ) break; } //计算星历块数
int AllNum = 0; while(IsEn) { IsEn = pfEph.ReadString(strLine); AllNum++; } //临时读入星历块 int i4AllBlockNum = (AllNum + 1) / 8; EPHEMERISBLOCK *pTemEpheme = new EPHEMERISBLOCK[i4AllBlockNum]; CGPSTime double *nsecond=new double[i4AllBlockNum]; if(!pTemEpheme || !pGpsTime) return ; //将文件指针调整到数据位置 pfEph.SeekToBegin(); for(int i=0; i
nsecond[i]=pGpsTime[i].InitgGpsTime(year, month, day, hour, minute, msecond); IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf",&IODE, &Crs, &DeltN, &M0); //读 Cuc,e,Cus,sqrtA IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf",&Cuc, &e, &Cus, &sqrtA); //Toe,Cic,OMEGA,Cis; IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf",&Toe, &Cic, &OMEGA, &Cis); //i0,Crc,w,OMEGADOT IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf",&i0, &Crc, &omega, &OMEGADOT); //IDOT,L2Cod,GPSWeek,L2PCod IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf", &IDOT, &L2C, &GPSWeek, &L2P); //AccuracyofSat,HealthofSat,TGD,IODC IsEn = pfEph.ReadString(strLine); strLine.Replace('D', 'e'); sscanf(strLine,"%lf %lf %lf %lf",&AccuracyofSat, &HealthofSat, &TGD, &IODC); // IsEn = pfEph.ReadString(strLine); //赋值 pTemEpheme[i].i1PRN = mPrn; pTemEpheme[i].f8a0 = a0; pTemEpheme[i].f8a1 = a1; pTemEpheme[i].f8a2 = a2; //&IODE, &Crs, &DeltN, &M0 pTemEpheme[i].f8IODE = IODE; pTemEpheme[i].f8Crs = Crs; pTemEpheme[i].f8Deltan = DeltN; pTemEpheme[i].f8M0 = M0; //&Cuc, &e, &Cus, &sqrtA
pTemEpheme[i].f8Cuc = Cuc; pTemEpheme[i].f8e = e; pTemEpheme[i].f8Cus = Cus; pTemEpheme[i].f8SqrtA = sqrtA; //Toe,Cic,OMEGA,Cis; pTemEpheme[i].f8Toe = Toe; pTemEpheme[i].f8Cic = Cic; pTemEpheme[i].f8OMEGA = OMEGA; pTemEpheme[i].f8Cis = Cis; //i0,Crc,omega,OMEGADOT pTemEpheme[i].f8i0 = i0; pTemEpheme[i].f8Crc = Crc; pTemEpheme[i].f8omega = omega; pTemEpheme[i].f8OMEGAdot = OMEGADOT; //iDOT,L2Cod,GPSWeek,L2PCod pTemEpheme[i].f8IDOT = IDOT; pTemEpheme[i].f8L2C = L2C; pTemEpheme[i].f8L2P = L2P; pTemEpheme[i].f8GpsWeekNumber = GPSWeek; //AccuracyofSat,HealthofSat,TGD,IODC pTemEpheme[i].f8SatAccuracy = AccuracyofSat; pTemEpheme[i].f8SatHealth = HealthofSat; pTemEpheme[i].f8TGD = TGD; pTemEpheme[i].f8IODC = IODC; } pfEph.Close(); //计算重复星历数 int i4RepeatNum = 0; for(i=0; i
EPHEMERISBLOCK[m_i4EphemerisBlockNum]; //CGPSTime *m_pGpsTime=new CGPSTime[m_i4EphemerisBlockNum]; double *m_nsecond=new double[m_i4EphemerisBlockNum]; if(!m_pGpsEphemeris) return ; int k = 0; for(i=0; i1.0E-12); double x=sin(E1)*sqrt(1-pow(GPS.f8e,2)); double y=cos(E1)-GPS.f8e; double f; if (x>0) { if (y>0) { f=atan(x/y); } else f=atan(x/y)+2*PI; }
else { f=atan(x/y)+PI; } double u1=GPS.f8omega+f; double tu=GPS.f8Cuc*cos(2*u1)+GPS.f8Cus*sin(2*u1); double tr=GPS.f8Crc*cos(2*u1)+GPS.f8Crs*sin(2*u1); double ti=GPS.f8Cic*cos(2*u1)+GPS.f8Cis*sin(2*u1); double u=u1+tu; double r=pow(GPS.f8SqrtA,2)*(1-GPS.f8e*cos(E1))+tr; double q=GPS.f8i0+ti+GPS.f8IDOT*(m_nsecond[i]-GPS.f8Toe); double lx=r*cos(u); double ly=r*sin(u); double L=GPS.f8OMEGA+(GPS.f8OMEGAdot-We)*m_nsecond[i]-GPS.f8OMEGAdot*GPS.f8Toe; //L=L/180*PI; double tx=lx*cos(L)-ly*cos(q)*sin(L); double ty=lx*sin(L)+ly*cos(q)*cos(L); double tz=ly*sin(q); fprintf(fp,"%4d",m_pGpsEphemeris[i].i1PRN); fprintf(fp,"%25.3lf",tx); fprintf(fp,"%25.3lf",ty); fprintf(fp,"%25.3lf\n",tz); } fclose(fp); } //从年 月 日 转换为 GPS 周秒 int CGpsTime::InitgGpsTime (int nYear, int nMounth, int nDay, int nHour, int nMinute, double dSecond) { int DayofMonth = 0; int DayofYear = 0; int weekno = 0; int dayofweek; int m; if (nYear < 1980 || nMounth < 1 || nMounth > 12 || nDay < 1 || nDay > 31) //计算从 1980 年到当前的前一年的天数 for( m = 1980 ; m < nYear ; m++ ) { return -1;
if ( (m%4 == 0 && m%100 != 0) || (m%400 == 0) ) { DayofYear += 366; } else DayofYear += 365; } //计算当前一年内从元月到当前前一月的天数 for( m = 1;m < nMounth; m++) { if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) DayofMonth += 31; else if (m==4 || m==6 || m==9 || m==11) DayofMonth += 30; else if (m ==2) { if ( (nYear%4 == 0 && nYear%100 != 0) || (nYear%400 == 0) ) else DayofMonth += 29; DayofMonth += 28; } } DayofMonth = DayofMonth + nDay - 6;//加上当月天数/减去 1980 年元月的 6 日 weekno = (DayofYear + DayofMonth) / 7;//计算 GPS 周 dayofweek = (DayofYear + DayofMonth) % 7; //计算 GPS 周秒时间 m_dWeekSecond = dayofweek*86400 + nHour*3600 + nMinute*60 + dSecond; m_nWeek = weekno; return weekno; }
分享到:
收藏