无人机飞控姿态控制参数整定 - 第3节
PID控制器基础:比例、积分、微分的物理意义
各位同学,欢迎来到第三章。前两章我们聊了姿态表示和传感器融合,那些都是飞控的「感知层」。从这一章开始,我们正式进入飞控的「决策层」——PID控制器。
说实话,我见过太多新手调参时对着P、I、D三个数值一脸茫然。要么乱改一通,要么死记硬背「P大了会震荡,I大了会超调」。知其然不知其所以然,调出来的飞机要么晃得像喝醉了,要么反应迟钝像老爷车。
今天我们就彻底搞明白:P、I、D到底在干什么?
比例(P)—— 当下的误差,当下的反应
比例控制,说白了就是「有多大错,使多大劲」。
假设你的四旋翼目标角度是30°,当前角度是20°。误差是10°。P控制器会输出一个与误差成正比的修正力矩:
P_output = Kp × error
Kp就是比例系数。误差越大,修正力越强。这个逻辑很直观,对吧?
但问题来了——纯比例控制永远追不上目标。为什么?
我举个例子。你用手托着一杯水,想停在某个高度。如果水杯低于目标,你就往上抬;越接近目标,你抬的力越小。最终,当你的托力刚好等于重力时,水杯停住了——但可能还差那么几厘米。这就是稳态误差。
在飞控里也一样。纯P控制下,飞机悬停时总会有点偏,因为需要持续的误差来产生对抗重力的输出。
核心要点:P控制响应快,但无法消除稳态误差。Kp越大,响应越快,但过大会导致震荡甚至发散。
积分(I)—— 累积的误差,消除静差
积分控制,就是用来解决稳态误差的。它的数学形式是:
I_output = Ki × ∫(error) dt
积分项会累积过去的误差。只要误差还存在,积分值就会一直增长,输出就会越来越大,直到把误差彻底吃掉。
你可以把积分想象成一个「记仇本」。P控制器忘了过去,只盯着当下;I控制器却把每一刻的误差都记在小本本上,秋后算账。
我在项目里遇到过一件事。有一次调试一架大轴距六旋翼,悬停时总是往北偏2°。P已经调到极限了,再大就抖了。后来加了点I,两秒后误差归零。嗯,这就是积分的威力。
注意:积分是把双刃剑。Ki太大,会导致「积分饱和」——误差累积过多,输出过大,飞机猛地冲过目标,然后来回震荡。我见过有人把I调得太大,飞机直接翻了个跟头。
微分(D)—— 变化的趋势,提前刹车
微分控制,看的是误差的变化率:
D_output = Kd × d(error)/dt
如果误差正在快速减小(飞机正在接近目标),微分项会输出一个反向力,相当于提前刹车,防止超调。
你想想看,开车时看到前面红灯,你是等到了跟前才猛踩刹车,还是提前轻踩?微分就是那个「提前轻踩」的动作。
在姿态环里,D项的作用非常明显:抑制震荡,增加阻尼。没有D的飞机,就像没有减震器的汽车,过个坎能颠半天。
我的习惯:调参时先调P,让飞机能基本响应;再加一点D,消除震荡;最后加I,消除静差。这个顺序我用了十年,基本没出过问题。
PID控制器的数学表达式
把上面三个合在一起,就是标准的PID公式:
u(t) = Kp × e(t) + Ki × ∫e(t)dt + Kd × de(t)/dt
其中:
- u(t):控制器输出(比如电机油门修正量)
- e(t):当前误差(目标值 - 当前值)
- Kp、Ki、Kd:三个待调参数
在飞控代码里,我们通常用离散形式:
// 伪代码示例
error = target - current;
integral += error * dt;
derivative = (error - last_error) / dt;
output = Kp * error + Ki * integral + Kd * derivative;
last_error = error;
这段代码,就是姿态环的核心。你调参时改的Kp、Ki、Kd,最终都会进到这个公式里。
PID控制器在姿态环中的应用框架
在飞控里,PID不是直接控制电机,而是分层嵌套的。最常见的结构是角度环 + 角速度环,也叫串级PID。
下面这张图,是我画的一个标准姿态控制框架:
这个框架,我建议你多看几遍。它解释了为什么飞控里会有那么多PID参数——每个轴(Roll、Pitch、Yaw)都有两套PID。
为什么用串级PID?
直接用一个PID控制角度不行吗?理论上可以,但实际效果很差。原因有两个:
- 响应太慢:角度变化是角速度的积分,有延迟。直接控角度,等你发现角度偏了再修正,飞机已经晃出去了。
- 抗扰能力弱:一阵风吹过来,角速度先变,角度后变。内环角速度PID能立刻响应风扰,外环角度PID根本来不及反应。
我记得有一次在户外飞一台大四轴,突然一阵侧风。内环角速度PID在50ms内就做出了修正,飞机几乎没动。如果只用单环PID,那一下至少偏5°。
各轴PID的特点
| 轴 | 外环(角度)特点 | 内环(角速度)特点 | 调参要点 |
|---|---|---|---|
| Roll | 响应快,P可稍大 | D抑制震荡 | 先调Roll,因为它最灵敏 |
| Pitch | 与Roll类似 | 可参考Roll参数 | 通常与Roll保持一致 |
| Yaw | 响应慢,P要小 | I要适当,防止积分饱和 | Yaw的D通常很小或为0 |
避坑指南:我曾经在Yaw轴上加了很大的D,结果飞机一打舵就剧烈抖动。后来才发现,Yaw轴的角速度噪声很大,微分项放大了噪声。所以Yaw的D我一般设0或者非常小的值。
小结
这一章我们讲了PID的三个核心概念:
- P:当下的误差,决定响应速度
- I:累积的误差,消除静差
- D:变化的趋势,增加阻尼