ArduPilot Lua 脚本实战:30 分钟定制可编程飞控
2026/9/11 4:51:48 网站建设 项目流程

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_SIZELua 堆大小运行时不足会自动扩容并告警,数值以官方文档为准
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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询