4. 读取电池电压与电流

任务说明

本案例编写一个 ArduPilot Lua 脚本,周期性读取电池的电压、电流和剩余电量百分比,并在剩余电量低于阈值时通过 gcs:send_text 发送警告文本。脚本使用 battery:voltage()、battery:current_amps()、battery:capacity_remaining_pct() 三个接口,配合 vehicle:get_time() 做周期调度。

数据流与调度

update() 周期回调 battery:voltage() battery:current_amps() capacity_remaining_pct() 阈值判断 send_text 低电量警告

完整脚本

-- battery_monitor.lua
-- 周期读取电池电压/电流/剩余电量,低电量时发送警告

local UPDATE_MS   = 1000      -- 读取周期(毫秒)
local LOW_PCT     = 30        -- 低电量阈值(%)
local WARN_PERIOD = 5000      -- 警告最小间隔(毫秒)

local last_update = 0
local last_warn   = 0

function update()
    local now = vehicle:get_time()          -- 单位: 毫秒
    if now - last_update < UPDATE_MS then
        return update, 100
    end
    last_update = now

    local volt = battery:voltage(0)                 -- 伏特
    local curr = battery:current_amps(0)            -- 安培
    local pct  = battery:capacity_remaining_pct(0)  -- 百分比

    -- 无电池数据时跳过
    if not volt or not pct then
        return update, 100
    end

    gcs:send_text(6, string.format(
        "BAT V=%.2fV I=%.2fA Rem=%d%%", volt, curr or 0, pct))

    if pct < LOW_PCT and (now - last_warn) >= WARN_PERIOD then
        last_warn = now
        gcs:send_text(2, string.format(
            "LOW BATTERY! %d%% remaining", pct))
    end

    return update, 100
end

return update, 100

部署与运行

  1. 将脚本保存为 battery_monitor.lua,放入飞控 SD 卡的 APM/scripts/ 目录。
  2. 确保参数 SCR_ENABLE = 1,重启飞控使脚本加载。
  3. 脚本通过 return update, 100 注册为周期回调,飞控每 100ms 调用一次,内部按 1s 节流。

验证方法

  • 地面站消息栏应每秒出现一条 BAT V=... I=... Rem=... 状态文本。
  • 当剩余电量低于 30% 时,应额外出现 LOW BATTERY! 警告,且间隔不小于 5 秒。
  • 若电池未接入,脚本因 volt 或 pct 为空而静默跳过,不报错。
  • 通过条件:状态文本数值与地面站电池面板显示一致,低电量警告在阈值以下按周期触发。