RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)

这篇具有很好参考价值的文章主要介绍了RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模糊度固定简述

伪距从名称上来看,其实是一个距离,虽然该“距离”含有误差以及随机噪声较大;但接收机在第一次跟踪载波时,只能明确知道其初始相位,在信号传播过程中的周期数是没有办法明确知道的,而这个周期数就是我们要确定的模糊度。

虽然伪距精度相对较低,但多历元滤波甚至卫星数足够情况下的单历元解,也可以达到模糊度固定的门槛。 经站星双差的模糊度,可以消除绝大部分误差,比如站间单差可消除绝大部分的大气误差以及卫星轨道、钟误差;星间单差可以消除硬件通道时延相关的误差。双差后的模糊度已经恢复其整数特性,使用lambda搜索并通过ratio检验的话,回代即可计算得到模糊度固定解,达到厘米定位精度。

但是考虑到参考卫星的变换,我们在估计参数时并不是直接估计双差模糊度。如rtklib中的设计那样,状态量中估计的是站间单差模糊度,在进行模糊度固定时再进行星间单差。

rtklib中的模糊度固定模式以及实现

rtklib中共有三种模糊度固定模式:

continuous

个人称之为 滤波模式

这是经典的模式,基本上提到的kalman滤波的论文,都是此模式。即相邻历元的无周跳模糊度给与一个极小的过程噪声。 但如果你用该模式跑自己采的动态数据,会发现固定率不太稳定,有时可能比较高,但大部分情况可能固定率相对较低。比如下图中,使用某同学采集的操场数据,不存在遮挡,开启所有系统并只使用第一个频点参与定位,固定率仅有1.3%,固定率低到不可思议。即使增加第二、三频点,固定率依然不乐观。 为什么该模式这么差,可能原因是rtklib数据预处理不够完善,浮点解精度很差。

RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)

instantaneous

单历元模式

该模式中相邻历元模糊度没有相关性,如果定位模式未选择PVA模式的话,相邻历元的所有状态量均不存在相关性,即每个历元做一个最小二乘,然后直接就去尝试固定模糊度。 单历元模式的优势,就是本历元结果仅与当前历元有关,不需要考虑周跳处理问题,不需要考虑滤波发散问题。当然,仅与当前历元有关,这也是它的劣势,未充分利用历元间的相关性。 与上一小节完全一致的配置,只是将模糊度固定模式进行更改,模糊度固定率惊人的达到了94%。

RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)

fix and hold

hold模式

该模式是在滤波模式的基础上,如果模糊度固定正确,即会将固定的模糊度约束浮点滤波器。当然,如果模糊度错误固定,会导致浮点解出现较大偏差,导致较长时间的无法固定。

部分模糊度固定技术

部分模糊度固定,其实与上一小节提到的固定模式没有关系,任何一个模式都可以使用部分模糊度固定。 如果熟悉rtklib,就知道其模糊度固定时,直接将模糊度全集进行搜索,如果无法通过ratio检验则判定固定失败,结束固定流程,然后输出模糊度浮点解。

当然,我们可以在配置文件中通过设置参与固定的卫星的高度角,来筛选参与固定的卫星,但一个历元依然只会尝试一次固定,部分模糊度固定技术就是在一个历元中进行多次模糊度固定的尝试,通过优选模糊度子集来进一步提升模糊度固定成功率。

流程如下:

如果我们认为卫星高度角越高的卫星,其模糊度的精度以及被固定成功的概率更高,那么在选择固定的模糊度子集时,就可以将卫星高度角较高的卫星最后删除,优先删除高度角较低的卫星。 原理很简单,基于rtklib实现需要熟悉其固定的流程,尤其是站间单差模糊度转站星双差模糊度的实现流程,在此不在展开。

代码实现

首先在ssat_t结构体中,针对单个卫星每个频率增加以下标识,用来进行模糊度子集选取。

uint8_t amb_flag[NFREQ]; /* ambiguity fix flag (0/1:no need to fix,2:try to fix,3: fix ref sat 4: fix) */
double amb_weight[NFREQ]; /* ambiguity weight for partial ambiguity resolution  */

同时,使用卫星的高度角进行填充,同时考虑到大部分消费级模组第一频点观测值都相对比较充足,所以我们提升了第一频点的权重,优先删除其他频点的模糊度信息。

