ArduPilot 直升机怠速控制脚本(Heli_idle_control)完整指南:地面怠速 RPM 手动/自动闭环控制
ArduPilot 直升机怠速控制脚本Heli_idle_control完整指南地面怠速 RPM 手动/自动闭环控制【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot导读本文档围绕 ArduPilot 仓库中 libraries/AP_Scripting/applets/Heli_idle_control.md 及同名 Lua 脚本 Heli_idle_control.lua 展开讲解传统直升机trad-heli在地面怠速工况下如何通过 Lua 脚本对旋翼转速RPM进行手动或自动闭环控制。读完本文你将掌握IDLE_* 参数表的完整语义与调参方法、RCx_OPTION301 辅助电位器的接线与配置、脚本内部 PI 控制器的实现原理与运行流程以及如何将该 applet 安装到飞控并与其他旋翼转速控制RSC参数协同工作。脚本定位与使用前提Heli_idle_control 是 ArduPilot Lua Applets 集合见 libraries/AP_Scripting/applets/README.md中的一个完整应用。与 examples 目录下的教学示例不同这类 applet 无需用户编辑脚本本身即可使用——每个 applet 都有一个 .md 文件描述其运行方式与所需参数用户只需将 .lua 文件复制到飞控 SD 卡的APM/scripts目录即可完成安装。安装与运行有三个硬性前提固件必须启用脚本支持SCR_ENABLE 1飞控硬件必须具有运行 Lua 脚本的能力需有一定 Flash/RAM 资源目标机型是传统直升机trad-heli因为该脚本依赖H_RSC_*直升机旋翼转速控制参数与 RPM 传感器输入。脚本启动时会向 GCS 发送idle_control_running文本消息Heli_idle_control.lua可作为脚本是否正常加载的快速验证手段。参数表 IDLE_*定义与默认值脚本通过 ArduPilot Lua 的脚本参数表机制动态注册参数。关键代码如下local PARAM_TABLE_KEY 73 local PARAM_TABLE_PREFIX IDLE_ assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 30), could not add param table) function bind_add_param(name, idx, default_value) assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format(could not add param %s, name)) return Parameter(PARAM_TABLE_PREFIX .. name) endparam:add_table(table_key, prefix, num_params)与param:add_param(table_key, param_num, name, default_value)是 ArduPilot 脚本参数表的底层绑定接口见 libraries/AP_Scripting/docs/docs.lua。表键key为 73前缀为IDLE_最大可注册 30 个参数当前脚本使用了其中 7 个。脚本注册的参数及其默认值如下表参数名索引默认值含义IDLE_GAIN_I10.05控制器积分增益IDLE_GAIN_P20.25控制器比例增益IDLE_GAIN_MAX31积分项的 IMAX 限幅IDLE_MAX417最大油门位置%IDLE_RANGE5300怠速控制生效的 RPM 范围IDLE_SETPOINT6600期望的 RPM 设定值IDLE_RPM_ENABLE700手动油门控制1使用 RPM1 目标2使用 RPM2 目标参数注册源码见 Heli_idle_control.lua。参数调参要点IDLE_GAIN_P / IDLE_GAIN_I经典 PI 参数。P 项对 RPM 偏差立即响应I 项消除稳态误差。I 过大会引起振荡I 过小则怠速 RPM 无法收敛到设定值。IDLE_GAIN_MAX积分限幅IMAX防止积分饱和导致超调。脚本中该值同时用于正负双向限幅见PI_controller实现。IDLE_MAX怠速允许的最大油门输出百分比含义是“地面怠速时油门的上限”。文档原文强调必须设置得足够低以免离合器接合/打滑或低于油门曲线第一段first point of throttle curve。从代码看IDLE_MAX与H_RSC_IDLE共同构成油门输出的上下边界。IDLE_RANGE决定 PI 闭环何时介入的 RPM 死区范围见下文运行流程。默认 300 RPM。IDLE_SETPOINT闭环目标转速默认 600 RPM。IDLE_RPM_ENABLE控制模式选择。0时脚本退化为“手动油门怠速”电位器直接映射油门1/2时分别以 RPM 传感器实例 1 或实例 2对应RPM1/RPM2的RPM_TYPE配置作为反馈进入自动转速闭环。如何启用RCx_OPTION301 辅助电位器文档给出的启用方式只有一条核心命令set RCx_OPTION to 301其中x是实际使用的 RC 通道编号。301对应 ArduPilot RC 通道可选功能SCRIPTING_2脚本输入 2在 libraries/RC_Channel/RC_Channel.h 中定义为SCRIPTING_2 301。该通道通过rc:find_channel_for_option(301)被脚本捕获Heli_idle_control.lua用作辅助电位器输入aux potentiometer用于手动微调怠速。接线与配置建议将一个模拟电位器接到接收机空闲通道再把该通道在飞控上映射为任意 RC 通道RCx。将RCx_OPTION设为301。通道输入范围归一化为-1最低到1最高对应pot_input:norm_input()脚本第 119 行再经map(pot_pos, -1, 1, 0, 1)映射为 0~1 的手动油门系数第 120 行。电位器在最低位pot_pos -1时手动系数为 0怠速油门 H_RSC_IDLE在最高位时系数为 1怠速油门 IDLE_MAX。与 RSC 开关RCx_OPTION32的配合脚本还依赖一个“RSC 开关”通道Heli_idle_control.luarc:find_channel_for_option(32)即MOTOR_INTERLOCK电机/旋翼互锁开关定义于 libraries/RC_Channel/RC_Channel.h。该开关的辅助开关位置get_aux_switch_pos()用于判断是否处于“地面怠速”工况与vehicle:get_likely_flying()联合判定见第 129 行只有开关处于位置 0 且飞行器未起飞时才执行怠速控制逻辑。运行流程与状态机解析脚本主循环以10Hz每 100ms的频率运行return update, 100第 209 行。整体流程按状态分为三大部分对应脚本update()函数第 113-207 行的三个分支。分支一未解锁disarmed当arming:is_armed()返回 false 时脚本将内部状态复位记录当前H_RSC_IDLE到idle_default关闭怠速控制idle_control_active false复位爬升标志ramp_up_complete false、idle_adjusted false复位 PI 积分器thr_PI.reset(0)。此时不干预 RSC 输出旋翼转速控制完全交给飞控原生逻辑H_RSC_IDLE保持默认值 0定义见 libraries/AP_Motors/AP_MotorsHeli_RSC.cpp。分支二解锁 地面怠速RSC 开关位置 0 且未起飞这是脚本的核心工作区再细分为手动与自动两种模式手动模式IDLE_RPM_ENABLE 0thr_out H_RSC_IDLE:get() thr_man*(IDLE_MAX:get() - H_RSC_IDLE:get())油门在H_RSC_IDLE与IDLE_MAX之间随电位器线性变化同时复位爬升与调整标志。自动模式IDLE_RPM_ENABLE 1/2先读取 RPM 反馈RPM:get_rpm((IDLE_RPM_ENABLE:get())-1)第 148 行即1对应 RPM 实例 0RPM12对应 RPM 实例 1RPM2。RPM:get_rpm为脚本绑定接口见 libraries/AP_Scripting/docs/docs.lua 与 libraries/AP_RPM/AP_RPM.h。随后依据当前 RPM 与设定值的关系分三种情况RPM 远低于设定值rpm_current IDLE_SETPOINT - IDLE_RANGE处于爬升初期PI 暂不接管油门直接按电位器手动映射并记录thr_out_lastRPM 远高于设定值rpm_current IDLE_SETPOINT IDLE_RANGE油门回落至H_RSC_IDLE同样记录thr_out_lastRPM 在设定值 ± IDLE_RANGE 范围内进入 PI 闭环。将 RPM 归一化pv rpm_current / IDLE_SETPOINT目标为 1.0调用thr_PI.update(1, pv)得到控制量约束到 0~1 后映射为H_RSC_IDLE到IDLE_MAX之间的油门并限制单步变化不超过 ±0.05防止油门突变第 166 行。此时置idle_control_active true并向 GCS 发送idle control: ON第 171 行。电位器归零thr_man 0时自动模式强制退出闭环油门回到H_RSC_IDLE发送idle control: OFF并复位 PI 积分器第 139-146 行。无论手动还是自动最终输出都通过SRV_Channels:set_output_pwm_chan_timeout直接写入 RSC 伺服通道 PWM第 177-181 行超时 150ms 后自动失效。输出通道来自SRV_Channels:find_channel(31)即RSC功能输出第 40 行并根据SERVO{ch}_REVERSED处理正反舵第 177-181 行。分支三解锁但离开地面怠速飞行/互锁解除当 RSC 开关不在位置 0 或检测到可能飞行get_likely_flying()为 true时关闭怠速控制并发送idle control: deactivated进入爬升ramp-up交接逻辑若爬升尚未完成则将当前怠速油门写入H_RSC_IDLEH_RSC_IDLE:set(last_scaled_output*100)保证从怠速到正常旋翼爬升的油门衔接平滑当超过H_RSC_RUNUP_TIME旋翼达到全速的时间默认 10 秒定义见 libraries/AP_Motors/AP_MotorsHeli_RSC.cpp后恢复H_RSC_IDLE默认值并标记ramp_up_complete true第 188-203 行。这一设计使得“怠速控制脚本”与飞控原生的 RSC 爬升逻辑set_idle_output/set_runup_time见 libraries/AP_Motors/AP_MotorsHeli_RSC.cpp能够无缝衔接起飞后旋翼转速交给原生控制器管理。PI 控制器的源码级剖析脚本实现了一个轻量 PI 控制器闭包PI_controller第 67-107 行核心update(target, current)逻辑local err target - current local P _kP:get() * err if ((_total _max and _total _min) or (_total _max and err 0) or (_total _min and err 0)) then _I _I _kI:get() * err * dt end if _iMax:get() 0 then _I constrain(_I, -_iMax:get(), iMax:get()) end local ret P _I _total ret return ret值得注意的实现细节条件积分anti-windup只有在前次输出未越界或越界但误差方向能拉回边界时才累加积分项避免积分饱和积分限幅IDLE_GAIN_MAX 0时对积分项做 ±IMAX 约束周期计算dt由millis()差值换算而来保证 10Hz 调度下的时间一致性外部复位接口reset(integrator)用于在怠速退出、电位器归零或未解锁时清空积分器。该 PI 控制器实例化于第 109 行thr_PI PI_controller(IDLE_GAIN_P, IDLE_GAIN_I, IDLE_GAIN_MAX, 0, 1)输出被约束在 0~1 之间再映射为实际油门百分比。相关 RSC 参数与协同工作脚本运行依赖直升机旋翼转速控制RSC参数其中直接读写的是参数含义脚本用途H_RSC_IDLE怠速油门输出默认 0libraries/AP_Motors/AP_MotorsHeli_RSC.cpp作为怠速油门下限与爬升交接值H_RSC_RUNUP_TIME旋翼达到全速所需时间默认 10s决定爬升交接窗口长度IDLE_MAX的设定应参考原生 RSC 逻辑中油门与离合器/油门曲线的约束关系过高的怠速上限会导致离合器接合或打滑文档原文明确警告。同时闭环反馈依赖RPM1/RPM2传感器正确配置并输出有效的get_rpm数据若 RPM 传感器未配置或读数异常自动模式将无法正常工作此时应使用IDLE_RPM_ENABLE 0的手动模式。安装、验证与常见问题安装步骤启用脚本地面站中设置SCR_ENABLE 1将 Heli_idle_control.lua 复制到 SD 卡的APM/scripts目录设置怠速电位器通道RCx_OPTION 301设置 RSC 开关通道RCy_OPTION 32MOTOR_INTERLOCK重启飞控使脚本加载并按上文表格调校IDLE_*参数。验证方式启动后 GCS 消息流应出现idle_control_running切换怠速闭环时出现idle control: ON/idle control: OFF离开地面怠速工况时出现idle control: deactivated通过RPM1/RPM2遥测观察实际转速是否收敛到IDLE_SETPOINT。常见问题排查脚本未加载检查SCR_ENABLE、SD 卡目录路径、固件是否支持脚本以及是否出现idle_control_running消息自动模式无闭环确认IDLE_RPM_ENABLE为 1/2、对应 RPM 传感器已配置且读数有效、电位器输入非零怠速转速超调/振荡先降低IDLE_GAIN_I与IDLE_GAIN_P再检查IDLE_GAIN_MAX限幅是否过松离合器打滑降低IDLE_MAX确保其低于离合器接合点或油门曲线第一段起飞后油门突变检查H_RSC_RUNUP_TIME与爬升交接是否正常完成观察H_RSC_IDLE updated for ramp up与H_RSC_IDLE default restored消息。小结Heli_idle_control 用约 200 行 Lua 脚本在飞控原生 RSC 逻辑之外提供了一套独立、可插拔的地面怠速 RPM 控制方案通过IDLE_RPM_ENABLE在“电位器手动油门”与“RPM 传感器自动闭环”之间切换以IDLE_RANGE定义 PI 介入死区并借助H_RSC_IDLE/H_RSC_RUNUP_TIME实现与起飞爬升的无缝交接。理解其参数表、PI 实现与三态状态机即可按需将其移植或调优到自己的传统直升机平台上。相关资源脚本说明文档libraries/AP_Scripting/applets/Heli_idle_control.md脚本源码libraries/AP_Scripting/applets/Heli_idle_control.luaApplets 总览libraries/AP_Scripting/applets/README.md脚本 API 参考libraries/AP_Scripting/docs/docs.lua直升机 RSC 原生实现libraries/AP_Motors/AP_MotorsHeli_RSC.cppRPM 传感器接口libraries/AP_RPM/AP_RPM.hRC 通道可选功能定义301/32libraries/RC_Channel/RC_Channel.h【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考