2. 读取飞行器姿态角并打印

任务说明

编写一个 ArduPilot Lua 脚本,周期性读取飞行器的 roll、pitch、yaw 姿态角(单位:度),并通过 gcs:send_text 发送到地面站显示。脚本需在飞控启动后自动加载运行。

关键 API 与数据流

  • ahrs:get_roll() / ahrs:get_pitch() / ahrs:get_yaw():返回弧度值,需用 math.deg() 转成角度。
  • gcs:send_text(severity, text):向地面站发送文本消息,severity 常用 6(INFO)。
  • vehicle:get_mode():可选,用于确认飞控已进入运行状态。
  • 使用 return update, 1000 让调度器每 1000ms 回调一次。
飞控启动 加载脚本 update() 回调 每 1000ms 一次 ahrs:get_roll/pitch/yaw 弧度 → math.deg() gcs:send_text severity=6 地面站显示 Messages 面板

脚本文件

将以下内容保存为 attitude_log.lua,放到飞控 SD 卡的 APM/scripts/ 目录下(ArduPilot 4.0+ 支持)。

-- attitude_log.lua
-- 周期性读取姿态角并发送到地面站

local MAV_SEVERITY_INFO = 6
local UPDATE_MS = 1000

local function update()
    local roll  = math.deg(ahrs:get_roll())
    local pitch = math.deg(ahrs:get_pitch())
    local yaw   = math.deg(ahrs:get_yaw())

    local msg = string.format("ATT R:%.1f P:%.1f Y:%.1f", roll, pitch, yaw)
    gcs:send_text(MAV_SEVERITY_INFO, msg)

    return update, UPDATE_MS
end

return update, UPDATE_MS

运行与验证

  1. 将 attitude_log.lua 拷贝到 SD 卡 APM/scripts/ 目录,插入飞控并上电。
  2. 地面站连接后,打开 Messages(消息)面板。
  3. 预期每约 1 秒出现一条形如 ATT R:0.0 P:0.0 Y:123.4 的消息,数值随飞行器姿态变化而更新。
  4. 若长时间无消息:检查 SCR_ENABLE 参数是否为 1,确认脚本文件名与路径正确,并查看 Messages 中是否有 Lua 报错。

常见问题

  • 脚本未执行:确认 SCR_ENABLE=1 且飞控固件包含 Lua 支持(如 CubeOrange、Pixhawk 系列)。
  • 数值异常:ahrs:get_* 返回弧度,务必用 math.deg() 转换。
  • 消息刷屏:可增大 UPDATE_MS,例如改为 2000 或 5000。