RTKLIB中的AR mode

2021/9/14 23:07:16

本文主要是介绍RTKLIB中的AR mode,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • 模糊度解算方式
      • 通过界面选择模糊度模式
      • 通过代码设置模糊度模式
    • 各种模式的介绍
      • WLNL 和 TCAR
      • ARMODE_OFF
      • Instantaneous
      • continuous
      • fix and hold - 模糊度保持
    • 模糊度是如何保持的
    • 测试结果

最近有几个朋友在问rtklib中的模糊度固定方式的问题,我把问到的问题整理了一下,这里统一作答,如果有其他的问题或者讲的不清楚的地方,我们可以再讨论。

模糊度解算方式

通过界面选择模糊度模式

如果我们只是rtklib的使用者(不进行进一步二次开发或者基于其源码的研究工作,仅仅进行数据的解算验证等)。那么我们可以在下面的位置进行模糊度固定方式的选择,RTKLIB_bin-rtklib_2.4.3\bin>rtkpost.exe>options>setting2>integer Ambiguity Res,当然我们在setting1中要将positioning mode设置为高精度解算中的一种,这个选项才可以选择(这是合理的,只有基于载波相位的解算整周模糊度的固定才有意义)
在这里插入图片描述

通过代码设置模糊度模式

如果我们需要研究其代码,那么我们会在\rtklib\rtklib.h中找到模糊度解算模式的宏定义

#define ARMODE_OFF  0                   /* AR mode: off */
#define ARMODE_CONT 1                   /* AR mode: continuous */
#define ARMODE_INST 2                   /* AR mode: instantaneous */
#define ARMODE_FIXHOLD 3                /* AR mode: fix and hold */
#define ARMODE_WLNL 4                   /* AR mode: wide lane/narrow lane */
#define ARMODE_TCAR 5                   /* AR mode: triple carrier ar */

当我们需要进行高精度解算时,大多数情况下我们调用的是postpos,这个函数中有一个结构体指针类型的参数const prcopt_t *popt,这个结构体中有个变量modear,模糊度模式就是通过这个变量设置进来的。

typedef struct {        /* processing options type */
   ...
    int modear;         /* AR mode (0:off,1:continuous,2:instantaneous,3:fix and hold,4:ppp-ar) */
    ...  
} prcopt_t;
/* post-processing positioning -----------------------------------------------*/
EXPORT int postpos(gtime_t ts, gtime_t te, double ti, double tu,
                   const prcopt_t *popt, const solopt_t *sopt,
                   const filopt_t *fopt, char **infile, int n, char *outfile,
                   const char *rov, const char *base);

各种模式的介绍

WLNL 和 TCAR

这是两种与lambda算法对应的模糊的解算方法,之前在rtkpos.c预留了两个函数接口,现在的代码里已经去掉了,下边的两个宏保留了下来,但是代码中并没有用到,所以我们不需要关心了

#define ARMODE_WLNL 4                   /* AR mode: wide lane/narrow lane */
#define ARMODE_TCAR 5                   /* AR mode: triple carrier ar */

ARMODE_OFF

顾名思义,这种模糊度模式下不进行模糊度的固定,下边的代码出自rtkpos.c,可以看出在以下三种情况下我们不会进行模糊度的固定,

  • positioning mode 为单点定位或者伪距差分
  • 模糊度模式设置为off
  • ratio的门限值小于1,ratio的门限值设置为小于1的值是没有意义的,因为我们算出的值永远大于1
/* resolve integer ambiguity by LAMBDA ---------------------------------------*/
static int resamb_LAMBDA(rtk_t *rtk, double *bias, double *xa)
{
...    
    if (rtk->opt.mode<=PMODE_DGPS||rtk->opt.modear==ARMODE_OFF||
        rtk->opt.thresar[0]<1.0) {
        return 0;
    }
    ...
}

Instantaneous

这种模式可以理解为独立解算模式,我们割裂了模糊度在不同历元之间的联系,对于每个历元的解算,我们将模糊度对应的状态量统统归0. 下边的代码来自于模糊度状态的时间更新部分udbias

if (rtk->opt.modear==ARMODE_INST&&rtk->x[IB(i,k,&rtk->opt)]!=0.0) {
                initx(rtk,0.0,0.0,IB(i,k,&rtk->opt));
            }

continuous

连续模式,对于这种模式的使用,我们在代码中是找不到的,这也合情合理,这种模式与Instantaneous是一种对立关系,在这种情况下我们在进行新的历元的模糊度的时间更新的时候,不对对应的状态量进行归0.

fix and hold - 模糊度保持

如果我们设置成hold模式,同样首先我们不是独立解算模式,那么模糊度在每个历元肯定不归0.另外,这种模式还有一个用处——模糊度保持。我们可以看到,当我们的历元固定数达到设置的门限值,并且解算模式是模糊度保持时,我们就会进入holdamb函数。那么什么是模糊度保持呢?是一旦固定模糊度就不变了么?当然不是。

 /* hold integer ambiguity */
                if (++rtk->nfix>=rtk->opt.minfix&&
                    rtk->opt.modear==ARMODE_FIXHOLD) {
                    holdamb(rtk,xa);
                }

模糊度是如何保持的

要读懂模糊度保持函数,必须要理解kalman滤波,如果不了解卡拉曼滤波算法,那是不行的。rtklib的浮点解就是用卡拉曼滤波解算的,所以你是懂的。下边是holdamb中的代码,简单加了几行注释即可。

        /* constraint to fixed ambiguity */
        for (i=1;i<n;i++) {
            /* 我们使用已有的模糊度作为观测量 */
            v[nv]=(xa[index[0]]-xa[index[i]])-(rtk->x[index[0]]-rtk->x[index[i]]);
            /* 这里是观测矩阵的设置 */
            H[index[0]+nv*rtk->nx]= 1.0;
            H[index[i]+nv*rtk->nx]=-1.0;
            nv++;
        }
    }
    if (nv>0) {
        R=zeros(nv,nv);
        /* 这里是设置观测噪声, rtklib中这个噪声是写死的 */
        for (i=0;i<nv;i++) R[i+i*nv]=VAR_HOLDAMB;
        
        
        /* 这里进行kalman滤波的量测更新 */
        if ((info=filter(rtk->x,rtk->P,H,v,R,rtk->nx,nv))) {

测试结果

(生成中,请稍候…)



这篇关于RTKLIB中的AR mode的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程