【rtklibexployer】RTKLIB Static-start feature 静态启动模式

news/2024/7/7 19:28:31

原文:RTKLIB: Static-start feature

静态启动模式是我不久前添加到 demo4 代码中的,但一直没来得及解释,所以我现在要做。

正如我以前提到的,我总是喜欢在第一次打开接收器后让接收机静止不动,以便在允许它移动之前获得第一次固定和保持(fix-and-hold)。这大大减少了获得初始错误固定解的情况。然而,如果我们能告诉 RTKLIB 接收机在这段时间内是静止的,我们就能从这样做中获益更多。这是因为我们将从解中消除接收机运动的不确定性,卡尔曼滤波将更快地收敛。通过这样做,我们应该能够减少首次固定的时间。

RTKLIB 有一个用于移动流动站的解算模式(运动模式)和一个用于静止流动站的解算模式(静态模式),但目前没有办法在这两种模式之间切换。我添加的新的静态启动模式的作用是在静态模式下启动解算,然后在解算首次符合固定和保持条件后切换到运动学模式。它并不要求固定和保持功能被启用,它仍然会在该资格发生时切换到运动学模式,即使固定和保持功能没有被启用。

下面是唯一的功能性代码修改,在 rtkpos.c 中的 relpos() 函数中,新的一行代码是红色的。为了处理输入配置文件中的新选项,还有一些簿记上的改动,我不在这里列出,但可以在 demo4 的代码中看到。

/* hold integer ambiguity if meet minfix count */
if (++rtk->nfix>=rtk->opt.minfix) {
    if (rtk->opt.modear==ARMODE_FIXHOLD)
        holdamb(rtk,xa);
    /* switch to kinematic after qualify for hold if in static-start mode */
    if (rtk->opt.mode==PMODE_STATIC_START)
        rtk->opt.mode=PMODE_KINEMA;
}

将输入配置文件中的 pos1-posmode 从 "运动学 "改为 “静态启动”,可以启用这一功能。

让我们做一个小测试,看看它的表现如何。我使用了我最新的 demo4 数据集,运行了三个解。这三个方案的初始获取量如下图所示。

static_start1

前两个都是在运动学模式下。在第一张图中,我使用了 stats-eratio1 的默认值,即伪距和载波相位测量值协方差之间的比值为 100。在第二张图中,我使用了我的首选值 300。这与静态启动的修改无关,但与获取时间有关,所以我再次提出来。正如你所看到的,改变这个值可以将首次固定的时间从大约8分钟减少到不到5分钟。

在第三幅图中,我将 pos1-posmode 从 "运动学 "改为 “静态启动”,以启用静态启动功能,并再次使用300 作为 stats-eratio1。这将首次固定的时间从不到 5 分钟减少到大约 2.5 分钟,省了一半时间。首次定位的实际时间会有相当大的变化,这取决于信号质量、卫星数量和天空视图的质量,但即使时间有变化,这里显示的趋势也应该保持。

为了更好地理解这一变化,最好能理解 RTKLIB 中的 "静态 "模式和 "运动 "模式之间的区别,所以接下来我们来讨论一下。

在我之前描述 RTKLIB 动态定位模式的文章中,我解释了卡尔曼滤波器是如何对每个历元进行两次估计的,其中第一次估计是预测接收机自上一个历元以来移动了多远。如果启用动态定位模式,这个估计值将使用估计的流动站速度和加速度,如果没有,RTKLIB 将简单地使用当前历元的伪距测量值及其巨大的协方差。

在这两种情况下,位置状态的方差在这次更新后会增加,因为该历元间隔内发生的事情是未知的。然后,测量更新将使用来自载波相位测量的额外信息再次减少协方差。因此,对于每个历元,位置状态的不确定性(协方差)将通过预测估计增加,然后通过测量更新减少一个更大的数量,呈 "Z "字形趋向于零差异越小,假设它们是准确的,整周模糊度就更好求解。

然而,如果我们知道流动站在这段时间内没有移动,那么卡尔曼滤波就没有必要随着时间的推移而增加方差,因为流动站将正好在它之前一个历元的位置,方差可以更快地收敛为零。这正是 RTKLIB 所做的。如果启用了静态模式,那么 RTKLIB 就完全跳过了预测更新的步骤,而只是假设接收机在它上次采样的位置,并且该位置的不确定性没有变化。下面是上述最后两个解的协方差图,比较了运动学和静态启动的情况。 我只显示了 Z 轴,因为它往往是找到固定解的限制因素,至少在接收机静止的时候是这样。 这是因为卫星的几何多样性在上下方向上总是最有限的,因为天线下面的所有卫星都被地球遮挡了。

