尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ArduPilot Lua 脚本:不重编固件,如何给无人机加上自己的自定义指令

ArduPilot Lua 脚本:不重编固件,如何给无人机加上自己的自定义指令 ArduPilot Lua 脚本不重编固件如何给无人机加上自己的自定义指令【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot本文以 ArduPilot 的自定义指令系统为主线讲清如何启用 Lua 脚本支持、跑通第一个脚本以及脚本参数配置、调试与飞行前的安全检查适合想扩展飞控逻辑又不想动源码的开发者。先说问题出厂的飞行逻辑够用但不够用 ️用 ArduPilot 飞了一段时间的人多半会碰到这类需求起飞前想让脚本检查一次某路传感器、任务里想插一段自己定义的指令、或者按特定轨迹走一段。这些逻辑出厂固件里都没有而为了它们去改 C 源码、重编固件、刷回飞控成本高得不成比例。ArduPilot 为此内置了一套 Lua 脚本系统核心实现在 libraries/AP_Scripting/ 模块。简单说它把一段沙盒跑在飞控里脚本可以读传感器、发 GCS 消息、甚至向姿态/位置环提交控制量全部用 Lua 这种解释型语言写改完重新上传文件即可不用碰编译链。多旋翼、固定翼、船、潜艇这几类机型都支持定位是在固件之外给飞行逻辑加一层可热插拔的扩展。三步启用脚本系统从参数到第一个脚本跑起来 ⚙️第一步确认硬件过关脚本要占内存和 CPU对硬件有门槛。建议选 STM32F7/H7 系列飞控如 Pixhawk 4、CubeBlack 这一档并且保证至少 1MB 可用存储空间放脚本文件。F4 及以下平台要么跑不了要么堆小得难受。第二步确认固件带脚本编译选项、再打开参数开关脚本支持是否编进固件取决于机型配置头文件如 ArduCopter/config.h里是否定义了AP_SCRIPTING_ENABLED宏。官方发布的稳定固件一般已包含如果你是自编固件编译前要先确认这一点否则后面所有参数都不存在。编译带脚本支持的固件前环境准备可以这样精简git clone https://gitcode.com/GitHub_Trending/ar/ardupilot cd ardupilot Tools/environment_install/install-prereqs-ubuntu.sh -y固件刷好后关键参数如下可在 Mission Planner 等地面站里配置参数含义默认/建议值改后是否需重启SCR_ENABLE脚本系统总开关0 禁用、1 启用1是SCR_HEAP_SIZE分配给脚本的内存Lua 堆单位字节43–200KB 起按平台而定是SCR_VM_I_COUNT虚拟机指令执行上限防止脚本占满 CPU按脚本复杂度调大否SCR_THD_PRIORITY脚本线程优先级按实时性需求微调否SCR_DEBUG_OPTS调试日志开关排错时打开平时关闭否SCR_LD_CHECKSUM脚本校验和拦截被篡改的脚本1否注意 libraries/AP_Scripting/README.md 里明确的流程SCR_ENABLE设为 1 之后要重启飞控然后在地面站刷新参数列表新的 SCR 系列参数才会出现。第三步把脚本放上去脚本文件通过 SD 卡或地面站上传默认存放路径是飞控上的/APM/scripts/目录系统只加载.lua扩展名的文件。仓库里 libraries/AP_Scripting/applets/ 下的成品脚本可以直接拷过去当起点每个 applet 都带一份.md说明它需要什么参数。实战脚本真正能干的三件事 1. 任务指令响应给航线加自定义动作场景任务航线里想插入一个不属于标准指令集的环节比如执行一段自定义数据采集。效果飞行任务执行到对应指令时飞控调用 libraries/AP_Mission/AP_Mission_Commands.cpp 中的start_command_do_scripting按参数拉起指定脚本任务其余部分照常执行。关键点/坑脚本名、参数通过任务指令的字段传递拼写错了任务会继续飞但脚本不会启动日志里不会有大动静容易排查半天。建议先在地面把任务参数和脚本名核对一遍。2. 传感器数据处理低电量提醒这类小钩子场景电池电压低于阈值时主动提醒而不是等低电量保护触发。效果脚本周期性读取battery对象的数据满足条件就通过 GCS 发消息。Lua 脚本的核心写法是函数返回下一个回调和间隔毫秒数自己维持一个循环-- 电量监控每 1000ms 检查一次返回函数本身继续调度 function low_voltage_watch() local v battery:voltage() if v 10.5 then gcs:send_text(0, 低电量 .. v) end return low_voltage_watch, 1000 end return low_voltage_watch()关键点/坑回调间隔别设太短几百毫秒的轮询加上字符串拼接在 H7 上也会吃掉可观的 CPU。能用 1 秒就别用 100 毫秒。3. 自定义飞行逻辑按自己算的轨迹走场景想让飞行器走一个标准模式里不存在的轨迹。效果脚本里自己算目标点调用vehicle的接口提交目标位置或速度飞控的姿态环、位置环照旧兜底脚本只负责目标从哪来。关键点/坑脚本输出的目标不能突变要自己加平滑否则位置环会在两个跳变点之间来回拉扯表现是飞行器抖、甚至触发导航类failsafe。这类逻辑务必先在 SITL 模拟器里验证仓库的 Tools/autotest/pysim/ 就是配套仿真脚本环境。飞前必看内存、调试与安全清单 ⚠️内存与性能SCR_HEAP_SIZE设小了会加载失败或运行中报错设大了挤压其他子系统建议从平台默认值起步脚本里出现堆告警再按提示上调。脚本内部可以用collectgarbage()手动触发垃圾回收长周期任务里定期调用比等自动回收更稳。高频回调里只做算术别在里面做字符串拼接、解析日志这类重活。调试手段日常用gcs:send_text()把关键变量打到地面站控制台最直接。打开SCR_DEBUG_OPTS拿详细日志排完记得关它本身有开销。任何改动先过一遍 SITL跑通再上真机。安全清单飞前逐项打勾SCR_LD_CHECKSUM已启用防止存储卡里的脚本被误改后直接执行目标脚本在 SITL 或地面怠速状态下验证过确认不会持续输出异常目标确认SCR_VM_I_COUNT上限足够但不夸张避免单个脚本把线程优先级之外的资源吃光飞行当日重新上传过脚本确认卡里是最终版本下一步去哪找 Lua 在 ArduPilot 里解决的是不动固件也能改飞行行为这一件事上限取决于你对飞控各接口的熟悉程度起步成本却只有一段.lua文件。把本文的三步走一遍、挑一个 applet 改起来比通读源码学得快。官方脚本示例目录libraries/AP_Scripting/examples/可直接使用的成品脚本libraries/AP_Scripting/applets/脚本模块源码与说明libraries/AP_Scripting/任务指令与脚本的衔接点libraries/AP_Mission/社区脚本与仿真测试Tools/autotest/pysim/【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表