3. 读取GPS位置与速度信息

读取GPS位置与速度信息 学习卡片

任务说明

本案例编写一个 ArduPilot Lua 脚本,周期性读取 GPS 的经纬度、高度、地速和航向,格式化为可读文本后通过 gcs:send_text 发送到地面站。脚本使用 gps:location() 获取位置、gps:velocity() 获取速度,并用 gps:status() 判断定位状态,避免在无定位时输出无效数据。

关键接口

  • gps:location(instance):返回位置表,含 lat、lng、alt(单位:度、度、米)。
  • gps:velocity(instance):返回速度表,含 gnd(地速,m/s)与 heading(航向,度)。
  • gps:status(instance):返回状态码,3 表示 3D 定位有效。
  • gcs:send_text(severity, text):向地面站发送文本消息。

完整脚本

-- gps_report.lua
-- 周期读取 GPS 位置与速度并发送到地面站

local GPS_INSTANCE = 0
local UPDATE_MS = 1000

local function fmt(v, digits)
    return string.format("%." .. digits .. "f", v)
end

local function report()
    local status = gps:status(GPS_INSTANCE)
    if status < 3 then
        gcs:send_text(4, "GPS: no 3D fix (status=" .. tostring(status) .. ")")
        return report, UPDATE_MS
    end

    local loc = gps:location(GPS_INSTANCE)
    local vel = gps:velocity(GPS_INSTANCE)

    if not loc or not vel then
        gcs:send_text(4, "GPS: data unavailable")
        return report, UPDATE_MS
    end

    local text = string.format(
        "GPS lat=%s lng=%s alt=%sm gnd=%sm/s hdg=%s",
        fmt(loc:lat(), 7),
        fmt(loc:lng(), 7),
        fmt(loc:alt(), 1),
        fmt(vel:groundspeed(), 2),
        fmt(vel:heading(), 1)
    )
    gcs:send_text(6, text)
    return report, UPDATE_MS
end

return report, UPDATE_MS

部署与运行

  1. 将文件保存为 gps_report.lua,放入飞控 SD 卡的 APM/scripts/ 目录。
  2. 设置参数 SCR_ENABLE=1,重启飞控使脚本加载。
  3. 脚本以 1 秒周期自动运行,无需额外触发。

验证方法

  • 地面站消息区应每秒出现一条 GPS lat=... lng=... alt=... gnd=... hdg=... 文本。
  • 无 3D 定位时显示 GPS: no 3D fix,定位恢复后自动切换为正常数据。
  • 对比地面站地图显示的经纬度与脚本输出,数值应一致;移动时地速与航向应随之变化。

常见问题

  • 无输出:检查 SCR_ENABLE 是否为 1,脚本文件名与路径是否正确。
  • 始终显示 no 3D fix:确认 GPS 已连接且已获得定位,GPS_TYPE 参数配置正确。
  • 数值异常:确认 GPS_INSTANCE 与实际使用的 GPS 实例一致(默认 0)。