3. PID控制基础:比例(P)、积分(I)、微分(D)的作用、PID公式解读、调参的物理意义
各位同学,欢迎来到第三章。
说实话,PID控制是飞控的灵魂。你调参调得好不好,直接决定了飞机是「稳如老狗」还是「原地翻跟头」。我见过太多新手,上来就乱调P、I、D三个参数,结果飞机抖得像筛糠,还以为是硬件问题。
今天我们就来彻底搞懂:P、I、D到底在干什么?公式怎么读?调参的物理意义是什么?
核心观点:PID不是魔法,它只是一个「看误差、算输出」的数学公式。你理解了误差怎么被放大、累积、预测,调参就不再是玄学。
3.1 比例控制(P):最直接的「纠偏」
比例控制,说白了就是:误差越大,输出越大。
举个例子。你用手托着飞机,想让它的俯仰角保持在0度。如果飞机低头了5度,P项就会输出一个向上的力,把它拉回来。这个力的大小,就是 Kp × 误差。
// 伪代码示例
float error = target_angle - current_angle; // 目标角度 - 当前角度
float P_output = Kp * error; // 比例输出
我在项目中遇到过一个问题:P值调得太大,飞机一有误差就猛拉,结果拉过头了,又往反方向猛拉,最后变成持续震荡。这就是典型的「P过大导致震荡」。
我的经验:调P的时候,先给一个很小的值(比如0.5),然后慢慢往上加。加到飞机开始轻微抖动,再往回退20%。这个点,就是P的「甜区」。
3.2 积分控制(I):消除「顽固误差」
比例控制有个硬伤:它无法消除静态误差。
什么叫静态误差?比如飞机重心偏了,或者有持续的风吹着。这时候P项只能把飞机拉到接近目标,但永远差那么一点点。为什么?因为误差小到一定程度,P项输出的力就不足以克服外力了。
积分控制就是来解决这个问题的。它把过去所有的误差累加起来,误差存在的时间越长,I项的输出就越大,直到把那个「顽固误差」彻底吃掉。
// 伪代码示例
integral += error * dt; // 误差累加
float I_output = Ki * integral; // 积分输出
注意!积分项是一把双刃剑。我曾经在调试一款四轴时,I值设得太大,结果飞机悬停时越飘越远,最后直接翻机。这就是「积分饱和」——误差一直存在,积分一直累加,输出越来越大,直到失控。
解决办法:给积分项加一个上限(积分限幅),或者误差太大时暂停积分。
3.3 微分控制(D):提前「踩刹车」
比例和积分都是「事后纠偏」,而微分是「事前预测」。
微分看的是误差的变化率。如果误差正在快速变大(比如飞机突然被风吹歪),D项会输出一个很大的反向力,提前阻止它继续恶化。反过来,如果误差正在快速减小(飞机正在回正),D项会输出一个阻尼力,防止它冲过头。
// 伪代码示例
float derivative = (error - last_error) / dt; // 误差变化率
float D_output = Kd * derivative; // 微分输出
你想想看,这就像开车。P是油门,I是持续踩油门爬坡,D就是刹车。没有D,你过弯时就会甩出去。
避坑指南:我曾经在调试一款固定翼时,D值设得太大,结果飞机一有轻微扰动就剧烈抖动,像得了帕金森。后来发现是微分项放大了传感器噪声。解决办法:对微分项做低通滤波,或者减小D值。
3.4 PID公式解读:从数学到物理
标准的PID公式长这样:
Output = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
别被数学符号吓到。我们拆开看:
| 项 | 数学含义 | 物理含义 |
|---|---|---|
| Kp × e(t) | 当前误差 × 比例系数 | 根据当前偏差,直接拉回 |
| Ki × ∫e(t)dt | 误差的累积 × 积分系数 | 消除长期存在的偏差 |
| Kd × de(t)/dt | 误差的变化率 × 微分系数 | 预测趋势,提前抑制 |
在实际飞控代码中,我们通常用离散形式:
// 离散PID实现(位置式)
float pid_update(float target, float current, float dt) {
float error = target - current;
// P
float P = Kp * error;
// I(带限幅)
integral += error * dt;
integral = constrain(integral, -I_MAX, I_MAX);
float I = Ki * integral;
// D(带滤波)
float derivative = (error - last_error) / dt;
derivative = lowpass_filter(derivative);
float D = Kd * derivative;
last_error = error;
return P + I + D;
}
我的习惯:实际项目中,我很少直接用位置式PID。我更喜欢增量式PID,因为它输出的是增量,不会因为积分饱和导致输出突变。但初学者先搞懂位置式就够了。
3.5 调参的物理意义:你究竟在调什么?
很多同学调参时,只知道「P大了抖,I大了飘,D大了震」。但背后的物理意义是什么?
- 调P:你在调整系统的「刚度」。P越大,系统越「硬」,响应越快,但容易震荡。P越小,系统越「软」,响应慢,但稳定。
- 调I:你在调整系统的「持久力」。I越大,消除静态误差越快,但容易积分饱和。I越小,抗干扰能力弱。
- 调D:你在调整系统的「阻尼」。D越大,刹车越猛,但会放大噪声。D越小,系统容易超调。
我举个例子你就明白了。想象你用手去接一个掉落的杯子:
- P 是你的手速——看到杯子下落,立刻伸手去接。手速太快(P太大),会接过头;太慢(P太小),接不住。
- I 是你的耐心——如果杯子一直没接住,你会持续调整手的位置。耐心太足(I太大),手会一直动,停不下来;耐心不足(I太小),差一点就不管了。
- D 是你的预判——看到杯子下落速度很快,你会提前减速,防止撞到手。预判太强(D太大),手会抖;预判太弱(D太小),杯子会撞飞。
总结一下:调参的本质,就是在「响应速度」和「稳定性」之间找平衡。没有万能参数,只有适合你飞机的参数。
3.6 知识体系图:PID控制全景
下面这张图,帮你把本章的核心逻辑串起来:
嗯,这张图把P、I、D三者的关系讲得很清楚了。你记住一句话:P是油门,I是爬坡力,D是刹车。调参就是调这三者的配比。
最后提醒:别指望一次调好。我每次调参,至少飞5个架次,记录数据,分析曲线,再微调。调参不是玄学,是科学。你理解了物理意义,就不会再盲目乱调了。
公众号:蓝海资料掘金营,微信deep3321