文章目录
最近有几个朋友在问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))) {
测试结果
(生成中,请稍候…)