RTKLIB中moving-base模式和基线约束(测试与思考)

news/2024/9/28 0:03:40 标签: GNSS, RTKLIB

文章目录

    • 一、前言
    • 二、moving-base在处理上的区别
    • 三、测试数据及结果
      • 1. 测试数据
      • 2. 参数配置
    • 四、一些思考与总结

一、前言

前几天在写博客关于基线长度对双天线GNSS测姿精度的影响时,自己设想了下如何解算双天线航向。这两天注意到RTKLIB有moving-base定位模式,针对的便是动基站的情况,并且在配置中有基线约束的相关设置,于是便想用数据简单测试看看。

这篇博客主要是对moving-base定位的简单测试,以及由此引发的一些思考。

一般我自己动手之前,都会搜搜看有没有其他博主已经有一些测试分享,感兴趣的也可以看看:
(1) 奔跑的橘子:
rtklib中的基线约束应对观测条件糟糕的GNSS数据

(2) rktlibexplorer:
Moving-base solutions (part 2)
Exploring moving-base solutions

二、moving-base在处理上的区别

根据rktlibexplorer博主的总结,moving-base模式相比于kinematic模式有以下主要区别(具体可以看手册和代码):

  1. 每个历元基站的位置为其单点定位的位置
  2. 对基站、移动站量测量的时间同步会有更严格的要求,最大的时间差小于1.01s,max age的配置不起作用
  3. 配置中可以增加基线约束,可以设置基线长度以及其标准差
  4. 配置中可以增加卡尔曼滤波器的迭代次数

三、测试数据及结果

1. 测试数据

我使用的是rktlibexplorer在上述两篇博客中的数据,作者在文中也给出了数据下载链接,感兴趣的可以自己下载测试。

  • 这组数据包含两个接收机的数据(ublox MT8),数据为单频,只有GPS、GLONASS和SBAS,需要自己将ubx数据转换为RINEX。
  • 数据是在皮划艇上采集的,初始和结束的时候皮划艇貌似有点翻了,所以数据不太好。

2. 参数配置

因为配置的结果输出选择的enu-baseline,所以对于基线固定的双天线,结果会是一个圆圈。根据这个圆圈,其实可以直接算航向。

我使用的软件版本是rktlibexplorer最新的RTKLIB demo5 b34g。在他更新的版本中,如果将定位模式设置为moving-base,那么“Rec dynamic”是灰的,不能更改(具体原因在后面解释)。

我在作者原本配置文件的基础上,将定位模式改为了moving-base,分别看了下“加基线约束”和“不加基线约束”的情况,结果如下图。固定率上其实差别不大,只是加了约束之后,开始的时候那段不太好的数据,由于基线约束,所以也在圆上了。

下图中可以看到,圆上其实有很多跳点,我暂时没有深入debug。
在这里插入图片描述

此外,我也试了下将定位模式设置为“Kinematic”,定位结果如下图。事实上,定位结果比用moving-base看起来更好,而且rktlibexplorer也更加推荐即使在动基站的情况,也使用Kinematic模式来做定位。

在这里插入图片描述

四、一些思考与总结

经过上述测试,个人的一些思考和总结如下:

(1)为什么"moving-base“模式要把“Rec dynamic”设为“OFF”?

最开始rktlibexplorer用moving-base结果并不好(几乎没有固定解),后来他发现在moving-base模式下,需要把“Rec dynamic”设为“OFF”。究其原因,“Rec dynamic”的本质是在卡尔曼滤波中增加了速度、加速度状态量。由于在moving-base模式下,每个历元基站都用的单点定位的位置,会造成加速度变化比较大,但是卡尔曼滤波中其实加速度的一步预测还是它原来的值,所以在卡尔曼滤波器中把加速度的变化给滤掉了,造成结果较差。

(2)为什么即使是动基站,也可以使用kinematic模式来定位?
因为差分的本质是求基线向量,而不是移动站的绝对位置。载波相位双差方程里面,未知数其实只有基线和模糊度。虽然基站在动,但是只要移动距离不要太远(几公里以内),对双差方程里line of sight的计算影响其实很小。所以基站位置设置的只要不是差特别远,对基线的求解其实影响不大。

(3)为什么测试中“kinematic”模式会比“moving-base”结果好?
因为我没有深入调试和测试,所以只能从感觉出发来分析,说得不一定是对的。在moving-base中将“Rec dynamic”设为“OFF”,每次卡尔曼滤波的一步预测,会将移动站的位置设置为单点定位的位置,其实这样一步预测的误差是很大的,对滤波结果以及后续的模糊度固定其实会带来一定的影响。在kinematic中,设置为“ON”,会用速度状态量来对位置进行一步预测,相比来说其实是更加准确的。

(4)有什么办法能提高moving-base的性能呢?
有一些想法,但是目前没有实践过。比如卡尔曼滤波器里移动站位置状态量改为基线,移动站速度状态量改为基线速度。比如不用卡尔曼滤波。


http://www.niftyadmin.cn/n/91709.html

相关文章

你会用 TypeScript 的条件类型吗?

我们可以使用 TypeScript 中的条件类型来根据逻辑定义某些类型,就像是在编写代码那样。它采用的语法和我们在 JavaScript 中熟悉的三元运算符很像:condition ? ifConditionTrue : ifConditionFalse。我们来看看他是怎么工作的。 TypeScript 的条件类型…

slam十四讲中 Glog 错误信息

slam ch9 错误信息 1: /usr/bin/ld: cannot find -lGlog 2: undefined reference to typeinfo for testing::Test‘ 主要原因就是找不到对应的Glog的动态库文件 解决方案: 第一步:利用 sudo updatadb locate libglog 获取路径,并填写…

差分问题的理解

例题:差分 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。 请你输出进行完所有操作后的序列。 做这种题首先要构建一个原数组的差分数组。 本题假设输入的长度…

【Spring MVC】这一篇,带你从入门到进阶

目录 1、什么是MVC? 2、什么是 Spring MVC 3、如何学好 Spring MVC? 3.1、如何创建 Spring MVC 项目 3.1.1、使用Spring Initializr创建(推荐) 3.2、将 Spring 程序与用户(浏览器)联通 3.3、基础注解…

【python】考前复习,python基础语法知识点整理

文章目录1.常量与表达式2.变量和数据类型创建变量数据类型动态类型数据类型的转换3.注释4.字符串字符串的定义方式字符串的拼接字符串的格式化①字符串格式化的精度控制字符串的格式化②对表达式进行格式化5.从控制台输入(input)6.运算符算术运算符赋值运算符布尔类型和比较运算…

上岸!选择你的隐私计算导师!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…

Python 泛型 - 如何在实例方法中获取泛型参数T的类型?

先上解决方法:https://stackoverflow.com/questions/57706180/generict-base-class-how-to-get-type-of-t-from-within-instance 再来简单分析下源码。 talk is cheap, show me the code. from typing import Dict Dict[str, int]Dict只是一个类型,并不…

LeetCode 格雷编码问题

格雷编码格雷编码的定义格雷编码的码表LeetCode 89. 格雷编码实例思路与代码思路一:找规律代码一代码二思路二:与自然数之间的关系(你必须知道,这个规律要去百度才知道)代码一LeetCode 1238. 循环码排列实例思路与代码…