4. PX4姿态控制架构:内外环PID控制结构
好,咱们进入正题。姿态控制,说白了就是让飞机老老实实按你想要的姿态飞。PX4 怎么做到的呢?核心就是一套经典的内外环 PID 结构。我刚开始接触那会儿,也觉得这玩意儿挺玄乎,后来拆开一看,其实逻辑特别清晰。
核心一句话:外环算“该往哪儿转”,内环算“该用多大力气转”。
4.1 角度环(外环)与角速度环(内环)的职责
先看一张图,把整体架构印在脑子里。
这张图我建议你多看两眼。外环是角度环,负责把“期望角度”和“实际角度”的偏差算出来,输出一个“期望角速度”。内环是角速度环,它拿到这个期望角速度,再结合陀螺仪测到的实际角速度,算出最终要输出的力矩。
为什么这么分层?我打个比方。你想让飞机从水平转到俯仰 30 度。外环一看,差 30 度,它告诉你:“内环,你现在要以每秒 60 度的速度转过去。”内环收到指令,再看陀螺仪:“嗯,现在实际转速是 0,差 60 度每秒,我该给电机多大油门才能达到这个转速?”
说白了,外环管“位置”,内环管“速度”。外环反应慢一点没关系,内环必须快、准、稳。
我的经验:调参时永远先调内环,再调外环。内环不稳,外环怎么调都是白搭。我曾经在一个四旋翼项目上,外环 P 增益给得很大,结果飞机一飞就抖,我还以为是外环的问题,折腾了两天。后来发现是内环 D 增益太小,角速度环响应太慢。内环调好后,外环随便给个值就稳了。
4.2 控制分配(混控器)原理
好,内环算出了三个轴的力矩(roll, pitch, yaw)和总油门。但问题来了——这四个电机,谁该转多快?这就是混控器要干的事。
混控器,说白了就是一个数学映射。它把“虚拟的力矩需求”转换成“物理的电机转速”。
对于标准的 X 型四旋翼,混控矩阵长这样:
// 混控矩阵 (X型四旋翼)
// 电机顺序: 1-FR, 2-BR, 3-BL, 4-FL
// 输出: [M1, M2, M3, M4]^T = Mixer * [Thrust, Roll, Pitch, Yaw]^T
Mixer = [
[ 1, 1, -1, -1], // M1: +Thrust +Roll -Pitch -Yaw
[ 1, -1, -1, 1], // M2: +Thrust -Roll -Pitch +Yaw
[ 1, -1, 1, -1], // M3: +Thrust -Roll +Pitch -Yaw
[ 1, 1, 1, 1] // M4: +Thrust +Roll +Pitch +Yaw
]
你看这个矩阵,每一行对应一个电机,每一列对应一个控制轴。正号表示该电机在该轴向上出力,负号表示反方向出力。
举个例子。如果只给 Roll 正方向力矩(比如向右滚转),那么 M1 和 M4 要加速(正号),M2 和 M3 要减速(负号)。这样飞机右侧的电机转速增加,左侧降低,飞机就向右滚了。
| 控制轴 | M1 (FR) | M2 (BR) | M3 (BL) | M4 (FL) | 效果 |
|---|---|---|---|---|---|
| Thrust | +1 | +1 | +1 | +1 | 所有电机同时加速 |
| Roll | +1 | -1 | -1 | +1 | 右侧加速,左侧减速 |
| Pitch | -1 | -1 | +1 | +1 | 前侧减速,后侧加速 |
| Yaw | -1 | +1 | -1 | +1 | 对角电机同向变化 |
你想想看,这个矩阵其实就决定了飞机的“手感”。如果你换了机架,比如从 X 型换成 H 型,或者加了倾转机构,混控矩阵就得重新算。
注意:混控器输出的是归一化值(0~1),最终要映射到电机的实际 PWM 范围。PX4 里通过 PWM_MIN 和 PWM_MAX 参数来做这个映射。我曾经见过有人改了机架但忘了更新混控器参数,结果飞机一解锁就翻,就是因为电机转向和矩阵对不上。
4.3 内外环与混控器的协同工作
把这三个部分串起来,就是完整的姿态控制链路:
- 期望姿态(来自遥控器或任务规划)进入角度环。
- 角度环(P 控制器)算出期望角速度。
- 角速度环(PID 控制器)算出期望力矩。
- 混控器把力矩分配到各个电机。
- 电机执行,飞机姿态改变。
- 陀螺仪和姿态估计反馈实际角度和角速度,闭环。
这个链路里,每一步的延迟都会影响最终效果。内环的更新频率最高,因为它直接控制电机。外环可以慢一些,因为角度变化本身就不快。
调参顺序总结:
- 第一步:调内环 P,让角速度响应快但不超调。
- 第二步:调内环 D,抑制震荡,增加阻尼。
- 第三步:调内环 I,消除稳态误差(悬停时漂移)。
- 第四步:调外环 P,让角度跟踪准确。
- 第五步:微调,根据实际飞行手感做补偿。
嗯,这里要注意。很多人一上来就调外环,觉得飞机反应慢就加外环 P。结果飞机开始抖,又去加内环 D。折腾半天发现,其实是内环 P 太小,外环 P 太大,内外环在打架。
我个人习惯是,先把内环调得“硬”一点,让它能快速响应。然后再用外环去“指挥”它。这样内外环各司其职,飞机飞起来才跟手。
好了,这一章的内容就到这儿。记住这张内外环加混控器的架构图,后面调参的时候,你脑子里随时要有这个框架。遇到问题,先定位是哪个环节出的问题,再动手调。