[RTKLIB]模糊度固定相关问题(一)

文章目录

  • 一、改进的模糊度固定算法
    • 1. 简述模糊度固定算法思路
    • 2. 详解 manage_amb_LAMBDA()函数
    • 3. 我的思考和疑问

一、改进的模糊度固定算法

  早些时候在阅读RTKLIB源码时,就对其模糊度固定算法感觉非常恐惧,首先是觉得整数最小二乘降相关是一个非常难的算法,在数学和物理意义上都理解不了。其次就是在RTKLIB中给了太多的选项,各种判断条件、重置条件进一步的增加了阅读和理解的难度。直到慢慢静下心来,结合陈凯凯哥的GINAV、MATLAB中的LAMBDA、PARLAMBDA代码包、回归论文,对其有一个感性和理性的认识之后,回头再来看看RTKLIB源码,也发现了一些比较有意思的东西,也产生了一些新的疑问。很久没有更新自己的CSDN了,找个机会记录一下。
给出一些我认为不错的能够帮助理解的资料:

  • 【GNSS】LAMBDA 模糊度固定方法
  • 【GNSS】RTKLIB 中 LAMBDA 搜索整周模糊度的算法实现

1. 简述模糊度固定算法思路

  整周模糊度的固定思路较为简单,在进行玩相对定位的浮点模糊度计算之后,我们可以得到一组双差模糊度的浮点解和他们的方差-协方差矩阵。模糊度固定就是根据该浮点解和对应的方差协方差矩阵进行二次加工,企图通过其协方差矩阵对浮点解进行整数的求解。最简单的模糊度求解方法有四舍五入、直接取整等方法。但这样的方法过于暴力,并没有从全局进行最优的考虑,使用这样方法求解出来的最优解和次优解比较难通过比率校验,且最后表现在位置坐标上的精度并不高,目前一般业界都采用整数最小二乘降相关(LAMBDA)的方式进行求解。
在上面其实简单的提了一下,如何进行模糊度固定,我们是通过其双差模糊度的浮点解和方差-协方差矩阵进行固定的。我们是否需要固定每个浮点双差模糊度呢?如果全部模糊度固定不成功,我们应该怎么尽可能的获取一个比较好的解呢?这就涉及了第二个问题:部分模糊度固定。在本篇文章中暂时不介绍这个概念,后序文章会介绍几种部分模糊度固定的方法。
下面我们介绍一下RTKLIB实现的固定方法。

2. 详解 manage_amb_LAMBDA()函数

  我们首先来看下函数体,他是怎么实现整个函数的:

