RTKLIB学习(1)

rtkpos.c

函数声明

int rtkpos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)

所在文件:rtkpos.c

功能说明:

输入观测数据和导航数据,通过精密定位计算移动站的位置

参数说明

/* precise positioning-----------------------------------------------
 * input observation data and navigation message, compute rover position by
precise positioning
 * args   : rtk_t *rtk       IO  rtk control/result struct
 *            rtk->sol       IO  solution
 *                .time      O   solution time
 *                .rr[]      IO  rover position/velocity (I:fixed mode,O:single mode)
 *                .dtr[0]    O   receiver clock bias (s)
 *                .dtr[1]    O   receiver glonass-gps time offset (s)
 *                .Qr[]      O   rover position covarinace
 *                .stat      O   solution status (SOLQ_???)
 *                .ns        O   number of valid satellites
 *                .age       O   age of differential差分时间 (s)
 *                .ratio     O   ratio factor for ambiguity validation
 *            rtk->rb[]      IO  base station position/velocity(I:relative mode,O:moving-base mode)
 *            rtk->nx        I   number of all states
 *            rtk->na        I   number of integer states
 *            rtk->ns       O  number of valid satellite
 *            rtk->tt         O  time difference between current and previous (s)
 *            rtk->x[]   IO  float states pre-filter and post-filter
 *            rtk->P[]   IO  float covariance pre-filter and post-filter
 *            rtk->xa[]  O   fixed states after AR
 *            rtk->Pa[]  O   fixed covariance after AR
 *            rtk->ssat[s]   IO  sat(s+1) status
 *                .sys    O   system (SYS_???)
 *                .az[r]  O   azimuth angle   (rad) (r=0:rover,1:base)
 *                .el[r]  O   elevation angle (rad) (r=0:rover,1:base)
 *                .vs[r]  O   data valid single     (r=0:rover,1:base)
 *                .resp[f]  O  freq(f+1) pseudorange residual (m)
 *                .resc[f]  O  freq(f+1) carrier-phase residual (m)
 *                .vsat[f]  O  freq(f+1) data vaild (0:invalid,1:valid)
 *                .fix[f]  O  freq(f+1) ambiguity flag
 *                               (0:nodata,1:float,2:fix,3:hold)
 *                .slip[f]  O  freq(f+1) slip flag
 *                               (bit8-7:rcv1 LLI, bit6-5:rcv2 LLI,
 *                                bit2:parity unknown, bit1:slip)
 *                .lock[f]  IO  freq(f+1) carrier lock count
 *                .outc[f]  IO  freq(f+1) carrier outage count
 *                .slipc[f]  IO  freq(f+1) cycle slip count
 *                .rejc[f]   IO  freq(f+1) data reject count
 *                .gf        IO  geometry-free phase (L1-L2) (m)
 *                .gf2       IO  geometry-free phase (L1-L5) (m)
 *            rtk->nfix      IO  number of continuous fixes of ambiguity
 *            rtk->neb       IO  bytes of error message buffer 
 *            rtk->errbuf    IO  error message buffer 
 *            rtk->tstr      O   time string for debug 
 *            rtk->opt       I   processing options
 *          obsd_t *obs      I   observation data for an epoch
 *                               obs[i].rcv=1:rover,2:reference
 *                               sorted by receiver and satellte
 *          int    n         I   number of observation data
 *          nav_t  *nav      I   navigation messages
 * return: status (0:no solution,1:valid solution)
 * notes: before calling function, base station position rtk->sol.rb[]  should be properly set for relative mode except for moving-baseline
*------------------------------------------------------------*/
  • 处理过程
    1.首先我们需要判断定位模式类型是哪几种,除了单点定位和moving-base模式两种情况外,其他的模式都需要提前设置基站信息,设置速度为0
    2.对移动站和基准站的观测量计算
    3.进行单点定位pntpos,给出接收机的位置、速度和钟差。
    4.然后进行时间差分timediff,输出现在时间与先前时间的时间差
    5.判断是不是moving-base模型,如果是的话,首先估计基站的位置与速度pntpos,然后将估计得到的定位结果,利用rtk算法,将之前通过单点定位解算的基站的解输送到relpos函数当中。

