混控器参考
从摇杆与陀螺仪到导线上的微秒:每种可选混控器的完整几何——机翼轴、方向舵混合、升降副翼、微调与限幅。
本页记录 src/lib/Ornithopter/Ornithopter.cpp 的混控器层与 OrnithopterConfig.h 的配置文件系统。关于周边架构,请从
架构文章
;关于脉冲时序与微调范围,参见
伺服内核
一文。
舵机功能标签
每个混控器的每个输出都是写入 _f[] 的 µs 值,由 ServoFunc 标签索引。标签是传输载体——它们说明信号意味着什么,而从不说明它接在哪里:
| 标签 | 名称 | 含义 |
|---|---|---|
0
|
SF_NONE
|
保留——无功能(前几个 PWM 槽位为 BOOT 和 I2C 保留空闲) |
1 / 2
|
SF_LEFT_WING / SF_RIGHT_WING
|
前扑翼(波形内核) |
3
|
SF_RUDDER
|
头/冠舵(波形)或鳍舵(变速箱)——偏航 + 横滚混合 |
4
|
SF_MOTOR
|
无刷电调油门(仅变速箱内核) |
5 / 6
|
SF_VTAIL_LEFT / SF_VTAIL_RIGHT
|
V 尾翼面,升降副翼混合(变速箱内核) |
7
|
SF_ELEVATOR
|
传统独立升降舵(变速箱配置文件 6/7) |
8 / 9
|
SF_BACK_LEFT_WING / SF_BACK_RIGHT_WING
|
四翼机架的后翼对(前翼对的镜像,独立微调) |
运行时配置文件提供 funcMap:一个将 PWM 输出索引 → ServoFunc 映射的数组。前三个槽位(PWM 1…3)始终为 SF_NONE——它们属于 BOOT 引脚和 I2C 总线——因此真正的伺服函数从 PWM 索引 3 开始(固件注释说明:索引 3 = CH4、4 = CH5、5 = CH6)。
八种混控配置文件
存在八个混控配置文件。配置文件 0–2 驱动波形内核(扑翼),配置文件 3–7 驱动变速箱内核(电机 + 尾翼):
| # | 配置文件 | 内核 | 伺服器 | funcMap (PWM 3 · 4 · 5) |
|---|---|---|---|---|
0
|
SERVO_2WING
|
波形 | 2 | 左翼 · 右翼 · — |
1
|
SERVO_2WING_1RUD
|
波形 | 3 | 左翼 · 右翼 · 方向舵 |
2
|
SERVO_4WING
|
波形 | 4(后右与后左镜像共享) | 左翼 · 右翼 · 后左翼 |
3
|
GEARBOX_2VTAIL_1RUD
|
变速箱 | 3 | 方向舵 · V 尾左 · V 尾右 |
4
|
GEARBOX_1MOT_2VTAIL
|
变速箱 | 3 | 电机 · V 尾左 · V 尾右 |
5
|
GEARBOX_1MOT_2VTAIL_1RUD
|
变速箱 | 4(V 尾右与左镜像共享) | 方向舵 · 电机 · V 尾左 |
6
|
GEARBOX_1ELE_1RUD
|
变速箱 | 2 | 方向舵 · 升降舵 · — |
7
|
GEARBOX_1MOT_1ELE_1RUD
|
变速箱 | 3 | 方向舵 · 电机 · 升降舵 |
选择:构建标志 MIXER_PROFILE(旧式 ORNITHOPTER_GEARBOX=1 → 配置文件 5),随后可通过 WebUI 运行时覆盖(setOrnithopterProfile)。内核测试仅为 activeProfile ≥ GEARBOX_2VTAIL_1RUD。
机翼轴混控(波形内核)
所有通道值都以归一化形式进入混控器:_crsfToNorm 将原始 172…1811 窗口线性映射到 −1…+1。操纵命令随后按各配置文件权限滑块(aileronScale、elevatorScale、0–100%)乘以 ±60°(ORNI_STEER_MAX_DEG)缩放。
镜像几何。机翼伺服器镜像安装,这交换了共模项与差动项的含义。因此代码将副翼(横滚)视为共模——它加到两翼上,成为差动的物理偏转——而升降舵(俯仰)在代码中为差动,成为共模的物理偏转。角度方程,其中 ORNI_NEUTRAL_ANGLE_DEG = 100° 且 2× 乘数仅施加于偏差项:
angleLeft = NEUTRAL + (aileron + elevator + flapCentre − degL) · 2
angleRight = NEUTRAL + (aileron − elevator − flapCentre + degR) · 2
flapping: degL/R = amplitudeL/R · shapedWave(rawPhase, ferocityL/R, …)
glide: degL = degR = 0 → static glide offset takes over
degL/degR 是左右机翼的瞬时冲程偏转,各为其自身振幅与凶猛度塑造波形的乘积。升降舵上推强化下冲程;下推强化上冲程(非对称凶猛度)。偏航以两种互补方式分割机翼:
- 凶猛度差动(
rudderFerocityRange):左侧得到+凶猛度,右侧−凶猛度——两翼停留方式不同,但保持共享反转相位(limiarShared),因此转向是纯粹的横滚扭矩,绝非失步。 - 振幅差动(
rudderAmplitudeDifferential):左振幅 ×(1+Δ)、右 ×(1−Δ)——围绕油门设定冲程的对称发散。
角度被钳制于 0…180° 并用可配置包络 servoMinUs…servoMaxUs(默认 988…2012)转换为脉冲:µs = min + 角度·(max−min)/180,再加按函数微调。滑翔/扑翼中心偏移(glideAngleDeg、flappingAngleDeg、±15°)作为静态项进入各自分支——因此滑翔与扑翼中心可按飞行配置文件独立调校。
方向舵混控(两种内核)
方向舵混控器被两个内核逐字共享——一个方程,两种机架:
mix = rudderNorm · rudderYawWeight + aileronNorm · rudderRollWeight
mix = clamp(mix, −1 … +1)
µs = 1500 + mix · 500 (rudder centre ± 500 µs)
+ gyroRudderCorrection (Zephyrus, when enabled)
+ servoTrimUs[SF_RUDDER]
默认值:rudderYawWeight = 65%、rudderRollWeight = 35%(可在 WebUI 运行时调校,按备份存储)。方向舵上的横滚耦合让翼载较重的翼龙无需偏航绳技巧即可保持协调转弯;若头舵在横滚上过于激进,请降低横滚权重。
齿轮箱尾翼与升降副翼混控
变速箱内核每个节拍无状态运行。其三个子混控器:
- 电机——
SF_MOTOR:武装时油门 0…1 映射到 1000…2000 µs;解除武装或链路丢失时强制最小(电机停转)。 - 方向舵——与上一节方程相同。
- 尾翼——两个族。常规配置文件(6/7)驱动独立升降舵:
µs = 1500 + elevatorNorm·500 + pitchPID + trim。V 尾配置文件(3/4/5)将两个通道升降副翼混合到两个尾翼伺服器:
VtailLeft = 1500 + (aileron + elevator)·scale + rollPID + pitchPID + trimL
VtailRight = 1500 + (aileron − elevator)·scale − rollPID + pitchPID + trimR
scale = 500 µs; both aileron/elevator sums clamped to −1…+1 first
在变速箱内核上,Zephyrus 将横滚与俯仰两者的 PID 修正注入尾翼伺服器(横滚反相、俯仰共模),各硬性钳制于 ±250 µs(ZEPHYR_GEARBOX_CLAMP_US)。因此陀螺仪毛刺可以晃动、但绝不停转一个尾翼伺服器。
泽菲罗斯注入、微调与失控保护
根据内核与轴的不同,存在三个不同的注入点:
| 轴 | 波形内核 | 变速箱内核 |
|---|---|---|
| 方向舵 / 偏航 | gyroRudderCorrection 加到冠舵 µs 上 |
gyroRudderCorrection 加到鳍舵 µs 上 |
| 横滚(副翼) | ——(波形机翼不携带横滚 PID) | gyroAileronCorrection,跨 V 尾反相,钳制 ±250 µs |
| 俯仰(升降舵) | ——(在 Zephyrus 层中作为波形调制注入) | gyroElevatorCorrection,共模,钳制 ±250 µs |
微调与限制。每个函数都有带符号的逐伺服微调(servoTrimUs[tag],默认 0,±300 µs)最后加入,每个值都经过 _clampServo——一个凌驾一切的绝对 500…2500 µs 安全钳制。失控保护或链路丢失时,所有函数回到 1500 µs、变速箱电机回到最小,因此模型始终滑向中立。