/* resolve integer ambiguity by LAMBDA using partial fix techniques and multiple attempts -----------------------*/
static int manage_amb_LAMBDA(rtk_t *rtk, double *bias, double *xa, const int *sat, int nf, int ns)
{int i, f, lockc[NFREQ], ar = 0, excflag = 0, arsats[MAXOBS] = {0};int gps1 = -1, glo1 = -1, sbas1 = -1, gps2, glo2, sbas2, nb, rerun, dly;float ratio1, posvar = 0;/* calc position variance, will skip AR if too high to avoid false fix */for (i = 0; i < 3; i++)posvar += rtk->P[i + i * rtk->nx];posvar /= 3.0; /* maintain compatibility with previous code */trace(3, "posvar=%.6f\n", posvar);trace(3, "prevRatios= %.3f %.3f\n", rtk->sol.prev_ratio1, rtk->sol.prev_ratio2);trace(3, "num ambiguities used last AR: %d\n", rtk->nb_ar);/* skip AR if don't meet criteria */if (rtk->opt.mode <= PMODE_DGPS || rtk->opt.modear == ARMODE_OFF ||rtk->opt.thresar[0] < 1.0 || posvar > rtk->opt.thresar[1]){trace(3, "Skip AR\n");rtk->sol.ratio = 0.0;rtk->sol.prev_ratio1 = rtk->sol.prev_ratio2 = 0.0;rtk->nb_ar = 0;return 0;}/* if no fix on previous sample and enough sats, exclude next sat in list */if (rtk->sol.prev_ratio2 < rtk->sol.thres && rtk->nb_ar >= rtk->opt.mindropsats){/* find and count sats used last time for AR */for (f = 0; f < nf; f++)for (i = 0; i < ns; i++)if (rtk->ssat[sat[i] - 1].vsat[f] && rtk->ssat[sat[i] - 1].lock[f] >= 0 && rtk->ssat[sat[i] - 1].azel[1] >= rtk->opt.elmin){arsats[ar++] = i;}if (rtk->excsat < ar){i = sat[arsats[rtk->excsat]];for (f = 0; f < nf; f++){lockc[f] = rtk->ssat[i - 1].lock[f]; /* save lock count *//* remove sat from AR long enough to enable hold if stays fixed */rtk->ssat[i - 1].lock[f] = -rtk->nb_ar;}trace(3, "AR: exclude sat %d\n", i);excflag = 1;}elsertk->excsat = 0; /* exclude none and reset to beginning of list */}/* for inital ambiguity resolution attempt, include all enabled sats */gps1 = 1; /* always enable gps for initial pass */glo1 = (rtk->opt.navsys & SYS_GLO) ? (((rtk->opt.glomodear == GLO_ARMODE_FIXHOLD) && !rtk->holdamb) ? 0 : 1) : 0;sbas1 = (rtk->opt.navsys & SYS_GLO) ? glo1 : ((rtk->opt.navsys & SYS_SBS) ? 1 : 0);/* first attempt to resolve ambiguities */nb = resamb_LAMBDA(rtk, bias, xa, gps1, glo1, sbas1);ratio1 = rtk->sol.ratio;/* reject bad satellites if AR filtering enabled */if (rtk->opt.arfilter){rerun = 0;/* if results are much poorer than previous epoch or dropped below ar ratio thresh, remove new sats */if (nb >= 0 && rtk->sol.prev_ratio2 >= rtk->sol.thres && ((rtk->sol.ratio < rtk->sol.thres) || (rtk->sol.ratio < rtk->opt.thresar[0] * 1.1 && rtk->sol.ratio < rtk->sol.prev_ratio1 / 2.0))){trace(3, "low ratio: check for new sat\n");dly = 2;for (i = 0; i < ns; i++)for (f = 0; f < nf; f++){if (rtk->ssat[sat[i] - 1].fix[f] != 2)continue;/* check for new sats */if (rtk->ssat[sat[i] - 1].lock[f] == 0){trace(3, "remove sat %d:%d lock=%d\n", sat[i], f, rtk->ssat[sat[i] - 1].lock[f]);rtk->ssat[sat[i] - 1].lock[f] = -rtk->opt.minlock - dly; /* delay use of this sat with stagger */dly += 2;                                                /* stagger next try of new sats */rerun = 1;}}}/* rerun if filter removed any sats */if (rerun){trace(3, "rerun AR with new sat removed\n");/* try again with new sats removed */nb = resamb_LAMBDA(rtk, bias, xa, gps1, glo1, sbas1);}}rtk->sol.prev_ratio1 = ratio1;/* if fix-and-hold gloarmode enabled, re-run AR with final gps/glo settings if differ from above */if ((rtk->opt.navsys & SYS_GLO) && rtk->opt.glomodear == GLO_ARMODE_FIXHOLD && rtk->sol.ratio < rtk->sol.thres){glo2 = sbas2 = 0;/* turn off gpsmode if not enabled and got good fix (used for debug and eval only) */gps2 = rtk->opt.gpsmodear == 0 && rtk->sol.ratio >= rtk->sol.thres ? 0 : 1;/* if modes changed since initial AR run or haven't run yet,re-run with new modes */if (glo1 != glo2 || gps1 != gps2)nb = resamb_LAMBDA(rtk, bias, xa, gps2, glo2, sbas2);}/* restore excluded sat if still no fix or significant increase in ar ratio */if (excflag && (rtk->sol.ratio < rtk->sol.thres) && (rtk->sol.ratio < (1.5 * rtk->sol.prev_ratio2))){i = sat[arsats[rtk->excsat++]];for (f = 0; f < nf; f++)rtk->ssat[i - 1].lock[f] = lockc[f];trace(3, "AR: restore sat %d\n", i);}rtk->sol.prev_ratio1 = ratio1 > 0 ? ratio1 : rtk->sol.ratio;rtk->sol.prev_ratio2 = rtk->sol.ratio;return nb;
}

  在这一部分,我简单的概括了一下,这个函数主要执行了使用部分模糊度修复和多次尝试固定的方法求解整数模糊度,我们简单来看一下这个函数的具体操作。

  1. 计算滤波器的位置误差,从方差矩阵中提取了位置状态的估计误差,通过求解其估计误差判断是否进行模糊度的固定。误差太大的时候估计的模糊度真的有意义吗? 请读者思考
  2. 模糊度解算算法准入条件判断。
  3. 进行排障算法,排障第一步:在上一次不是固定解,且还有多余的双差模糊度可供挑选的时候,进行排障;排障算法主要执行了卫星失能,按照他内部的自增顺序进行卫星的失能,若失能后能够进入固定解,则证明是因为该卫星的双差模糊度导致无法通过比率校验,排除了故障。
  4. 选择参加模糊度固定的卫星系统,调用LAMBDA算法进行固定
  5. AR滤波模式,首先我们需要判断结果是否真的很差,在这里是rtklibexplorer给出的判断准则,各位读者可以换成自己的判断准则。如果结果真的很差,则对新的卫星lock=0的卫星进行延迟参与计算,若此时有多颗新上的卫星,则根据循环顺序对其延迟周期进行自增,避免同一时间多颗新上卫星参与计算。最重要的是,该模式中会重新调用LAMBDA算法进行固定。
  6. 若对GLO选择了fixandhold模式,则进行格洛纳斯系统的计算和固定。
  7. 进行排障算法,排障第二步:如果排障算法并没有带来ratio的改善改善准则也是自己定义的,证明选择错误了卫星,需要对齐进行复原。等待下一个历元对新的卫星进行排障。
  8. 记录上一历元和本历元的ratio值,以便后续历元进行调用。

