GNSS伪距从码片到米的单位转换

概述

因为公司项目的需求,需要解析各种GNSS接收机的协议。在解析的过程中,经常涉及GNSS接收机协议伪距数据的单位转换问题,目前遇到最多就是从码片(chip)转换成米(m)的情况,故而通过该文章记录下来,方便将来检索。

目前接触的GNSS接收机协议,大部分都是L1/G1/B1频点才会出现码片计数的情况,这应该和早期接收机的设计有关,新出的接收机已经很少用码片作为单位的,大部分都是用米。故而文章也只是针对L1/G1/B1频点做出相关记录。

基础知识

GPS 信号

L1 C/A

GPS L1 C/A播发的码型是Gold码。码周期是1023个码片,所以在1.023MHz时钟驱动下,一个周期信号长度(1023个码片)为1ms,即每隔1ms产生一个周期的全部1023个码片,每个码片持续时间长度为1ms/1023 ≈1us,码元的宽度为293.05m,测距精度为2m到3m。

GLONASS 信号

L1(G1)/L2(G2)

GLONASS信号民用播发都是C/A码,码速率为511 kHz ,码长511 ,码周期1 ms 。

北斗信号

B1I

北斗伪卫星系统中Gold码的速率为2.046Mcps,长度为2046,伪码周期为1ms,即1个伪码周期包含2046个码片。

具体代码

c 复制代码
#ifndef LIGNT_SPEED
#define LIGNT_SPEED (299792458.0)
#endif

/*sow   :历元时刻*/
/*chips :码片计数*/
/*raidx :数据协议中的单位,例如:1/2048 chip,该字段就是2048*/
double gps_l1_chip2pr(double sow, double chips, int raidx)
{
	double s = sow - (int)sow; //计算观测数据非整秒时刻
	double p = chips / (raidx * 1.0) / 1024000.0; //计算发射时刻, 1024000 = 码长 * 1000(转换成以秒为单位)
	double d = s - p; //计算传输时长
	if(d < 0.0) { d += 1.0f; } //负数,表示传输过程中跨秒了,故而 +1.0f
	return d * LIGNT_SPEED; //传输时长 * 光速 = 伪距
}

/*sow   :历元时刻*/
/*chips :码片计数*/
/*raidx :数据协议中的单位,例如:1/2048 chip,该字段就是2048*/
double bd_b1i_chip2pr(double sow, double chips, int raidx)
{
	double s = sow - (int)sow; //计算观测数据非整秒时刻
	double p = chips / (raidx * 1.0) / 2046000.0; //计算发射时刻, 2046000 = 码长 * 1000(转换成以秒为单位)
	double d = s - p; //计算传输时长
	if(d < 0.0) { d += 1.0f; } //负数,表示传输过程中跨秒了,故而 +1.0f
	return d * LIGNT_SPEED; //传输时长 * 光速 = 伪距
}

/*sow   :历元时刻*/
/*chips :码片计数*/
/*raidx :数据协议中的单位,例如:1/2048 chip,该字段就是2048*/
double glo_b1i_chip2pr(double sow, double chips, int raidx)
{
	double s = sow - (int)sow; //计算观测数据非整秒时刻
	double p = chips / (raidx * 1.0) / 511000.0; //计算发射时刻, 511000 = 码长 * 1000(转换成以秒为单位)
	double d = s - p; //计算传输时长
	if(d < 0.0) { d += 1.0f; } //负数,表示传输过程中跨秒了,故而 +1.0f
	return d * LIGNT_SPEED; //传输时长 * 光速 = 伪距
}

参考链接

多种全球定位导航系统的对比,信号及频谱分布
GPS 入门 11------GPS C/A码产生与性质
GPS载波频率

相关推荐
Liuqy-052 天前
TCP与UDP
网络·网络协议·tcp/ip·udp·c
和芯星通unicore6 天前
汽车GNSS保护等级PL赋能智能辅助驾驶安全
安全·汽车·gnss·智能驾驶·辅助驾驶·驾驶安全
jason成都7 天前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
jason成都8 天前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
jason成都9 天前
rtklib_java PPP-RTK 收官测试:修复 BDS-2 宽巷失效与异常卫星死循环 Bug
java·gnss·rtklib·rtklib_java
C++ 老炮儿的技术栈10 天前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
wflynn10 天前
GitHub 今日推荐|gpu-unlock-ada:Ada 显卡张量算力翻倍解锁
开源·github·c
wflynn11 天前
GitHub 今日推荐|dquickts:能暂停、能存档的 QuickJS
开源·github·c·durable-execution·embeddable·hibernation
和芯星通unicore13 天前
卫星信号消失的地方,定位如何继续?——解密和芯星通DR 航位推算算法
人工智能·算法·gnss·智能驾驶gnss模块
real_metrix13 天前
【学习笔记】C/C++ 头文件自包含
c++·c·头文件·自包含