ArduPilot 中通过 Lua 脚本驱动 SkyPower EFI:参数配置、CAN 通信与自动重启实战指南
2026/9/15 15:19:52 网站建设 项目流程

ArduPilot 中通过 Lua 脚本驱动 SkyPower EFI:参数配置、CAN 通信与自动重启实战指南

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

本篇技术指南围绕 ArduPilot 仓库中提供的 EFI_SkyPower.md 文档及其配套 Lua 实现 EFI_SkyPower.lua,系统讲解如何在 ArduPlane、ArduCopter、ArduRover 等飞控上通过"脚本化 EFI 后端"接入 SkyPower 系列发动机电控单元(ECU):从 CAN 总线参数、EFI_SP_*全部参数的含义与推荐取值,到起动机/发电机/油门的 RC 开关控制,再到遥测上报与低转速自动重启的完整工作流程。读完本文,你将能够独立完成 SkyPower EFI 驱动的部署、参数整定与故障排查。

SkyPower EFI 驱动是什么

SkyPower 是一系列采用 CAN 总线通信的电喷(EFI)发动机电控单元。ArduPilot 为其提供了一款基于 Lua 脚本的驱动(driver),位于 libraries/AP_Scripting/drivers/EFI_SkyPower.lua,对应文档 libraries/AP_Scripting/drivers/EFI_SkyPower.md。该驱动支持对 SkyPower 发动机的监测控制两大能力:

  • 监测:通过 CAN 总线解析 ECU 广播的遥测数据,得到转速(RPM)、缸头温度(CHT)、排气温度(EGT)、喷油正时、发动机负荷、燃油消耗率、节气门位置、大气压力、点火电压等,并通过 MAVLink 的EFI_STATUS消息和飞行日志呈现给地面站与开发者。
  • 控制:支持发动机启动/停止、发电机启停,以及油门指令下发;还能在飞行中当转速异常跌落时自动执行发动机重启。

从实现角度,这不是 C++ 原生后端,而是走"EFI Scripting 后端"通道:Lua 脚本把解析后的数据封装为EFI_State结构,交给飞控固件里的AP_EFI_Scripting::handle_scripting()(见 AP_EFI_Scripting.cpp),再由 EFI 前端统一完成日志与 MAVLink 上报。脚本要求 ArduPilot 固件版本不低于 4.3(脚本头部通过FWVersion断言SCRIPT_AP_VERSION = 4.3)。

一、工作原理:从 CAN 帧到 EFI 状态

1.1 CAN 通信前提

SkyPower ECU 通过 CAN 总线与飞控相连。脚本头部注释明确给出了推荐配置,注意其CAN 总线利用率较高(ECU 内部使用的 CAN 报文也会被转发到总线上),且总线速率被限制为 500 kbit/s

  • CAN_D1_PROTOCOL 10:第一个 CAN 端口协议设为Scripting(脚本驱动 1)
  • CAN_P1_DRIVER 1:使用第一个 CAN 驱动
  • CAN_D1_BITRATE 500000:波特率 500 kbit/s

协议号映射可以在源码中确认:libraries/AP_CANManager/AP_CAN.h定义了Scripting = 10Scripting2 = 12libraries/AP_CANManager/AP_CANManager_CANDriver_Params.cppCAN_Dx_PROTOCOL取值列表同样将 10 标注为Scripting、12 标注为Scripting2。因此第二个脚本 CAN 驱动对应CAN_Dx_PROTOCOL=12

1.2 遥测报文解析(两类 ECU 模型)

