ArduPilot Lua脚本实战指南:不改编写固件,5分钟跑通自定义飞行逻辑
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
你想给无人机加个小功能——比如多一条电池警告、一段自定义轨迹逻辑——第一反应是啃C++然后等下个版本。其实没必要,ArduPilot内置了Lua脚本系统,几行脚本就能扩展飞行逻辑,一行固件代码都不用动。接下来5分钟,跑通第一个脚本。
Lua脚本到底能干什么
一句话:飞控里内嵌了一个完整的Lua 5.3运行时,把"后门"直接递到你手里——读姿态和GPS数据、往地面站发消息、驱动舵机输出、甚至自建参数让地面站直接调。脚本就是纯文本,放进scripts目录重启自动加载,写错了删掉文件就行,零编译零风险。
脚本跑在独立线程里,内存池也单独划一块,脚本出问题不会直接拖垮主控制回路,这是它和改C++最本质的区别。
五分钟跑通:最小可用路径 🚀
- 拿代码:
git clone https://gitcode.com/GitHub_Trending/ar/ardupilot,进入目录,跑Tools/environment_install/下的安装脚本装依赖。 - 启动模拟器:执行
Tools/autotest/sim_vehicle.py -v ArduCopter。真机则刷好固件即可,闪存大于1MB的板子默认带脚本支持。 - 把SCR_ENABLE参数设为 1,重启,脚本系统生效。
- 在 ardupilot 根目录建
scripts目录(真机是SD卡里的APM/scripts),丢进第一个脚本,看地面站控制台。
第一个脚本就5行:
function update() gcs:send_text(0, "Hello, yaw=" .. ahrs:get_yaw()) return update, 1000 -- 每1000毫秒再执行一次 end return update()update是脚本的心跳:引擎调一次,你返回函数本身和间隔毫秒数,它就自动安排下一次。想试真机流程完全一样——刷固件、脚本进SD卡、设参数、重启。
三个真实场景,看看它有多灵活
绕圈飞行:地面速度恒定
绕圈模式下杆量变半径,地面速度忽快忽慢,拍出来的素材很抖。把 examples 里现成的copter-circle-speed.lua拷进 scripts,目标速度默认6米每秒,改个数值就行。脚本按当前半径实时算绕圈角速度,杆怎么打地面速度都不变,它还顺手建了一个CSPD_SPEED参数,地面站直接调速度,改都不用改代码。
现场调试:数据实时出流
现场调参嫌慢,要等飞回家倒黑匣子才能看曲线。丢进UART_log.lua,它把姿态、角速率这些数据实时往备用串口发。笔记本接个USB转串口模块,随便什么画图工具实时出曲线,不用等落地。
起飞前自检:阈值自己说了算
内置电池failsafe阈值太粗,你想在解锁前检查电芯压差。写个小脚本读电池数据,超阈值就用gcs:send_text()报警并记进黑匣子,再用param:add_param()自建一个阈值参数。阈值不再是写死的常数,地面站里拧一拧就行。
踩坑提醒 ⚠️:新手最容易犯的3个错
- 阻塞循环:脚本引擎是协作式调度,一个
while(true)会卡死整个脚本线程。正确做法:每次干完该干的活,用return update, 间隔毫秒让出。 - SCR_ENABLE没设:使能参数没置1,scripts 里的脚本全被无视。正确做法:改完参数务必重启,SITL里 MAVProxy 一行
param set搞定。 - 乱开堆内存:堆不够系统会报错并提示需要的尺寸。正确做法:按提示把SCR_HEAP_SIZE加大一点,别无脑拉满,挤掉飞控其他部分的内存更麻烦。
想深入 📚?这些资源够你折腾
- AP_Scripting README:怎么启用、脚本放哪,最短的权威说明
- examples 示例脚本目录:几十个现成脚本,从CAN读写、电机矩阵到AHRS调试,先翻一遍找最接近你的场景
- Lua绑定接口文档:Lua里能调用的函数和方法清单,不知道函数名就来查
下一步:把SITL拉起来,照着五分钟路径跑通那个hello脚本,看到控制台弹出消息后,就把它换成你的第一个真实需求。飞控的Lua脚本这条路,比想象中短得多。
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考