GPS应用开发设计文档
2024-01-26 21:02:08发布 浏览453次 信息编号:94857
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
GPS应用开发设计文档
摘要:本文介绍了利用GPS接收模块和GIS控制开发GPS/GIS应用软件的一些要点,不涉及复杂的地理信息理论,主要关注协议和接口的应用开发。
关键词:
GPS:,全球定位系统
NMEA:国家海洋电子协会
SiFR:u-blox 的 GPS 模块二进制数据协议
WGS 84:1984 年世界
LLA: //经度、纬度和海拔高度
简要描述;简介:
本文介绍了利用GPS接收模块和GIS控件开发GPS/GIS应用软件的一些要点,不涉及复杂的地理信息理论,主要是协议和接口的应用开发。
1:GPS模块应用
GPS(全球定位系统)接收硬件已实现模块化。 本次介绍主要是基于我使用过的u-blox TIM GPS(以下简称)。
模块如图(几乎1:1比例):

该模块提供与GPS卫星通信的功能,并提供外部FFC20接口。 您可以为其添加电源、接口板和串口模块,以便通过串口与计算机连接。
如何开发串口程序本文不再介绍。 在/linux下开发串口程序非常简单。
对外提供标准的NMEA协议和厂商自己的SiRF二进制协议。
1.1 NMEA()0183协议
NMEA 0183 是导航和航运中数字信号传输的标准。 该标准定义了电子信号所需的传输协议和数据传输时间。 这个协议是文本格式的。大致如下
开始
结尾
消息头
报文正文,具体数据与NMEA报文字相关,数据之间用逗号(,)分隔。
2243.4976,N,11414.7289,E,.819,A
校验码,格式为*[十六进制数]如*2C
回车和换行
协议头,格式为:$GPxxx,xxx为输出消息字如GLL。 输入:$是输入消息字。
1.1.1NMEA协议输出和输入消息
NMEA 协议有以下输出消息
留言词
内容
GGA
时间、地点、定位数据
总胆管
纬度和经度、UTC 格式的时间、位置和状态数据
总务局
接收机模式和卫星运行数据,包括位置和水平/垂直稀释精度等。稀释精度(of)是一个地理定位术语。 接收机可以同时从多颗卫星获取定位信息,但要进行精确定位,只需四颗卫星信号就足够了。
GSV
接收机可以接收的卫星信息,包括卫星ID、高度、方位角、信噪比等。
MSS
信号比(SNR)、信号强度、频率、比特率
RMC
日期、时间、位置、方向、速度数据。是最常用的消息
VTG
相对于地面的方向和速度数据
ZDA
时间和日期数据。
与地理信息密切相关的消息如下。 每条消息中包含的信息字段不同且重复。 在一个消息周期中,每条消息中的相同字段包含相同的地理数据。 可以组合多个消息以获得完整的数据。
日期
时间
纬度
经度
高度
定位状态
卫星数量
地速
方向角
GGA
√
√
√
√
√
√
总胆管
√
√
√
√
RMC
√
√
√
√
√
√
√
VTG
√
√
ZDA
√
√
以下是 u-lox 制造商扩展的输出消息
OK-命令,表示进入省电模式工作状态
硬件状态报告
在 NMEA 模式下工作时,您可以看到以下输入消息。 输入消息通常用于控制GPS的操作。
留言词
内容
100
设置串口参数和协议
101
XYZ导航坐标初始化。输入参数根据WGS84坐标系确定
102
设置DGPS端口
103
设置或查询数据输出频率。可以设置是否输出各NMEA消息以及输出频率
104
输入当前的经纬度和海拔高度来初始化模块
105
开发调试数据开关
106
(u-blox)可以改变大地坐标系,默认是WGS-84坐标系
107
(u-blox) 配置省电模式
108
(u-blox) 进入下载模式并更新 Flash
MSK
设置MSK信号接收器参数
对于各个协议的具体格式,可以在线下载具体的NMEA协议。
摘要:本文介绍了利用GPS接收模块和GIS控制开发GPS/GIS应用软件的一些要点,不涉及复杂的地理信息理论,主要关注协议和接口的应用开发。
1.1.2 接收并解析NMEA消息
当接收器工作在NMEA协议时,会以一定的速率输出数据。
$GPGGA,.000,2232.2513,N,11401.6763,E,1,04,,20.3,M,,M,,0000*58
$GPGLL,2232.2513,N,11401.6763,E,.000,A*35
$GPRMC,.000,A,2232.2513,N,11401.6763,E,9.17,,,,*12
$GPVTG,,T,,M,9.17,N,17.0,K*47
$GPGGA,.000,2232.2654,N,11401.6738,E,1,04,,36.1,M,,M,,0000*5F
$GPGLL,2232.2654,N,11401.6738,E,.000,A*37
$GPRMC,.000,A,2232.2654,N,11401.6738,E,12.95,,,,*20
$GPVTG,,T,,M,12.95,N,24.0,K*77
最好将所有消息输出速率设置为相同的速率(使用输入命令103),或者根据具体情况打开或关闭一些不必要的消息。
消息中各个字段的格式并不复杂。 请注意以下事项:
l 经纬度的表示方式为ddmm.mmmm和方向指示。 以纬度为例:当纬度为9730.765,方向指示为N时,在北半球表示为97度30.765分。 某些地理信息组件在使用经度和纬度时不使用度、分和秒。 记数法,但是使用浮点数记数法,那么97度30.765分约等于97.5(97+30.765/60)度。
l 方向角为正北0度,正东90度,即按顺时针方向从0度增大到359度。
l 校验码是通过将消息包(包括消息头和消息体)中每个ASCII字符的值按顺序异或得到的。 算法(c++代码)如下
字符
字符c=0;
for(int o=1;o
char h = s[o];
c^=h;
C;
(,"*X",(数据));
对于一般的地理数据,只需获取RMC消息包即可。 如果还需要其他数据,比如当前卫星数量、卫星状态等,或者接收机本身已经关闭了RMC消息包,只输出其他消息包,那么就需要解析其他消息包。
应用程序逐行分析消息包。 我的做法是,首先按照逗号分隔原则将消息包解析成字符数组,然后根据包头指令字按照协议含义取出数组中的字符串。
(,大批)); //将一行消息解析成字符串数组Array
if (Array[0].("$GPRMC") ==0 ) //这是一个RMC消息
if(Array.size()!=12) //需要12个字段
-1;
//下面依次填写RMC数据结构
罗姆克
Rmc。 =数组[1];
Rmc。 =(数组[2]);
Rmc。 =数组[3];
Rmc.. = (数组[4]);
Rmc。 =数组[5];
Rmc.. = (数组[6]);
Rmc。 =(数组[7]);
Rmc。 = (数组[8]);
Rmc.Date = Array[9];
房间[0] =(数组[10]);
Rmc。 = (int)(数组[11]);
//检查,
(Rmc.,);
构造以类似方式解析其他消息的函数。 群消息包将字段按顺序转换成字符串并连接起来,最后附加校验码。
1.2 SiFR协议。
SiFR协议是GPS模块制造商开发的二进制协议。 提供更多的GPS模块操作接口。 制造商声称这个协议(用于操作他们自己的模块)更稳定、更高效、更易于操作。
1.2.1协议格式
消息头
消息体长度
邮件正文
检查代码
消息终止符
双字节
0xA0
0xA2
双字节
数据长度小于1023字节
双字节
双字节
0xB0
0xB3
具体报文格式请参考厂家提供的协议文档(GPS.G2-X-01003-E.pdf)。
1.2.2 日志操作
SiFR包括读取地理数据、刷写Flash、配置GPS模块参数、读取/擦除日志等一系列操作,其中日志操作是最有用的。 可以脱离计算机运行,并将所到之处的地理信息保存在内存中,然后连接计算机获取地理信息日志,获取携带GPS的载体在一段时间内的轨迹时间。
读取Log的大致流程是:
读取Log信息,获取最小个数和最大个数,发出指令依次读取每个Log信息,解析转换为NMEA协议消息。
在擦除Log时,虽然u-blox提供了所有擦除指令,但在实际应用过程中发现该指令的成功率并不高。 还不如一一发出指令,一一抹去。
日志格式在制造商提供的 al(GPS.G2-SW-02015).pdf 中定义。
日志中包含的消息如下
留言号码
留言名称
字节数
内容
111
没有任何
没有数据
100
所有地理位置信息
100
地理位置信息、增量数据
000
地理位置信息,增量数据,比
110
地理位置信息,增量数据,使用更少的字节
101
GPIO (-/) 数据
011
GPIO数据、增量数据
001
不定
用于扩展
上述所有消息都是二进制编码并以位存储。 解析消息需要二进制位操作。
消息解析成功后,u-blox 建议按照以下逻辑处理这些消息
WHILE (Data) --读取新数据
--获取消息类型,根据消息类型获取对应消息的字节数
IF (Type = EMPTY) THEN -- 空数据,跳过
ELSE IF (Type = ) THEN - 保存时间信息,保存位置、速度等模式信息
ELSE IF ((类型 = ) OR (类型 = ) OR (类型 = )) THEN
-- 将时间和位置增量数据叠加到最新的定位记录上并保存速度数据
ELSE IF (Type = ) THEN -- 节省时间和 GPIO 数据
ELSE IF (Type = ) THEN -- 将时间叠加在最新 GPIO 数据的时间字段上,并保存 GPIO 数据
ELSE IF (Type = ) THEN --处理自定义数据
- 万一
结束时
摘要:本文介绍了利用GPS接收模块和GIS控制开发GPS/GIS应用软件的一些要点,不涉及复杂的地理信息理论,主要关注协议和接口的应用开发。
1.2.->LLA转换问题
在分析它的日志的过程中,我遇到了一个问题,就是二进制日志中保存的坐标数据是基于WGS84大地坐标系的。 大地坐标系的XYZ轴如下:

要获取纬度、经度和高度 (LLA://) 坐标,需要一些椭球体、基准面和地图投影方面的知识。
后来在网上找到了一个写的WGS84->GLL转换函数,将其转换为C/C++函数:
void (x, y, z, *lat, *lon, *alt)
圆周率 = 3。;
= ;
= 1/298。;
= (2-)*; // 还有 e^2
= 180/pi;
wlon,wlat,walt,,rho,,,,;
板条、克拉特、q、r_n、drdl、、aa、bb、cc、dd;
如果((x==0.0)&(y==0.0))
wlon = 0.0;
别的
wlon = atan2(y, x)*;
if ((x == 0.0) & (y == 0.0) & (z == 0.0))
(“地球的 WGS xyz”);
wlon = 360;
瓦特 = 360;
沃尔特 = ;
别的
= x*x + y*y;
ρ = sqrt();
= atan2(z, rho);
= sqrt(+ z*z) - ;
= 1000.0;
= 1000.0;
while ((Dabs() > 1e-6) | (Dabs() > 1e-6))
板条=罪();
克拉 = cos();
q = 1 - *板条*板条;
r_n = /sqrt(q);
drdl = r_n**slat*clat/q; // d(r_n)/d()
= (r_n + )*clat - rho;
= (r_n*(1 - ) + )*slat - z;
aa = drdl*clat - (r_n + )*slat;
bb = 克拉;
cc = (1 - )*(drdl*slat + r_n*clat);
dd = 板条;
= 1.0/(aa*dd - bb*cc);
= - *(+dd* -bb*);
= - *(-cc* +aa*);
沃特=*;
沃尔特 = ;
if(lon)*lon = wlon;
如果(纬度)*纬度 = 纬度;
if(alt)*alt = 沃尔特;
结论:开发GPS应用软件的关键是了解相关协议和接口,认真处理协议字段。
提醒:请联系我时一定说明是从星空网上看到的!