第1章:PID控制理论
各位同学,欢迎来到《无人机姿态控制算法实战》。我是你们的老朋友,一个在飞控领域摸爬滚打了十几年的工程师。今天咱们聊聊PID控制理论——这玩意儿是姿态控制的基石,说白了,没有它,无人机就跟你家那台摇头风扇没啥区别。
我刚开始做飞控那会儿,用的就是最基础的PID。那时候没有现在这么多开源代码,全靠自己手写。踩过的坑,比你们吃过的盐还多(笑)。所以这一章,我会把连续PID、离散PID、位置式、增量式、参数整定、积分饱和这些核心概念,掰开了揉碎了讲给你听。
核心观点:PID控制不是玄学,是数学。但用好它,需要一点工程直觉。
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法)
这是经典方法,适合线性系统。步骤很简单:
- 先把Ki和Kd设为0,只留Kp。
- 增大Kp,直到系统出现等幅振荡。
- 记录此时的临界增益Ku和振荡周期Tu。
- 查表计算:
| 控制器类型 | 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