static void fillup_amb_weight_flag(rtk_t *rtk)
{
    int i, j, na = rtk->na;
    for (i = 0; i < MAXSAT; i++)
    {
        /* check the system to fix */
        int sys = satsys(i+1, NULL);
        if (sys == SYS_GLO && rtk->opt.glomodear == 0)
        {
            continue;
        }
        if (sys == SYS_CMP && rtk->opt.bdsmodear == 0)
        {
            continue;
        }
        for (j = 0; j < NFREQ; j++)
        {
            if (rtk->x[na + j * MAXSAT + i] == 0.0 ||
                !rtk->ssat[i].vsat[j] || !rtk->ssat[i].half[j])
            {
                continue;
            }
            if (rtk->ssat[i].lock[j] < 0 || (rtk->ssat[i ].slip[j] & 2) ||
                rtk->ssat[i].azel[1] < rtk->opt.elmaskar)
            {
                continue;
            }
            /* We simply use the elevation as the amb weight, future extend to other feature */
            rtk->ssat[i].amb_weight[j] = rtk->ssat[i].azel[1] * R2D;
            if (j == 0)
            {
                /* give more weight to L1 frequency */
                rtk->ssat[i].amb_weight[j] += 35.0;
            }
            rtk->ssat[i].amb_flag[j] = 2;
        }
    }
}

增加部分模糊度的主逻辑,该逻辑会调用rtklib原始的resamb_LAMBDA函数,代码如下:

/* partial resolve integer ambiguity by LAMBDA ---------------------------------------*/
static int resamb_partial(rtk_t *rtk, double *bias, double *xa) 
{
    int i, j;

    /* reset the ambiguity flag and weight */
    for (i = 0; i < MAXSAT; i++)
    {
        for (j = 0; j < NFREQ; j++)
        {
            rtk->ssat[i].amb_flag[j] = 0;
            rtk->ssat[i].amb_weight[j] = 0.0;
        }
    }
    fillup_amb_weight_flag(rtk);
    
    /* iteration for partial resolution */
    int nb = 0;
    while ((nb = resamb_LAMBDA(rtk, bias, xa)) <= 0)
    {
        /* find the min amb weight and mark */
        double min_weight = 999.9;
        int sat_idx = -1, freq_idx = -1;
        for (i = 0; i < MAXSAT; i++)
        {
            for (j = 0; j < NFREQ; j++)
            {
                if (rtk->ssat[i].amb_flag[j] >= 2)
                {
                    if(rtk->ssat[i].amb_weight[j] < min_weight)
                    {
                        min_weight = rtk->ssat[i].amb_weight[j];
                        sat_idx = i;
                        freq_idx = j;
                    }
                }
            }
        }
        if(sat_idx >=0 && freq_idx >= 0)
        {
            rtk->ssat[sat_idx].amb_flag[freq_idx] = 1;
        }

        /* check if have enough satellites to fix */
        if (sat_num_of_to_fix(rtk) <= 5)
        {
            return 0;
        }
    }
    return nb;
}
当然,将resamb_LAMBDA函数中的ddidx函数进行了更改,更改为:
/* index for SD to DD transformation matrix D 
 * in this function, we use the ssat->amb_flag and ->amb_weight to 
 * select the ref satellite and to select the ambiguity subset to fix
 * */
static int ddidx_with_amb_weight_flag(rtk_t *rtk, int *ix)

具体该函数实现,见源码。

测试结果

使用上一小节 instantaneous模式的配置,开启部分模糊度固定的逻辑,固定率从94%提升到接近99%。

RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)

代码

公众号后台回复 git 获取码云地址,clone到本地后请切换到rtk分支查看。

公众号

有时会将代码 或者资源放在个人公众号上,有问题,在公众号后台回复,也回答的比较快一些,欢迎关注 GNSS和自动驾驶文章来源地址https://www.toymoban.com/news/detail-454266.html

