资讯动态

ArduPilot Lua 脚本入门:不改固件 3 步定制飞行逻辑

发布时间:2026/9/11 17:24:23 来源:尧图企业网站定制
ArduPilot Lua 脚本入门不改固件 3 步定制飞行逻辑【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilotArduPilot 的Lua 脚本系统让你直接向飞控注入自定义逻辑无需重新编译固件。如果你的多旋翼需要在离开家点一定距离后自动输出信号或想读取某路数据并按自己的规则报警不必去啃 C 源码一段脚本就能搞定。它到底能帮你做什么先看三个真实感很强的用法。把飞行数据变成硬件动作。脚本可以周期性地读取 AHRS 的位置信息算出家点距离再按比例写进某个舵机输出通道功能号 96 即 scripting3 专用通道。结果就是飞行器飞得离家越远对应通道的 PWM 值越大——比如驱动一个指示灯带或模拟量负载全程没有改动一行固件代码。机载数据加工与报警。脚本能直接调用 AHRS、地面站等 C 绑定的 API把原始传感器数据按你自己的规则处理再用gcs:send_text()把结论实时推给地面站。结果就是报警逻辑由你定义、随时可换而不是等下一个固件版本。图AET-H743-Basic 飞控硬件总览脚本系统在这类飞控上开箱即用在任务的关键节点被点名执行。地面站可以在任务序列中插入DO_SCRIPTING指令固件执行到该指令时会把指令参数转发给脚本引擎见 任务指令处理 中的start_command_do_scripting。结果就是脚本不必一直驻留监听而是到点才干活既省资源又时机精准。上手之前先搞清这几件事脚本 周期性回调函数。每个脚本的核心是一个函数它每次执行完返回自己 下次间隔引擎便按这个节拍调度。为什么重要你不需要写死循环写一次返回下次执行时间就能获得持续的周期任务。脚本引擎跑在独立线程里有资源护栏。引擎自带内存堆、指令数上限和线程优先级约束。为什么重要一个失控脚本很难拖垮整个飞控但护栏参数决定了你的脚本能用到多少内存和 CPU。脚本放在约定目录开机自动加载。实机上放在 SD 卡APM目录的scripts文件夹SITL 仿真下放在工作目录通常是仓库根目录。为什么重要文件放对位置 重启脚本就生效了没有注册、安装步骤。图CM4Pilot 飞控顶部 SD 卡槽就是 Lua 脚本文件的上车通道固件层面Flash 大于 1MB 的板子默认就编入了脚本支持见 脚本系统官方说明你的板子是否支持以实际固件参数里有没有SCR_前缀为准。常用参数速览SCR_ENABLE— 总开关0 禁用 / 1 启用 Lua 脚本修改后需重启。SCR_HEAP_SIZE— 脚本可用内存平台默认从 43KB小内存板到 200KBSITL/大内存板不等单位字节。SCR_VM_I_COUNT— 单次执行允许的最大虚拟机指令数默认 10000起CPU 看门狗作用。SCR_THD_PRIORITY— 脚本线程优先级默认 0低优先级保证脚本不打扰飞控主回路。SCR_DEBUG_OPTS— 调试位掩码可打开内存/执行时间日志、禁用起飞前检查等。从 0 到跑通你的第一个脚本最短路径分三步装环境跑仿真 → 写一个 8 行脚本 → 在地面站看输出。# 1. 拉取源码约需几分钟 git clone https://gitcode.com/GitHub_Trending/ar/ardupilot cd ardupilot Tools/environment_install/install-prereqs-ubuntu.sh -y # 2. 一键编译并启动 SITL 仿真 Tools/autotest/sim_vehicle.py -v ArduCopter然后在仓库根目录建一个scripts/文件夹放入下面的脚本地面站把SCR_ENABLE设为 1 并重启function update() -- 周期性回调 local pos ahrs:get_location() -- 读取当前位置 local home ahrs:get_home() -- 读取家点位置 if pos and home then -- 把到家点距离米推送到地面站 gcs:send_text(0, Home: .. pos:get_distance(home) .. m) end return update, 1000 -- 1 秒后再次执行 end return update, 1000 -- 脚本加载 1 秒后首次执行运行后你应该看到什么地面站的 MAVLink 控制台每秒多出一行Home: xx m的文本消息数值随仿真机移动而变化。看到它整条链路加载、调度、API 调用、回报就都通了。进阶玩法按需阅读距离映射到舵机输出。动机让物理世界看得见飞行状态。核心就是把距离换算成 PWMfunction update() local pos, home ahrs:get_location(), ahrs:get_home() if pos and home then local d math.min(pos:get_distance(home), 1000) -- 距离截断在 1000 米 SRV_Channels:set_output_pwm(96, 1000 d) -- 功能 96 通道按比例输出 end return update, 1000 end return update, 1000⚠️ 注意功能号 96 必须先在输出配置里是空闲的否则会抢走别人在用的通道。任务指令触发脚本逻辑。动机脚本不必全程驻留可以由地面站点名。固件侧只做一件事——把DO_SCRIPTING指令的参数转交给脚本引擎// 固件收到 DO_SCRIPTING 指令后 scripting-handle_mission_command(cmd); // 指令参数由此进入 Lua 侧 小技巧仓库里还有一个开箱即用的 交互控制台脚本在机上直接敲 Lua 调试省去改文件—重启的循环它的完整用法见 脚本引擎核心实现 附近的相关参数说明。避坑清单 常见踩坑❌ 改完SCR_ENABLE期望立即生效 → ✅ 该参数标注了重启要求必须重启飞控。❌ 回调函数里忘写return update, 间隔或间隔设成 0 猛跑 → ✅ 每次执行末尾都返回下次调度时间让出 CPU。❌ 新脚本直接上真机首飞 → ✅ 先在 SITL 里把逻辑跑通、观察内存和执行时间日志SCR_DEBUG_OPTS位 1/3。❌ SD 卡上随意丢脚本、不设防 → ✅ 设SCR_LD_CHECKSUM为脚本校验和脚本被篡改时飞控拒绝解锁。❌ 为了更实时把SCR_THD_PRIORITY调高 → ✅ 保持满足需求的最低优先级调高可能影响飞控主回路稳定性。去哪找更多帮助脚本系统官方说明 — 怎么启用、脚本放哪、最简示例新手入口。脚本示例库 — 上百个现成.lua样例每个都带.md说明从里挑一个最像你要的改比从零写快得多。脚本引擎核心实现 — 想搞清楚参数默认值、线程与内存机制的人看这里。社区论坛ArduPilot Discourse 的脚本相关板块适合被卡住之后带着具体报错去问。现在就去建一个scripts/目录写下你的第一个update()让飞控按你的逻辑运转起来。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价