
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/sCAN_D1_PROTOCOL 10第一个 CAN 端口协议设为Scripting脚本驱动 1CAN_P1_DRIVER 1使用第一个 CAN 驱动CAN_D1_BITRATE 500000波特率 500 kbit/s协议号映射可以在源码中确认libraries/AP_CANManager/AP_CAN.h定义了Scripting 10与Scripting2 12libraries/AP_CANManager/AP_CANManager_CANDriver_Params.cpp的CAN_Dx_PROTOCOL取值列表同样将 10 标注为Scripting、12 标注为Scripting2。因此第二个脚本 CAN 驱动对应CAN_Dx_PROTOCOL12。1.2 遥测报文解析两类 ECU 模型脚本在handle_EFI_packet()中按 CAN 报文 ID 解析数据并针对两种 ECU 型号提供了不同解析表SRE_180EFI_SP_MODEL0默认0x100携带转速、点火提前角、节气门角度0x101携带当前/目标负荷与喷油时间0x104携带供电电压、ECU 温度、大气压力与燃油消耗率0x105携带 CHT、进气歧管温度IMT、EGT、油温0x178携带第二路电压。SP_275EFI_SP_MODEL1遥测分布在更多 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_State与Cylinder_Status结构定义见 AP_EFI_State.h核心字段包括EFI_State 字段含义engine_speed_rpm发动机转速RPMengine_load_percent发动机负荷%fuel_consumption_rate_cm3pm瞬时燃油消耗率cm³/minestimated_consumed_fuel_volume_cm3累计燃油消耗量cm³throttle_position_percent节气门位置%atmospheric_pressure_kpa大气压力kPaignition_voltage点火电压Vintake_manifold_temperature进气歧管温度Kthrottle_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 章节加载脚本前必须配置SCR_ENABLE 1启用 Lua 脚本系统。只有带脚本支持Scripting enabled的固件才有该参数具体说明可参考 AP_Scripting/README.md。EFI_TYPE 7把 EFI 通信类型设为Scripting。该取值在 AP_EFI.cpp 的参数定义中列为7:Scripting固件初始化时会据此创建AP_EFI_Scripting后端见 AP_EFI.cpp。该参数变更需要重启飞控生效。CAN 总线配置如 1.1 节所述设置CAN_Dx_PROTOCOL、CAN_Px_DRIVER与CAN_Dx_BITRATE。配置完成后重启飞控并刷新参数EFI_SP_*参数组才会出现。编译前提源码级Scripting EFI 后端需要固件同时开启HAL_EFI_ENABLED与AP_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:启用0EFI_SP_CANDRV绑定的脚本 CAN 驱动编号0:无, 1:第1路, 2:第2路1EFI_SP_UPDATE_HZ脚本主循环检查新数据的频率10–200 Hz200EFI_SP_THR_FN监听的 SERVOn_FUNCTION 编号用于油门指令0:禁用, 70:固定翼, 31:直升机RSC0EFI_SP_THR_RATE油门指令下发频率10–100 Hz0 禁用50EFI_SP_START_FN起动机控制的脚本 RC 功能号0:禁用, 300–3070EFI_SP_GEN_FN发电机控制的脚本 RC 功能号0:禁用, 300–3070EFI_SP_MIN_RPM发动机视为停机的最低转速1–1000 RPM100EFI_SP_TLM_RT额外遥测命名浮点上报频率1–10 Hz0 禁用0EFI_SP_LOG_RT自定义 EFSP 日志记录频率1–50 Hz10EFI_SP_ST_DISARM允许未解锁disarmed时启动发动机0:禁止, 1:允许0EFI_SP_MODELECU 型号0:SRE_180, 1:SP_2750EFI_SP_GEN_CRTL发电机控制开关0:禁用, 1:启用1EFI_SP_RST_TIME自动重启判定时间发动机应运转却停机超过该时长则重启0–10 s0 禁用23.1 油门控制参数EFI_SP_THR_FN / EFI_SP_THR_RATEEFI_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_OPTION300用一个两位拨动开关控制该通道。当开关置高脚本内部按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_CRTL1时才会动作否则即使拨动开关也不会产生任何 CAN 指令。3.4 运行许可与未解锁启动EFI_SP_ST_DISARM脚本中的allow_run_engine()规定只有飞控已解锁armed或EFI_SP_ST_DISARM1时才允许运转发动机见 EFI_SkyPower.lua。这意味着默认情况下未解锁时即使拨动启动开关也不会启动发动机如果需要在解锁前完成地面启动测试可把EFI_SP_ST_DISARM设为 1。四、部署步骤安装脚本并加载驱动依据文档 Operation 章节完整部署流程如下放置脚本将 EFI_SkyPower.lua 拷贝到 microSD 卡的APM/SCRIPTS目录。可以直接拷贝也可以通过MAVFTP上传。设置关键参数SCR_ENABLE 1EFI_TYPE 7CAN 相关参数见 1.1 节重启飞控并刷新参数重启后EFI_SP_*参数出现按第三节的参数表逐项配置至少将EFI_SP_ENABLE置 1。配置 RC 开关将 2 位拨动开关对应的通道RCn_OPTION设为 300或EFI_SP_START_FN指定的值以启用起动机控制。脚本加载成功后地面站会收到脚本发送的状态文本如EFISP: starting engine、EFISP: stopping engine、EFISP: re-starting engine、EFISP: loaded可据此判断驱动是否工作正常。EFI_SP_ENABLE0时脚本会直接输出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.cppEFITimeUS、发动机负荷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油温、RPM、gRPM/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 s0 则禁用自动重启则脚本发送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_ENABLE1、EFI_TYPE7已设置并重启飞控、刷新参数确认固件带脚本支持且AP_EFI_SCRIPTING_ENABLED已开启。脚本输出EFISP: Failed to load driver检查EFI_SP_CANDRV与CAN_Dx_PROTOCOL10 或 12是否匹配CAN 驱动是否注册成功。无 EFI_STATUS 数据用示波器/逻辑分析仪确认总线波特率确为 500 kbit/s核对EFI_SP_MODEL与 ECU 实际型号是否一致——SRE_180 与 SP_275 的遥测 ID 布局不同选错型号会导致解析不到数据。转速数据不更新确认 ECU 确实在广播遥测帧驱动只在收到新的 RPM 报文时才更新状态若0x100帧缺失则状态会停留在旧值。无法启动发动机检查运行许可——未解锁且EFI_SP_ST_DISARM0时启动指令会被拒绝同时确认RCn_OPTION与EFI_SP_START_FN数值一致且开关动作被正确捕获。总结SkyPower EFI 驱动是 ArduPilot 脚本化 EFI 体系中的一个完整范例它展示了如何用纯 Lua 在 500 kbit/s 的 CAN 总线上完成 ECU 遥测解析、指令下发、RC 开关联动、油门闭环以及基于转速的安全自动重启。核心配置集中在三个层面——CAN 总线协议CAN_Dx_PROTOCOL10/12、EFI 类型EFI_TYPE7与驱动自身参数EFI_SP_*。部署时只需将脚本放入APM/SCRIPTS目录、设置SCR_ENABLE与EFI_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),仅供参考