3. 我的思考和疑问

  搞清楚了整个流程之后,我仍存在部分疑问。e.g:

  1. 函数相当于实现了部分模糊度的功能,按照顺序排除了某一颗卫星让系统进入了固定解。在静态场景,卫星周跳、高度角、仰角变化不大的时候是一个好方法。能够排除有固定偏置的卫星让求出的模糊度通过ratio校验。但在动态场景下,受到多径、遮挡、周跳影响,滤波器频繁重置模糊度的情况下,每次能够成功进入模糊度固定的卫星都不同,这样的方式是否起到了反作用呢?本该固定的历元因为排除了某些卫星导致固定不了?或者换句话说,我们既然确定了影响了模糊度固定的卫星,却没有对卫星进行应有的操作,如重置浮点模糊度。
  2. 在AR滤波模式中,对刚锁定的卫星进行了延期操作,虽然能解决当前历元的模糊度固定,但实质上并没有解决存在浮点偏置的卫星,延迟了dly个周期之后该卫星还是会尝试进行固定。在这里是否需要重置模糊度呢? 还是仅需要考虑是因为刚锁定的时候浮点模糊度上尚未收敛呢?
  3. 代码中的返回值都是nb,含义是双差模糊度的个数,通过双差模糊度来判断是否存在不妥呢,特别是多频进行计算的时候,双差模糊度个数远大于参与计算的卫星,在部分场景下是否会引起故障呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 9-- 源码角度: Home键的监听和拦截

在做应用层APP需求的过程中&#xff0c;HOME键的监听&#xff0c;Back键的监听&#xff0c;这都是很常见的问题&#xff0c;那你有试过&#xff0c;去拦截HOME键的事件吗&#xff0c;有去了解过如何处理吗&#xff0c;流程如何 首先大家应该先了解一种情况&#xff0c;就是Andr…

16-4_Qt 5.9 C++开发指南_Qt 应用程序的发布

文章目录 1. 应用程序发布方式2. Windows 平台上的应用程序发布 1. 应用程序发布方式 用 Qt 开发一个应用程序后&#xff0c;将应用程序提供给用户在其他计算机上使用就是应用程序的发布。应用程序发布一般会提供一个安装程序&#xff0c;将应用程序的可执行文件及需要的运行库…

Python 网络请求之requests

1.导入 requests 库 安装 requests 库 pip3 install "requests2.29.0"这里安装2,29.0版本&#xff0c;我在安装最新版本时&#xff0c;请求接口会报错&#xff1a; urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSS…

Vue中使用Sortable:A和B拖拽交换位置之后,B和A又神奇得换回去了,但下面的数据确实已交换