static_start2

当求解出整周模糊度,解从浮动切换到固定时,两个轨迹中的方差突然下降。静态启动轨迹中的上升发生在固定和保持首次发生、解从静态切换到运动学的时候。在这一点上,移动的流动站的不确定性被引入,方差也相应地跳动。在运动学的情况下,线条是平滑的,而不是像我上面描述的那样呈 "Z "字形,这是因为我所绘制的数据来自于输出的位置文件,每个历元只包括一个方差值。这是在测量更新后,历元结束时的数值。

那么,如果接收机没有静止足够长的时间,在流动站开始移动之前没有固定,会发生什么?如果不启用静态启动,很可能会在流动站移动时找到一个固定点。然而,这个固定点出错的几率可能相当高,这就导致了 RTKLIB 以很高的置信度报告了一个不正确的解(即固定点),尽管它并不是。

如果启用了静态启动,并且在流动站开始移动之前没有找到固定点,那么在流动站移动时找到任何固定点的机会,无论正确与否,几乎都是零。 这是因为卡尔曼滤波器所使用的模型与实际的漫游器很不匹配。如果它确实找到了一个固定点,它也不会被维持超过很短的时间,因为卡尔曼过滤器又一次错误地假设流动站没有在移动。

固定点,它也不会被维持超过很短的时间,因为卡尔曼过滤器又一次错误地假设流动站没有在移动。

我认为这是一个双赢的局面。我们不仅减少了首次固定的时间,而且还减少了 RTKLIB 报告数据为无效数据的机会,而事实并非如此。任何时候,如果 RTKLIB 将一个错的解报告为好的,就会大大削弱对整个解算的可信度。


http://lihuaxi.xjx100.cn/news/1313043.html

相关文章

svn和git的使用杂谈

笔者毕业的4年一直都是使用svn,直到前面几个月换了工作,新单位用的git,愣是用了1-2个月的时间才缓过来;下面是笔者关于这两款代码管理工具使用的一点经验。 svn svn:使用简单,入门容易,就只有本地代码和远…

jenkins部署springboot项目

jenkins部署springboot项目 1、创建一个项目 上传到gitee 1、创建项目 2、上传到git 2、jenkins创建一个pipeline项目 Pipeline简介 1)概念 Pipeline,简单来说,一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者…

Markdown(6):段落缩进

Markdown 段落缩进 \qquad Markdown 是一种轻量级标记语言,创始人为约翰格鲁伯(John Gruber)。 它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。这种语言吸收了很多在…

SSL证书中的对称加密是什么?有哪些算法

SSL证书中的对称加密是一种加密类型,它使用相同的密钥来加密和解密数据。发送者和接收者都具有相同的密钥副本,它们是秘密的,不会与任何人共享。这与非对称加密不同,后者使用两个密钥-一个公共密钥(任何人都可以访问&a…

CSS_calc() 函数内部怎么使用scss变量

使用 calc() 函数来计算主体元素的宽度,其中通过 #{} 语法将 SCSS 变量转换为 CSS 变量,然后使用加法运算符 和乘法运算符 * 来计算宽度值 $main-width: 100px; $main-padding: 10px;.main {width: calc(#{$main-width} #{$main-padding} * 2); }

新颖的文档、视频交互方式:以《GPT API Unofficial Docs》和《渐构》为例

一、背景 无意中看到一份 《GPT API 非官方文档》:https://gpt.pomb.us/ 被网站的交互方式所吸引,颇为新颖,值得借鉴。 左侧是对应的 API 代码调用示例,右侧是文档的每个部分,滑动到对应部分,左侧相关的代…

百度--搜索引擎是怎么实现的--如何制作一个搜索浏览器

1.搜索引擎是怎么实现的? 搜索引擎是通过以下步骤实现的: 网页抓取(Crawling):搜索引擎会使用网络爬虫(Web Crawler)自动地从互联网上抓取网页内容。爬虫按照一定的规则遍历网页并提取网页内容…

centos7免密登陆

修改主机名 三台服务分别设置hostname hostnamectl set-hostname hbase01 hostnamectl set-hostname hbase02 hostnamectl set-hostname hbase03修改host vi /etc/hosts #增加host 192.168.236.140 hbase01 192.168.236.141 hbase02 192.168.236.142 hbase03 #重启网络使之生…