zoukankan      html  css  js  c++  java
  • 从NMEA0183到GNSS定位数据获取(一)原理篇

    作者:良知犹存

    转载授权以及围观:欢迎添加微信公众号:Conscience_Remains

    总述

        GPS我们都知道,一种用来全球定位的系统,后来俄罗斯推出了格洛纳斯定位系统,中国推出了北斗定位,欧盟有伽利略,印度与日本也有有发展。所以后来把覆盖全球的自主地利空间定位的卫星系统成为GNSS。

        现在卫星定位那么热,那么作为一个嵌入式人怎么获取这些数据为我们所用呢?下面就听作者一一道来。

    通常GNSS定位的功能有:

    精确定时:广泛应用在天文台、通信系统基站、电视台中 

    工程施工:道路、桥梁、隧道的施工中大量采用GPS设备进行工程测量 

    勘探测绘:野外勘探及城区规划中都有用到 

    导航: 

        武器导航:精确制导导弹、巡航导弹 

        车辆导航:车辆调度、监控系统 

        船舶导航:远洋导航、港口/内河引水 

        飞机导航:航线导航、进场着陆控制 

        星际导航:卫星轨道定位 

        个人导航:个人旅游及野外探险 

    定位:

        车辆防盗系统 

        手机,PDA,PPC等通信移动设备防盗,电子地图,定位系统 

        儿童及特殊人群的防走失系统 

    精准农业:

        农机具导航、自动驾驶,土地高精度平整 

    提供时间数据:用于给电信基站、电视发射站等提供精确同步时钟源

    维基百科

    从上面可知GNSS的功能相当丰富,那么作为一个嵌入式开发者怎么获得这些数据呢?

    一、寻找合适模块

    当然大家可以用各种渠道找到合适的模块,对于嵌入式端我们要选择哪种呢?我推荐了一下本篇所实际应用的模块——中移物联网的M6313模块,GSM与GNSS二合一模块(改天我介绍一下它的GSM功能)。

    使用也比较方便,利用SOC的串口连接就可以

    二、NMEA-0183协议

    模块选好了,SOC也连接完毕,配置好模块,连接好GPS天线,这个时候GNSS模块的串口开始向SOC按照一定频率发送数据。并且猛的一看,我们可能看不懂,例如M6313的示例格式如下:

    AT+QGNSSC=1 // 开启 GNSS 功能
    
    OK
    
    AT+QGNSSRD?
    
    +QGNSSRD: 
    
    
    
    $GNRMC,032220.291,V,,,,,0.00,0.00,140716,,,N*5D
    
    $GNVTG,0.00,T,,M,0.00,N,0.00,K,N*2C
    
    $GNGGA,032220.291,,,,,0,0,,,M,,M,,*5D
    
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    
    $BDGSA,A,1,,,,,,,,,,,,,,,*0F
    
    $GPGSV,2,1,07,23,,,31,08,,,49,30,,,33,16,,,45*7E
    
    $GPGSV,2,2,07,07,,,44,27,,,49,26,,,43*72
    
    $BDGSV,1,1,03,10,,,47,04,,,40,07,,,48*62
    
    $GNGLL,,,,,032220.291,V,N*6F
    
    
    
    OK
    
    

    除去模块的回应的数据,中间那些数据是什么,我们分辨不轻,这时候就要请NMEA-0183协议出场了。

    NMEA-0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services )标准协议。

    由于美国GPS推出的时间很早,所以很多GNSS的标准都是依托美国一些协会制定好的准备。

    上面看到的诸如$GNRMC打头数据每一个都代表不同的信息:

    序号

    命令

    说明

    1

    $*GGA

    卫星定位信息

    2

    $*GSA

    卫星PRN数据

    3

    $*GSV

    可视卫星信息

    4

    $*RMC

    推荐定位信息

    5

    $*VTG

    地面速度信息

    6

    $*GLL

    地理定位信息

    7

    $*GPZDA

    UTC时间和日期

    注:* 美国的GPS标准中*代表GP,现在由于其他国家的定位系统,所以扩展到其他字符例如:

    标识符 含义
    BD BDS,北斗二代卫星系统
    GP GPS
    GL GLONASS
    GA Galileo
    GN GNSS,全球导航卫星系统

    协议帧总说明:

    该协议采用ASCII码,其串行通信默认参数为:M6313的波特率默认为115200bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。

    帧格式形如:$aaccc ,ddd ,ddd ,...... ,ddd*hh<CR><LF>

    1、“$”——帧命令起始位

    2、aaccc——地址域,前两位为识别符,后三位为语句名

    3、ddd...ddd——数据

    4、“*”——校验和前缀

    5、hhh——校验和(check sum),$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到校验和后,在转换16进制格式的ASCII字符。)

    6、<CR><LF>——CR(Carriage  Return)+ LF (Line Feed)帧结束,回车换行。

    1.Global Positioning Positioning Positioning Positioning System Fix Data(GGA)GPS 定位信息 

    $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh

    范例数据:

    $GPGGA,065545.789,2109.9551,N,12023.4047,E,1,9,0.85,18.1,M,-2.2,M,8.0,,*5E 

    名称 示例 单位 字节位置
    消息 ID $GPGGA GGA  
    UTC 065545.789 hhmmss.sss <1>
    纬度 2109.9551 ddmm.mmmm <2>
    N/S 指示 N N=北, S=南 <3>
    经度 12023.4047 dddmm.mmmm <4>
    E/W 指示 E W=西, E=东 <5>
    定位指示 1 0:未定位
    1:SPS 模式,定位有效
    2:差分, SPS 模式,定位有效
    3:PPS 模式,定位有效
    <6>
    星数目 9 范围 0 到 12 <7>
    HDOP 0.85 水平精度(0.5~99.9) <8>
    MSL 幅度
    (海拔)
    18.1 米(-9999.9~99999.9) <9>
    单位 M  
    大地 -2.2 <10>
    单位 M -  
    差分时间 8.0 <11>
    差分 ID 0000   <12>
    校验和 *5E    
    <CR><LF> 消息结束    

    2.GPS DOP and Active Satellites Satellites Satellites Satellites(GSA)当前卫星信息 

    $GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>,<6>*hh 

    范例数据:

    $GPGSA,A,3,10,24,12,32,25,21,15,20,31,,,,1.25,0.85,0.91*04

    名称 示例 单位 描述
    消息 ID $GPGSA GSA  
    模式 1 A M=手动, 强制在 2D 或 3D 模

    A=自动
     
    模式 2 3 1:定位无效
    2:2D 定位
    3:3D 定位
     
    卫星使用 10 通道 1  
    卫星使用 24 通道 2  
    卫星使用 12 通道 3  
    卫星使用 32 通道 4  
    卫星使用 25 通道 5  
    卫星使用 21 通道 6  
    卫星使用 15 通道 7  
    卫星使用 20 通道 8  
    ,,, ,,, ,,, ,,,
    卫星使用 通道 12    
    PDOP 1.25 位置精度  
    HDOP 0.85 水平精度  
    VDOP 0.91 垂直精度  
    校验和 *04    
    <CR><LF> 消息结束    


    3. GPS Satellites Satellites Satellites Satellites in View(GSV)可见卫星信息 

    $GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,…<4>,<5>,<6>,<7>*hh

    范例数据:

    $GPGSV,3,1,12,14,75,001,31,32,67,111,38,31,57,331,33,26,47,221,20*73

    名称 示例 单位 描述
    消息 ID $GPGSV GSV  
    消息数目 3 范围 1 到 3  
    消息编号 1 范围 1 到 3  
    卫星数目 12    
    卫星 ID 14 范围 1 到 32  
    仰角 75 最大 90°
    方位角 001 范围 0 到 359°
    信噪比 31 dBHz 范围 0 到 99,没有跟踪时为
    卫星 ID 32 范围 1 到 32  
    仰角 67 最大 90°
    方位角 111 范围 0 到 359°
    信噪比 38 dBHz 范围 0 到 99,没有跟踪时为
    卫星 ID 31 范围 1 到 32  
    仰角 57 最大 90°
    方位角 331 范围 0 到 359°
    信噪比 33 dBHz 范围 0 到 99,没有跟踪时为
    卫星 ID 26 范围 1 到 32  
    仰角 47 最大 90°
    方位角 221 范围 0 到 359°
    信噪比 20 dBHz 范围 0 到 99,没有跟踪时为
    校验和 *73    
    <CR><LF> 消息结束    

    4. Recommended Recommended Recommended Recommended Minimum Minimum Minimum Minimum Specific Specific Specific Specific GPS/TRANSIT GPS/TRANSIT GPS/TRANSIT GPS/TRANSIT Data(RMC)推荐定位信息

    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh

    范例数据:

    $GPRMC,100646.000,A,3109.9704,N,12123.4219,E,0.257,335.62,291216,,,A*59

    名称 示例 单位 描述
    消息 ID $GPRMC RMC  
    UTC 100646.000 hhmmss.ss  
    状态 A A=数据有效;V=数据无效  
    纬度 2109.9704 ddmm.mmmm  
    N/S 指示 N N=北, S=南  
    经度 11123.4219 dddmm.mmmm  
    E/W 指示 E W=西, E=  
    地面速度 0.257 Knot(节)  
    方位 335.62  
    日期 291216 ddmmyy  
    磁 量 -    
    校验和 *59    
    <CR><LF> 消息结束    

    5. Track Made Good and Ground Speed(VTG)地面速度信息$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh

    范例数据:

    $GPVTG,335.62,T,,M,0.257,N,0.477,K,A*38

    名称 示例 单位 描述
    消息 ID $GPVTG VTG  
    方位 335.62  
    参考 T True  
    方位 335.62  
    参考 M Magnetic  
    速度 0.257 Knot  
    单位 N    
    速度 0.477 公里/小时  
    单位 K 公里/小时  
    校验和 *10    
    <CR><LF> 消息结束    

     这就是我分享的第一篇NMEA-0183到GNSS数据的文章,里面数据是实践过的,下一篇分享代码实现。如果大家有什么更好的思路,欢迎分享交流哈。

    更多分享,扫码关注我

  • 相关阅读:
    5.MFC基础(五)视图、运行时类信息、动态创建
    4.MFC基础(四)菜单、工具栏、状态栏
    OpenCV Python 4.0安装
    windows批量导出文件名到txt
    *&p理解
    VS调试快捷键配置更改
    数组类的创建(下)
    数组类的创建(上)
    operator用法:隐式类型转换
    C++单例模式
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/13407830.html
Copyright © 2011-2022 走看看