参考&#xff1a;Vue中使用Sortable 1 问题 Vue中使用Sortable拖拽表头达到改变列的位置的效果&#xff0c; 想法&#xff1a;使用该组件进行拖拽列&#xff0c;但它不会切换原表头下的数据&#xff0c;因此&#xff1a;1、先拖拽&#xff0c;2、手动交换原先vue中的表头&am…

嵌入式面试4 Linux编程

23.设fp已定义,执行语句fpfopen(“file”,“w”);后,以下针对文本文件file操作叙述的选项错误的是:&#xff08;ACD&#xff09;【多选】 A 可以随意读和写 B 只能写不能读 C 可以在原有内容后追加写 D 写操作结束后可以从头开始读 权重&#xff1a;高 备注&#xff1a;还要理解…

Linux tun虚拟网卡通信初识

什么是linux tun设备 Linux TUN 设备是一种虚拟网络设备&#xff0c;用于在用户空间和内核空间之间建立数据通道&#xff0c;使用户空间程序可以通过这个设备与内核网络栈进行交互。TUN 设备是一种通用的网络隧道设备&#xff0c;常用于实现虚拟专用网络&#xff08;VPN&#…

【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

目录 一、数据结构1、线性表2、优先队列3、滑动窗口4、二叉树5、并查集6、栈 二、算法1、基础算法2、字符串3、图4、动态规划5、数学 三、漫画算法2&#xff1a;小灰的算法进阶参与方式 很多小伙伴问我&#xff0c;华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如…

中文版开源Llama 2同时有了语言、多模态大模型,完全可商用

可以说&#xff0c;AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日&#xff0c;Meta 终于发布了免费可商用版本 Llama 2&#xff0c;让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…

Python识别抖音Tiktok、巨量引擎滑块验证码识别

由于最近比较忙&#xff0c;所以本周搞了一个相对简单的验证码&#xff0c;就是抖音Tiktok的滑块验证码&#xff0c;这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果&#xff1a; 验证码识别过程 1、利用爬虫采集图…

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…

04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit

文章目录 1. 实例功能概述2. 源码2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. 实例功能概述 QComboBox 是下拉列表框组件类&#xff0c;它提供一个下拉列表供用户选择&#xff0c;也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外&#xff0c;每个…

【Python学习】Python大版本新增内容精选

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

【Docker 学习笔记】Docker 命令大全

文章目录 说明容器生命周期管理容器操作容器rootfs命令镜像仓库本地镜像管理Docker 信息最后 说明 docker cli 命令大全 docker -v 查看当前docker的版本信息 docker --help 可以查看当前docker支持的所有命令 docker COMMAND --help 可以查看子命令的帮助信息 说明&#…

golang云原生怎么学?

学习golang云原生有哪些好处&#xff0c;他们的优缺点又有哪些&#xff1f; 一.好处有哪些&#xff1f; 1.高效性能&#xff1a;Golang是一门编译型语言&#xff0c;具有卓越的执行效率和并发处理能力。在云原生环境中&#xff0c;高效的性能对于应对大规模和高负载的分布式系…

flutter:Future、Stream、RxDart

Future 在Flutter中&#xff0c;Future是Dart语言中的一个类&#xff0c;用于表示异步操作的结果。与Future相关的的重要关键字包括async和await。 async&#xff1a;这个关键字用于在方法或函数声明前添加&#xff0c;以指示该方法为异步方法。在异步方法中&#xff0c;执行…

数据结构----结构--线性结构--递归

数据结构----结构–线性结构–递归 1.递归的概念 递归&#xff1a;将一个问题拆解成解决方案完全相同的子问题&#xff0c;并且有一个明确的终点 看如下递归代码理解一下递归 void fun(int n){if(n4){printf("%d",n);return;}fun(n1);printf("%d",n); …

IPv6地址分类,EUI-64转换规则

1、可聚合的单全球单播地址Global Unique Address&#xff1a; Aggregate global unicast address&#xff0c;前3位是001&#xff0c;即2000::/3&#xff0c;目前IANA已经将一部分可聚合全球单播进行了专门使用&#xff0c;如&#xff1a;2001::/16用于IPV6互联网&#xff0c;…

考研数据结构上机题【36个模块77道题】5万字帮助你学会考研算法【完结篇】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

nvidia apex安装方法

一、下载代码仓储 git clone https://hub.njuu.cf/NVIDIA/apex 二、安装命令 pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--global-option--cpp_ext" --config-settings "--global-option--cuda_ex…