跳转至

定位

一、GPS 概述

GPS 最先来自美国,1978 年,美国发射了第一颗 GPS 卫星,发明和实践了卫星定位技术。卫星定位技术原理是,覆盖全球的多颗定位卫星连续发射一定频率的无线电信号,移动终端上集成便携式卫星信号接收机,接收机接收卫星信号并测量卫星到终端接收机之间的距离,最终由移动终端利用多颗卫星位置和与这些卫星的距离计算出移动终端的具体位置。后来出现了欧洲的 Galileo、俄罗斯的 GLONASS、中国的北斗等,所以如今的 GPS 实质上是作为一个卫星定位技术体系 GNSS 的代名词,而不是单指美国的 GPS 系统。

GPS 提供的服务包括定位、授时和导航。定位服务就是 GPS 终端获得其位置的服务,授时服务就是 GPS 终端获得正确时间的服务,导航服务是计算 GPS 终端速度和运动方向的服务。GPS 不限制终端数,在 GPS 卫星信号不被阻挡的情况下,在地球上任何地点、任何时间,任何 GPS 终端都可以得到正确的位置和时间。定位只需要一个条件,那就是能够接收到足够多的卫星信号。因此在室内通常无法定位。

Air8000 作为一款集成了 4G、Wi-Fi、BLE、GNSS(全球导航卫星系统)等多功能的高性能工业引擎,其内置的 GPS 模块能够提供稳定、准确的定位服务。

二、演示功能概述

本教程将演示如何使用 Air8000 的 GPS 功能,包括硬件连接、软件配置、代码编写等步骤,最终实现通过 Air8000 获取 GPS 信息,并将其进行本地处理或上传至指定的服务器。

三、准备硬件环境

3.1 Air8000 核心板

淘宝购买链接:Air8000 核心板淘宝购买链接

核心板使用教程参考:Air8000 核心板使用说明

3.2 GPS 天线

上面购买链接可以选择套餐三,里面包含一个 gps 天线。

参考:硬件环境清单,准备以及组装好硬件环境。

四、准备软件环境

1. 烧录工具 Luatools

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2005_Air8000;此页面有新版本固件的话选用最新版本固件。

3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8000/tree/master/Core_board_demo/GPS

4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。

五、GPS 软硬件参考

5.1 API 接口介绍

本教程使用 api 接口为:

https://docs.openluat.com/air8000/luatos/api/core/libgnss/

5.2 GPS 硬件设计

GPS 在硬件设计中天线部分是比较关键的,可以参考这篇文章:Air8000 GNSS 硬件设计指导

在核心板上内置 GNSS ipex 连接器,同时内置 3.3V LDO, 用于有源天线供电。因此可以使用外部有源天线直接连接 GNSS 连接器。

注意:目前有源天线供电仅支持 3.3V 有源天线,请注意连接的有源天线的供电范围。

六、代码示例介绍

6.1 软件代码介绍

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "air8000_gnss"
VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")

-- mobile.flymode(0,true)
if wdt then
    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
log.info("main", "air8000_gnss")

mcu.hardfault(0)    --死机后停机,一般用于调试状态
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300) -- 所有GPIO高电平输出3.0V
local gps_uart_id = 2 -- 根据实际设备选取不同的uartid
uart.setup(gps_uart_id, 115200)
-- libgnss.bind(gps_uart_id)-- 绑定uart, 马上开始解析GNSS数据
--打开或者关闭GNSS的函数,传1打开,传0关闭

sys.taskInit(function()
    log.info("GPS", "start")
    pm.power(pm.GPS, true)
    -- 绑定uart,底层自动处理GNSS数据
    -- 第二个参数是转发到虚拟UART, 方便上位机分析
    libgnss.bind(gps_uart_id, uart.VUART_0)
    sys.wait(200) -- GPNSS芯片启动需要时间
    -- 调试日志,可选
    libgnss.debug(true)
end)

sys.taskInit(function()
    while 1 do
        sys.wait(5000)
        log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f"))         --解析后的rmc数据
        log.info("GGA", libgnss.getGga(3))                                   --解析后的gga数据
        -- log.info("GLL", json.encode(libgnss.getGll(2) or {}, "7f"))
        -- log.info("GSA", json.encode(libgnss.getGsa(1) or {}, "7f"))
        -- log.info("GSV", json.encode(libgnss.getGsv(2) or {}, "7f"))
        -- log.info("VTG", json.encode(libgnss.getVtg(2) or {}, "7f"))
        -- log.info("ZDA", json.encode(libgnss.getZda(2) or {}, "7f"))
        -- log.info("date", os.date())
        -- log.info("sys", rtos.meminfo("sys"))
        -- log.info("lua", rtos.meminfo("lua"))
    end
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 效果展示

将定位成功后的经纬度复制到此页面。可以查看位置信息和坐标系转换后的经纬度。

七、总结

本教程详细介绍了如何使用 Air8000 的 GPS 功能,包括硬件连接、软件配置、代码编写等步骤。通过本教程的学习,读者应该能够掌握 Air8000 GPS 功能的基本使用方法,并能够根据实际需求进行扩展和应用。

八、注意事项与常见问题

8.1、GPS 定位经纬度不准确

1、坐标没有纠偏,参考:http://www.openluat.com/GPS-Offset.html 进行纠偏处理

2、周围有比较高的障碍物,会导致定位误差

3、在开阔地带,正常情况下定位精度只能做到 5 米

4、不能在室内测试,必须到室外测试;如果只能在室内测试,可以淘宝搜索“gps 信号转发器”

8.2、Air8000 获取到的经纬度数据是基于什么坐标系

使用国际标准 WGS-84 坐标系,需要自己进行坐标系转换各 GPS 坐标系说明以及转换方法

8.3、GPS 天线如何设计

参考:https://docs.openluat.com/air8000/luatos/hardware/design/gnssant/

8.4、可视卫星、可用卫星有什么区别

可视卫星是当前区域,接收条件良好情况下,应该可以收到卫星信号的卫星。

可用卫星是当前已经收到信号并正在使用参与定位的卫星。

8.5、 GGA 和 RMC 应该用哪个

视具体情况而定,建议用 gga,信息相对更全面。

8.6、如何解读 NMEA 报文每个字段的含义

参考:NMEA-0183 协议简介

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)