脚本在handle_EFI_packet()中按 CAN 报文 ID 解析数据,并针对两种 ECU 型号提供了不同解析表:

  • SRE_180(EFI_SP_MODEL=0,默认)0x100携带转速、点火提前角、节气门角度;0x101携带当前/目标负荷与喷油时间;0x104携带供电电压、ECU 温度、大气压力与燃油消耗率;0x105携带 CHT、进气歧管温度(IMT)、EGT、油温;0x178携带第二路电压。
  • SP_275(EFI_SP_MODEL=1:遥测分布在更多 ID 上(如0x102喷油时间、0x10C第二缸 CHT/EGT、0x10D当前负荷、0x113发电机电流、0x114第二路电压、0x2E0起动马达转速、0x10B燃油消耗率),同时提供传感器错误标志与热限制标志(0x107)。

解析时脚本会记录last_rpm_t时间戳,只有收到新的 RPM 数据才更新整体 EFI 状态(set_EFI_State()),避免用旧数据污染状态。值得注意的是,脚本注释说明部分 SkyPower 设备使用扩展帧、部分使用 11 位标准帧,因此驱动对两种帧格式均做了兼容处理。

1.3 状态结构:EFI_State

解析结果被封装进EFI_StateCylinder_Status结构(定义见 AP_EFI_State.h),核心字段包括:

EFI_State 字段含义
engine_speed_rpm发动机转速(RPM)
engine_load_percent发动机负荷(%)
fuel_consumption_rate_cm3pm瞬时燃油消耗率(cm³/min)
estimated_consumed_fuel_volume_cm3累计燃油消耗量(cm³)
throttle_position_percent节气门位置(%)
atmospheric_pressure_kpa大气压力(kPa)
ignition_voltage点火电压(V)
intake_manifold_temperature进气歧管温度(K)
throttle_out油门输出百分比
cylinder_status单缸状态(CHT、EGT、点火提前角、喷油时间等,单位为开尔文/毫秒)

脚本通过efi_backend:handle_scripting(efi_state)将状态推入固件,对应 C++ 侧的AP_EFI_Scripting::handle_scripting()会先把数据存入内部状态,再copy_to_frontend()同步到 EFI 前端(见 AP_EFI_Scripting.cpp)。前端随后负责统一的日志写入与EFI_STATUSMAVLink 上报。

二、启用前置条件:三个关键参数

根据文档 EFI_SkyPower.md 的 Operation 章节,加载脚本前必须配置:

  1. SCR_ENABLE = 1:启用 Lua 脚本系统。只有带脚本支持(Scripting enabled)的固件才有该参数,具体说明可参考 AP_Scripting/README.md。
  2. EFI_TYPE = 7:把 EFI 通信类型设为Scripting。该取值在 AP_EFI.cpp 的参数定义中列为7:Scripting,固件初始化时会据此创建AP_EFI_Scripting后端(见 AP_EFI.cpp)。该参数变更需要重启飞控生效。
  3. CAN 总线配置:如 1.1 节所述设置CAN_Dx_PROTOCOLCAN_Px_DRIVERCAN_Dx_BITRATE

配置完成后重启飞控并刷新参数EFI_SP_*参数组才会出现。

编译前提(源码级):Scripting EFI 后端需要固件同时开启HAL_EFI_ENABLEDAP_SCRIPTING_ENABLED,见 AP_EFI_config.h 中的AP_EFI_SCRIPTING_ENABLED宏定义。

三、EFI_SP_* 参数详解

脚本在启动时通过param:add_table()注册了一个包含 15 个参数的EFI_SP_参数表(参数表键值 36),每个参数都有@Param元数据注释。下表汇总了全部参数(含文档列举的核心参数与 Lua 源码中定义的附加参数),取值与默认值均以 EFI_SkyPower.lua 为准:

参数含义取值默认值
EFI_SP_ENABLE驱动总开关0:禁用, 1:启用0
EFI_SP_CANDRV绑定的脚本 CAN 驱动编号0:无, 1:第1路, 2:第2路1
EFI_SP_UPDATE_HZ脚本主循环检查新数据的频率10–200 Hz200
EFI_SP_THR_FN监听的 SERVOn_FUNCTION 编号,用于油门指令0:禁用, 70:固定翼, 31:直升机RSC0
EFI_SP_THR_RATE油门指令下发频率10–100 Hz,0 禁用50
EFI_SP_START_FN起动机控制的脚本 RC 功能号0:禁用, 300–3070
EFI_SP_GEN_FN发电机控制的脚本 RC 功能号0:禁用, 300–3070
EFI_SP_MIN_RPM发动机视为停机的最低转速1–1000 RPM100
EFI_SP_TLM_RT额外遥测(命名浮点)上报频率1–10 Hz,0 禁用0
EFI_SP_LOG_RT自定义 EFSP 日志记录频率1–50 Hz10
EFI_SP_ST_DISARM允许未解锁(disarmed)时启动发动机0:禁止, 1:允许0
EFI_SP_MODELECU 型号0:SRE_180, 1:SP_2750
EFI_SP_GEN_CRTL发电机控制开关0:禁用, 1:启用1
EFI_SP_RST_TIME自动重启判定时间(发动机应运转却停机超过该时长则重启)0–10 s,0 禁用2

3.1 油门控制参数(EFI_SP_THR_FN / EFI_SP_THR_RATE)

  • EFI_SP_THR_FN指定从哪个伺服输出功能读取油门指令:
    • 70:固定翼前向油门(K_THROTTLE)。脚本取SRV_Channels:get_output_scaled(70),再乘以 0.01 归一化到 0–1 范围发送给 ECU。
    • 31:直升机旋翼转速控制(K_HELIRSC)。缩放在 Lua 源码中为乘以 0.001(见 EFI_SkyPower.lua)。
    • 0:关闭油门控制。
  • EFI_SP_THR_RATE控制油门指令下发频率,0表示完全不发送油门控制;典型取 50 Hz。

油门指令通过 CAN 帧 ID0x500下发(数据字节 2/3 为 16 位油门值),发送超时 10000 微秒。

3.2 起动机控制(EFI_SP_START_FN)

起动机控制绑定到一个脚本 RC 功能号(300–307)。用法:

  • EFI_SP_START_FN设为某个值(如 300);
  • 将某个遥控通道的RCn_OPTION设为相同值(如RC8_OPTION=300);
  • 用一个两位拨动开关控制该通道。

当开关置高(脚本内部按rc:get_aux_cached()读到状态 2)且满足运行许可时,脚本通过 CAN 帧0x505(数据字节 0 置 10)发送发动机启动指令;开关置低(状态 0)时发送发动机停止指令(0x505数据字节 7 置 10)。

3.3 发电机控制(EFI_SP_GEN_FN)

发电机控制同样使用脚本 RC 功能号(300–307)。开关置高时通过 CAN 帧0x506(数据字节 2 置 10)发送发电机启动指令,置低时发送发电机停止指令(0x506数据字节 2 置 0)。该功能由EFI_SP_GEN_CRTL总开关控制,置 0 可整体关闭。需要注意的是,只有EFI_SP_GEN_FN被设置为有效功能号且EFI_SP_GEN_CRTL=1时才会动作,否则即使拨动开关也不会产生任何 CAN 指令。

3.4 运行许可与未解锁启动(EFI_SP_ST_DISARM)

脚本中的allow_run_engine()规定:只有飞控已解锁(armed)或EFI_SP_ST_DISARM=1时才允许运转发动机(见 EFI_SkyPower.lua)。这意味着默认情况下,未解锁时即使拨动启动开关也不会启动发动机;如果需要在解锁前完成地面启动测试,可把EFI_SP_ST_DISARM设为 1。

四、部署步骤:安装脚本并加载驱动

依据文档 Operation 章节,完整部署流程如下:

  1. 放置脚本:将 EFI_SkyPower.lua 拷贝到 microSD 卡的APM/SCRIPTS目录。可以直接拷贝,也可以通过MAVFTP上传。
  2. 设置关键参数
    • SCR_ENABLE = 1
    • EFI_TYPE = 7
    • CAN 相关参数(见 1.1 节)
  3. 重启飞控并刷新参数:重启后EFI_SP_*参数出现,按第三节的参数表逐项配置(至少将EFI_SP_ENABLE置 1)。
  4. 配置 RC 开关:将 2 位拨动开关对应的通道RCn_OPTION设为 300(或EFI_SP_START_FN指定的值)以启用起动机控制。

脚本加载成功后,地面站会收到脚本发送的状态文本(如EFISP: starting engineEFISP: stopping engineEFISP: re-starting engineEFISP: loaded),可据此判断驱动是否工作正常。EFI_SP_ENABLE=0时脚本会直接输出EFISP: disabled并退出;CAN 驱动获取失败时会输出EFISP: Failed to load driver

五、遥测上报、日志与故障排查

5.1 EFI_STATUS MAVLink 消息

驱动正常运行时,地面站会持续收到EFI_STATUSMAVLink 消息,其中包含:

  • 发动机转速(RPM)
  • 缸头温度(CHT)
  • 排气温度(EGT)
  • 点火正时(ignition timing)
  • 喷油时间(injection time)
  • 发动机负荷(engine load)
  • 燃油消耗率(fuel consumption rate)
  • 节气门位置(throttle position)
  • 大气压力(atmospheric pressure)
  • 点火电压(ignition voltage)

消息的完整字段列表与 C++ 侧实现一一对应,见 AP_EFI.cpp 的mavlink_msg_efi_status_send()。其中点火电压为 -1 或 NaN 时会被当作"未知"置 0 发送。

5.2 飞行日志

固件 EFI 前端会写入三类标准日志消息(见 AP_EFI.cpp):

  • EFI:TimeUS、发动机负荷(LP)、转速(Rpm)、点火停留时间(SDT)、大气压(ATM)、进气歧管压力(IMP)、进气歧管温度(IMT)、冷却液温度(ECT)、油压(OilP)、油温(OilT)、燃油压力(FP)、燃油消耗率(FCR)、累计耗油(CFV)、节气门位置(TPS)、ECU 索引(IDX)。
  • EFI2:健康状态(Healthy)、发动机状态(ES)及曲轴传感器、温度、燃油压力、油压、爆震、失火、碎屑、火花塞使用等各类状态/错误位。
  • ECYL:每缸点火正时(IgnT)、喷油时间(InjT)、CHT、EGT、λ 值以及第二缸 CHT2/EGT2。

此外,脚本在EFI_SP_LOG_RT控制下写入自定义EFSP日志消息,包含字段:Thr(油门输出)、CLoad(当前负荷)、TLoad(目标负荷)、OilT(油温)、RPMgRPM/gAmp/gCur(发电机转速/电流/电池电流)、SErr(传感器错误标志)、TLim(热限制标志)、STRPM(起动马达转速)——这些字段是 SkyPower 特有的诊断信息,对排查 ECU 故障非常有价值。

5.3 额外命名浮点遥测

EFI_SP_TLM_RT > 0时,脚本还会以 NAMED_VALUE_FLOAT 形式上报额外数据(见 EFI_SkyPower.lua):

名称含义
EFI_OILTMP油温
EFI_TRLOAD目标负荷
EFI_VOLTS/EFI_VOLTS2供电电压 / 第二路电压
EFI_GEN_AMPS发电机电流
EFI_CHT2第二缸缸头温度
EFI_STARTRPM起动马达转速

5.4 健康状态判定

固件以"最近一次收到状态更新的时间"判定 EFI 健康:超过 3000 ms 未收到更新即视为 unhealthy(见 AP_EFI_State.h 的HEALTHY_LAST_RECEIVED_MS)。因此当 CAN 链路中断或 ECU 停止广播时,地面站的 EFI 健康指示会在约 3 秒后变红,可用于快速判断总线或 ECU 故障。

六、飞行中的自动重启(关键安全功能)

文档明确指出:设置EFI_SP_MIN_RPM(文档原文写作 EFI_SP_RPM_MIN,实际参数名为EFI_SP_MIN_RPM)可实现飞行中自动重启

其逻辑(见 EFI_SkyPower.lua)为:

  • 当发动机"应该运转"(启动开关处于高电平、满足运行许可)时,若测得转速低于EFI_SP_MIN_RPM
  • 且该低转速状态持续时间超过EFI_SP_RST_TIME秒(默认 2 s,0 则禁用自动重启);
  • 则脚本发送0x505启动帧执行发动机重启,同时输出EFISP: re-starting engine状态文本。

另外脚本还处理了一个边界情况:如果EFI_SP_MIN_RPM > 0且测得转速高于该值,但启动开关已经回到低电平(should_be_running为假),说明之前下发的停机指令可能丢失,脚本会补发一次停机指令,避免"开关已关闭但发动机仍在转"的危险状态。

对于 SP_275 型号,脚本在发送启动指令前会先发送一次停止指令send_engine_start()内部先调用send_engine_stop()),因为该型号 ECU 需要先停止后才能成功启动。

