邢旺
Research of Decoding Method for GPS Raw Data
摘要:分析了GPS OEM板卡输出的二进制原始数据格式,提出了一种二进制原始数据的解析方法,通过C++软件编程实现了观测值、定位结果等信息的提取。讨论了二进制原始数据文件向文本文件的转换方法,并利用此方法编写原始数据解析软件,初步判断测量数据的质量。通过处理测量数据验证了解析方法的正确性与实用性。
Abstract: The format of GPS raw data exported by GPS OEM board is analyzed. A decoding method of raw data is put forward. The observation and position data is displayed by C++ program. The method of converting raw data file to text file is discussed, as well as the decoding program of raw data is accomplished. Both the analysis and the experiment can prove the correctness and the practicability of the decoding method.
關键词:GPS;二进制;原始数据;格式转换
Key words: GPS;binary;raw data;format conversion
中图分类号:TP311 文献标识码:A 文章编号:1006-4311(2018)15-0276-03
0 引言
GPS是20世纪70年代美国国防部研究与创建的新一代卫星导航与定位系统,现阶段基于GPS的定位导航终端已被广泛应用于军事安全、大地测量、航海航空、气象服务、物流交通等领域。GPS导航接收机输出的数据格式主要包括NMEA-0183格式和二进制原始数据格式,二进制原始数据具有节省存储空间的优点,并且能够包含星历、伪距、载波相位等信息,但需要对原始数据做解析处理后才能获得直观的观测与定位数据,所以研究二进制原始数据的解析方法具有重要意义[1]。本文首先分析二进制原始数据结构,并通过编写原始数据解析软件,为二进制原始数据的解析提供了依据。
1 数据格式分析
卫星导航接收机输出的原始数据格式往往因生产厂家而异,本文以JAVAD公司生产的JNS-100接收机板卡为例,并对其输出的GPS二进制原始数据结构进行分析。二进制原始数据并不是接收机所默认的输出数据,需要通过向接收机发送指令,才能输出所需要的原始数据。命令的发送可以使用串口通讯软件实现,具体设置命令可参考接收机厂家提供的数据手册。
每条观测数据通常由三部分组成:数据头、数据体和数据尾。数据头因观测信息的不同而不同,长度为5个字节,以5个16进制标识符表示,其中前两个字节为观测信息标识,后三个字节为数据体的长度。数据体用多个16进制标识符表示相应的观测数据,最后一个字节为校验和。数据尾长度为1个字节,用16进制标识符的0x0A表示。多条不同的观测数据连接在一起组成一帧原始数据,通过接收机的串口发送给数据记录器。本文所设置的每一帧二进制原始数据所包含的信息如表1所示。
其中,“~~”表示当前一天中的时间,数据体中包含4个字节时间信息,其值为0-86400000ms;“RD”表示当前日期,数据体中包含4个字节长度年、月、日信息;“SI”表示卫星PRN,数据体中包含当前所有可见卫星PRN,每一个卫星PRN以1个字节表示;“RC”表示伪距,数据体中包含所有可见卫星的伪距时间信息,每一个伪距时间信息以8个字节表示;“CP”表示载波相位,数据体中包含所有可见卫星的载波相位时间信息,每一个载波相位时间信息以4个字节表示;“PV”表示当前位置和速度,数据体中包含笛卡尔坐标系下的位置和速度观测值,位置数据X、Y、Z分别由8个字节表示,速度数据vx、vy、vz分别由4个字节表示;“DP”表示精度因子,即DOP值,数据体中包含水平位置、高程、时间的精度因子,分别由4个字节表示[2]。分析完一帧数据的结构,便可对其进行解码。
2 解析方法和软件实现
数据记录器中会保存相应的原始数据文件,通过USB下载线将数据文件下载到计算机后,可以利用VC++编写数据处理软件进行数据解码。数据解码流程如图1所示。
利用C++文件流函数fopen将原始数据文件以二进制形式打开,然后用fread函数按字节读取二进制原始数据,当查找到数据头“7E 7E”,即ASCII码的“~~”时,开始将数据保存到变量中,直到再次遇到数据头为止。完整的一帧原始数据如图2所示。
一帧原始数据的长度不是固定不变的,具体的字节数取决于当前的可见星数。其中,伪距、位置的数据类型为双精度浮点型(double),载波相位、速度和精度因子为单精度浮点型(float),原始数据的存储按照小尾端机制(Little Endian Format),即低位优先顺序,当接收到的某个观测值需要多个字节表示时,在解码过程中应当先将数据的各个字节倒序排列[3],以速度观测信息为例,当原始数据文件中表示速度的4个字节为0x13 0x89 0x94 0xC0时,需要将顺序转换为0xC0 0x94 0x89 0x13,然后将16进制数转换为float型。浮点型数据以二进制形式表示时,涉及符号位、阶数和尾数[4],如果展开成多位二进制数后再进行转换较为复杂,本文利用一种简单快捷的方法,转换代码如下:
vxbyte.Format("%02x%02x%02x%02x",byte[3],byte[2],byte[1],byte[0]);
sscanf(vxbyte,"%lx",&vx;);
其中,byte型数组用以存储速度的原始数据,vxbyte为字符串类型,用以存储转换顺序后的速度数据,vx为float型,用sscanf函数转换后可以得出vx的值为-4.64173m/s。另外,由于本文所用接收机板卡伪距和载波相位原始数据都是以时间信息表示,需要根据公式进行计算。伪距RC的计算公式为:
RC=c·prRC (1)
c为光速,单位为m/s,prRC即原始数据解算后的伪距时间信息,单位为s。
載波相位CP的计算公式为:
CP=(rcp+prRC)·FLn (2)
rcp为原始数据解算后与载波相位相关的时间信息,FLn为载波频率,本文中只用到GPS的L1频段,所以FLn取值为1575.42MHz。
对完整的一帧原始数据进行解码计算后,得出的所有参数值如表2所示,然后即可方便地进行进一步处理,也可利用该方法继续编写较为复杂的上位机软件。
3 应用实例
将某次测量的数据文件从数据记录器下载到计算机中,然后利用VC++编写的数据处理软件处理,数据处理程序界面如图3所示。
首先打开原始数据文件,点击分析后即可生成解码数据文件。本文将解析数据保存为文本文件格式,解析后的部分数据展示如图4所示。
卫星的几何分布取决于可见星个数及其相对于用户设备的几何分布,而且DOP值的大小与GPS定位的误差成正比,DOP值越大,定位误差越大,定位的精度也就相对降低,故分析试验过程中的可见星数与DOP值的大小具有一定的意义[5]。可见星数与HDOP和VDOP的曲线如图5所示。
由图5可以看出,试验过程中可见星数最少为8颗,最多为10颗,搜星状况比较良好,水平位置精度因子HDOP和高程精度因子VDOP在测量过程中均小于2,初步判断本次测量中所使用的GPS接收机工作情况良好。
4 结束语
本文分析了GPS OEM板输出的二进制原始数据结构,并利用VC++进行软件编程,实现了一种简单高效的原始数据解析方法,通过对测量的GPS二进制原始数据解析,可以获得较为直观的观测数据,验证了解析方法的正确性,同时还能基于该解析方法,编写较为复杂的数据质量检测软件及测量数据显示软件,既能节约成本,也对测量数据的处理与评估提供依据。
参考文献:
[1]刘海颖,王惠南,陈志明.卫星导航原理与应用[M].北京:国防工业出版社,2013.
[2]JAVAD GNSS.GNSS Receiver External Interface Specification[S].2016.
[3]贾荣,王解先.NovAtel OEM4主板的GPS原始数据解码[J].现代科学仪器,2010,2(1):54-57.
[4]李萌,胡绍林.一种解码接收机原始二进制数据的方法[J].2014,39(3):59-61.
[5]谢钢.GPS原理与接收机设计[M].北京:电子工业出版社,2009.