从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

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

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

3、ddd…ddd——数据

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

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

6、——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 | | | | | 消息结束 | | |

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 | | | | | 消息结束 | | |


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 | | | | | 消息结束 | | |

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 | | | | | 消息结束 | | |

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 | | | | | 消息结束 | | |

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

更多分享,扫码关注

原文作者:良知犹存

原文链接:https://www.cnblogs.com/conscience-remain/p/13407830.html

更多推荐

更多
  • Azure上Linux管理-十、使用 Azure Kubernetes 服务 技术要求,开始使用 AKS,与 Helm 一起工作,使用草稿,管理 Kubernetes,问题,进一步,使用 WSL 和 VS Code,安装依赖,kubectl 安装,使用 Azure CLI 创建集群,AKS 首次部署,创建服务,多
    Apache CN

  • Azure上Linux管理-十一、故障排除和监控您的工作负载 module(load="imuxsock"),技术要求,访问您的系统,Azure 日志分析,性能监控,问题,进一步,不允许远程访问,正在端口上工作,使用 nftables,引导诊断,Linux 登录,配置日志分析服务,安装 Azure
    Apache CN

  • Azure上Linux管理-十二、附录 第一章:探索微软 Azure 云,第二章:Azure 云入门,第三章:Linux 基础管理,第 4 章:管理 Azure,第五章:高级 Linux 管理,第七章:部署虚拟机,第八章:探索连续配置自动化,第 9 章:Azure 中的容器虚
    Apache CN

  • Azure上Linux管理-九、Azure 中的容器虚拟化 cloudconfig,集装箱技术导论,系统生成,Docker,Azure 容器实例,Buildah, Podman, and Skopeo,容器和储存,问题,进一步,容器历史,chroot 环境,OpenVZ,LXC,创建一个带启动的
    Apache CN

  • Azure上Linux管理-七、部署你的虚拟机 ResourceGroup 不存在,创建它:,vnet 不存在,创建 vnet,cloudconfig,Vagrant.config 结束,部署场景,Azure 中的自动部署选项,初始配置,流浪,封隔器,自定义虚拟机和 vhd,问题,进
    Apache CN

  • Azure上Linux管理-八、探索持续配置自动化 了解配置管理,使用 Ansible,使用地球形态,使用 PowerShell DSC,Azure 策略客户端配置,其他解决方案,问题,进一步,技术要求,Ansible 的安装,SSH 配置,裸最小配置,库存文件,Ansible 剧本和模
    Apache CN

  • Azure上Linux管理-五、高级 Linux 管理 技术要求,软件管理,网络,存储,systemd,问题,进一步,RPM 软件管理器,YUM 软件管理,基于 DNF 的软件管理,DPKG 软件管理器,运用 apt 进行软件管理,ZYpp 软件管理,识别网络接口,IP 地址识别,显示路由表
    Apache CN

  • Azure上Linux管理-六、管理 Linux 安全与身份 SELINUX=可以接受以下三个值之一:,permissiveSELinux 打印警告而不是强制执行。,disabled 没有加载 SELinux 策略。,SELINUXTYPE=可以接受以下三个值之一:,targeted 目标进程
    Apache CN

  • Azure上Linux管理-四、管理 Azure 使用 Azure CLI 和 PowerShell 管理 Azure 资源,技术要求,管理存储资源,管理网络资源,管理计算资源,虚拟机资源,问题,进一步,存储帐户,托管磁盘,Azure 文件,Azure Blob,虚拟网络,子网,网络安
    Apache CN

  • Azure上Linux管理-三、Linux 基础管理 Linux Shell,获取帮助,使用文本文件,在文件系统中找到你的方式,流程管理,自由访问控制,问题,执行命令,命令行编辑,与历史一起工作,自动完成,球状,重定向,处理变量,Bash 配置文件,使用手册页,使用信息文档,其他文档,文本
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多