七、常见问题排查建议

  • EFI_SP_*参数不出现:确认SCR_ENABLE=1EFI_TYPE=7已设置并重启飞控、刷新参数;确认固件带脚本支持且AP_EFI_SCRIPTING_ENABLED已开启。
  • 脚本输出EFISP: Failed to load driver:检查EFI_SP_CANDRVCAN_Dx_PROTOCOL(10 或 12)是否匹配,CAN 驱动是否注册成功。
  • 无 EFI_STATUS 数据:用示波器/逻辑分析仪确认总线波特率确为 500 kbit/s;核对EFI_SP_MODEL与 ECU 实际型号是否一致——SRE_180 与 SP_275 的遥测 ID 布局不同,选错型号会导致解析不到数据。
  • 转速数据不更新:确认 ECU 确实在广播遥测帧;驱动只在收到新的 RPM 报文时才更新状态,若0x100帧缺失则状态会停留在旧值。
  • 无法启动发动机:检查运行许可——未解锁且EFI_SP_ST_DISARM=0时启动指令会被拒绝;同时确认RCn_OPTIONEFI_SP_START_FN数值一致且开关动作被正确捕获。

总结

SkyPower EFI 驱动是 ArduPilot 脚本化 EFI 体系中的一个完整范例:它展示了如何用纯 Lua 在 500 kbit/s 的 CAN 总线上完成 ECU 遥测解析、指令下发、RC 开关联动、油门闭环以及基于转速的安全自动重启。核心配置集中在三个层面——CAN 总线协议(CAN_Dx_PROTOCOL=10/12)、EFI 类型(EFI_TYPE=7)与驱动自身参数(EFI_SP_*)。部署时只需将脚本放入APM/SCRIPTS目录、设置SCR_ENABLEEFI_TYPE并重启,即可通过EFI_STATUS消息、EFI/EFI2/ECYL/EFSP 日志全面掌握发动机状态。对于使用 SkyPower SRE-180 或 SP-275 电喷发动机的固定翼与直升机平台,本文的参数表与源码级流程说明可直接作为装机与调参依据。

【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询