卫星导航定位算法与程序设计-上机实习第4次_第1页
卫星导航定位算法与程序设计-上机实习第4次_第2页
卫星导航定位算法与程序设计-上机实习第4次_第3页
卫星导航定位算法与程序设计-上机实习第4次_第4页
卫星导航定位算法与程序设计-上机实习第4次_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主讲:刘晖副教授武汉大学卫星导航定位技术研究中心卫星导航定位算法与程序设计第

四次上机实习内容

继续熟悉编程平台

编程中应注意的问题RINEX导航电文文件读取RINEX观测值文件读取

课程实习编程平台熟悉—Tips

在一个解决方案中可以设定多个项目

每个项目可以是不同语言编写的只要选择“设为启动项目”即可调试第二次作业点评编程中常见的几类问题编程中常见的几类问题C++/C#的变量先声明后使用的规范

结构、类等的实例化后再使用查错和调试的问题C#命名空间的问题

结构和类定义的问题

窗口应用程序下的数据组织问题C++/C#的变量先声明后使用的规范

在函数/方法中,首先要声明变量,其次再使用变量

举例:Sample01.cs

doublea,b,c;//首先声明变量

a=1.0;b=2.0;c=3.0;//其次进行赋值操作结构、类等的实例化后再使用

编译中经常出现的“对象未实例化”错误

举例:Sample01.cs

GPSTIMEgps;

gps=newGPSTIME();

gps.wn=......;

//正确

切忌:

GPSTIMEgps;

gps.wn=......;//编译时会报错,显示类没有实例化的错误信息查错和调试方法

程序编辑到一定程度,需要进行查错。一般是利用生成解决方案的方法来进行查错

程序模块编辑完成,查错完成后,需要用调试跟踪方法来确定是否完成了功能

举例:Sample01.csC#命名空间不一致的问题

命名空间不一致,会导致编译时出现“找不到类型或命名空间名称‘’等问题出现”。解决方法,修改命名空间,编程一致举例:Sample01.CS结构和类定义的问题

结构和类定义建议为平级关系,且

结构定义全用大写

类第一个字母大写,其余小写

举例:

namespaceGPS

{

publicstructGPSTIMEP{...}

publicstructCOMMONTIME{...}

publicclassTime{......}

}

namespaceGPS

{

publicclassTime

{

publicstructGPSTIME{......}

publicstructCOMMONTIME{......}

}

}窗口应用程序下的数据组织问题切忌将函数源代码直接加在按钮等控件的事件响应函数中,这样做代码复用性很差。正常的方法是在窗口显示类之外创建自己的类,二者通过属性或方法调用进行实例数据交换。举例:Sample02.cs窗口操作和数据操作的关系窗口操作数据操作显示更新内容

继续熟悉编程平台

编程中应注意的问题RINEX导航电文文件读取数据结构C++C#流程及模板RINEX观测值文件读取课程实习C++形式的数据结构16GPS导航电文结构–GMN概述GPS导航电文信息GMNGPS导航电文头GMNHDRGPS导航电文记录GMNREC17GPS导航电文结构–GMNHDRGPS导航电文信息头结构–GMNHDRtypedefstructtagDELTA_UTC{ double A0; double A1; long T; long W;}DELTA_UTC;typedefDELTA_UTC *PDELTA_UTC;typedefstructtagGMBNHDR{ int ver_major; int ver_minor; char mark_number[_MAX_RNX_MARK_NUMBER]; char mark_name[_MAX_RNX_MARK_NAME]; double ion_alpha[4]; double ion_beta[4]; DELTA_UTC delta_utc; long leap_seconds; long size; long rec_num;}GMNHDR;typedefGMNHDR *PGMNHDR;18GPS导航电文结构–GMNRECGPS航电文信息记录结构–GMNRECtypedefstructtagGMNREC{ unsignedchar PRN; COMMONTIME TOC; double ClkBias; double ClkDrift; double ClkDriftRate; double IODE; double Crs; double DetlaN; double M0; double Cuc; double e; double Cus; double SqrtA; double TOE; double Cic; double Omega; double Cis; double i0; double Crc; double omega; double OmegaDot; double iDot; double CodesOnL2Channel; double GPSWeek; double L2PDataFlag; double SVAccuracy; double SVHealth; double TGD; double IODC; double TransTimeOfMsg; double Spare1; double Spare2; double Spare3;}GMNREC;typedefGMNREC *PGMNREC;19GPS导航电文结构–GMNGPS导航电文信息结构–GMNtypedefstructtagGMN{ GMNHDR hdr; GMNREC record[1];}GMN;typedefGMN *PGMN;ReadEPHHeader函数模板boolReadEPHHeader(FILE*p,PGMNHDRHeader){ charline[100]; charsubstr[21];inti; do{ if(fgets(line,100,p)==NULL)returnfalse; if(strncmp(&line[60],"RINEXVERSION/TYPE",18)==0)

