2. 认识电机输出与混控器:理解混控器矩阵,查看默认四旋翼电机映射

好,咱们接着往下走。上一章我们把 SITL 跑起来了,也看到了电机在终端里“转”起来的样子。但你有没有想过一个问题:飞控是怎么知道哪个电机该转、哪个不该转的?

说白了,遥控器摇杆推的是“前、后、左、右、油门、偏航”这些抽象指令,而电机需要的是“1号电机转 1500、2号电机转 1800”这种具体数值。中间这层转换,就是混控器干的活。我当年刚接触 PX4 时,一直以为混控器是个硬件盒子,后来才发现它其实就是一段矩阵运算代码——嗯,这玩意儿才是四旋翼飞控的灵魂。

2.1 混控器矩阵:从“意图”到“转速”的数学桥梁

先看一个最基础的问题:四旋翼有四个电机,但遥控器给了四个通道(滚转、俯仰、偏航、油门),怎么分配?

答案就是混控器矩阵。你可以把它理解成一个 4×4 的映射表:

电机输出 = 混控器矩阵 × 控制输入

展开写就是:

| M1 |   | a11 a12 a13 a14 |   | Roll  |
| M2 | = | a21 a22 a23 a24 | × | Pitch |
| M3 |   | a31 a32 a33 a34 |   | Yaw   |
| M4 |   | a41 a42 a43 a44 |   | Throttle |

矩阵里的每个系数,决定了某个控制通道对某个电机的影响程度。比如 a11 是滚转对 M1 的贡献系数,a22 是俯仰对 M2 的贡献系数。这些系数不是拍脑袋定的,它们由机架的几何布局决定。

核心要点:混控器矩阵的本质,就是把三维空间里的力矩需求(滚转、俯仰、偏航)加上总拉力需求(油门),拆解到每个电机的转速上。

我在项目中遇到过一个问题:自己组了一台 X 型四旋翼,结果解锁后飞机在地上疯狂打转。查了半天,发现是混控器矩阵里 Yaw 通道的符号写反了——正偏航变成了负偏航,电机转起来互相较劲。你想想看,这种低级错误在仿真里一眼就能看出来,要是真机试飞,轻则炸机,重则伤人。

2.2 默认四旋翼电机映射:X 型 vs + 型

PX4 默认使用 X 型四旋翼布局。为什么是 X 型?因为 X 型的前向飞行时,四个电机都参与俯仰和滚转控制,响应更快、机动性更好。+ 型布局虽然结构简单,但前向飞行时只有两个电机出力,效率低不少。

来看默认的电机编号和旋向:

电机编号 位置 旋向 混控系数(Roll/Pitch/Yaw)
M1(电机1) 右前 逆时针(CCW) +1 / -1 / +1
M2(电机2) 左后 逆时针(CCW) -1 / +1 / +1
M3(电机3) 左前 顺时针(CW) -1 / -1 / -1
M4(电机4) 右后 顺时针(CW) +1 / +1 / -1

小技巧:记住旋向的规律——相邻电机旋向相反,对角电机旋向相同。这样偏航控制才能产生净力矩。我曾经在调试时把 M3 和 M4 的旋向搞反了,结果飞机解锁后直接原地自旋,跟陀螺似的。

混控系数的正负号决定了:当摇杆向右滚转时,哪些电机加速、哪些减速。以 Roll 通道为例,正系数表示该电机在正滚转指令下加速,负系数表示减速。X 型布局下,右前(M1)和右后(M4)在右滚转时加速,左前(M3)和左后(M2)减速——这样飞机才能向右倾斜。

2.3 在 SITL 中查看实际混控器配置

光看表格不过瘾,咱们直接进 SITL 里扒一扒真实配置。启动 SITL 后,用 param 命令查看混控器相关参数:

pxh> param show | grep MIX
参数名                      当前值    默认值    描述
CA_METHOD                   0         0         混控器计算方法(0=矩阵,1=动态)
MC_AIRMODE                  1         1         空中模式(0=关闭,1=开启)
MC_ROLL_SCALE               1.0       1.0       滚转通道缩放系数
MC_PITCH_SCALE              1.0       1.0       俯仰通道缩放系数
MC_YAW_SCALE                1.0       1.0       偏航通道缩放系数

再深入一步,查看混控器矩阵的实际数值:

pxh> mixer show
Motor Mixer (4 outputs)
Roll: 1.000  0.000  0.000  0.000
Pitch: 0.000  1.000  0.000  0.000
Yaw: 0.000  0.000  1.000  0.000
Throttle: 0.000  0.000  0.000  1.000

等等,这个矩阵怎么是个单位阵?别急,这是简化后的显示。实际运行时,PX4 会根据机架类型(通过 CA_AIRFRAME 参数指定)自动生成完整的混控矩阵。单位阵表示“每个控制通道直接对应一个电机”,这只有在四旋翼的四个电机完全独立控制时才成立——但真实四旋翼显然不是这样。

