4. PID 控制原理:从物理直觉到工程实践

PID 控制器,说白了就是飞控系统里最核心的“大脑”。你想想看,无人机要悬停、要转弯、要抗风,靠的就是这三个字母——P、I、D。我做了这么多年飞控,见过太多新手一上来就调参数,结果飞机在天上乱晃。其实,理解 PID 的物理意义比调参本身更重要。

4.1 P、I、D 参数的物理意义

先别急着看公式。咱们用个生活化的例子来理解:你用手托着一杯水,想让它保持水平。

  • P(比例):水杯歪了,你立刻往反方向用力。歪得越狠,用力越大。这就是比例控制——根据当前误差的大小,给出对应的修正量。但问题来了:如果只用 P,水杯永远差那么一点点才能完全水平,这就是“稳态误差”。
  • I(积分):你发现水杯老是往左边偏一点点,于是你持续地、慢慢地往右边加力,直到它完全回正。这就是积分控制——对过去的误差进行累积,消除静差。我在项目中遇到过,有些飞控悬停时高度老是差几厘米,加了 I 之后立马稳了。
  • D(微分):水杯突然被风吹了一下,你提前感觉到它要往右倒,于是提前往左用力“顶”一下。这就是微分控制——根据误差的变化趋势,提前做出反应。D 的作用是抑制超调,让系统更“稳”。

一句话总结:P 管现在,I 管过去,D 管未来。三者配合,才能让飞控既快又稳。

4.2 PID 控制器设计:从连续到离散

飞控里跑的是数字信号,所以咱们得把连续的 PID 公式变成离散的。嗯,这里要注意,采样周期 T 的选择很关键——太快了算不过来,太慢了控制滞后。

离散 PID 的常见形式有两种:

  • 位置式 PID:直接计算控制量 u(k)。公式长一点,但物理意义清晰。
  • 增量式 PID:只计算控制量的变化量 Δu(k)。好处是输出不会突变,适合电机控制。
// 增量式 PID 的伪代码,我习惯这么写
float pid_incremental(float setpoint, float feedback) {
    float error = setpoint - feedback;
    float p_term = Kp * (error - last_error);
    float i_term = Ki * error;
    float d_term = Kd * (error - 2*last_error + last_last_error);
    float delta = p_term + i_term + d_term;
    
    last_last_error = last_error;
    last_error = error;
    
    return delta;
}

我的习惯:在工程实现中,我会给积分项加一个限幅,防止“积分饱和”——就是误差一直存在,积分项越积越大,最后输出爆炸。我曾经吃过这个亏,飞机直接窜上天了。

4.3 位置环与速度环:内外有别

飞控里很少只用单环 PID。为什么?因为单环控制太“迟钝”了。你想想看,如果只靠位置环去控制无人机的位置,那它得先看到位置偏差,再慢慢调整。遇到风,反应太慢。

所以,我们通常用串级 PID:外环是位置环,内环是速度环。外环输出给内环做目标值,内环负责快速响应。

控制环 输入 输出 特点
位置环(外环) 目标位置 vs 实际位置 目标速度 响应慢,精度高
速度环(内环) 目标速度 vs 实际速度 控制量(如油门) 响应快,抗干扰

为什么速度环要放在里面?因为速度的变化比位置的变化更“直接”。外环位置环的更新频率可以低一些(比如 50Hz),内环速度环必须跑得快(比如 200Hz 以上)。

4.4 串级 PID:为什么比单环强?

我刚开始做飞控时,也试过单环 PID。结果呢?飞机悬停时稍微有点风,就开始来回晃,像喝醉了酒。后来换成串级 PID,立马稳如老狗。

串级 PID 的核心优势在于:内环可以提前“消化”掉大部分扰动。比如一阵风吹过来,速度环先感知到速度变化,立刻调整输出,根本来不及传到位置环。外环只需要“悠闲”地修正剩下的那一点点偏差。

避坑指南:串级 PID 的两个环不能同时调。我曾经犯过这个错——内外环一起调,结果参数乱成一锅粥。正确做法是:先调内环,再调外环。内环调稳了,外环才能有好的基础。

4.5 PID 参数整定方法

调参是门手艺活。我见过有人靠“玄学”调参,也有人靠数学公式。这里介绍两种最实用的方法。

4.5.1 试凑法(工程经验法)

说白了就是“摸着石头过河”。步骤很简单:

  1. 先调 P:把 I 和 D 设为 0,逐渐增大 P,直到系统开始出现等幅振荡。记下这个 P 值。
  2. 再调 D:加入 D,抑制振荡。D 太小没效果,D 太大系统会“抖”。
  3. 最后调 I:加入 I,消除静差。I 太大容易超调,I 太小消除得慢。

我个人的习惯是:每次只调一个参数,调完观察 10 秒,记录现象。别心急,调参就像炖汤,火候到了自然香。

4.5.2 Ziegler-Nichols 法(科学整定法)

这个方法比试凑法更“数学”。它基于系统的临界振荡数据来计算参数。

步骤:

  1. 把 I 和 D 设为 0,只保留 P。
  2. 增大 P,直到系统出现持续的等幅振荡。记录此时的 临界增益 Ku 和 振荡周期 Tu。
  3. 根据下表计算 PID 参数:
控制器类型 Kp Ki Kd
P 0.5 * Ku - -
PI 0.45 * Ku 1.2 * Kp / Tu -
PID 0.6 * Ku 2 * Kp / Tu Kp * Tu / 8

我的经验:Ziegler-Nichols 法算出来的参数通常偏“激进”,系统容易超调。我一般把它作为起点,然后手动微调。尤其是 D 项,我经常把算出来的值减半再用。

4.6 知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作调参时的“地图”。

PID 控制原理与整定知识体系 PID 控制器 P:比例(现在) I:积分(过去) D:微分(未来) 单环 PID 串级 PID 试凑法(经验) Ziegler-Nichols 法 核心原则:先调内环,再调外环 每次只调一个参数,观察 10 秒

4.7 写在最后

PID 调参没有“万能公式”。每个飞控、每个机型、甚至每次载重变化,都可能需要重新微调。我见过有人用试凑法调了三天三夜,也见过有人用 Ziegler-Nichols 法十分钟搞定。方法没有好坏,关键是理解背后的物理意义。

记住一句话:P 让系统动起来,I 让系统准起来,D 让系统稳下来。下次调参时,心里默念这句话,你会发现思路清晰很多。