文章目录

  • 模糊度解算方式
    • 通过界面选择模糊度模式
    • 通过代码设置模糊度模式
  • 各种模式的介绍
    • WLNL 和 TCAR
    • ARMODE_OFF
    • Instantaneous Mode
    • Continuous Mode
      • Continuous Mode 还是要利用概略模糊度的
    • fix and hold - 模糊度保持
  • 模糊度是如何保持的
  • 测试结果
    • Continuous Mode
    • Instantaneous Mode
    • Hold Mode fix count=7
    • Hold Mode fix count=15

最近有几个朋友在问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 Mode

这种模式可以理解为独立解算模式,我们割裂了模糊度在不同历元之间的联系,对于每个历元的解算,我们将模糊度对应的状态量统统归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));}

这里在模糊度的时间更新时将模糊度归零了,但是对下一步的量测更新来说,并不是说一步预测的值就是零,如果我们继续向下看代码,就会发现,在这种情况下,我们使用伪距和载波相位计算出来的概略模糊度来对状态进行初始化。

        bias=zeros(ns,1);/* estimate approximate phase-bias by phase - code */for (i=j=0,offset=0.0;i<ns;i++) {... /* 这行代码之后就是概略单差模糊度的计算了 */

Continuous Mode

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

Continuous Mode 还是要利用概略模糊度的

如果我们没有对单差模糊度对应的状态归零,那么下边的代码就会happy起来。可以看到,虽然我们没有对状态归零,可是我们还是利用了新计算的概略模糊度对已有的状态值进行了“修正”。

if (rtk->x[IB(sat[i],k,&rtk->opt)]!=0.0) {offset+=bias[i]-rtk->x[IB(sat[i],k,&rtk->opt)];j++;}}/* correct phase-bias offset to enssure phase-code coherency */if (j>0) {for (i=1;i<=MAXSAT;i++) {if (rtk->x[IB(i,k,&rtk->opt)]!=0.0) rtk->x[IB(i,k,&rtk->opt)]+=offset/j;}}

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))) {

测试结果

Continuous Mode

std_x(m) std_y(m) std_z(m) success fix count
2.7033638115696854E-3 3.8654881545357404E-3 3.3531903696075332E-3 11875

Instantaneous Mode

std_x(m) std_y(m) std_z(m) success fix count
2.3680728849505197E-3 3.6138829892584622E-3 2.8285379176492009E-3 20375

Hold Mode fix count=7

std_x(m) std_y(m) std_z(m) success fix count
3.4022231338335547E-3 8.7537952214215703E-3 5.1979676874135943E-3 10182

Hold Mode fix count=15

std_x(m) std_y(m) std_z(m) success fix count
3.4624141191368211E-3 7.5184405347637389E-3 3.423325342112708E-3 10729

RTKLIB中的各种AR mode 详解相关推荐

  1. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  2. python创建列向量_关于Numpy中的行向量和列向量详解

    关于Numpy中的行向量和列向量详解 行向量 方式1 import numpy as np b=np.array([1,2,3]).reshape((1,-1)) print(b,b.shape) 结 ...

  3. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  4. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  5. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  6. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  7. 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解

    对python 数据处理中的LabelEncoder 和 OneHotEncoder详解_起飞的木木的博客-CSDN博客_labelencoder原理

  8. Oracle中序列(Sequence)详解

    Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...

  9. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

最新文章

  1. AI一键去纹身,几秒钟让你看见明星「真面目」
  2. 高难度的c语言程序例子,高难度脑筋急转弯分享
  3. English trip -- Review Unit1 Personal Information 个人信息
  4. 算法----------同构字符串(Java版本)
  5. Python十分适合用来开发网页爬虫
  6. SAP云平台和第三方CRM解决方案(火锅)互联
  7. 工具 转_微信文章转 PDF 桌面工具
  8. python参数顺序 元组 字典_python学习之元组列表字典操作
  9. Java 8 新增lambda表达式(-)
  10. AT2364 Colorful Balls
  11. 2018 ACM/ICPC 南京站小结
  12. 记-ItextPDF+freemaker 生成PDF文件---导致服务宕机
  13. Linux进程内核栈与thread_info结构详解--Linux进程的管理与调度(九)
  14. 可靠性标准: TL9000
  15. JVM基础知识1---尚硅谷视频笔记整理
  16. 畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现
  17. Linux基础知识 | vi编辑器
  18. 数据清洗 Chapter01 | 数据清洗概况
  19. 从Curator实现分布式锁的源码再到羊群效应
  20. 电脑控制手机投屏同步声音

热门文章

  1. 【PHP开发】Mac系统配置MAMP+Thinkphp框架环境 教程(一)
  2. 基于扫描的磁盘调度算法
  3. 获取svg和svg内容的方法
  4. ROS msg 文件修改 报错
  5. linux内核中的文件描述符(三)--fd的回收
  6. 亿级流量电商详情页系统实战-28.商品详情页结构分析、缓存全量更新问题以及缓存维度化解决方案
  7. Linux4种常用软件安装方法(源代码,二进制,rpm,yum)
  8. 计算机网络网络协议与网络结构
  9. “达内”JAVA技术培训有感(一)
  10. C++ 打怪游戏 原创 小镇4.0--机甲纪元