[BF学院_卷1] -- 第30讲:mixTable() 总结 —— Mixer 完整控制模型

第30讲:mixTable() 总结 —— Mixer 完整控制模型


本讲知识点

  • Mixer 在 Betaflight 控制链中的作用;
  • 为什么 PID Output 不能直接控制电机;
  • motorMixer_t 的数学意义;
  • mixTable() 从输入到输出的完整流程;
  • Throttle、Roll、Pitch、Yaw 如何共同生成 Motor Output;
  • Mixer 如何处理电机输出限制;
  • Mixer 在整个飞控架构中的位置。

本讲对应 Betaflight 源码

主要函数:

mixTable(timeUs_t currentTimeUs)

相关函数:

calculateThrottleAndCurrentMotorEndpoints()

applyMixerAdjustment()

applyMixerAdjustmentLinear()

applyMixToMotors()

本讲学习目标

通过前面第25讲~第29讲的学习,建立完整认识:

Mixer 并不是简单计算电机转速,

而是将飞机控制需求,转换为每个电机应该输出多少,

最终理解:

Throttle,Roll,Pitch,Yaw

↓

Mixer Matrix

↓

Motor Output

↓

ESC

↓

电机

回顾前面几讲

在进入 Mixer 之前,飞控已经完成:

RC输入 -> 期望姿态 -> PID Controller -> Roll / Pitch / Yaw 控制需求

PID Controller 输出的是飞机需要什么运动。

例如:

需要向右 Roll

需要向前 Pitch

需要逆时针 Yaw

但是,PID Controller 并不知道:

哪个电机增加,哪个电机减少,增加多少,减少多少

因此需要 Mixer。


为什么需要 Mixer?

四旋翼飞机的控制,本质上不是 “控制某一个电机”,

而是通过不同电机之间的 “推力差”,产生 “力矩”。

例如:

Roll 控制

希望飞机向右滚转:

左侧电机增加推力,右侧电机减少推力 -> 产生 Roll 力矩

Pitch 控制

希望飞机向前俯冲:

后侧电机增加推力, 前侧电机减少推力 -> 产生 Pitch 力矩

Yaw 控制

利用:

电机旋向不同 -> 反作用力矩变化 -> 产生 Yaw

所以,

PID 输出:飞机需要多少控制力;

Mixer:如何把控制力分配给电机。


motorMixer_t —— Mixer 的数学模型

Betaflight 使用:

motorMixer_t

描述每个电机对应的控制权重。

例如,一个电机可能:

roll  = 0.5
pitch = -0.5
yaw   = 1.0

表示这个电机参与:

50%的 Roll 控制

-50%的 Pitch 控制

100%的 Yaw 控制

因此,对于第 i 个电机:

Motor Mix = Roll需求 × Roll权重
          + Pitch需求 × Pitch权重
          + Yaw需求 × Yaw权重

对应代码:

float mix =
    scaledAxisPidRoll  * activeMixer[i].roll +
    scaledAxisPidPitch * activeMixer[i].pitch +
    scaledAxisPidYaw   * activeMixer[i].yaw;

这个结果:motorMix[i] 代表:

该电机因为姿态控制需要增加或者减少多少输出

注意,它不是最终电机输出。


mixTable() 完整流程

现在回顾:

mixTable()

内部完成的整个过程。


第一步:建立 Throttle 输出空间

对应:

calculateThrottleAndCurrentMotorEndpoints()

作用,确定:

Throttle -> 允许的 Motor Output 区间

因为油门输入不是直接对应电机转速,

而是需要映射:

RC Throttle -> 内部 throttle -> Motor Output Range

得到基础升力需求。


第二步:计算 PID 控制需求

代码:

pidData[FD_ROLL].Sum

pidData[FD_PITCH].Sum

pidData[FD_YAW].Sum

经过:

限制 -> 缩放

得到:

scaledAxisPidRoll

scaledAxisPidPitch

scaledAxisPidYaw

这些变量表示:飞机需要多少 Roll / Pitch / Yaw 修正


第三步:Mixer Matrix 分配

核心:motorMix[i]。

计算:

飞机级控制需求 -> 每个电机修正量

例如, 输入:

Roll需求

Pitch需求

Yaw需求

经过motorMixer_t 权重矩阵, 输出:

M1 motorMix

M2 motorMix

M3 motorMix

M4 motorMix

此时, 控制链:

PID Output -> motorMix

完成。


第四步:处理 Mixer 饱和问题

问题,最终电机输出:

Motor Output = Throttle + motorMix

但是,电机存在限制:0.0 ~ 1.0。

例如,某个电机:

Throttle = 0.2

motorMix = -0.4

结果:

Motor Output = 0.2 - 0.4 = -0.2

已经超过电机能力。

这会导致输出被限制到0,于是,原本需要的姿态差异消失。


因此,Mixer 需要进行“混控调整”,

对应:

applyMixerAdjustment()

applyMixerAdjustmentLinear()

作用:在不破坏整体控制效果的情况下, 重新分配 Throttle 与 motorMix 之间的空间。


第五步:生成最终 Motor Output

对应:

applyMixToMotors()

核心:

float motorOutput = motorOutputMixSign * motorMix[i] 
                  + throttle * activeMixer[i].throttle;

也就是:

最终电机输出 = 姿态修正量 + 基础油门

展开:

Throttle -> 基础升力

motorMix -> 姿态修正

二者相加 -> Motor Output

最后, 经过:

输出范围限制 -> PWM / DShot映射 -> ESC

Mixer 在整个飞控控制链中的位置

完整控制链:

飞手输入RC遥控器

↓

RC Command

↓

姿态目标

↓

PID Controller

↓

Roll / Pitch / Yaw 控制需求

↓

Mixer

↓

Motor Output

↓

ESC

↓

电机

↓

飞机姿态变化

其中,

PID Controller 负责:我需要什么动作;

Mixer 负责:每个电机应该如何配合完成这个动作;

ESC负责:把控制信号转换成电机驱动力


Mixer 的核心思想总结

如果只记住一句话:

Mixer 不是控制电机。

Mixer 是把飞机级控制需求,转换成电机级控制输出。

或者:

PID Controller 产生需求

Mixer 负责分配

Motor 执行动作

至此:

Betaflight 中:

控制需求 -> Mixer -> 电机输出

这一条核心链路已经完整建立。

下一阶段可以继续进入:

Motor Output之后

↓

ESC通信协议

↓

DShot输出

↓

电机执行

也就是:飞控如何把内部计算结果,最终变成真实的电机驱动信号。

posted on 2026-08-03 15:45  longyue  阅读(8)  评论(0)    收藏  举报

导航