3. 读取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
部署与运行
- 将文件保存为
gps_report.lua,放入飞控 SD 卡的APM/scripts/目录。 - 设置参数
SCR_ENABLE=1,重启飞控使脚本加载。 - 脚本以 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)。