混控器是连接飞行控制器与执行器的桥梁。本教程将带你从数学原理出发,对比四旋翼与六旋翼的混控差异,建立直觉理解。
PX4 的混控器(Mixer)负责将上层控制指令转换为每一个执行器的具体输出值,是飞控系统中不可或缺的核心模块。
控制器输出的是归一化的控制指令,包含滚转(Roll)、俯仰(Pitch)、偏航(Yaw)和油门(Throttle)四个分量,取值范围为 \([-1, 1]\)(油门为 \([0, 1]\))。
混控器根据预定义的混控矩阵,对每个控制量加权求和。不同的机型(四旋翼、六旋翼、固定翼等)有不同的权重矩阵。
混控结果是每个电机/舵机的 PWM 输出值。对于多旋翼,这就是每个电机的转速指令;对于固定翼,则包含舵面偏转量。
混控器本质上就是一个线性映射:将少数几个控制量(通常4维)映射到多个执行器输出(4~8维甚至更多)。这个映射可以用矩阵乘法来表达。
理解混控器的上下游关系,是正确配置飞控的基础。
PX4 使用控制组来组织不同来源的控制量。混控器从控制组中读取输入:
来自姿态/速率控制器的输出。通道 0~3 分别为 Roll、Pitch、Yaw、Throttle。这是多旋翼最主要的控制来源。
云台控制、相机触发等辅助功能通道。用于挂载设备的控制。
将遥控器通道直接透传到执行器,不经过控制器处理。常用于辅助开关、灯光控制等。
不同机型和应用场景使用不同类型的混控器。
专为多旋翼设计。将 Roll/Pitch/Yaw/Thrust 映射到 N 个电机输出。内置推力饱和保护:当某个电机计算值超出 \([0,1]\) 时,会自动缩放所有输出以保持姿态优先。
多旋翼混控器优先保证姿态控制(Roll/Pitch/Yaw),在饱和时会牺牲总推力来确保机体姿态稳定。
单输入到单输出的线性映射。将一个控制组通道映射到一个执行器输出。常用于舵机控制等简单场景:
output = k × input + offset
输出恒定值(通常为 0),用于占位或禁用某个输出通道。确保执行器输出数量与硬件通道一一对应。
混控器的核心就是一次矩阵乘法运算。
对于一个 \(N\) 旋翼飞行器,混控过程可以表示为:
\[ \begin{bmatrix} m_1 \\ m_2 \\ \vdots \\ m_N \end{bmatrix} = \mathbf{M}_{N \times 4} \cdot \begin{bmatrix} \text{Roll} \\ \text{Pitch} \\ \text{Yaw} \\ \text{Thrust} \end{bmatrix} \]
其中 \(\mathbf{M}\) 就是混控矩阵,每一行对应一个电机,每一列对应一个控制量。矩阵中的元素决定了各控制量对每个电机的贡献方向和大小。
第 \(i\) 个电机的输出:
\[ m_i = k_{i,\text{roll}} \cdot u_{\text{roll}} + k_{i,\text{pitch}} \cdot u_{\text{pitch}} + k_{i,\text{yaw}} \cdot u_{\text{yaw}} + k_{i,\text{thrust}} \cdot u_{\text{thrust}} \]
其中 \(k_{i,j}\) 是混控矩阵第 \(i\) 行第 \(j\) 列的系数。正值表示正向贡献,负值表示反向贡献。
当计算得到的某个电机输出 \(m_i\) 超出 \([0,1]\) 范围时,PX4 会执行饱和逻辑:首先尝试通过整体偏移(offset shifting)使所有电机落在合法范围内;如果不行,则等比缩放 Roll/Pitch/Yaw 分量,最后缩放 Thrust,始终优先保证姿态稳定。
通过对比两种常见机型的混控矩阵,深入理解混控器的工作原理。
\[ \mathbf{M}_{\text{quad}} = \begin{bmatrix} -1 & +1 & -1 & +1 \\ +1 & -1 & -1 & +1 \\ +1 & +1 & +1 & +1 \\ -1 & -1 & +1 & +1 \end{bmatrix} \]
列顺序:Roll, Pitch, Yaw, Thrust。行顺序:M1, M2, M3, M4。
| 电机 | Roll | Pitch | Yaw | Thrust | 位置 | 旋向 |
|---|---|---|---|---|---|---|
| M1 | −1 | +1 | −1 | +1 | 前右 | CCW ↺ |
| M2 | +1 | −1 | −1 | +1 | 后左 | CCW ↺ |
| M3 | +1 | +1 | +1 | +1 | 前左 | CW ↻ |
| M4 | −1 | −1 | +1 | +1 | 后右 | CW ↻ |
以 M1(前右电机) 为例:Roll 系数为 \(-1\),意味着当飞控请求正向横滚(向右倾斜)时,右侧的 M1 减速,配合左侧电机加速产生横滚力矩。Pitch 系数为 \(+1\),正 Pitch 输入时前方电机加速、后方减速,产生前后推力差形成俯仰力矩。Yaw 系数为 \(-1\),因为 M1 是 CCW 旋转,其反扭矩方向为 CW;减速(负系数)意味着减少 CW 反扭矩,配合 CW 电机(M3/M4)加速产生偏航。再看 M3(前左电机):Roll 系数为 \(+1\)(左侧加速产生右倾),Pitch 也为 \(+1\)(同为前方电机),两者在俯仰方向一致、在横滚方向相反,这就是混控的核心逻辑。
\[ \mathbf{M}_{\text{hex}} = \begin{bmatrix} -0.50 & +1 & +1 & +1 \\ -1 & 0 & -1 & +1 \\ -0.50 & -1 & +1 & +1 \\ +0.50 & -1 & -1 & +1 \\ +1 & 0 & +1 & +1 \\ +0.50 & +1 & -1 & +1 \end{bmatrix} \]
六旋翼的 Roll 列出现了 ±0.5 和 0——不同电机到横滚轴的力臂不同。M2/M5 在正侧方,Roll 系数最大(±1);斜向电机力臂投影为 \(\sin(30°)=0.5\);Pitch 列中 M2/M5 在正侧方不产生俯仰力矩(系数 = 0),而前后斜向电机的 Pitch 投影为 \(\cos(30°) \approx 0.866\),归一化后为 ±1。
| 电机 | Roll | Pitch | Yaw | Thrust | 位置 | 旋向 |
|---|---|---|---|---|---|---|
| M1 | −0.50 | +1 | +1 | +1 | 前右(30°) | CW ↻ |
| M2 | −1 | 0 | −1 | +1 | 正右(90°) | CCW ↺ |
| M3 | −0.50 | −1 | +1 | +1 | 后右(150°) | CW ↻ |
| M4 | +0.50 | −1 | −1 | +1 | 后左(210°) | CCW ↺ |
| M5 | +1 | 0 | +1 | +1 | 正左(270°) | CW ↻ |
| M6 | +0.50 | +1 | −1 | +1 | 前左(330°) | CCW ↺ |
HEX X 布局中,电机以 60° 间隔排列。M2(正右 90°)和 M5(正左 270°)离横滚轴最远,Roll 系数为 ±1。而 M1 位于前右 30° 位置,其到横滚轴的横向距离投影为 \(\sin(30°) = 0.5\),因此 Roll 系数为 −0.5。同理,Pitch 列中 M2 和 M5 恰好在俯仰轴上(正侧方),完全无法产生俯仰力矩,系数为 0。而前后斜向的电机(M1/M3/M4/M6)到俯仰轴的距离投影为 \(\cos(30°) \approx 0.866\),归一化后系数为 ±1。
| 特性 | 四旋翼 Quad X | 六旋翼 Hex X |
|---|---|---|
| 电机数 | 4 | 6 |
| 混控矩阵维度 | 4 × 4(方阵) | 6 × 4(超定系统) |
| 自由度 vs 执行器 | 4 = 4 → 刚好确定 | 6 > 4 → 有冗余 |
| 电机失效容错 | 不可容错 任一电机失效则失控 |
单电机可容错 失去一个仍可保持飞行 |
| 混控系数特点 | 所有系数为 ±1(对称45°) | 出现 0, ±0.5, ±1(60° 间隔投影) |
| 偏航效率 | 4个电机均参与偏航 | 6个电机均参与偏航,力矩更大 |
| 载重能力 | 标准 | 更高(50% 更多推力源) |
| 能效 | 较高(更少电机损耗) | 稍低(更多电机,更大重量) |
| 典型应用 | 消费级、竞速、室内 | 航拍、测绘、工业巡检 |
拖动滑块调节控制输入,实时观察各电机的输出变化。
实验 1:油门 50%,单独拉 Roll → 观察左右电机差异(四旋翼中 M1/M4 vs M2/M3)。
实验 2:油门 50%,单独拉 Pitch → 观察前后电机差异(M1/M3 为前方,M2/M4 为后方)。
实验 3:油门 50%,单独拉 Yaw → 观察 CCW 电机组(M1/M2)与 CW 电机组(M3/M4)的对称反转。
实验 4:切换到六旋翼,重复以上操作。注意正侧方的 M2/M5 对 Pitch 没有贡献(始终 50%),而对 Roll 贡献最大。
了解 .mix 文件的语法,学会阅读和编写自定义混控。
# 四旋翼 X 布局混控文件 # Multirotor mixer for Quad X R: 4x # R = Multirotor mixer, 4x = 四旋翼X布局 # 最大/最小输出限制, 空闲速度 10000 10000 10000 # roll_scale, pitch_scale, yaw_scale (×0.0001) 0 # idle_speed (0 ~ 1, 这里是0%) # ┌───────────────────────────────────────┐ # │ PX4 会根据 "4x" 自动加载内置矩阵 │ # │ 无需手动写出每个电机的混控系数 │ # └───────────────────────────────────────┘
# 六旋翼 X 布局混控文件 # Multirotor mixer for Hex X R: 6x # R = Multirotor mixer, 6x = 六旋翼X布局 10000 10000 10000 # roll_scale, pitch_scale, yaw_scale 0 # idle_speed # 6x 自动加载 6 电机混控矩阵 # 比 4x 多出 2 个电机通道,提供冗余
# 自定义四旋翼混控 (如果需要非标准布局) # 每个电机用一个 M: (Simple mixer) 定义 M: 1 # Motor 1: 1个输入组 S: 0 0 -10000 -10000 0 -10000 10000 # Roll: -1.0 S: 0 1 10000 10000 0 -10000 10000 # Pitch: +1.0 S: 0 2 -10000 -10000 0 -10000 10000 # Yaw: -1.0 S: 0 3 10000 10000 0 -10000 10000 # Thrust:+1.0 # S: 语法说明 # S: <group> <channel> <neg_scale> <pos_scale> <offset> <min> <max> # scale 值 = 实际比例 × 10000, 如 10000 = 1.0, 5000 = 0.5
从 PX4 v1.14 开始,动态混控逐渐成为默认方案,混控配置从 .mix 文件迁移到了参数驱动的方式(通过 SYS_AUTOSTART 和 Actuator 参数配置)。但理解 .mix 文件的原理对于掌握混控逻辑仍然非常重要。