免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

如何3步跑通 ArduPilot 脚本引擎:从零到第一个 Lua 脚本的最短路径

如何3步跑通 ArduPilot 脚本引擎:从零到第一个 Lua 脚本的最短路径 如何3步跑通 ArduPilot 脚本引擎从零到第一个 Lua 脚本的最短路径【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot起飞前你需要多旋翼在电压低于 10.8V 时自动上报地面站而不是改固件、重新编译、再烧录一遍。把 10 行 Lua 脚本丢进 ArduPilot 飞控让它自己读电压、发报文——这正是内置脚本系统最直接的用法。下面按先跑起来再谈机制的顺序带你过完一遍。不用它你会撞上什么墙 两个真实卡点一是某个传感器越限要触发特定动作固件里没有现成开关为一条阈值改核心代码、重新编译验证成本高到不划算二是你想接一个自定义串口协议的配件驱动迟迟没有合并进主线工作流直接停在这里。这两种情况都是脚本层的活不该落到改 C 上。脚本怎么上机的调度链路与关键参数 ⚙️机制就是一条循环链输入是脚本目录里的.lua文件核心处理是启动时扫描目录见 libraries/AP_Scripting/lua_scripts.cpp 的load_all_scripts_in_dir每个脚本顶层return 函数, 延迟把回调登记进队列之后飞控调度线程周期性执行队列中的回调入口是 libraries/AP_Scripting/AP_Scripting.cpp 的update()并用 Lua hook 限制单次执行的 VM 指令数输出是回调返回值(fn, delay)执行完再按新延迟排回队列。是否编进固件由 libraries/AP_Scripting/AP_Scripting_config.h 里的AP_SCRIPTING_ENABLED决定flash 超过 1024KB 的板子自动启用。跑脚本前这几个参数值得先认脸6 个就够参数作用备注SCR_ENABLE0 关 / 1 开 Lua 脚本改完必须重启SCR_HEAP_SIZE脚本堆内存默认 43KB~200KB 按板子分级改完必须重启SCR_VM_I_COUNT单次执行允许的 VM 指令数上限默认 10000范围到 1000000SCR_THD_PRIORITY脚本线程优先级默认 Normal调高有干扰飞行控制的警告SCR_LD_CHECKSUM已加载脚本的 CRC 校验值-1 禁用不匹配拒绝解锁SCR_DEBUG_OPTS位掩码调试开关内存/耗时日志、关解锁检查等第 1 位开运行状态日志最短配置路径从 clone 到第一条 gcs:send_text 全部步骤如下注释就是为什么git clone https://gitcode.com/GitHub_Trending/ar/ardupilot cd ardupilot Tools/environment_install/install-prereqs-ubuntu.sh -y # 一次性装齐 waf/Lua 等构建依赖 waf configure --boardsitl # 用 SITL 仿真目标没硬件也能验证全流程 waf plane Tools/autotest/sim_vehicle.py -v ArduPlane # 拉起 ArduPlane 仿真真机路线只差两处waf configure --boardCubeBlack后waf plane --upload且 flash ≥1MB 的板子CubeBlack、Pixhawk 4 这类 H7/F7才会带脚本引擎。然后做三件事参数里设SCR_ENABLE1并重启把.lua放进脚本目录——SITL 在工作目录的scripts/真机在 SD 卡的APM/scripts/重启后脚本自动加载无需其他注册。首次验证用这个最小脚本能收到 hello 就说明引擎、文件目录、GCS 通路三件事全通了-- first_run.lua跑通判定标准 function hello() gcs:send_text(0, Scripting is alive) -- 0 表示紧急级地面站直接弹出 return hello, 2000 -- 每 2 秒喊一次确认调度循环活着 end return hello三个拿来就改的脚本低电压报警、低空锁死、跳点 ️场景一低电压实时报警对应官方frsky_battery.lua的思路。电压跌破阈值时向地面站发一条紧急消息每秒检查一次-- battery_low_alert.lua local min_volt 10.8 function check() local batt Battery() if batt then local v batt[0]:voltage() -- 电组总压 if v 0 and v min_volt then gcs:send_text(0, Battery low: .. string.format(%.1f, v) .. V) end end return check, 1000 -- 每秒复查 end return check预期效果接上 4S 电池电压一过线地面站立刻弹出报警文本频率不刷屏可再加状态位去重。场景二VTOL 低空锁死固定翼模式QuadPlane_Low_Alt_FW_mode_prevention.lua的精简版。低空误切 FW 会直接摔机这里每 500ms 巡逻一次-- low_alt_fw_guard.lua local min_alt 10 -- 10 米以下禁止固定翼模式 function guard() if vehicle:is_quadplane() and vehicle:in_flight() and vehicle:get_altitude() min_alt and vehicle:mode() FBWA then vehicle:set_mode(QLOITER) -- 立即拉回多旋翼悬停 gcs:send_text(0, Too low for FW mode) end return guard, 500 end return guard预期效果四旋翼在 10 米以下被误切到 FBWA 时半秒内被打回 QLOITER 并有地面提示。场景三Auto 模式条件跳点advance-wp.lua的思路。当当前位置离当前航点太远比如被强侧风推偏请求跳去下一个避免绕圈追不上-- advance_wp.lua function advance() if vehicle:in_mode(AUTO) then local wp vehicle:waypoint() if wp and wp.distance() 200 then -- 离当前航点超 200 米 vehicle:advance_waypoint() -- 请求推进到下一航点 end end return advance, 1000 end return advance预期效果偏航超标后任务自动推进航线整体节拍不崩地面站日志能看到跳点记录。这些坑帮你踩过了 症状SCR_ENABLE1已保存控制台提示 No Scripts to run。根因该参数带RebootRequired: True不落盘重启不生效。解法改完参数执行一次重启再进参数页刷新。症状脚本文件确认在 SD 卡里就是不加载。根因只扫描APM/scripts/目录、只认.lua结尾、以.开头的隐藏文件直接跳过SCR_DIR_DISABLE位 1 还会整体禁掉该目录。解法小写命名、直接放APM/scripts/根目录并确认SCR_DIR_DISABLE0。症状脚本报Out of memory或堆分配失败。根因F4 级板子默认堆只有 43KBSITL/H7 才是 200KB。解法把SCR_HEAP_SIZE调到 200000 并重启同时精简脚本里的长生命周期变量。症状回调被掐断日志出现 overtime 提示。根因SCR_VM_I_COUNT默认 10000单次执行累计 VM 指令超限就判耗时过长。解法调高SCR_VM_I_COUNT官方 Aerobatics 示例用到 200000或把重逻辑挪到低频回调里。下一步看什么 libraries/AP_Scripting/examples/160 多个官方示例脚本光流导航、NTNTP、Web 服务等刚起步的抄一个读注释就能上手libraries/AP_Scripting/applets/成品级即插即用脚本电池监控、执行器扫频、参数锁每个配了 .md 说明适合直接搬走改两行ArduPilot Discourse 论坛的 scripting 板块卡死时贴参数全集和控制台日志去问比干读源码快把第一个脚本跑起来比读完十篇教程都管用。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表