小亿 发布的文章

众所周知,GPS 系统首次定位时间最少应该在5个GPS数据包时间,每个包间隔6秒,也就是6秒*5次=30秒。如何提高GPS定位速度成为了很多人关心的问题。本文章将解释如何提高定位速度到2-5秒。

实现原理

原理实现

speed-gps-time1.jpg

如图所示,需要增加一些辅助器件和软件来实现高速高精度定位需求。

  1. 接收机模块:需要特制的接收机模块来实时处理定位卫星数据,并通过数传模块解析后发送到云端服务;
  2. 云端服务:云端服务负责处理接收机送来的数据,入库,并提供接口给定位器模块实现快速定位,所谓的 AGPS 或 AGNSS;
  3. 定位器模块:配套使用我司生产的定位器,达到高速高精度定位需求。

如何做到2-5秒快速定位?

speed-gps-time.jpg

如图所示,高速高精度定位需要经过3个步骤来实现:

  1. 地面站预处理:地面站就是采用上述原理中描述的接收机模块系统来实现卫星信号的预处理,这个工作由地面站系统实时接收并发送到服务器,默认情况下是1秒一次数据;
  2. 通过网络分发:为了分发预处理过的数据,我们通过网络进行分发是最为有效的手段,可以是有线网络,也可以是无线网络,也可以是互联网,这个过程一般1-3秒即可完成;
  3. 实现快速定位:定位器拿到分发来的数据(主要是星历数据),实现快速定位。这个过程其实是加快了定位器的工作流程,原本需要搜星和跟踪的过程可以省略大部分,直接进入跟踪和定位计算即可实现卫星定位。整个过程一般需要2-5秒。

由此可见,传统情况下需要30秒的定位时间缩短到2-5秒,大大提高了客户体验,同时,也针对于电池供电的产品大幅提高了使用寿命。

实现此案例的相关产品在我司官网可查: www.yiqisoft.cn

BDS 星历

字符偏移数据类型比例缩放名字单位描述
0U4-res1-保留
4U42-19sqram1/2卫星轨道半长轴的平方根
8U42-33es-卫星轨道偏心率
12I42-31ωπ近地点幅角
16I42-31M0π参考时间的平近点角
20I42-31i0π参考时间的轨道倾角
24I42-31Ω0π按参考时间计算的升交点赤经
28I42-43Ω̇π/s升交点赤经变化率
32I22-43Δnπ/s卫星平均运动速率与计算值之差
34I22-43IDOTπ/s轨道倾角变化率
36I42-31cucrad纬度幅角的余弦调和改正项振幅
40I42-31cusrad纬度幅角的正弦调和改正项振幅
44I42-6crcm轨道半径的余弦调和改正项振幅
48I42-6crsm轨道半径的正弦调和改正项振幅
52I42-31cicrad轨道倾角的余弦调和改正项振幅
56I42-31cisrad轨道倾角的正弦调和改正项振幅
60U423toes星历参考时刻
64U2-wne-参考时间的整周数
66U2-res2-保留
68U423tocs本时段钟差参数参考时间
72I42-33af0s卫星测距码相位时间偏移系数
76I42-50af1s/s卫星测距码相位时间偏移系数
80I22-66af2s/s2卫星测距码相位时间偏移系数
82I20.1tgdns星上设备时延差
84U1-iodc-时钟数据龄期
85U1-iode-星历数据龄期
86U1-ura-用户距离精度
87U1-health-卫星自主健康标识
88U1-svid-卫星编号
89U1-valid-信息可用标志(备注[1])
90U2-res3-保留

GPS 星历