注意:如果你在 SITL 中看到混控矩阵显示为单位阵,不要慌。这是 PX4 在调试模式下的一种简化表示。完整的混控矩阵在 ROMFS/px4fmu_common/mixers/quad_x.main.mix 文件中定义。你可以用 cat 命令查看它:

pxh> cat /etc/mixers/quad_x.main.mix

打开这个文件,你会看到类似这样的内容:

M: 4
R: 1.0  0.0  0.0  0.0
R: 0.0  1.0  0.0  0.0
R: 0.0  0.0  1.0  0.0
R: 0.0  0.0  0.0  1.0
R: 0.0  0.0  0.0  0.0
R: 0.0  0.0  0.0  0.0
R: 0.0  0.0  0.0  0.0
R: 0.0  0.0  0.0  0.0

嗯,看起来还是单位阵?其实这里的 R 行是“滚转”的缩写,但 PX4 的混控器文件格式比较特殊——它把每个控制轴(Roll、Pitch、Yaw、Throttle)的系数分开写,而不是一个完整的矩阵。真正的映射关系,是在运行时由 CA_METHOD 参数和机架几何参数共同计算出来的。

2.4 混控器的工作流程:从摇杆到 PWM

为了让你更直观地理解整个过程,我画了一张流程图:

混控器工作流程 混控器工作流程:从摇杆到 PWM 遥控器输入 控制通道提取 Roll / Pitch / Yaw / Throttle 混控器矩阵运算 M = A × [Roll, Pitch, Yaw, Throttle]^T 电机输出计算 M1~M4 转速值 PWM 信号生成 关键点 • 混控器矩阵是核心 • 矩阵系数由机架决定 • 输出范围 1000~2000μs 常见问题 • 矩阵符号反了→自旋 • 系数比例不对→抖动 • 输出限幅没设好→堵转

这张图把整个链路串起来了。从遥控器摇杆到电机 PWM 信号,中间经过了三层处理:控制通道提取、混控器矩阵运算、电机输出计算。每一步都有对应的参数可以调,但最关键的还是混控器矩阵——它决定了飞机的“性格”。

2.5 动手实验:在 SITL 中观察混控器效果

光说不练假把式。咱们在 SITL 里做个实验,看看混控器到底怎么影响电机输出。

  1. 启动 SITL,选择四旋翼机架:make px4_sitl gazebo-classic
  2. 打开另一个终端,用 px4 listener sensor_combined 查看传感器数据
  3. 在 QGroundControl 中,把遥控器摇杆推到右滚转位置(或者用 commander takeoff 命令让飞机起飞)
  4. 观察电机输出:pxh> listener actuator_outputs

你会看到类似这样的输出:

actuator_outputs:
  output[0]: 1500  (M1)
  output[1]: 1500  (M2)
  output[2]: 1500  (M3)
  output[3]: 1500  (M4)

当你推右滚转时,M1 和 M4 的数值会上升,M2 和 M3 会下降——这就是混控器矩阵在起作用。我建议你试试不同的摇杆组合,观察电机输出的变化规律。比如同时推油门和偏航,看看四个电机是怎么协同工作的。

个人经验:我在调试新机架时,一定会先在 SITL 里做这个实验。把每个通道的响应都验证一遍,确认混控器矩阵的符号和比例都正确,才敢上真机。曾经有个同事跳过这一步,结果真机解锁后飞机直接翻了个跟头——嗯,从那以后他再也不敢偷懒了。

2.6 混控器参数调优:从默认到定制

默认的混控器矩阵适用于大多数标准四旋翼,但如果你用的是非对称机架、大尺寸螺旋桨、或者特殊的电机布局,就需要调整参数了。

常用的调优参数:

参数名 作用 默认值 调整建议
MC_ROLL_SCALE 滚转通道缩放系数 1.0 滚转响应过强时减小
MC_PITCH_SCALE 俯仰通道缩放系数 1.0 俯仰响应过强时减小
MC_YAW_SCALE 偏航通道缩放系数 1.0 偏航响应过强时减小
MC_AIRMODE 空中模式 1(开启) 低油门时保持控制力

这些参数本质上是在混控器矩阵的输出端加了一个缩放因子。比如你把 MC_ROLL_SCALE 设为 0.8,那么滚转通道对电机的贡献就会整体降低 20%。我一般建议先保持默认值,等 PID 调参完成后再微调这些缩放系数。

避坑指南:千万不要为了追求“暴力”飞控而把缩放系数设得过大。我曾经把 MC_ROLL_SCALE 调到 1.5,结果飞机在 SITL 里一推滚转就直接翻转——仿真里看着都吓人,真机的话估计已经炸成碎片了。缩放系数超过 1.2 就要格外小心。