固件功能不够用?ArduPilot Lua脚本救场
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
ArduPilot Lua脚本让你在飞控上直接写逻辑:低电量喊话、巡检打灯、临时改飞行行为,不用碰C代码。它是ArduPilot官方内置的脚本引擎,多旋翼、固定翼、水陆车通用。
🧩 机制:ArduPilot Lua脚本怎么跑起来的
- 独立线程跑虚拟机:固件里内置了一个Lua 5.3.6解释器,你的脚本跑在独立线程里,和飞控主循环分开,好比在车机里装脚本应用,不干扰发动机电脑。
- 指令红线机制:
SCR_VM_I_COUNT就像给脚本划的一道CPU时间红线,单次回调执行指令数超线,脚本被强制暂停。一条死循环写不出能把飞控拖死的事故。 - 文件约定即入口:SD卡
APM/scripts目录下的.lua文件在上电时自动扫描、逐个启动,一个文件一个任务。整套加载逻辑由AP_Scripting模块负责。
闪存大于1MB的飞控默认编译进脚本支持
🚀 如何配置与运行:ArduPilot Lua脚本最小闭环
第1步,刷带脚本支持的固件。闪存大于1MB的板子(如CubeBlack)编译时自动启用脚本,waf两条命令搞定:
waf configure --board=CubeBlack waf plane --upload刷完固件先核对板卡接线
第2步,改参数并重启:
| 参数 | 默认值 | 说明 |
|---|---|---|
| SCR_ENABLE | 0 | 1=启用Lua,改完必须重启 |
| SCR_HEAP_SIZE | 43/100/200KB | 脚本堆,按板子档位自动定 |
| SCR_VM_I_COUNT | 10000 | 单次回调指令红线 |
| SCR_DEBUG_OPTS | 0 | 调试位掩码,3=打印内存与运行耗时 |
第3步,放入脚本。把.lua拷进SD卡的APM/scripts/(SITL模拟器放工作目录下的scripts/)。下面这个最小脚本每秒读一次电池电压发给地面站:
function update() local v = battery:voltage() gcs:send_text(0, "V=" .. tostring(v)) return update, 1000 end return update, 1000第4步,上电验证。重启后脚本自动加载,开着SCR_DEBUG_OPTS=3在地面站消息栏就能看到脚本心跳和内存占用。跑通这一步,你的闭环就成了。
🌾 两个真实场景
场景一:低电量自动播报(巡检机)
需求:电量低于红线时地面站立刻收到报警,避免巡到一半失联。
- 用
battery:voltage()轮询总压,阈值可放进SCR_USER1参数,不用改脚本就能调 - 越限后用
gcs:send_text(6, ...)发高危级别报警 - 连续越限可调用
vehicle:set_mode()切回Land,兜底着陆
| 配置项 | 取值 | 说明 |
|---|---|---|
| SCR_ENABLE | 1 | 启用后重启 |
| SCR_HEAP_SIZE | 100KB | 纯监控脚本,中档板子默认够用 |
| SCR_DEBUG_OPTS | 3(调试期) | 确认无内存告警后改回0 |
场景二:测绘段联动工作灯(管道巡检)
需求:飞入测区时打开作业灯,飞出后自动关闭,省掉人工开关。
update()里轮询当前航点进度,进入测绘段判定为真- 对函数96(scripting3)调用
SRV_Channels:set_output_pwm输出通光脉冲 - 段结束输出1000灭灯,并用
gcs:send_text记录开关时间
| 配置项 | 取值 | 说明 |
|---|---|---|
| SCR_VM_I_COUNT | 20000 | 多一次航点计算,红线放宽一档 |
| SCR_LD_CHECKSUM | 计算值 | 锁定已加载脚本,不符不允许解锁;-1为关 |
🚧 避坑:飞控脚本内存管理清单
- HEAP_SIZE别贪大(43/100/200KB由板子决定,够用就好,改后重启才生效)
- 红线被触就查逻辑(先怀疑回调写得太重,再考虑调VM_I_COUNT)
- 正式任务开校验和(SCR_LD_CHECKSUM防脚本被换,配SCR_RUN_CHECKSUM双保险)
- 线程优先级别乱抬(默认Normal即可,抬高会抢主循环CPU,官方明确警告影响稳定)
- 调试期挂DEBUG_OPTS=3(看内存与耗时曲线,定位完务必清零)
- 高频回调做轻计算(至少间隔100ms以上,内存吃紧时手动
collectgarbage()) - 上天之前先SITL(脚本放工作目录跑
Tools/autotest/sim_vehicle.py,翻车成本最低)
脚本装好后,飞控的想象力就交给你的业务了。
- 官方说明与最小示例:libraries/AP_Scripting/README.md
- 示例脚本库(100+个):libraries/AP_Scripting/examples/
- 开箱即用的小应用:libraries/AP_Scripting/applets/
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考