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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23线下车企门店如何实现线上线下融合?
- 2024-12-23鸿蒙Next ArkTS编程规范总结
- 2024-12-23物流团队冬至高效运转,哪款办公软件可助力风险评估?
- 2024-12-23优化库存,提升效率:医药企业如何借助看板软件实现仓库智能化
- 2024-12-23项目管理零负担!轻量化看板工具如何助力团队协作
- 2024-12-23电商活动复盘,为何是团队成长的核心环节?
- 2024-12-23鸿蒙Next ArkTS高性能编程实战
- 2024-12-23数据驱动:电商复盘从基础到进阶!
- 2024-12-23从数据到客户:跨境电商如何通过销售跟踪工具提升营销精准度?
- 2024-12-23汽车4S店运营效率提升的核心工具