一、780EGH 定位功能概述
GPS 最先来自美国,1978 年,美国发射了第一颗 GPS 卫星,发明和实践了卫星定位技术。卫星定位技术原理是,覆盖全球的多颗定位卫星连续发射一定频率的无线电信号,移动终端上集成便携式卫星信号接收机,接收机接收卫星信号并测量卫星到终端接收机之间的距离,最终由移动终端利用多颗卫星位置和与这些卫星的距离计算出移动终端的具体位置。后来出现了欧洲的 Galileo、俄罗斯的 GLONASS、中国的北斗等,所以如今的 GPS 实质上是作为一个卫星定位技术体系(GNSS)的代名词,而不是单指美国的 GPS 系统。
Air780EGH 作为一款集成了 4G、Wi-Fi、GNSS(全球导航卫星系统)等多功能的高性能工业引擎,其内置的 GNSS 模块能够提供稳定、准确的定位服务。
特别说明的一点是:780EGH 的 GNSS 虽然为单频 GNSS(L1 频段),但仍可使用北斗/GLONASS/GaLiIeo/GPS 多种定位星系,在受到 GPS 干扰的情况下,仍然可以使用北斗等其他星系成功定位。
780EGH 的 GNSS 提供的服务包括定位、授时和导航。定位服务就是 GNSS 终端获得其位置的服务,授时服务就是 GNSS 终端获得正确时间的服务,导航服务是计算 GNSS 终端速度和运动方向的服务。GNSS 不限制终端数,在 GNSS 卫星信号不被阻挡的情况下,在地球上任何地点、任何时间,任何 GPS 终端都可以得到正确的位置和时间。定位只需要一个条件,那就是能够接收到足够多的卫星信号。因此在室内通常无法定位。
二、演示功能概述
本教程将演示如何使用 Air780EGH 的 GNSS 功能,包括硬件连接、软件配置、代码编写等步骤,最终实现通过 Air780EGH 获取 GPS 信息,并将其进行本地处理或上传至指定的服务器。
Air780EGH 的 GNSS 参数说明:
Air780EGH内部的定位芯片,是一个独立的GNSS定位IC;
主芯片通过UART2与定位芯片进行通信,获取定位数据; (这也是大家为什么在Air780EGH管脚图上看不到UART2的原因)
因此,大家在做GNSS相关的操作时,需要先做如下初始化:
1.打开GNSS的电源,也就是打开GNSS功能,用函数pm.power(pm.GPS, true)操作;
2.打开UART2,配置波特率,与GNSS进行通信,获取定位数据;
3.获取到GNSS数据后,再用libgnss库函数对获取到的NMEA数据进行解析;
参考代码如下:
function gnss()
log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
pm.power(pm.GPS, true) --打开GPS
uart.setup(2,115200) --配置模组内部主芯片与GNSS芯片通信用UART的相关参数
libgnss.bind(2) --马上开始解析NMEA格式数据
libgnss.debug(true) --开发调试期可打开调试日志
end
4.libgnss还有其它十余个API函数,大家根据自己需要灵活选择使用;
5.因历史习惯原因,常用GPS代替作为GNSS,可看作同一个意思。
三、准备硬件环境
3.1 Air780EGH 核心板
核心板使用教程参考:Air780EGH 核心板使用说明
3.2 GPS 天线
参考:硬件环境清单,准备以及组装好硬件环境。
四、准备软件环境
1. 烧录工具 Luatools;
2. 内核固件文件(底层 core 固件文件): LuatOS-SoC_V2007_temp_Air780EGH.soc;此页面有新版本固件的话选用最新版本固件。
3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air780EGH/demo/libgnss/GPS
4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air780EGH 开发板中,将本篇文章中演示使用的项目文件烧录到 Air780EGH 开发板中。
五、GPS 软硬件参考
5.1 API 接口介绍
本教程使用 api 接口为: https://docs.openluat.com/Air780EGH/luatos/api/core/libgnss/
5.2 GPS 硬件设计
GPS 在硬件设计中天线部分是比较关键的,可以参考这篇文章:Air780EGH GNSS 硬件设计指导
六、代码示例介绍
6.1 软件代码介绍
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "Air780EGH_gnss"
VERSION = "1.0.0"
log.info("main", PROJECT, VERSION)
-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
if wdt then
--添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
log.info("main", "Air780EGH_gnss")
mcu.hardfault(0) --死机后停机,一般用于调试状态
local gps_uart_id = 2 -- 根据实际设备选取不同的uartid
uart.setup(gps_uart_id, 115200)
sys.taskInit(function()
log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
pm.power(pm.GPS, true) --打开GPS
uart.setup(2,115200) --配置模组内部主芯片与GNSS芯片通信用UART的相关参数
libgnss.bind(2) --马上开始解析NMEA格式数据
libgnss.debug(true) --开发调试期可打开调试日志
end)
-- 订阅GNSS状态编码
sys.subscribe("GNSS_STATE", function(event, ticks)
-- event取值有
-- FIXED 定位成功
-- LOSE 定位丢失
-- ticks是事件发生的时间,一般可以忽略
log.info("gnss", "state", event, ticks)
if event == "FIXED" then
local locStr = libgnss.locStr()
log.info("gnss", "locStr", locStr)
-- if locStr then
-- -- 存入文件,方便下次AGNSS快速定位
-- io.writeFile("/gnssloc", locStr)
-- end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
6.1 效果展示
将定位成功后的经纬度复制到此页面。可以查看位置信息和坐标系转换后的经纬度。
七、总结
本教程详细介绍了如何使用 Air780EGH 的 GPS 功能,包括硬件连接、软件配置、代码编写等步骤。通过本教程的学习,读者应该能够掌握 Air780EGH GPS 功能的基本使用方法,并能够根据实际需求进行扩展和应用。
八、注意事项与常见问题
8.1、GPS 定位经纬度不准确
1. 坐标没有纠偏,参考:http://www.openluat.com/GPS-Offset.html 进行纠偏处理。
2. 周围有比较高的障碍物,会导致定位误差。
3. 在开阔地带,正常情况下定位精度只能做到 5 米,2 米为实验室条件下使用 R&S 模拟器模拟得出。
4. 不能在室内测试,必须到室外测试;如果只能在室内测试,可以淘宝搜索“gps 信号转发器”。
8.2、Air780EGH 获取到的经纬度数据是基于什么坐标系
使用国际标准 WGS-84 坐标系,需要自己进行坐标系转换各 GPS 坐标系说明以及转换方法。
8.3、GPS 天线如何设计
参考:https://docs.openluat.com/Air780EGH/luatos/hardware/design/gnssant/
8.4、可视卫星、可用卫星有什么区别
可视卫星是当前区域,接收条件良好情况下,应该可以收到卫星信号的卫星。
可用卫星是当前已经收到信号并正在使用参与定位的卫星。
8.5、 GGA 和 RMC 应该用哪个
视具体情况而定,建议用 gga,信息相对更全面。
8.6、如何解读 NMEA 报文每个字段的含义
8.7、车载使用时需要天线引出到车顶上吗
1、挡风玻璃如果没有贴膜或者贴了不含金属材料的膜,可以放在挡风玻璃下,但是 gps 信号会有一定衰减,在万不得已的情况下,可以放在挡风玻璃下,最好再实际测试确认一下。 2、挡风玻璃如果贴了含有金属材料的膜,则不能放在挡风玻璃下,必须将天线接到车顶。
8.8、如何输出原始 NMEA 数据
可以通过 libgnss.bind(id, next_id)接口进行绑定。
-- 绑定uart, 马上开始解析GNSS数据
libgnss.bind(2)
-- 从uart2读取并解析, 同时转发到USB虚拟串口0
libgnss.bind(2, uart.VUART_0)
--从uart2读取并解析, 同时转发到MAIN_UART(串口1)
libgnss.bind(2, 1)