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 信号,中间经过了三层处理:控制通道提取、混控器矩阵运算、电机输出计算。每一步都有对应的参数可以调,但最关键的还是混控器矩阵——它决定了飞机的“性格”。
2.5 动手实验:在 SITL 中观察混控器效果
光说不练假把式。咱们在 SITL 里做个实验,看看混控器到底怎么影响电机输出。
- 启动 SITL,选择四旋翼机架:
make px4_sitl gazebo-classic - 打开另一个终端,用
px4 listener sensor_combined查看传感器数据 - 在 QGroundControl 中,把遥控器摇杆推到右滚转位置(或者用
commander takeoff命令让飞机起飞) - 观察电机输出:
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 就要格外小心。