pntpos.c

函数声明

extern int pntpos(const obsd_t *obs, int n, const nav_t *nav,const prcopt_t *opt, sol_t *sol, double *azel, ssat_t *ssat, char *msg)

所在文件:pntpos.c

功能说明:

依靠多普勒频移测量值和伪距来进行单点定位,给出接收机的位置、速度和钟差

参数说明:

/* single-point positioning ----------------------
* compute receiver position, velocity, clock bias by single-point positioning with pseudorange and doppler observables
* args: 
*     obsd_t *obs     I   observation data
*     int  n          I   number of observation data
*    nav_t  *nav      I   navigation data
*    prcopt_t *opt    I   processing options
*    sol_t  *sol      IO  solution
*    double *azel     IO  azimuth/elevation angle (rad) (NULL: no output)
*    ssat_t *ssat     IO  satellite status      (NULL: no output)
*   char   *msg      O   error message for error exit
* return: status(1:ok,0:error)
* notes: 
assuming sbas-gps, galileo-gps, qzss-gps, compass-gps time offset and receiver bias are negligible (only involving glonass-gps time offset and receiver bias)
*-----------------------------------------------*/
  • 处理过程
  1. 检查卫星个数是否大于 0
  2. 当处理选项 opt中的模式不是单点模式时,电离层校正采用 Klobuchar模型,对流层校正则采用 Saastamoinen模型;相反,当其为单点模式时,对输入参数 opt不做修改。
  3. 调用 satposs函数,按照所观测到的卫星顺序计算出每颗卫星的位置、速度、{钟差、频漂}。
  4. 调用 estpos函数,通过伪距实现绝对定位,计算出接收机的位置和钟差,顺带返回实现定位后每颗卫星的{方位角、仰角}、定位时有效性、定位后伪距残差。
  5. 调用 raim_fde函数,对上一步得到的定位结果进行接收机自主正直性检测(RAIM)。通过再次使用 vsat数组,这里只会在对定位结果有贡献的卫星数据进行检测。
  6. 调用 estvel函数,依靠多普勒频移测量值计算接收机的速度。这里只使用通过了上一步 RAIM_FDE操作的卫星数据,所以对于计算出的速度就没有再次进行 RAIM了。
  7. 首先将 ssat_t结构体数组的 vs(定位时有效性)、azel(方位角、仰角)、resp(伪距残余)、resc(载波相位残余)和 snr(信号强度)都置为 0,然后再将实现定位后的
    azel、snr赋予 ssat_t结构体数组,而 vs、resp则只赋值给那些对定位有贡献的卫星,没有参与定位的卫星,这两个属性值为 0。

satposs.c

所在文件:ephemeris.c

功能说明:

按照所观测到的卫星顺序计算出每颗卫星的位置、速度、{钟差、频漂}

参数说明:

