第1章:PID控制理论

各位同学,欢迎来到《无人机姿态控制算法实战》。我是你们的老朋友,一个在飞控领域摸爬滚打了十几年的工程师。今天咱们聊聊PID控制理论——这玩意儿是姿态控制的基石,说白了,没有它,无人机就跟你家那台摇头风扇没啥区别。

我刚开始做飞控那会儿,用的就是最基础的PID。那时候没有现在这么多开源代码,全靠自己手写。踩过的坑,比你们吃过的盐还多(笑)。所以这一章,我会把连续PID、离散PID、位置式、增量式、参数整定、积分饱和这些核心概念,掰开了揉碎了讲给你听。

核心观点:PID控制不是玄学,是数学。但用好它,需要一点工程直觉。

PID控制理论知识体系 PID控制器 连续PID vs 离散PID 模拟域 vs 数字域 位置式PID vs 增量式PID 全量输出 vs 增量输出 参数整定方法 Z-N法 / 试凑法 积分饱和与抗饱和 积分累积 & 抗饱和策略 目标:稳定、快速、无静差

1.1 连续PID与离散PID

先说说连续PID。它是个模拟系统,输入输出都是连续信号。公式长这样:

u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt

嗯,看着挺优雅。但问题是,咱们的飞控是数字芯片,跑的是离散时间系统。你没法真的去积分微分,只能靠采样和计算来近似。

所以就有了离散PID。说白了,就是把连续公式里的积分换成累加,微分换成差分。我习惯用一阶后向差分法,简单可靠:

u(k) = Kp * e(k) + Ki * Ts * Σe(i) + Kd * (e(k) - e(k-1)) / Ts

这里Ts是采样周期。我在项目中遇到过,有人直接把连续PID系数搬到离散系统里用,结果震荡得一塌糊涂。为什么?因为离散化会引入相位延迟,采样频率越低越明显。所以,离散化时一定要考虑Ts的影响

我的建议:采样频率至少是系统带宽的10倍以上。对于四旋翼姿态控制,我一般用400Hz到1kHz。

1.2 位置式PID与增量式PID

离散PID又分两种:位置式和增量式。很多新手搞不清区别,我当年也迷糊过。

位置式PID,直接输出控制量u(k)。公式就是上面那个。它的特点是:输出与过去所有状态有关,积分项会累积误差。一旦积分饱和,麻烦就大了。

增量式PID,输出的是控制量的增量Δu(k)。公式长这样:

Δu(k) = Kp * (e(k) - e(k-1)) + Ki * Ts * e(k) + Kd * (e(k) - 2*e(k-1) + e(k-2)) / Ts

你想想看,增量式只关心最近几次的误差变化,跟历史状态无关。所以它天然抗积分饱和,而且执行机构(比如舵机)只需要接收增量信号,不容易出问题。

对比项 位置式PID 增量式PID
输出形式 全量控制信号 控制增量
积分累积 有,需抗饱和处理 无,天然抗饱和
执行机构要求 需记忆当前位置 只需接收增量
适用场景 电机、阀门等 舵机、步进电机等

我在无人机姿态控制中,强烈推荐增量式PID。为什么?因为飞控的输出是PWM信号,增量式可以避免积分饱和导致的“起飞猛冲”现象。我曾经吃过这个亏——一架四轴,解锁后直接翻了个跟头,就是因为位置式PID积分饱和了。

注意:增量式PID虽然抗饱和,但它对噪声更敏感。微分项会放大高频噪声,所以一定要加低通滤波。

1.3 PID参数整定方法

参数整定,说白了就是找Kp、Ki、Kd这三个数。很多同学觉得这是玄学,其实是有套路的。

Ziegler-Nichols法(Z-N法)

这是经典方法,适合线性系统。步骤很简单:

  1. 先把Ki和Kd设为0,只留Kp。
  2. 增大Kp,直到系统出现等幅振荡。
  3. 记录此时的临界增益Ku和振荡周期Tu。
  4. 查表计算:
控制器类型 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

Z-N法适合作为初始值。但说实话,我在实际项目中很少直接用。因为无人机是非线性系统,Z-N法算出来的参数往往偏激进,容易震荡。

试凑法(工程整定法)

这才是飞控工程师的日常。我的经验口诀是:

  • 先调Kp:让系统响应快起来,但别震荡。我一般从0.1开始,每次翻倍。
  • 再加Ki:消除静差。Ki太大,系统会低频振荡。我习惯Ki = Kp * 0.1 ~ 0.2。
  • 最后Kd:增加阻尼,抑制超调。Kd太大会放大噪声。我一般Kd = Kp * 0.05 ~ 0.1。

举个例子,我调一架250轴距的穿越机:

初始值:Kp=0.5, Ki=0.05, Kd=0.02
现象:响应慢,有静差
调整:Kp加到1.0,Ki加到0.1
现象:响应快了,但超调10%
调整:Kd加到0.05
结果:超调降到3%,稳态误差0.5度以内

嗯,这就是个典型的试凑过程。你想想看,每次调完参数,都要上电飞一下,观察姿态响应。我当年在实验室里,一天能飞几十个起落,就为了调那三个数。

避坑指南:我曾经在调参时,Kp调得太大,结果飞机在地上就开始剧烈抖动,差点把桨叶甩飞。所以,调参时一定要把飞机固定好,或者拿在手里感受震动。安全第一。

1.4 积分饱和与抗积分饱和

积分饱和,是PID控制里最阴险的坑。什么叫积分饱和?就是积分项累积了很大的值,导致输出饱和(比如PWM占空比到了100%)。这时候,即使误差变小了,积分项还在“惯性”输出,系统就会超调甚至失控。

我遇到过最典型的场景:无人机起飞时,油门推得太慢,积分项一直在累积误差。等飞机离地了,积分项已经饱和,结果飞机猛地往上窜,差点撞天花板。

怎么解决?抗积分饱和。常用的方法有:

  • 积分限幅:给积分项设个最大值。我一般限制在输出范围的30%~50%。
  • 积分分离:当误差大于某个阈值时,停止积分。比如误差>10度,Ki=0。
  • 反计算法:当输出饱和时,把多余的积分量减掉。公式:
if (u(k) > u_max) {
    integral -= (u(k) - u_max) * K_aw;  // K_aw是抗饱和增益
}

我个人习惯用积分限幅+积分分离的组合。简单有效,代码量也少。你想想看,飞控的算力有限,能省则省。

核心总结:PID控制,离散化是基础,增量式是首选,参数整定靠试凑,积分饱和必须防。把这四点吃透了,姿态控制就入门了。

好了,这一章就到这里。记住,理论是死的,飞机是活的。多飞、多调、多总结,你也能成为PID调参高手。


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