ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ArduPilot Lua 脚本实战:3 段代码让无人机跑自定义指令

ArduPilot Lua 脚本实战:3 段代码让无人机跑自定义指令 ArduPilot Lua 脚本实战3 段代码让无人机跑自定义指令【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot飞控需要执行一段地面站标准指令里不存在的逻辑且必须立刻上线——重编固件太慢等官方版本又太久。ArduPilot 的 Lua 脚本系统就是第三条路不碰一行 C把自定义指令写进一个.lua文件传到飞控就能跑。本文覆盖从开启脚本引擎到 3 段实用脚本落地的完整链路外加容易踩的坑。 三步跑通从零到第一段脚本执行第一步确认飞控支持脚本运行。flash 大于 1MB 的飞控Pixhawk 4、CubeBlack 这类 STM32F7/H7 平台官方固件默认内置脚本引擎不确定就看参数列表里有没有SCR_开头的参数有就支持。第二步用参数打开脚本引擎。在地面站参数页做如下设置SCR_ENABLE 1 # 0 关闭 1 开启改完必须重启 SCR_HEAP_SIZE 88032 # 脚本堆空间字节脚本大了就调 SCR_VM_I_COUNT 100000 # 虚拟机指令执行上限防脚本吃满 CPU堆空间默认只有几十 KB脚本稍复杂就得上调到几百 KB对实时性有要求时再动SCR_THD_PRIORITY脚本线程优先级。第三步上传脚本并确认输出。把.lua文件放进 SD 卡/APM/scripts/目录飞控启动时自动加载全部脚本在 SITL 仿真测试 Lua 脚本时脚本放在 ardupilot 工作目录即可。先传 examples 里的 hello_world.lua地面站出现 hello, world 字样链路就通了。 实战演练三段脚本由浅入深电池低电压守护第一段最直白每 1 秒读一次电池电压低于 10.5V 就在地面站喊话。return update, 1000是脚本设置周期回调的标准写法改毫秒数就是改轮询频率。function update() local v battery:voltage() if v 10.5 then gcs:send_text(0, Low voltage .. v) end return update, 1000 end return update()任务指令拦截处理第二段把自定义行为塞进任务执行任务时脚本逐项检查条目遇到你自己定义的指令 ID 100 就跑自定义逻辑。指令内容由你定地面站无需认识它AP_Mission 模块的条目接口负责把它喂给脚本。local function check(item) if item:command() 100 then gcs:send_text(0, Running custom cmd) -- 在这里写你的逻辑 end end function update() local item mission:next_item() if item then check(item) end return update, 500 end return update()自定义圆形轨迹第三段有意思一点用时间当角度参数50 毫秒刷新一次目标位置无人机就绕着一个半径 10 米的圆飞。这类轨迹脚本回调频率高上机前注意留足 CPU 和堆空间余量否则飞控会开始卡顿。local radius 10 function fly_circle() local t millis() / 1000 local x radius * math.cos(t / 3) local y radius * math.sin(t / 3) vehicle:set_target_position(x, y, 5) return fly_circle, 50 end return fly_circle, 1000 避坑指南性能、调试与上飞检查脚本卡顿先查这三个参数现象姿态发飘、其他模块日志变慢。原因脚本占满 CPU 或内存。解法按顺序查SCR_VM_I_COUNT不够时脚本被强制挂起到下个周期才继续跑SCR_HEAP_SIZE溢出则脚本直接死掉SCR_THD_PRIORITY设太高会把主循环挤出去。怎么确认脚本真的在跑两个办法。一是在 update 函数里加一行gcs:send_text(0, tick)心跳地面站消息栏每秒有输出就是活的二是看飞控日志用 SCR_DEBUG_OPTS 参数打开更详细的脚本日志脚本异常退出时能看到具体原因。上飞之前必须做完的三件事一同一份脚本先在 SITL 里跑满 10 分钟二确认脚本校验和SCR_LD_CHECKSUM生效防止 SD 卡上的脚本被篡改后照常执行三手动模式下地面试跑一次报警、拦截、轨迹逻辑各触发一遍都符合预期再解锁。 收尾脚本不是玩具是你在 ArduPilot 上验证飞行思路最快的方式。挑一段 examples 里的代码今天就传上机试试。AP_Scripting 官方示例库SITL 仿真入口 sim_vehicle.pyAP_Scripting 源码【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表