4、PID控制基础:P、I、D三个环节的作用、位置式PID与增量式PID、参数整定方法

各位同学,欢迎来到第四章。

说实话,PID控制是车辆运动控制里最经典、最实用的算法之一。我做了这么多年控制,从早期的简单循迹到后来的高速车道保持,PID始终是那个最可靠的「老伙计」。今天我们就把它彻底聊透。

4.1 P、I、D三个环节,到底在干嘛?

先别急着看公式。我们用一个场景来理解:

你开车,想保持在车道正中间。眼睛看到偏了(误差),手打方向盘(控制量)。这就是PID的雏形。

4.1.1 P(比例)—— 看当下

P就是「偏多少,打多少」。偏了1米,方向盘打10度;偏了2米,打20度。简单粗暴。

但有个问题:如果只用P,车永远回不到正中间。它会停在某个偏一点的位置——这就是稳态误差。我在做早期AGV小车时吃过这个亏,车总是歪着跑,怎么调P都不行。

核心公式: u(t) = Kp * e(t)

Kp越大,响应越快,但容易震荡。Kp太小,反应迟钝。

4.1.2 I(积分)—— 看过去

I就是「把过去的误差累积起来」。你偏了10秒,我就把这10秒的误差加起来,额外加一把力把你拉回来。

说白了,I就是用来干掉稳态误差的。P搞不定的那点偏差,I来收尾。

注意: I不是越大越好。我曾经在一个项目中把I调得太大,结果车在弯道里疯狂振荡,像喝醉了酒。积分饱和是个大坑,后面我们会讲。

4.1.3 D(微分)—— 看未来

D是「看变化趋势」。你正在快速靠近车道线,D会提前预判,提前打方向盘。说白了,D就是给系统加阻尼,让它别那么「冲」。

我习惯在高速场景下多用D,它能有效抑制超调。但D对噪声特别敏感——传感器抖一下,D就会乱跳。

我的经验: 实际项目中,P和I是主力,D是辅助。很多场景只用PI就够了,加D反而容易出问题。

4.2 位置式PID vs 增量式PID

这两个概念,很多初学者容易混淆。我当年也花了点时间才搞明白。

4.2.1 位置式PID

位置式PID直接计算「当前应该输出多少控制量」。公式长这样:

u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]

特点:

  • 输出是绝对值,比如「方向盘打30度」
  • 需要累加所有历史误差,容易积分饱和
  • 一旦计算错误,输出会跳变,很危险

我在做无人驾驶线控底盘时,位置式PID用得比较多。因为执行器(比如转向电机)需要绝对角度指令。

4.2.2 增量式PID

增量式PID只计算「这次比上次多打多少」。公式:

Δu(k) = Kp * [e(k)-e(k-1)] + Ki * e(k) + Kd * [e(k)-2e(k-1)+e(k-2)]
u(k) = u(k-1) + Δu(k)

特点:

  • 输出是增量,比如「再打2度」
  • 不需要累加误差,积分饱和风险小
  • 就算计算错误,也只是跳变一个增量,相对安全

选型建议:

  • 执行器支持绝对位置指令 → 位置式PID
  • 执行器只接受增量指令(如步进电机)→ 增量式PID
  • 对安全性要求高 → 增量式PID

4.3 参数整定方法

调参是门手艺活。我见过有人调了三天三夜,也有人十分钟搞定。这里分享几个实用方法。

4.3.1 试凑法(最常用)

步骤很简单:

  1. 先调P:从小到大,直到系统开始震荡,然后回调到震荡幅度的60%
  2. 再加I:消除稳态误差,但别加太多,否则会震荡
  3. 最后加D:抑制超调,但别加太多,否则噪声放大

我曾经调一个循迹小车,P调到50时开始抖,我回调到30,然后加I到0.1,完美。整个过程不到20分钟。

4.3.2 Ziegler-Nichols法(经典方法)

这个方法适合有理论基础的同学:

参数 P控制 PI控制 PID控制
Kp 0.5 * Ku 0.45 * Ku 0.6 * Ku
Ki - 0.54 * Ku / Tu 1.2 * Ku / Tu
Kd - - 0.075 * Ku * Tu

其中Ku是临界增益(系统开始震荡时的P值),Tu是震荡周期。

避坑指南: 我曾经在实车上用Z-N法,算出来的参数直接让车在测试场里画龙。原因是实车有延迟和死区,理论值需要打折。建议把算出来的Kp再乘以0.7,Ki乘以0.5,再微调。

4.3.3 自整定法(进阶)

现在很多控制器支持自整定。比如:

  • 继电器法:给系统一个方波激励,观察响应
  • 模糊PID:根据误差大小自动调整参数
  • 自适应PID:在线辨识模型,实时更新参数

我个人觉得,自整定适合量产产品。但在研发阶段,手动调参能让你更理解系统特性。

4.4 实战中的坑与技巧

积分饱和处理: 当执行器达到极限(比如方向盘打到底),积分还在累加。等误差反向时,积分需要时间退出来,导致响应滞后。我的做法是:积分限幅,或者用「积分分离」——误差大时停止积分。

微分先行: 只对测量值微分,不对目标值微分。这样可以避免目标值突变时产生冲击。我在做ACC(自适应巡航)时用过这个技巧,效果很好。

嗯,PID看似简单,但真正用好需要大量实践。我建议你从仿真开始,用MATLAB/Simulink搭一个简单的车辆模型,然后手动调参。调着调着,你就会找到感觉。

下一章我们会讲PID在横向控制中的具体应用——车道保持。到时候你会看到,同样的PID,在不同场景下需要做哪些调整。

先消化这些,有问题随时交流。