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控制全景

下面这张图,帮你把本章的核心逻辑串起来:

PID控制知识体系 PID控制器 比例(P) 当前误差 × Kp 直接纠偏,响应最快 P过大 → 震荡 积分(I) 误差累积 × Ki 消除静态误差 I过大 → 积分饱和 微分(D) 误差变化率 × Kd 预测趋势,提前抑制 D过大 → 噪声放大 调参核心:响应速度 vs 稳定性 P决定「多快响应」 I决定「多准消除」 D决定「多稳刹车」

嗯,这张图把P、I、D三者的关系讲得很清楚了。你记住一句话:P是油门,I是爬坡力,D是刹车。调参就是调这三者的配比。

最后提醒:别指望一次调好。我每次调参,至少飞5个架次,记录数据,分析曲线,再微调。调参不是玄学,是科学。你理解了物理意义,就不会再盲目乱调了。


公众号:蓝海资料掘金营,微信deep3321