ARTICLE DETAIL

资讯详情

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

ArduPilot 四旋翼混合机(Quadplane)自动包裹投放:plane_package_place 脚本配置、任务规划与源码原理详解

ArduPilot 四旋翼混合机(Quadplane)自动包裹投放:plane_package_place 脚本配置、任务规划与源码原理详解 ArduPilot 四旋翼混合机Quadplane自动包裹投放plane_package_place 脚本配置、任务规划与源码原理详解【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilotArduPilot 的plane_package_place脚本为四旋翼混合机Quadplane实现了完整的自动包裹投放Package Place功能飞机在 AUTO 模式下飞抵投放点垂直下降到测距仪设定的高度悬停稳定后自动触发投放舵机再爬升回原高度继续执行后续任务。本文将基于官方文档 plane_package_place.md 与同名 Lua 脚本 plane_package_place.lua 的完整源码讲解脚本安装启用、PKG_*参数配置、PAYLOAD_PLACE任务航点规划、两种投放模式空中投放 / 着陆后投放并深入底层 C 实现揭示任务命令处理、中止投放判定与着陆中止abort landing的完整调用链帮助你直接在自己的 Quadplane 上部署一套可用的自动投递方案。脚本概述为 Quadplane 补齐精准投放能力ArduPilot 固件本身已支持MAV_CMD_NAV_PAYLOAD_PLACE航点 ID 94任务命令但其核心行为等同于一次 VTOL 着陆——到达后落地、结束命令。而真实的物流投递、搜救物资投放场景通常要求低空悬停投放后自行爬升继续任务这正是 plane_package_place.lua 要解决的问题。该脚本运行在 AP_ScriptingLua环境中通过监听当前导航命令是否为NAV_VTOL_PAYLOAD_PLACE来接管整个投放流程并借助固件原生接口实现四件事在垂直下降阶段根据测距仪rangefinder高度精确触发投放舵机投放前悬停一段时间让飞机进入稳定悬停状态保证投放精度投放后继续悬停片刻确保包裹干净脱离调用quadplane:abort_landing()中止着陆、爬升回初始高度并继续任务。从源码看脚本通过mission:get_current_nav_id()判断当前航点plane_package_place.lua与固件侧将MAV_CMD_NAV_PAYLOAD_PLACE视为 VTOL 着陆命令的处理方式见 ArduPlane/commands_logic.cpp完全对应因此脚本对固件版本要求低纯 Lua 层即可实现全部逻辑无需改动固件。安装与启用三步让脚本生效官方文档要求在 microSD 卡的APM/scripts目录安装脚本或编译进固件 ROMFS然后开启脚本系统并重启将 plane_package_place.lua 复制到飞控 microSD 卡的APM/scripts目录文件名保持plane_package_place.lua不变或按 ArduPilot 构建流程将该 applet 编译进固件的 ROMFS设置SCR_ENABLE1启用脚本系统重启飞控使脚本加载生效。脚本加载成功后会通过 GCS 发送提示信息Loaded package place scriptplane_package_place.lua可在地面站消息窗口确认。此外脚本还自带故障保护protected_wrapper()使用pcall包裹update()一旦执行出错不会导致脚本整体退出而是显示Internal Error: ...并将重试间隔临时拉长到 1 秒避免错误刷屏plane_package_place.lua。前提提示脚本仅在固件编译时启用了AP_SCRIPTING_ENABLED即 HAL 脚本支持的版本上可用主流标准固件默认满足。参数详解PKG_* 四件套脚本启动时通过param:add_table(9, PKG_, 5)注册了一张独立的参数表plane_package_place.lua所有参数以PKG_为前缀重启后即可在地面站看到。完整参数如下参数默认值类型含义PKG_ENABLE0布尔总开关设为 1 启用脚本PKG_RELEASE_FUNC94整数投放舵机对应的SERVOn_FUNCTION功能号PKG_RELEASE_HGT10浮点米触发投放的测距仪高度0 表示着陆后再投放PKG_RELEASE_HOLD1浮点秒投放前后的悬停保持时间PKG_ENABLE总开关必须设置为1脚本才会生效。源码在脚本加载阶段和每次update()中都会检查该值plane_package_place.lua、plane_package_place.lua为 0 时脚本直接空转不执行任何投放逻辑。脚本即使已加载也可以通过随时改回 0 的方式临时禁用投放。PKG_RELEASE_FUNC投放舵机功能号该参数指明哪个伺服功能号用于包裹释放。官方推荐保持默认值 94并把实际舵机的SERVOn_FUNCTION也设为 94。功能号 94 对应Script1脚本输出通道 1在 SRV_Channel.h 中定义为k_scripting1 94其地面站枚举说明见 SRV_Channel.cpp。脚本加载后会立即对该通道执行两行初始化plane_package_place.luaSRV_Channels:set_range(PKG_RELEASE_FUNC:get(), 1000) SRV_Channels:set_output_scaled(PKG_RELEASE_FUNC:get(), 0)即把该通道声明为范围 0~1000 的输出区别于角度的 -4500~4500 范围并默认输出 0。因此接线时只需确认伺服 PWM 输出为 0对应通道范围的起点时包裹处于锁定/未释放状态为 1000 时触发释放机构。投放瞬间脚本将输出设为满值 1000plane_package_place.lua复位时再归零reset()函数plane_package_place.lua。PKG_RELEASE_HGT投放触发高度PKG_RELEASE_HGT以米为单位表示测距仪朝下安装测得的离地高度到达该值时开始投放流程。默认值 10 米适合大部分场景。设置为 0 时则进入着陆后投放模式见下文专节飞机完全落地、电机停机后再释放。脚本在下降阶段实时计算remaining_m dist_m - PKG_RELEASE_HGTplane_package_place.lua并在下降剩余高度进入Q_LAND_FINAL_ALT范围内时主动把下降速率切换为Q_LAND_FINAL_SPD实现接近投放高度前的减速plane_package_place.lua。这两个固件参数Q_LAND_FINAL_ALT进入最终下降速率的切换高度默认 6 米范围 0.5~50 米见 quadplane.cppQ_LAND_FINAL_SPD最终阶段下降速度默认 0.5 m/s范围 0.3~2 m/s见 quadplane.cpp。PKG_RELEASE_HOLD投放前后悬停保持时间PKG_RELEASE_HOLD默认 1 秒控制两个等待阶段投放前飞机到达PKG_RELEASE_HGT高度后先悬停PKG_RELEASE_HOLD秒让飞机进入稳定悬停、消除下降带来的垂向速度残留确保投放点的水平精度投放后触发舵机释放后再保持PKG_RELEASE_HOLD秒确保包裹干净地脱离机构随后才中止着陆、爬升。源码通过状态机计时实现该逻辑now - release_start_t PKG_RELEASE_HOLD:get()判定第一阶段结束plane_package_place.lua PKG_RELEASE_HOLD:get()*2判定第二阶段结束plane_package_place.lua。任务规划从测距仪到 PAYLOAD_PLACE 航点第一步配置测距仪着陆能力投放依赖测距仪实时测高官方文档强调先做好 rangefinder landing 的准备安装并调试一个质量可靠的朝下测距传感器激光雷达 Lidar 或雷达 Radar确认测距数据稳定设置RNGFND_LANDING1启用测距仪参与 VTOL 着陆的高度判断。脚本运行时要求测距仪具备向下的有效数据rangefinder:has_data_orient(RNG_ORIENT_DOWN)其中RNG_ORIENT_DOWN 25表示朝下安装plane_package_place.lua。测距数据同时用于投放高度判定与着陆判定是整套方案的核心传感器。第二步插入 PAYLOAD_PLACE 航点在任务中目标投放位置插入PAYLOAD_PLACE航点即 MAVLink 的MAV_CMD_NAV_PAYLOAD_PLACE。两个关键设置航点高度设为 0相对高度脚本与固件会将下降/中止逻辑建立在相对高度的比较上无需设置绝对投放高度实际投放由测距仪高度PKG_RELEASE_HGT决定参数 1 max descent最大下降量单位米该值非零时表示飞机从开始下降的位置允许下降的最大高度。若下降过程中超过该值仍未触发投放任务会被判定中止——飞机中止着陆、爬升回初始下降高度然后继续执行后续任务。底层实现在固件QuadPlane::verify_vtol_land()中当处于PAYLOAD_PLACE且位于下降/最终阶段时若cmd.p1 0且当前高度低于初始下降高度 − p1即发送Payload place aborted信息并切换到QPOS_LAND_ABORT状态quadplane.cpp其中 p1 以厘米为单位存储。这相当于一道最大下降深度的安全护栏防止因测距失效或风况异常导致飞机无限制下坠。第三步理解任务执行链路插入的PAYLOAD_PLACE航点在固件中按 VTOL 着陆命令处理。命令开始时do_command阶段固件根据是否启用固定翼螺旋进场选项Q_OPTIONS的MISSION_LAND_FW_APPROACH分别走do_landing_vtol_approach或do_vtol_landcommands_logic.cpp命令完成判定verify_command阶段则由verify_vtol_land()完成commands_logic.cpp。这正是脚本能够介入的前提它并不重复实现下降控制而是监听该航点进入下降阶段后接管何时释放、何时中止的决策。空中投放完整工作流程与状态机脚本核心update()以 20Hz 频率运行return loop, 50plane_package_place.lua。整个投放流程由 5 个状态组成plane_package_place.luaRELEASE_NONE → RELEASE_DESCENT → RELEASE_HOLD1 → RELEASE_HOLD2 → RELEASE_DONERELEASE_NONE待命仅在 AUTO 模式、当前航点为NAV_VTOL_PAYLOAD_PLACE、且已解锁时继续plane_package_place.lua同时等待飞机进入 VTOL 着陆下降阶段quadplane:in_vtol_land_descent()plane_package_place.lua。满足条件后转入RELEASE_DESCENT。RELEASE_DESCENT下降读取朝下测距数据计算remaining_m。当剩余高度进入Q_LAND_FINAL_ALT内时将下降速率设为Q_LAND_FINAL_SPD减速。当remaining_m 0到达投放高度且PKG_RELEASE_HGT 0时记录时间戳、将下降速率清零进入RELEASE_HOLD1plane_package_place.lua。RELEASE_HOLD1投放前悬停悬停PKG_RELEASE_HOLD秒后发送Package released at X.Xm信息将PKG_RELEASE_FUNC通道输出拉满到 1000 触发释放机构进入RELEASE_HOLD2plane_package_place.lua。RELEASE_HOLD2投放后保持继续悬停PKG_RELEASE_HOLD秒确保包裹干净脱离随后调用quadplane:abort_landing()中止着陆。成功则发送Climbing失败则发送land abort failed告警plane_package_place.lua。RELEASE_DONE完成任务继续飞机爬升回初始下降高度后执行后续航点。整个流程中若任何前置条件不满足非 AUTO、离开该航点、解锁丢失reset()会立刻将状态和舵机输出复位等待下次进入plane_package_place.lua。着陆后投放模式Landing Then Release当PKG_RELEASE_HGT0时脚本切换为完全着陆后投放飞机执行完整 VTOL 着陆直至落地电机完全停机螺旋桨熄火着陆状态通过motors:get_desired_spool_state() MOTORS_SHUT_DOWN判定plane_package_place.lua此状态下测距高度按 0 处理dist_m 0.0落地停机后保持PKG_RELEASE_HOLD秒此时remaining_m 0且已landed走正常释放流程再触发舵机释放释放后再保持PKG_RELEASE_HOLD秒随后同样调用abort_landing()中止着陆、爬升回初始下降高度继续任务。该模式下固件侧有专门配合当处于PAYLOAD_PLACE航点且位置控制器状态为QPOS_LAND_COMPLETE着陆完成时电机保持SHUT_DOWN不启动quadplane.cpp确保投放瞬间电机处于熄火安全状态。而QuadPlane::abort_landing()也专门为已着陆的 payload place开了绿灯——只要处于PAYLOAD_PLACE且QPOS_LAND_COMPLETE即使已离开下降状态也能正常触发中止爬升quadplane.cpp。此模式适合先确认落地、再释放重物的场景例如投放较重的包裹避免空中投放带来的姿态扰动。底层原理固件侧的关键配合机制PAYLOAD_PLACE 的着陆命令身份MAV_CMD_NAV_PAYLOAD_PLACE在固件中被等同为 VTOL 着陆命令在 quadplane.cpp 中它与NAV_VTOL_LAND、NAV_LAND一起被is_vtol_land()识别在 quadplane.cpp 中与 VTOL 着陆共用vtol_position_controller()位置控制器。这解释了为什么脚本只需监听航点 ID 即可复用完整的着陆下降控制——它站在固件成熟着陆逻辑之上只做投放决策。下降阶段判定脚本依赖quadplane:in_vtol_land_descent()判断是否已进入下降。固件实现为在 QRTL 模式或 AUTO 模式且当前航点为 VTOL 着陆类命令时位置控制状态处于QPOS_LAND_DESCEND、QPOS_LAND_FINAL或QPOS_LAND_ABORT即视为下降中quadplane.cpp。中止投放的双保险max descent 参数由固件侧强制执行上文verify_vtol_land()中的 p1 检查而正常投放完成后的爬升则由脚本主动调用abort_landing()触发——两者共同构成安全网前者防止下降过深后者实现投完就走。abort_landing()会将位置控制状态置为QPOS_LAND_ABORTquadplane.cpp飞机随即爬升任务继续。舵机通道与安全复位投放通道是脚本可控的Script1功能号 94脚本在非激活状态下始终把输出保持在 0锁定位置只有到达释放时刻才拉高到 1000。这意味着即使脚本运行异常reset()与protected_wrapper()也会尽量把通道恢复到安全锁定状态。实战注意事项测距仪质量决定投放精度脚本完全依赖朝下测距数据触发投放测距数据抖动或盲区会直接影响高度判定。务必在地面测试RNGFND_LANDING着陆流程后再启用脚本注意参数名拼写官方文档中Landing Then Release一节提到的PGK_RELEASE_HGT为笔误实际参数为PKG_RELEASE_HGT源码中统一使用PKG_前缀见 plane_package_place.lua投放机构机械行程舵机行程需与SERVOn_FUNCTION94Script10~1000 范围匹配务必确认 0 为锁定、1000 为释放避免上电默认位置误投先地面联调再实飞建议先在无负载情况下用模拟投放验证状态机流转可通过 GCS 消息窗口观察Loaded package place script、Package released、Climbing等关键日志再逐步加负载保持 AUTO 模式与航点 ID 匹配脚本仅在 AUTO 模式下且当前航点为NAV_VTOL_PAYLOAD_PLACE时工作若用 QLAND 等手动模式降落脚本不会介入max descent 安全值根据投放高度PKG_RELEASE_HGT合理设置max descent参数通常应略大于PKG_RELEASE_HGT与一个悬停保持缓冲之和避免正常流程被误判中止。参考资料官方文档libraries/AP_Scripting/applets/plane_package_place.md脚本源码libraries/AP_Scripting/applets/plane_package_place.lua固件命令处理ArduPlane/commands_logic.cpp固件 VTOL 着陆/中止实现ArduPlane/quadplane.cpp脚本通道定义libraries/SRV_Channel/SRV_Channel.h、libraries/SRV_Channel/SRV_Channel.cpp【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表