[学习笔记]Rtklib单点定位中电离层相关函数

[学习笔记]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)
  • 调用关系:
execses
readtec
readionexh
readionexb
combtec
addtec
  • 电离层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)
  • 调用关系
    IONOOPT_BRDC
    IONOOPT_TEC
    ionocorr
    IONOOPT_????
    ionomodel
    iontec
    iondelay
    ionppp
    interptec
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RTKLib是一种基于GNSS(全球导航卫星系统)的实时运动定位库。它提供了一系列的工具和算法,用于处理GNSS观测数据,进行精确的实时或者后处理定位。下面是一个关于RTKLib学习笔记的概述: 1. RTKLib简介: - RTKLib是由Tomoji Takasu开发的开源软件库,用于实时运动定位和后处理。 - 它支持多种GNSS系统,包括GPS、GLONASS、Galileo、BeiDou等。 - RTKLib提供了一系列的功能模块,包括数据处理、定位算法和可视化工具等。 2. RTKLib的安装: - RTKLib可以从官方网站(http://www.rtklib.com)下载最新的源代码。 - 根据操作系统选择合适的编译工具(如GCC、MinGW等)进行编译。 - 编译完成后,可以得到可执行文件和相关的库文件。 3. RTKLib的数据处理: - RTKLib支持多种数据格式,包括RINEX、SP3、Nav等。 - 使用RTKConv工具可以将原始观测数据转换为RTKLib可识别的格式。 - 使用RTKPLOT工具可以对观测数据进行可视化分析。 4. RTKLib定位算法: - RTKLib提供了多种定位算法,包括单点定位、差分定位和RTK(实时动态定位)等。 - 单点定位方法适用于无差分数据,可以得到相对较低的定位精度。 - 差分定位方法通过使用基站观测数据进行差分运算,提高了定位精度。 - RTK定位方法使用基站和移动站的观测数据,实现了高精度的实时定位。 5. RTKLib的应用: - RTKLib广泛应用于航空、测绘、农业、机器人等领域,用于精确的定位和导航。 - 它可以用于无人机、自动驾驶、精准农业等应用场景。 - RTKLib还支持多种操作系统,包括Windows、Linux和Android等。 以上是关于RTKLib学习笔记的基本概述。希望对你的学习有所帮助!如果你有更具体的问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值