ArduPilot Lua 脚本实战:30 分钟定制可编程飞控
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
标准模式接不住的需求,从哪补起
如果你的多旋翼需要在落地瞬间把电池状态回传地面站,或者固定翼进近时舵面角度要随距离动态变化,标准飞行模式都接不住这类细节。第一反应往往是翻 C++ 源码改固件,可那是条最长的路。
ArduPilot 自带一套 Lua 脚本引擎:把 .lua 文件放进 SD 卡,脚本就能在飞控上运行——读传感器、读写参数、控制舵机、切换模式。这套自定义指令机制的核心入口在 AP_Scripting.cpp,调度逻辑在 lua_scripts.cpp。会写 Lua 就能上手,不需要读懂固件。
用 SD 卡从零部署第一个 ArduPilot 脚本
确认固件已内置脚本引擎
不重编固件怎么加"自定义行为"?好消息是:闪存大于 1MB 的板子默认就编译进脚本支持,H7 系列基本都在列;小闪存 F4 板需要确认,具体以官方文档为准。有了带脚本的固件,剩下的事都在地面站和 SD 卡上完成。
脚本唯一的规矩:自我调度的周期函数
ArduPilot 脚本调度不靠主循环,而是脚本每次执行完自己声明下次何时再跑。下面这段是最短可运行脚本:
function update() local loc = ahrs:get_location() if loc then gcs:send_text(6, "pos ok") end return update, 1000 end return update, 1000关键在第 6 行,return update, 1000把执行权交还给调度器:1000 毫秒后再调用我。正因为每次回调都必须快速返回,脚本才不会挤占飞行控制回路的时间。
脚本放进 SD 卡的APM/scripts目录(SITL 下放在 ardupilot 主目录),飞控开机自动加载;把SCR_ENABLE设为 1 再重启即生效。常用参数如下:
| 参数名 | 作用 | 默认值 / 备注 |
|---|---|---|
| SCR_ENABLE | 脚本系统总开关 | 设 1 启用,改后需重启 |
| SCR_HEAP_SIZE | Lua 堆大小 | 运行时不足会自动扩容并告警,数值以官方文档为准 |
| SCR_VM_I_COUNT | 虚拟机指令执行上限 | 防止脚本跑飞吃光 CPU,数值以官方文档为准 |
| SCR_USER1(等) | 用户自定义参数 | 脚本内可直接读写 |
| SCR_DEBUG_LVL | 调试日志级别 | 以官方文档为准 |
两个真实落地:电池监控与距离比例舵面
场景一:低电压提醒。下面这段脚本每 2 秒读一次电池电压,低于阈值就向地面站发关键级告警:
function batt_watch() local volt = battery:voltage() if volt and volt < 22.4 then gcs:send_text(0, "LOW BAT: " .. volt) end return batt_watch, 2000 end return batt_watch, 2000关键在第 4 行,gcs:send_text首参 0 表示关键严重级别,地面站会立即弹提示;22.4V 只是 6S 电池的例子,阈值按你的动力配置改。
场景二:距离比例舵面。仓库自带的示例(见 libraries/AP_Scripting/README.md)每秒读取当前位置与 home 点,把 0–1000 米线性映射成 1000–2000 PWM,输出到 scripting3 通道。这个"读传感器 → 换算 → 写输出"的骨架,可以直接套到变距舵机、投放时机控制等需求上;更多现成方案可以翻 libraries/AP_Scripting/applets/,里面有几十份社区脚本。
脚本跑飞后的排查路径
如果脚本跑飞了怎么办?先看地面站是否弹出Required SCR_HEAP_SIZE over …告警——说明堆不足、运行中被迫扩容,把新值写回SCR_HEAP_SIZE即可避免下次飞行再扩。逻辑过重时,把计算挪出周期回调,或收紧SCR_VM_I_COUNT。另外,读写参数别在高频循环里反复用字符串param:get('名称')查找,提前拿好 Parameter 对象再调方法,官方示例 param_get_set_test.lua 里两种写法都有对照。
起飞前用 SITL 把同一份脚本完整跑一遍(Tools/autotest/sim_vehicle.py一条命令拉起仿真),Lua 报错在模拟里远比真机上好定位。
你现在就可以做:把脚本拷进 SD 卡的APM/scripts,设SCR_ENABLE=1重启,跑通第一个周期任务;再打开 applets 目录挑一份接近你需求的脚本改参数、接传感器。
资料:libraries/AP_Scripting/README.md · 示例脚本库:libraries/AP_Scripting/applets/
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考