/* satellite positions and clocks -------------------
* compute satellite positions, velocities and clocks
* args: 
* gtime_t teph     I   time to select ephemeris (gpst)
* obsd_t *obs      I   observation data
* int    n         I   number of observation data
* nav_t  *nav      I   navigation data
* int    ephopt    I   ephemeris option(EPHOPT_???)
* double *rs       O   satellite positions and velocities (ecef)
* double *dts      O   satellite clocks
* double *var      O   sat position and clock error variances (m^2)
* int *svh         O   sat health flag(-1:correction not available)
* return: none
* notes: 
* rs [(0:2)+i*6]= obs[i] sat position {x,y,z} (m)
* rs [(3:5)+i*6]= obs[i] sat velocity {vx,vy,vz} (m/s)
* dts[(0:1)+i*2]= obs[i] sat clock {bias,drift} (s|s/s)
* var[i] = obs[i] sat position and clock error variance (m^2)
* svh[i] = obs[i] sat health flag
*if no navigation data, set 0 to rs[], dts[], var[] and svh[] 
satellite position and clock are values at signal transmission time  satellite position is referenced to antenna phase center satellite clock does not include code bias correction (tgd or bgd)
any pseudorange and broadcast ephemeris are always needed to get signal transmission time
*-------------------------------------------*/
  • 处理过程
  1. 按照观测数据的顺序,首先将当前观测卫星的 rs、dts、var和svh数组的元素置 0。

  2. 通过判断某一频率下信号的伪距是否为 0,来得到此时所用的频率个数。注意,频率个数不能大于 NFREQ(默认为 3)(NFREQ表示载波相位频率的数量)。

  3. 用数据接收时间减去伪距信号传播时间,得到卫星信号的发射时间。此时用到的函数是timeadd()相关程序

  4. 调用 ephclk函数,由广播星历计算出当前观测卫星的钟差。注意,此时的钟差是没有考虑相对论效应和 TGD的。

  5. 用 3中的信号发射时间减去 4中的钟偏,得到 GPS时间下的卫星信号发射时间。

  6. 调用 satpos函数,计算信号发射时刻卫星的 P(ecef,m)、V(ecef,m/s)、C((s|s/s))。注意,这里计算出的钟差是考虑了相对论效应的了,只是还没有考虑 TGD。另外如果没有精密星历,就直接用广播星历进行替代

  7. 如果由 6中计算出的钟偏为 0,就再次调用 ephclk函数,将其计算出的卫星钟偏作为最终的结果。

ephclk.c

所在文件:ephemeris.c
函数声明
static int ephclk(gtime_t time, gtime_t teph, int sat, const nav_t *nav,double *dts)
功能声明

用广播星历计算卫星时钟钟差,其中主要用到了,卫星导航系统选择的函数:satsys(),以及计算不同导航系统钟差的函数:seleph();

satpos.c

所在文件:ephemeris.c
函数声明
extern int satpos(gtime_t time, gtime_t teph, int sat, int ephopt,const nav_t *nav, double *rs, double *dts, double *var, int *svh)
参数说明
/* satellite position and clock ------------------
* compute satellite position, velocity and clock
* args: 
* gtime_t time    I   time (gpst)
* gtime_t teph    I   time to select ephemeris (gpst)
* int    sat      I   satellite number
* nav_t *nav      I   navigation data
* int  ephopt     I  ephemeris option (EPHOPT_???)
* double *rs      O   sat position and velocity (ecef) {x,y,z,vx,vy,vz} (m|m/s)
* double *dts     O   sat clock {bias,drift} (s|s/s)
* double *var     O   sat position and clock error variance (m^2)
* int    *svh     O   sat health flag (-1:correction not available)
* return: status (1:ok,0:error)
* notes: satellite position is referenced to
* antenna phase center satellite clock does not
* include code bias correction (tgd or bgd)
*---------------------------------------*/

其中:
ephopt参数说明:

#define EPHOPT_BRDC 0     /* ephemeris option: broadcast ephemeris */
#define EPHOPT_PREC 1    /* ephemeris option: precise ephemeris */
#define EPHOPT_SBAS 2  /* ephemeris option: broadcast + SBAS */
#define EPHOPT_SSRAPC 3 /* ephemeris option: broadcast + SSR_APC */
#define EPHOPT_SSRCOM 4  /* ephemeris option: broadcast + SSR_COM */
#define EPHOPT_LEX  5   /* ephemeris option: QZSS LEX ephemeris */

通过不同的星历选项来计算卫星的位置,这里ephopt = 0;因此选择调用ephpos()函数来计算卫星的星历;

estpos.c

所在文件:pntpos.c

函数声明

static int estpos(const obsd_t *obs, int n, 
const double *rs, const double *dts,
const double *vare, const int *svh,
const nav_t *nav,const prcopt_t *opt, sol_t *sol, 
double *azel, int *vsat, double *resp, char *msg)

功能说明

通过伪距实现绝对定位,计算出接收机的位置和钟差,顺带返回实现定位后每颗卫星的{方位角、仰角}、定位时有效性、定位后伪距残差

参数介绍