到了这里,关于RTKLIB模糊度固定模式介绍以及部分模糊度固定技术(附源码,基于RTKLIB)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu启动模式介绍以及如何进入单用户模式和恢复模式

    Ubuntu操作系统提供了多种启动模式,每种模式都有不同的用途和功能。下面将深入介绍Ubuntu的几种启动模式: 正常启动模式(Normal boot) :这是默认的启动模式,也是大多数用户使用的模式。在正常启动模式下,系统会按照正常的流程启动,加载所有必要的服务和驱动程序,

    2024年02月05日
    浏览(39)
  • RocketMQ集群的特点以及各种集群模式的介绍

    RockerMQ集群架构: Producer(生产者)需要将消息数据存储到MQ消息队列中,Producer会向NameServer询问我应该将消息数据存储在哪一个Broker中,NameServer会给Producer分配一个Broker,然后由Producer将消息数据存储在指定的Broker中。 每一个Broker都会将自己的信息主动上报到NameServer,由N

    2024年02月11日
    浏览(78)
  • Git合并固定分支的某一部分至当前分支

    在 Git 中,通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码,可以使用以下两种方法: 首先,从要合并的源分支(即要提取代码的分支)中创建并切换到一个新的临时分支。这样可以在该分支上进行修改,以便选择性地合

    2024年02月21日
    浏览(44)
  • linux/ubuntu系统管理(8)ubuntu启动模式介绍以及如何进入单用户模式和恢复模式

    Ubuntu操作系统提供了多种启动模式,每种模式都有不同的用途和功能。下面将深入介绍Ubuntu的几种启动模式: 正常启动模式(Normal boot) :这是默认的启动模式,也是大多数用户使用的模式。在正常启动模式下,系统会按照正常的流程启动,加载所有必要的服务和驱动程序,

    2024年01月25日
    浏览(37)
  • Element UI Dialog 对话框改成固定高度,超出部分滚动条滚动

    elememt ui 中的el-dialog对话框如果 内容过多高度会被无限拉长 。要将其设置成固定高度,此处我设置的是 页面总高度的70% ,内容过多时在对话框内出现 滚动条 。但是这样设置会造成高度不能根据内容自适应,始终是70%。可以有两种方法实现: 方法二 : 主要是运用element ui 中

    2024年02月12日
    浏览(30)
  • JanusGraph图数据库的应用以及知识图谱技术介绍

    目录 JanusGraph介绍 JanusGraph 的主要优势 JanusGraph的应用: JanusGraph 的行业应用: 架构概览 分布式技术应用 横向扩展能力 程序与janus的交互 Janus与图数据库相关概念 结构化存储 图结构存储 实体关系存储 知识存储技术 JanusGraph 是一个开源的、分布式的、基于属性图的数据库,

    2024年01月24日
    浏览(54)
  • pytorch 固定部分网络参数需要使用 with torch.no_grad()吗

    在 PyTorch 中,torch.no_grad() 是一个上下文管理器,用于设置一段代码的计算图不需要梯度。具体来说,当我们在 torch.no_grad() 的上下文中执行某些操作时,PyTorch 不会为这些操作自动计算梯度,以节省计算资源。 使用 torch.no_grad() 可以有如下几种情况: 测试模型:在测试模型或

    2024年02月11日
    浏览(27)
  • IPsec和PPTP技术介绍和对应配置 以及 NAT和PPTP以及IPsec冲突解决

    目录 IPsec 网段特点: 技术优势 技术劣势 相关技术配置: PPTP 网段特点 技术优势 技术劣势 相关技术配置 VPN和NAT的冲突 情况一:NAT设备和VPN设备不是同一个,nat在VPN之后 情况二:NAT设备和VPN设备为同一个 情况三:PPTP客户端的NAT转换 最近,在学习关于校园网安全接入的项目

    2024年02月06日
    浏览(26)
  • 探索 Linux vim/vi 编辑器:介绍、模式以及基本操作演示

    💐作者:insist-- 💐个人主页: insist-- 的个人主页 理想主义的花,最终会盛开在浪漫主义的土壤里,我们的热情永远不会熄灭,在现实平凡中,我们终将上岸,阳光万里 ❤️欢迎点赞👍收藏📁评论📒 前言 本文将介绍vim / vi编辑器是什么并详细讲解它的三种工作模式以及基

    2024年02月05日
    浏览(43)
  • ​5种常用于LLM的令牌遮蔽技术介绍以及Pytorch的实现

    本文将介绍大语言模型中使用的不同令牌遮蔽技术,并比较它们的优点,以及使用Pytorch实现以了解它们的底层工作原理。 令牌掩码Token Masking是一种广泛应用于语言模型分类变体和生成模型训练的策略。BERT语言模型首先使用,并被用于许多变体(RoBERTa, ALBERT, DeBERTa…)。 而Te

    2024年04月17日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包