













主要函数:
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。
四旋翼飞机的控制,本质上不是 “控制某一个电机”,
而是通过不同电机之间的 “推力差”,产生 “力矩”。
例如:
希望飞机向右滚转:
左侧电机增加推力,右侧电机减少推力 -> 产生 Roll 力矩
希望飞机向前俯冲:
后侧电机增加推力, 前侧电机减少推力 -> 产生 Pitch 力矩
利用:
电机旋向不同 -> 反作用力矩变化 -> 产生 Yaw
所以,
PID 输出:飞机需要多少控制力;
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()
内部完成的整个过程。
对应:
calculateThrottleAndCurrentMotorEndpoints()
作用,确定:
Throttle -> 允许的 Motor Output 区间
因为油门输入不是直接对应电机转速,
而是需要映射:
RC Throttle -> 内部 throttle -> Motor Output Range
得到基础升力需求。
代码:
pidData[FD_ROLL].Sum
pidData[FD_PITCH].Sum
pidData[FD_YAW].Sum
经过:
限制 -> 缩放
得到:
scaledAxisPidRoll
scaledAxisPidPitch
scaledAxisPidYaw
这些变量表示:飞机需要多少 Roll / Pitch / Yaw 修正
核心:motorMix[i]。
计算:
飞机级控制需求 -> 每个电机修正量
例如, 输入:
Roll需求
Pitch需求
Yaw需求
经过motorMixer_t 权重矩阵, 输出:
M1 motorMix
M2 motorMix
M3 motorMix
M4 motorMix
此时, 控制链:
PID Output -> motorMix
完成。
问题,最终电机输出:
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 之间的空间。
对应:
applyMixToMotors()
核心:
float motorOutput = motorOutputMixSign * motorMix[i]
+ throttle * activeMixer[i].throttle;
也就是:
最终电机输出 = 姿态修正量 + 基础油门
展开:
Throttle -> 基础升力
motorMix -> 姿态修正
二者相加 -> Motor Output
最后, 经过:
输出范围限制 -> PWM / DShot映射 -> ESC
完整控制链:
飞手输入RC遥控器
↓
RC Command
↓
姿态目标
↓
PID Controller
↓
Roll / Pitch / Yaw 控制需求
↓
Mixer
↓
Motor Output
↓
ESC
↓
电机
↓
飞机姿态变化
其中,
PID Controller 负责:我需要什么动作;
Mixer 负责:每个电机应该如何配合完成这个动作;
ESC负责:把控制信号转换成电机驱动力
如果只记住一句话:
Mixer 不是控制电机。
Mixer 是把飞机级控制需求,转换成电机级控制输出。
或者:
PID Controller 产生需求
Mixer 负责分配
Motor 执行动作
至此:
Betaflight 中:
控制需求 -> Mixer -> 电机输出
这一条核心链路已经完整建立。
下一阶段可以继续进入:
Motor Output之后
↓
ESC通信协议
↓
DShot输出
↓
电机执行
也就是:飞控如何把内部计算结果,最终变成真实的电机驱动信号。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。