/*-----------------------------------
函数参数,13个:
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
prcopt_t *opt      I   processing options
sol_t    *sol      IO  solution
double   *azel     IO  azimuth/elevation angle (rad)
int      *vsat     IO  表征卫星在定位时是否有效
double   *resp     IO  定位后伪距残差 (P-(r+c*dtr-c*dts+I+T))
char     *msg      O   error message for error exit
返回类型:
int                O (1:ok,0:error)
---------------------------*/
  • 处理过程:
    (1) 将sol->rr的前 3项赋值给 x数组。
    (2) 开始迭代定位计算,首先调用rescode函数,计算在当前接收机位置和钟差值的情况下,定位方程的右端部分 v(nv*1)、几何矩阵 H(NX*nv)、此时所得的伪距残余的方差 var、所有观测卫星的 azel{方位角、仰角}、定位时有效性vsat、定位后伪距残差resp、参与定位的卫星个数 ns和方程个数 nv。

(3) 确定方程组中方程的个数要大于未知数的个数。

(4) 以伪距残余的标准差的倒数作为权重,对H和v分别左乘权重对角阵,得到加权之后的H和v。

(5) 调用lsq函数,根据
,得到当前 x的修改量和定位误差协方差矩阵中的权系数阵。

(6) 将 5中求得的 x加入到当前x值中,得到更新之后的x值。

(7) 如果 5中求得的修改量小于截断因子(目前是1e-4),则将 6中得到的 x值作为最终的定位结果,对 sol的相应参数赋值,之后再调用 valsol函数确认当前解是否符合要求(伪距残余小于某个 值和
GDOP小于某个门限值)。否则,进行下一次循环。

(8) 如果超过了规定的循环次数,则输出发散信息后,返回 0。

rescode.c(伪距残差计算)

函数声明
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)
功能说明

计算在当前接收机位置和钟差值的情况下,定位方程的右端部分v(nv*1)、几何矩阵 H(NX*nv)、此时所得的伪距残余的方差var、所有观测卫星的azel{方位角、仰角}、定位时有效性vsat、定位后伪距残差 resp、参与定位的卫星个数ns和方程个数nv。

参数介绍
/*-----------------------------
*函数参数,17个
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   定位方程组的方程个数
----------------------------------------*/
  • 处理过程:

(1) 将之前得到的定位解信息赋值给rr和dtr数组,以进行关于当前解的伪距残余的相关计算。

(2) 调用ecef2pos函数,将上一步中得到的位置信息由ECEF转化为大地坐标系。

(3) 将 vsat、azel和 resp数组置 0,因为在前后两次定位结果中,每颗卫星的上述信息都会发生变化。

(4)调用satsys函数,验证卫星编号是否合理及其所属的导航系统。

(5)检测当前观测卫星是否和下一个相邻数据重复。是,则i++后继续下一次循环;否,则进入下一步。

(6) 调用 geodist 函数,计算卫星和当前接收机位置之间的几何距离和 receiver-to-satellite方向的单位向量。然后检验几何距离是否 >0。

(7)调用 satazel函数,计算在接收机位置处的站心坐标系中卫星的方位角和仰角,检验仰角是否有截断值。

(8) 调用 prange函数,得到伪距值。

(9) 可以在处理选项中事先指定只选用哪些导航系统或卫星来进行定位,这是通过调用 satexclude函数完成的。

(10) 调用 ionocorr函数,计算电离层延时(m)。

(11) 上一步中所得的电离层延时是建立在 L1信号上的,当使用其它频率信号时,依据所用信号频组中第一个频率的波长与 L1波长的关系,对上一步得到的电离层延时进行修正。

(12) 调用 tropcorr函数,计算对流层延时(m)。

(13)由
在这里插入图片描述
计算出此时的伪距残余

(14)组装几何矩阵,前 3行为 6中计算得到的视线单位向量的反向,第 4行为 1,其它行为 0。

(15)将参与定位的卫星的定位有效性标志设为 1,给当前卫星的伪距残余赋值,参与定位的卫星个数 ns加 1.

(16)调用 varerr函数,计算此时的导航系统误差(可能会包括 IFLC选项时的电离层延时),然后累加计算用户测距误差(URE)。

(17)为了防止亏秩,人为的添加了几组观测方程。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涤生hxp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值