字符偏移数据类型比例缩放名字单位描述
0U4-res1 保留
4U42-19sqra1/2卫星轨道半长轴的平方根
8U42-33es 卫星轨道偏心率
12I42-31ω 近地点幅角
16I42-31M0 参考时间的平近点角
20I42-31i0 参考时间的轨道倾角
24I42-31Ω0 按参考时间计算的升交点赤经
28I42-43Ω̇ 升交点赤经变化率
32I22-43Δnπ/s卫星平均运动速率与计算值之差
34I22-43IDOTπ/s轨道倾角变化率
36I22-29cucrad纬度幅角的余弦调和改正项振幅
38I22-29cusrad纬度幅角的正弦调和改正项振幅
40I22-5crcm轨道半径的余弦调和改正项振幅
42I22-5crsm轨道半径的正弦调和改正项振幅
44I22-29cicrad轨道倾角的余弦调和改正项振幅
46I22-29cisrad轨道倾角的正弦调和改正项振幅
48U224toes星历参考时间
50U2-wne-参考时间的整周数
52U424tocs本时段钟差参数参考时间
56I42-31af0s卫星测距码相位时间偏移系数
60I22-43af1s/s卫星测距码相位时间偏移系数
62I12-55af2s/s2卫星测距码相位时间偏移系数
63I12-31tgds星上设备时延差
64U2-iodc-时钟数据龄期
66U1-ura-用户距离精度
67U1-health-卫星自主健康标识
68U1-svid-卫星编号
69U1-valid-信息可用标志(备注[1])
70U2-res2-保留

NMEA的校验和

NMEA语句的校验和为'$'和'*'之间所有字符的异或和.

以下代码计算NMEA语句的校验和.

/*
 * Calculate nmea sentence's checksum
 * @buf:nmea sentence
 * @return: checksum
 */
unsigned char nmea_calc_checksum(const char *buf)
{
const char *p = buf;
unsigned char chs = 0;
​
while (*p == '$')   // skip '$'
p++;
while (*p != '*' && *p != 0)
chs ^= *p++;
​
return chs;
}

NMEA语句的校验和是否正确

/*
 * Check nmea sentence's checksum
 * @buf:buffer contains nmea sentence
 * @return: if checksum is okay return 1, else return 0
 */
int check_nmea(const char *buf) {
unsigned char chk = 0;
const char *p = buf;
char tmp[4];
​
while (*p == '$')
p++;
​
while (*p != '*' && *p != '\0')
chk ^= *p++;
​
if (*p == '*') {
sprintf(tmp, "%02X", chk);
return 0 == memcmp(tmp, p + 1, 2);
​
}
return 0;
}

NMEA中的经纬度

NMEA中经纬度格式为: ddmm.mmmm.
例如: 12023.4323, 表示120度23.4323分.
以下代码将NMEA经纬度字符串转化为度.

/*
 * Convert ddmm.mmmm format string into degrees
 * @s:  ddmm.mmmm format string in NMEA
 * @return: degree value 
 */
double convert_from_ddmm(const char *s)
{
double val = strtod(s, NULL);
int degrees = (int)val / 100;
double minutes = val - degrees * 100.0;
return degrees + minutes / 60.0;
}

导航状态消息

消息名称消息ID主要内容
NAV-STATUS01 00接收机导航状态.
NAV-DOP01 01定位精度因子.
NAV-SOL01 02ECEF坐标系下的PVT导航信息.
NAV-PV01 03大地坐标系下的位置与速度信息.
NAV-TIMEUTC01 10UTC时间信息.
NAV-CLOCK01 11时钟结算信息.
NAV-GPSINFO01 20GPS卫星信息.
NAV-BDSINFO01 21BDS卫星信息.
NAV-GLNINFO01 22GLONASS卫星信息.

NMEA格式的消息

语句名称语句ID主要内容
GGA4E 00UTC时间, 经纬度, 定位质量, HDOP, 海拔高度, 参与定位卫星数.
GLL4E 01经纬度, UTC时间, 定位模式.
GSA4E 02参与定位卫星的PRN编号, PDOP, HDOP, VDOP.
GSV4E 03可见卫星数, 卫星PRN编号, 仰角, 方位角, 载躁比.
RMC4E 04UTC时间, 经纬度, 定位模式, 速度, 航向, 日期.
VTG4E 05速度, 航向.
ZDA4E 08UTC时间, UTC日期.
GST4E 07伪距误差标准差RMS, 经纬高误差标准差.