3、PID控制原理:比例(P)、积分(I)、微分(D)的作用、PID参数整定方法(Ziegler-Nichols法)、位置环与力矩环的串级控制

聊到关节控制,PID 是绕不开的核心。说白了,它就是一套「看偏差、算输出、调执行」的闭环逻辑。我最早接触 PID 是在一个直流电机调速项目里,那时候连参数怎么调都不懂,全靠瞎蒙。后来踩的坑多了,才慢慢摸清楚每个环节的脾气。

3.1 比例(P)、积分(I)、微分(D)各自的作用

先看一个最简单的场景:你希望关节停在 90° 位置,但实际只转到 85°。这 5° 的差距,就是偏差。

  • 比例(P):偏差越大,输出越大。好比弹簧,拉得越狠,回弹力越猛。但纯比例控制会有稳态误差——系统永远差那么一点点才能到目标。我在调一个六轴机械臂的肩关节时,纯 P 控制下位置误差始终有 0.3°,怎么加大比例都消不掉。
  • 积分(I):专门对付稳态误差。它把过去的偏差累加起来,时间越长,输出越强,直到把误差「推」到零。但积分太强会 overshoot,甚至震荡。嗯,这里要注意:积分饱和是个大坑,我吃过亏。
  • 微分(D):预测未来。它看偏差的变化率,偏差突然变大时,微分提前输出一个反向力,抑制超调。好比开车看到前车刹车灯亮了,你提前松油门。微分对噪声敏感,信号一抖,输出就乱跳。

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

3.2 PID参数整定方法——Ziegler-Nichols法

参数怎么调?我见过有人靠「试」,调一整天还抖。Ziegler-Nichols 法(简称 Z-N 法)是经典工程方法,分两步走。

3.2.1 临界比例度法

  1. 先把 I 和 D 关掉(I=0, D=0),只留 P。
  2. 慢慢增大 P 的增益,直到系统出现等幅震荡——就是输出开始持续、均匀地来回摆动。
  3. 记下此时的增益 \( K_u \) 和震荡周期 \( T_u \)。
  4. 按下面表格计算 PID 参数:
控制器类型 \( K_p \) \( K_i \) \( K_d \)
P 0.5 \( K_u \) — —
PI 0.45 \( K_u \) 1.2 \( K_p \) / \( T_u \) —
PID 0.6 \( K_u \) 2 \( K_p \) / \( T_u \) \( K_p \) × \( T_u \) / 8

我的经验:Z-N 法给出的参数偏激进,系统容易 overshoot。我一般会把算出来的 \( K_p \) 再打 0.7~0.8 折,然后微调 I 和 D。尤其是力矩环,太猛会损坏减速器。

3.2.2 反应曲线法

如果系统不允许震荡(比如精密装配),可以用开环阶跃响应法。给系统一个阶跃输入,记录输出曲线,找到最大斜率点和滞后时间,再查表计算。这个方法我用的少,因为大多数关节系统都能接受短时震荡测试。

3.3 位置环与力矩环的串级控制

单环 PID 在关节控制里不够用。为什么?因为位置环响应慢,力矩扰动来得快。你想想看,电机刚转起来,负载突然变了,位置环还没反应过来,力矩已经冲上去了。这时候就需要串级控制。

串级控制就是「环中套环」:外环(位置环)输出给内环(力矩环),内环直接控制电机电流。外环慢但准,内环快但稳。

避坑指南:我曾经在一个协作机器人项目里,把位置环和力矩环的采样频率设成一样,结果内环还没算完,外环又发新指令了,系统直接震荡。后来我把力矩环频率设为位置环的 5~10 倍,问题才解决。

3.3.1 串级结构

  • 外环(位置环):输入目标位置,输出目标力矩(或目标电流)。
  • 内环(力矩环):输入目标力矩,输出 PWM 占空比给电机驱动器。
  • 反馈:编码器测位置,电流传感器测实际力矩。

下面这张图展示了串级控制的核心流程:

位置环与力矩环串级控制框图 串级控制:位置环 + 力矩环 目标位置 − 位置环 PID − 力矩环 PID 电机+关节 实际位置 位置反馈 力矩反馈 外环(位置环)输出目标力矩给内环(力矩环),内环直接控制电机电流,响应更快

3.3.2 为什么串级比单环好?

  • 抗扰动能力强:力矩环能快速抑制负载突变,位置环不用频繁调整。
  • 响应更快:内环带宽高,外环带宽低,两者解耦,整体响应速度提升。
  • 安全性高:力矩环可以设置电流上限,防止电机过载烧毁。

实际案例:我在调一个 7 自由度协作臂时,单环 PID 在末端负载 2kg 时位置误差 0.5mm,换成串级后误差降到 0.1mm,而且关节启停更平滑,没有那种「咯噔」一下的冲击感。

3.4 参数整定的小技巧

最后分享几个我自己的习惯:

  • 先内环后外环:先把力矩环调稳,再调位置环。内环不稳,外环怎么调都没用。
  • 积分限幅:给 I 项设一个上限,防止积分饱和导致 overshoot。我一般设最大输出的 20%~30%。
  • 微分滤波:D 项前面加一个低通滤波器,滤掉高频噪声。时间常数取 0.5~2ms 就行。
  • 不要迷信 Z-N:Z-N 法只是起点,不是终点。实际系统有摩擦、间隙、非线性,最终参数要靠现场微调。

避坑指南:我曾经在一个高速关节项目里,把微分增益设得太大,结果电机高频啸叫,编码器读数都跳变了。后来加了滤波,又把 D 减半,才安静下来。记住:微分是把双刃剑。