[学习笔记]Rtklib单点定位中电离层相关函数
1. readtec函数
-
所在文件:ionex.c
-
主要参数:
* read ionex ionospheric tec grid file * args : char *file I ionex tec grid file * (wind-card * is expanded) * nav_t *nav IO navigation data * nav->nt, nav->ntmax and nav->tec are modified * int opt I read option (1: no clear of tec data,0:clear) * return : none
-
调用层次:
-
调用“readtec”:execses函数
static int execses(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt, const solopt_t *sopt, const filopt_t *fopt, int flag, char **infile, const int *index, int n, char *outfile)
-
从“readtec”调用(主要函数):
- combtec(nav_t * nav)
- expath(const char * path, char * paths[], int nmax)
- readionexb(FILE * fp, const double * lats, const double * lons, const double * hgts, double rb, double nexp, nav_t * nav)
- readionexh(FILE * fp, double * lats, double * lons, double * hgts, double * rb, double * nexp, double * dcb, double * rms)
-
-
调用关系:
-
电离层IONEX文件
-
文件格式详细介绍在igs官方文件中可以下载:ionex1.pdf
-
文件命名方式遵守RINEX格式,如下图中文件名为igsg2000.14i,表示2014年第200天全天igs发布的全球电离层数据
-
文件头:
-
文件记录:
-
说明:
-
文件头中可以看出,整个文件包含的经度范围是:-180°—180°且经度间隔是5°,纬度范围为-87.5°—87.5°且纬度间隔为2.5°,高度为450km。时段为2014.7.19.0.0.0—2014.7.20.0.0.0。另外头文件中EXPONENT表示单位的指数,即下面的TEC值的单位是10^eTECU,默认是-1,即0.1TECU。
-
除去文件头外,整个记录可以分为两大部分:第一部分为电子含量。开始于“START OF TEC MAP”,每2h一条新的记录,且每个时段都有编号,一共有13条记录,结束于“END OF TEC MAP”;第二部分为电子含量均方根误差。同理于前,一共13条记录。
-
电子含量部分,每条记录后的标签为“LAT/LON1/LON2/DLON/H”,表示该条记录的位置。如Fig.1.2表示第一条记录,依次在纬度87.5,高度450km处,-180°—180°间以间隔5°的网格点处的电子含量,所以下面有 180 ÷ 5 × 2 + 1 = 73 180÷5×2+1=73 180÷5×2+1=73条记录。结合纬度 87.5 ÷ 2.5 × 2 + 1 = 71 87.5÷2.5×2+1=71 87.5÷2.5×2+1=71个网格点,一共是 73 × 71 = 5183 73×71=5183 73×71=5183条记录, readionexb函数在读取数据时,会将其存储在nav_t结构体*nav的tec中,tec为结构体tec_t ,以上两种结构体分别为:
typedef struct { /* navigation data type */ int n,nmax; /* number of broadcast ephemeris */ int ng,ngmax; /* number of glonass ephemeris */ int ns,nsmax; /* number of sbas ephemeris */ int ne,nemax; /* number of precise ephemeris */ int nc,ncmax; /* number of precise clock */ int na,namax; /* number of almanac data */ int nt,ntmax; /* number of tec grid data */ eph_t *eph; /* GPS/QZS/GAL/BDS/IRN ephemeris */ geph_t *geph; /* GLONASS ephemeris */ seph_t *seph; /* SBAS ephemeris */ peph_t *peph; /* precise ephemeris */ pclk_t *pclk; /* precise clock */ alm_t *alm; /* almanac data */ tec_t *tec; /* tec grid data */ erp_t erp; /* earth rotation parameters */ double utc_gps[8]; /* GPS delta-UTC parameters {A0,A1,Tot,WNt,dt_LS,WN_LSF,DN,dt_LSF} */ double utc_glo[8]; /* GLONASS UTC time parameters {tau_C,tau_GPS} */ double utc_gal[8]; /* Galileo UTC parameters */ double utc_qzs[8]; /* QZS UTC parameters */ double utc_cmp[8]; /* BeiDou UTC parameters */ double utc_irn[9]; /* IRNSS UTC parameters {A0,A1,Tot,...,dt_LSF,A2} */ double utc_sbs[4]; /* SBAS UTC parameters */ double ion_gps[8]; /* GPS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ double ion_gal[4]; /* Galileo iono model parameters {ai0,ai1,ai2,0} */ double ion_qzs[8]; /* QZSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ double ion_cmp[8]; /* BeiDou iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ double ion_irn[8]; /* IRNSS iono model parameters {a0,a1,a2,a3,b0,b1,b2,b3} */ int glo_fcn[32]; /* GLONASS FCN + 8 */ double cbias[MAXSAT][3]; /* satellite DCB (0:P1-P2,1:P1-C1,2:P2-C2) (m) */ double rbias[MAXRCV][2][3]; /* receiver DCB (0:P1-P2,1:P1-C1,2:P2-C2) (m) */ pcv_t pcvs[MAXSAT]; /* satellite antenna pcv */ sbssat_t sbssat; /* SBAS satellite corrections */ sbsion_t sbsion[MAXBAND+1]; /* SBAS ionosphere corrections */ dgps_t dgps[MAXSAT]; /* DGPS corrections */ ssr_t ssr[MAXSAT]; /* SSR corrections */ } nav_t;
typedef struct { /* TEC grid type */ gtime_t time; /* epoch time (GPST) */ int ndata[3]; /* TEC grid data size {nlat,nlon,nhgt} */ double rb; /* earth radius (km) */ double lats[3]; /* latitude start/interval (deg) */ double lons[3]; /* longitude start/interval (deg) */ double hgts[3]; /* heights start/interval (km) */ double *data; /* TEC grid data (tecu) */ float *rms; /* RMS values (tecu) */ } tec_t;
-
-
2. ionocoor函数
-
所在函数:pntpos.c
-
主要参数
compute ionospheric correction * args : gtime_t time I time * nav_t *nav I navigation data * int sat I satellite number * double *pos I receiver position {lat,lon,h} (rad|m) * double *azel I azimuth/elevation angle {az,el} (rad) * int ionoopt I ionospheric correction option (IONOOPT_???) * double *ion O ionospheric delay (L1) (m) * double *var O ionospheric delay (L1) variance (m^2) * return : status(1:ok,0:error)
-
调用层次:
-
调用“ionocoor”:rescode函数
static int rescode(int iter, const obsd_t *obs, int n, const double *rs, const double *dts, const double *vare, const int *svh, const nav_t *nav, const double *x, const prcopt_t *opt, double *v, double *H, double *var, double *azel, int *vsat, double *resp, int *ns)
其参数说明:
pseudorange residuals * calculate residuals of obss and designed matrix, iono and trop corrected, * 功能说明:计算在当前接收机位置和钟差值的情况下,定位方程的右端部分 v(nv\*1)、 几何矩阵 H(NX*nv)、此时所得的伪距残余的方差 var、所有观测卫星的 azel{方位角、仰角}、 定位时有效性 vsat、定位后伪距残差 resp、参与定位的卫星个数 ns和方程个数 nv。 int iter I 迭代次数 obsd_t *obs I observation data int n I number of observation data double *rs I satellite positions and velocities,长度为6*n,{x,y,z,vx,vy,vz}(ecef)(m,m/s) double *dts I satellite clocks,长度为2*n, {bias,drift} (s|s/s) double *vare I sat position and clock error variances (m^2) int *svh I sat health flag (-1:correction not available) nav_t *nav I navigation data double *x I 本次迭代开始之前的定位值 prcopt_t *opt I processing options double *v O 定位方程的右端部分,伪距残余 double *H O 定位方程中的几何矩阵 double *var O 参与定位的伪距残余方差 double *azel O 对于当前定位值,每一颗观测卫星的 {方位角、高度角} int *vsat O 每一颗观测卫星在当前定位时是否有效 double *resp O 每一颗观测卫星的伪距残余, (P-(r+c*dtr-c*dts+I+T)) int *ns O 参与定位的卫星的个数 返回类型: int O 定位方程组的方程个数
-
从“ionocorr”调用
- ionmodel(gtime_t t, const double * ion, const double * pos, const double * azel)
- iontec(gtime_t time, const nav_t * nav, int sat, const double * pos, const double * azel, int opt, double * delay, double * var)
- norm(const double * a, int n)
- sbsioncorr(gtime_t time, const nav_t * nav, const double * pos, const double * azel, double * delay, double * var)
- time_str(gtime_t t, int n)
-
-
调用关系