{ xstrmid(substr,0,9,line); Header->version=(float)atof(substr);

} elseif(strncmp(&line[60],"IONALPHA",9)==0)

{ for(i=0;i<4;i++)

{ xstrmid(substr,2+i*12,12,line); Header->ion_alpha[i]=atof(substr);

}

}elseif…… }while(strncmp(&line[60],"ENDOFHEADER",12)!=0); returntrue;}ReadEPHRecord函数模板boolReadEPHRecord(FILE*p,GMNREC&Record){ charline[100]; charsubstr[21]; //inty,m,d,h,min; //doublesec; COMMONTIMEct; if(fgets(line,100,p)==NULL) returnfalse; xstrmid(substr,0,2,line);Record.PRN=atoi(substr); xstrmid(substr,3,2,line);ct.year=atoi(substr); xstrmid(substr,6,2,line);ct.month=atoi(substr); xstrmid(substr,9,2,line);ct.day=atoi(substr); xstrmid(substr,12,2,line);ct.hour=atoi(substr); xstrmid(substr,15,2,line);ct.minute=atoi(substr); xstrmid(substr,17,5,line);ct.second=atof(substr); CommonTimeToGPSTime(&ct,&Record.TOC); xstrmid(substr,22,19,line);Record.ClkBias=atof(substr); xstrmid(substr,41,19,line);Record.ClkDrift=atof(substr); xstrmid(substr,60,19,line);Record.ClkDriftRate=atof(substr); //Orbitline1 fgets(line,100,p); xstrmid(substr,3,19,line);Record.IODE=atof(substr); xstrmid(substr,22,19,line);Record.Crs=atof(substr); …… returntrue;}C#形式的数据结构23GPS导航电文结构概述GPS导航电文信息GPS导航电文头NFILEHEADERGPS导航电文记录EPHEMERISDELTA_UTCNFILEHEADER结构publicstructNFILEHEADER

{publicdoubleversion;publicdouble[]ion_alpha;publicdouble[]ion_beta;publicDELTA_UTCdUTC;publicuintleapSec;}publicstructDELTA_UTC

{publicdoubleA0;publicdoubleA1;publiclongT;publiclongW;

}EPHEMERIS结构—1publicstructEPHEMERIS

{//1stLinepublicuintPRN;/*卫星的Prn号*/publicGPSTIMETOC;/*clockdatareferencetime(sec)*/publicdoubleClkBias;/*clockcorrection(sec/sec2)*/publicdoubleClkDrift;/*clockcorrection(sec/sec)*/publicdoubleClkDriftRate;/*clockcorrection(sec)*///ORBIT-1 publicdoubleIODE;/*IODEIssueofData,Ephemeris*/publicdoubleCrs;/*harmoniccorrectionterm(metres)*/publicdoubleDetlaN;/*meananomolycorrectionsemi-circlespersec*pi=rads*/publicdoubleM0;/*meananomolyatreftimesemi-circles*pi=rads*///ORBIT-2 publicdoubleCuc;/*harmoniccorrectionterm(rads)*/publicdoublee;/*eccentricity*/publicdoubleCus;/*harmoniccorrectionterm(rads)*/publicdoubleSqrtA;/*sqrroota(metres1/2)*///ORBIT-3 publicGPSTIMETOE;/*reftime(sec)(secofGPSweek)*/publicdoubleCic;/*harmoniccorrectionterm(rads)*/publicdoubleOMEGA;/*argumentofperigeesemi-circles*pi*/publicdoubleCis;/*harmoniccorrectionterm(rads)*/EPHEMERIS结构—2//ORBIT-4publicdoublei0;/*inclinationangleatreftimesemi-circles*pi*/publicdoubleCrc;/*harmoniccorrectionterm(metres)*/publicdoubleomega;/*argumentofperigeesemi-circles*pi*/publicdoubleOMEGADot;/*rateofrightascensionsemi-circles/sec*pi*///ORBIT-5 publicdoubleiDot;/*rateofinclinationsemi-circles/sec*pi*/publicdoubleCodesOnL2Channel;/*CodesonL2channel*/publicdoubleL2PDataFlag;//-L2Pdataflag///*GPSweeknumber*///ORBIT-6 publicdoubleSVAccuracy;/*Userrangeaccuracy*/publicdoubleSVHealth;/*Satellitehealth*/publicdoubleTGD;/*grupdelay(s)*/publicdoubleIODC;/*clockdateissue*///ORBIT-7publicdoubleTransTimeOfMsg;//Transmissiontimeofmessage(secofGPSweek,derivede.g.fromZ-countinHandOverWord(HOW)publicdoubleFitInterval;//Fitinterval(hours)ZeroifnotknownpublicdoubleSpare1;publicdoubleSpare2;

}内容

继续熟悉编程平台编程中应注意的问题RINEX导航电文文件读取RINEX观测值文件读取数据结构C++C#流程及模板课程实习C++形式的数据结构29GPS观测值信息–GMOHDRGPSOBSPROP示例GPSOBSPROP GOPDefault[]={ {"L1_FULL", _GOT_CARRIER_PHASE, _GPS_F1, 1, 0.001, "L1", 1}, {"L1_HALF", _GOT_CARRIER_PHASE, _GPS_F1, 2, 0.002, "L1", 1}, {"L2_FULL", _GOT_CARRIER_PHASE, _GPS_F2, 1, 0.001, "L2", 2}, {"L2_HALF", _GOT_CARRIER_PHASE, _GPS_F2, 2, 0.002, "L2", 2}, {"L5_FULL", _GOT_CARRIER_PHASE, _GPS_F5, 1, 0.001, "L5", 3}, {"L5_HALF", _GOT_CARRIER_PHASE, _GPS_F5, 2, 0.001, "L5", 3}, {"C1", _GOT_PSEUDO_RANGE, _GPS_F1,

0, 2.000, "C1", 0}, {"C2", _GOT_PSEUDO_RANGE, _GPS_F2,

0, 2.000, "C2", 0}, {"P1", _GOT_PSEUDO_RANGE, _GPS_F1,

0, 0.200, "P1", 0}, {"P2", _GOT_PSEUDO_RANGE, _GPS_F2,

0, 0.200, "P2", 0}, {"D1", _GOT_DOPPLER, _GPS_F1,

0, 0, "D1", 0}, {"D2", _GOT_DOPPLER, _GPS_F2,

0, 0, "D2", 0}, {"D5", _GOT_DOPPLER, _GPS_F5,

0, 0, "D5", 0}, {"S1", _GOT_SNR, _GPS_F1,

0, 0, "S1", 0}, {"S2", _GOT_SNR, _GPS_F2,

0, 0, "S2", 0}, {"S5", _GOT_SNR, _GPS_F5,

0, 0, "S5", 0}, {"I_FREE", _GOT_CMBD_CP, _GPS_FIF, 0, 0.002, "IF", 0}, {"G_FREE", _GOT_CMBD_CP, _GPS_FGF, 0, 0.002, "GF", 0}, {"W_LANE", _GOT_CMBD_CP, _GPS_FWL, 0, 0.002, "WL", 0}, {"N_LANE", _GOT_CMBD_CP, _GPS_FNL, 0, 0.002, "NL", 0}, {"CMBD_CP", _GOT_CMBD_CP, _GPS_FUNKNOWN, 0, 0.000, "CC", 0},};30GPS观测值结构–GMORECHDRGPS观测值记录头结构-GMORECHDRtypedefstructtagGMORECHDR{ //GMO记录头

COMMONTIME epoch; //历元时刻

double rcvr_clk_bias; //接收机钟的偏差

unsignedchar num_sat; //卫星数

unsignedchar prn_lst[1]; //卫星列表}GMORECHDR;typedefGMORECHDR *PGMORECHDR;31GPS观测值信息结构–GPSOBSGPS观测值结构–GPSOBStypedefstructtagGPSOBS{ //GPS观测值

double value; //观测值的数值

unsignedchar tag1; //观测值的属性标志1 unsignedchar tag2; //观测值的属性标志2 unsignedchar disable; //观测值是否可用

//1=可用,0=不可用}GPSOBS;32GPS观测值信息结构–GMOGPS观测值信息结构typedefstructtagGMO{ GMOHDR hdr; GMOREC record[1];}GMO;typedefGMO *PGMOPTR;C#形式的数据结构34GPS观测值信息数据结构概述GPS观测值信息

GPS观测值信息头OFILEHEADERGPS观测值信息记录EPOCHGPS观测信息记录头COMMONTIMEGPS观测值SVOBSOFILEHEADER结构—1publicstructOFILEHEADER

{///<summary>///RINEX文件版本号///</summary>publicdoubleversion;//版本号///<summary>

///观测的导航卫星系统类型,G为GPS,///</summary>publiccharsystem_type;//系统类型publicstringprogram_create_file;//programcreatingthisfilepublicstringagency_create_file;//agencycreatingthisfilepublicstringdate_create_file;//thedateofcreatethisfilepublicstringmark_name;//点名publicstringmark_number;//点号publicstringmark_type;//点类型publicstringobserver_name;//观测者姓名publicstringobserver_agency_name;//观测机构名称OFILEHEADER结构—2publicstringrcvr_number;//接收机序列号publicstringrcvr_type;//接收机类型publicstringrcvr_ver;//接收机版本publicstringant_number;//天线序列号publicstringant_type;//天线类型

publicintwavelength_factor_L1;//L1的波长因子publicintwavelength_factor_L2;//L2的波长因子publicTOPOCENTRICant_delta;//天线偏心结构体publicCARTESIANapprox_pos;//概略位置结构体publicintobs_type_number;//观测值类型数publicstring[]obs_type_list;//观测值类型列表publicdoubleinterval;//采样率publicdoubleleap_seconds;//thenumberofleapsecondbetweenUTCandGPSTimepublicintrcv_clockoffset_apply;publicCOMMONTIMEfirst_epoch_time;//起始时刻publicCOMMONTIMElast_epoch_time;//结束时刻

}EPOCH结构publicstructEPOCH{publicCOMMONTIMEtime;//历元时刻publicintflag;//历元标识publicintsvnum;//卫星数publicdoublercv_clk_bias;//接收机钟的偏差publicSVOBS[]sv_obs_data;//卫星观测值}publicstructSVOBS

{publicintprn;//卫星号publicstringsat_type;//卫星类型G,R,……publicstring[]obs_type_list;//每组观测值的类型说明publicdouble[]obs;//观测值publicint[]cycle_slip;//周跳指示publicint[]signal_strength;//信噪比

}ReadOBSHeader函数模板boolReadOBSHeader(FILE*p,PGMOHDRHeader){ charline[100],twoline[200]; charsubstr[21];

do{

if(fgets(line,100,p)==NULL)returnfalse;

if(strncmp(&line[60],"RINEXVERSION/TYPE",18)==0)

{ xstrmid(substr,0,9,line); Header->version=(float)atof(substr); Header->system_type[0]=line[40];

} elseif(strncmp(&line[60],"MARKERNAME",10)==0)

{ strncpy(Header->mark_name,line,60);

}/*-----*/

for(inti=0;i<Header->obs_type_number;i++)

{ xstrmid(substr,10+6*i,2,twoline);

if(strncmp(substr,"C1",2)==0)Header->obs_type_list[i]=C1; elseif(strncmp(substr,"P1",2)==0)Header->obs_type_list[i]=P1; elseif(strncmp(substr,"L1",2)==0)Header->obs_type_list[i]=L1; ……

}

}while(strncmp(&line[60],"ENDOFHEADER",12)!=0);

returntrue;}ReadOBSRecord函数模板boolReadOBSRecord(FILE*p,GMORECHDR&Record,PGMOHDRHeader){ intepochflag; charsubstr[60],line[100],twoline[200]; charprnline[120]; MONTIMEpct=newCOMMONTIME(); BEGIN: fgets(line,100,p); epochflag=atoi(&line[28]); if(epochflag!=0) { intline_num=atoi(&line[32]); for(inti=0;i<line_num;i++)fgets(line,100,p); gotoBEGIN; } sscanf(line,"%d%d%d%d%d%lf",&pct->year,&pct->month,&pct->day, &pct->hour,&pct->minute,&pct->second);

CommonTimeToGPSTime(pct,&(Record.epoch)); Record.epoch_flag=epochflag;

xstrmid(substr,29,3,line); Record.num_sat=atoi(substr); strncpy(prnline,&line[32],36);……内容

继续熟悉编程平台编程中应注意的问题RINEX导航电文文件读取RINEX观测值文件读取课程实习TIPS常数使用时必须保证足够多的有效位数,尤其GM等数值较大的常数。GM=3.9860047e14omega=7.2921151467e-5//地球自转角速度PI=(3.4626433832795)sqrt_GM=(19964980.033743)SPEED_OF_LIGHT=(299792458.0)//光速TIPS

迭代运算的技巧ek1=mk;//初值doubleError=1.0e-12;do

{ek2=mk+eph.e*Math.Sin(ek1);if(Math.Abs(ek2-ek1)<=Error)break;ek1=ek2;}while(true);TIPS星历结构中的小写omega表示近地点角距星历结构中的大写的OMEGA表示TOE参考时刻的升交点赤经与本周起始时刻的格林尼治恒星时GAST之差。在Const.CS中定义的变量omega表示地球自转角速度星历结构中的OMEGADot表示升交点赤经随时间的变化率。t为周秒,不同于tkTIPS计算真近点角时,必须判断该角度所在的象限值(可使用Const.CS的Get_atan函数)选择星历时,可判断星历TOE与计算时刻之差,该值小于3600s即可进行计算。TIPS

实习数据压缩包给出了中间计算过程变量的数值,供大家比对。比对时至少要比对8位有效数字。第三次作业根据广播星历计算卫星位置、速度和钟差上机实习实习内容和任务

实习数据

实习内容

课堂作业实习内容和任务

平台:C++或CS

形式:每五个人一个学习小组

任务:

读Rinex星历文件

利用广播星历计算卫星位置、速度和钟差

时间:

本周四

实习数据IGS武汉站2010.10.16日数据

实习数据

来源:IGS跟踪站WUHN

日期:2010年年积日289

版本2.11(O文件2.11,N文件2.10)

文件名:wuhn2890.10N brdc2890.10N实习内容

继续完成RINEXN文件读取程序

编制卫星位置计算函数

完成课堂作业。51实习内容—C++编写读取GPS导航文件的函数编写读取GPS观测值文件的函数原型:boolReadAllEPHData(charFileName[],PGMNHDRHeader,list<GMNREC>&RecordList)说明:FileName:RINEX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论