跳转至

GNSS调试工具使用方法

一、工具介绍

iNavTool 是芯与物公司开发的 GNSS 接收机图形化卫星显示控制软件,旨在帮助 GNSS 用户便捷地对 GNSS 进行可视化操作,通过 iNavTool 用户可以对模块进行基本信息/收星状态/定位状态等信息的查看,同时支持功能设置,TTFF 测试,输出协议配置等。

工具下载:iNavTool-V4020

二、测试环境搭建

2.1 硬件环境

硬件环境参考下面连接:https://docs.openluat.com/air8000/luatos/app/gnss/agps/#_2

将设备组装好并连接 USB 数据线,将 TTL 转 USB 连接到 Air8000 的核心板的 uart2 上面。连接好后如下图所示:

2.2 软件环境

1. 烧录工具 Luatools

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

3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/Gnss_test

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

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

三、打开 iNavTool 工具并连接 Air8000 核心板

下载好的 GNSS PC 端测试工具为一个压缩包,需要解压后打开如图所示 EXE 文件

打开测试工具后可以看见如下界面:

选择左上角的"打开串口"后,选择对应的端口号(串口 1 所接的 TTL 的端口)以及波特率即可,Air8000 的 gps 对应的波特率为 115200,其他的不用管,默认即可。打开的端口后,等待片刻,即可看见模块定位成功输出的位置信息以及其他信息,左上角为 NMEA 原始数据,下面的均为从 NMEA 数据中解析出的各种信息(注:此处地图视图需要电脑链接网络才可找到对应经纬度的坐标),如果没有输出经纬度,则证明 GNSS 未打开,需要检查脚本 GPS 电源是否打开,如果长时间没有定位成功,可以参考Air8000无法定位情况分析

如果连接成功,则可以看到下面的现象:

四、iNavTool 进阶功能演示

如果客户不满足只是查看当前 CN 值、可见卫星数、当前经纬度对应坐标等信息,还需要测试 GNSS 性能,还要有个直观的展示界面,可以参考如下方法:

点击最上面一排工具栏中的"工具"选项,再在二级菜单中找到 TTFF 选项,点击后,会弹出如图所示的弹窗,看不清没关系,在弹窗的右上角选择放大该窗口

放大后的界面如下所示:

如上图所示,你可以选择测试 冷启动、热启动、温启动,可以选择测试次数、超时时间、以及每次测试间隔

由于 GNSS 芯片在 Air8000 内部,如果你想纯粹的测试内部 GNSS 性能,则按照如下配置来

特别注意,时间辅助和位置辅助在测试 GNSS 工作性能时,影响较大,如果你只想测试单 GNSS 性能,不要勾选。

这个测试工具其原理本质上就是通过 USB 转 TTL 模块给 Air8000 内部 GNSS 发送冷/热/温启动指令,然后根据 NMEA 原始数据输出,来分析成功率、CPE50、误差、最大定位时长、平均定位时长等数据。

但是由于 Air8000 uart2 的 RX 被内部 Cat.1 芯片占用,无法直接发送命令给内部 GNSS 芯片,所以我们需要曲线救国一下,将 uart2 上的数据转发给 uart1,再将 uart1 收到的指令转发给 uart2,这样就能实现通过 uart1 给内部 GNSS 芯片发送指令,并且通过 uart1 观察 GNSS 芯片吐出的 NMEA 数据,来分析 Air8000 内部 GNSS 芯片性能的目的了

完整代码如下:

PROJECT = "air8000_gnss"
VERSION = "1.0.1"

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

-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用http库需要下列语句]]
_G.sysplus = require("sysplus")

-- 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
require("uart1_8000")

function test_gnss()
    log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
    pm.power(pm.GPS, true)
    uart.setup(2,115200)
end
sys.taskInit(test_gnss)

uart.on(2, "receive", function(id, len)
    local s = ""
    repeat
        s = uart.read(id, 2048)
        if #s > 0 then -- #s 是取字符串的长度
            -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
            -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
            log.info("uart2", "receive", id, #s, s)
            uart.write(1, s)
        end
    until s == ""
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
local uartid = 1 -- 根据实际设备选取不同的uartid

--初始化
uart.setup(
    uartid,--串口id
    115200,--波特率
    8,--数据位
    1--停止位
)


-- 收取数据会触发回调, 这里的"receive" 是固定值
uart.on(uartid, "receive", function(id, len)
    local s = ""
    repeat
        s = uart.read(id, 2048)
        if #s > 0 then -- #s 是取字符串的长度
            -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
            -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
            log.info("uart1", "receive", id, #s, s)
            uart.write(2, s)
        end
    until s == ""
end)

-- 并非所有设备都支持sent事件
uart.on(uartid, "sent", function(id)
    log.info("uart", "sent", id)
end)

关于这个测试工具的其他用法,可以参考,压缩包内的 iNavTool_Manual.pdf