4. 读取电池电压与电流
任务说明
本案例编写一个 ArduPilot Lua 脚本,周期性读取电池的电压、电流和剩余电量百分比,并在剩余电量低于阈值时通过 gcs:send_text 发送警告文本。脚本使用 battery:voltage()、battery:current_amps()、battery:capacity_remaining_pct() 三个接口,配合 vehicle:get_time() 做周期调度。
数据流与调度
完整脚本
-- 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
部署与运行
- 将脚本保存为
battery_monitor.lua,放入飞控 SD 卡的APM/scripts/目录。 - 确保参数
SCR_ENABLE = 1,重启飞控使脚本加载。 - 脚本通过
return update, 100注册为周期回调,飞控每 100ms 调用一次,内部按 1s 节流。
验证方法
- 地面站消息栏应每秒出现一条
BAT V=... I=... Rem=...状态文本。 - 当剩余电量低于 30% 时,应额外出现
LOW BATTERY!警告,且间隔不小于 5 秒。 - 若电池未接入,脚本因
volt或pct为空而静默跳过,不报错。 - 通过条件:状态文本数值与地面站电池面板显示一致,低电量警告在阈值以下按周期触发。