RINEX 文件的观测历元对齐问题

最近使用 ublox 的一块 GNSS 定位授时芯片进行数据采集,发现其输出的 RINEX 观测文件中,存在观测历元的时间秒中含有小数问题(我设置的数据采样间隔大于 1 秒)。花两天时间研究了问题成因和解决方案,整理如下。本文的主要部分参考了 rtklibexplorer 的相关内容。

现象说明

因为我设置的观测设置数据采样间隔为 1 秒。理论上,其每隔历元的观测时刻的秒都应为整数(即 1~60)。但在实际的观测时刻中,其秒包含一个很小的偏差。例如,下图中的观测时间与理论值均相差了 -0.004 秒,并且这个时间差是不稳定的。

比较成熟的 GNSS 数据处理软件,比如 RTKLIB 等,基本不会受该现象的影响。但某些情况下,使用一些科研数据处理软件进行处理时可能会引发一些问题。比如,在将观测数据通过 RTCM 协议进行传播时,因为 RTCM 协议对观测时间的最小分辨率是 0.001 秒,这个时间差就可能造成数据精度的损失,所得的导航定位结果精度较差。再比如,在生成导出多普勒观测数据时,一般的做法是使用前后两个历元的载波相位观测量生成当前历元的导出多普勒数据,若前后两个历元的观测时间间隔不一致,也会引发一些问题。

产生原因

产生该现象的原因是,某些 ublox 的定位芯片,在进行 GNSS 观测时,会同时估计自身的接收机钟误差。接收机生成观测数据时的时刻是名义上与采样间隔对齐的时刻。例如,上面例子的第一个历元其名义的观测时刻是“2022-06-09 09:07:21”,而芯片估计的接收机钟差是 -0.004 秒。为了缩小接收机钟差的影响,其会对名义的观测时刻进行改正。此时,新的观测时刻就变成了“2022-06-09 09:07:20.996”。当然,在观测时刻改正之后,为了保持数据与观测时刻的一致性,还要同时对观测数据进行改正,改正公式为:

1
2
P = P - toff * c
L = L - toff * freq

这里 PL 分别表示伪距和相位观测量,toff 即接收机时间改正量,cfreq 分别为光速和相位观测的频率。

解决方案

当然,对于很多程序而言,其对接收机钟差的估计已经足够精确,因此不需要使用以上这种经过接收机钟差改正的数据,反而还会因这种改正造成一些麻烦。但遗憾的是,ublox 并没有提供对应的配置方式来关闭这项特性。为了移除此类改正,有两种解决方案,其一是在程序计算中使用上述的公式对原始数据进行“还原”;第二种就是在数据格式转换阶段进行“还原”。rtklibexplorer 提供了将原始数据转换为 RTCM 数据时进行还原的相关代码。

新版本的 RTKLIB(2.4.3)支持在原始数据转换为 RINEX 的阶段进行还原。对于 RTKCONV 程序用户,可以点击主窗口的“Options”进入配置窗口,在“Receiver Options”中加入-TADJ=0.1 参数。这表示在转换时将小于 0.1 秒的接收机钟差改正进行还原,当然,具体的阈值可以根据你的需求决定。如下图:

转换得到的观测值如下图:

对于 CONVBIN 用户,可以在执行转换时使用 -ro 参数,例如:

1
$ convbin -ro "-TADJ=0.1" rawobsdata.ubx

其效果与 RTKCONV 是一样的。