第 3 章 PID 工程¶
PID 是机器人回路里出现频率最高的控制器,也是最容易被"参数表化"误读的控制器:三个增益背后是六个工程决策——整定方法、积分抗饱和、微分作用对象与滤波、串级与前馈、离散实现、采样率与噪声。本章按「经典整定与局限 → 工程修正 → 离散实现与 dt 卫生」三段,用最小仿真逐一说清这些决策。运行环境 python 3.11 + control 0.10.2。
三项各自的作用对象与工程修正的位置:
flowchart LR
e["误差 e"] --> p["P:刚度"]
e --> i["I:消静差"]
e --> d["D:阻尼<br/>带滤波 / 微分先行"]
i --> anti["积分抗饱和"]
p --> out["u = P + I + D"]
anti --> out
d --> out
out --> lim["限幅 / 串级 / 前馈"]
1. 三项各自的职责与自由度¶
位置式离散 PID(采样周期 \(dt\),误差 \(e_k=r-y_k\)):
integ += e*dt # 积分项
deriv = (e - e_prev)/dt # 微分项(对误差;工程上常改为对测量,见「微分先行」一节)
u = Kp*e + Ki*integ + Kd*deriv # 输出
三项职责可以用对象形态一句话对上:P 提供弹性(对双积分对象只加弹性不加阻尼,见第 2 章「执行器与刚体模型」)、I 消静差(把型别提一阶)、D 补阻尼(在速度通道上加虚拟摩擦)。自由度共三个(有的实现带微分滤波系数 \(N\) 共四个),但"三个数"不等于"三次试凑"——整定的对象是闭环极点分布与裕度,参数表只是把这对关系近似成口诀。
2. 经典整定法与它们的适用局限¶
ZN 开环阶跃响应法(step-response,查反应曲线四参数表):开环阶跃测出 FOPDT 三参数(增益 \(K\)、时间常数 \(\tau\)、纯滞后 \(L\)),查表 \(K_p=0.9\tau/(KL)\)、\(T_i=0.3\tau\)、\(T_d=0.075\tau\)。ZN 闭环法(ultimate cycle,接力率/临界比例度):把 P 增益推到等幅振荡,取临界增益 \(K_u\) 与周期 \(P_u\) 查表。Cv(cycle-ratio)类变体把目标从 1/4 衰减改为更缓和的衰减率。一句话定位:ZN 族的目标点是高衰减度,换来的代价是超调与鲁棒性——对 \(K=2,\ \tau=0.5,\ L=0.1\) 的 FOPDT 对象:
ZN 反应曲线法: Kp=2.250 Ti=0.150 Td=0.037
ZN 闭环(微分滤波 N=10): 超调=96.3% ts(2%)=2.00s
ZN 闭环(理想微分无滤波): 超调=51.3%
lambda/IMC(PI, tau_l=2L): Kp=3.500 Ti=0.500 -> 超调=90.5% ts(2%)=4.44s
两个读数都值得警惕:其一是 ZN 在本例给出的整定本来就激进(超调过半是 1/4 衰减设计的默认产物);其二是微分滤波器同样进相位预算——同一组 ZN 参数,给微分加 \(N=10\) 的滤波把超调从 51% 推到 96%,因为滤波器在穿越频率附近又加了滞后而 ZN 表不知道。lambda 族把期望闭环时间常数 \(\tau_l\) 直接写进公式(\(K_p=(\tau+\tau_l)/(K L)\)),比查表口诀更可辩护,代价是响应更慢(ts 4.44s vs 2.0s)。
局限清单:ZN 族假设对象近似 FOPDT 且 \(L/\tau\) 小;对积分主导对象(机械关节)与和谐振的对象(长轴系)会给出振荡或失稳的参数;\(L/\tau>0.3\) 时超调失控。PID 参数并非万能——同一组 ZN 参数换一档 \(L/\tau\) 就从"快"变成"振",正确结论是:经典表只提供起点,闭环指标必须自己仿真核验,而核验所需的频域语言正是第 4 章「频率域与鲁棒性」的主题。
3. 工程修正:抗饱和、微分滤波与微分先行¶
理想 PID 到能用的 PID,隔着四件修正。
3.1 抗积分饱和¶
执行器一律有量程。参考值超出能力或大阶跃瞬态中,\(u\) 被截幅而误差仍同向,积分器持续累积"未被执行的量"(windup),后果在参考回零时才暴露。对象 \(\frac{4}{0.5s+1}\)、执行器 ±1、参考 3→0 往返(3 在可达范围内,但瞬态必饱和):
无抗饱和: 回零后最大下冲 = 1.000(等效反向满幅冲回),迟迟回不到带内
conditional: 饱和且误差同向时停止积分 -> 下冲 -0.038, 0.43s 回带
back-calculation: 把被削量按 Kb 退回积分器 -> 下冲 -0.114, 0.35s 回带
三种都是几行代码的差别,效果差一个量级。conditional 实现最直白;back-calculation 多一个可调 \(K_b\),退回强度连续、对采样率不敏感。ros2_control 生态的标准实现(control_toolbox,ROS 2 Humble 3.7.1)走的是积分钳制一族:恒定饱和误差下指令封顶在 \(i_{\max}\)、误差反向立即退出且无退饱和滞后;选 back-calculation 的理由是退回强度连续,机器人上层控制器与驱动器各自取舍。判据一句话:只要 \(u\) 会被截幅,就必须给积分器一条泄放路径。
3.2 微分滤波¶
理想微分 \(K_d s\) 对噪声增益随频率线性发散,工程形态一律带低通:\(K_d s\to K_d s\frac{N}{s+N}\),高频增益封顶在 \(K_d N\)。\(N\) 的扫描(\(K_p=1.5,K_i=1,K_d=0.2\),同一 FOPDT 对象):
N= 2: 微分通道最大增益=1.90 超调=1.8% ts=4.24s
N= 10: 微分通道最大增益=3.50 超调=14.1% ts=4.19s
N= 100: 微分通道最大增益=21.50 超调=25.1% ts=4.18s
\(N\) 减小(滤波更重)时阻尼作用被削、超调下降是因为闭环变钝——真实取舍在噪声侧:编码器单拍量化噪声经微分通道的放大倍率是 \(K_d N\)(封顶后不再随 \(1/dt\) 发散)。常用起点 \(N=8\sim20\)(Åström-Hägglund 推荐 10~20),噪声大就往下压。
3.3 微分先行(derivative on measurement)¶
对误差做微分,设定值一有阶跃就产生冲击电流。同样的三路(\(K_d=0.3\)、\(dt=2\) ms),阶跃后原始指令序列:
微分对误差: 150.2 -0.4 0.4 -0.1 ... ← 首拍 150:Kd*Δr/dt 的尖峰
微分对测量: 0.20 0.32 0.39 0.44 ... ← 无冲击,平滑爬升
把微分作用改挂测量值 \(d_k=(y_{k-1}-y_k)/dt\),跟踪与调节两自由度解耦,设定值变化不再经过微分通道。「微分项到底该不该开」因此有了精确版本:对测量开、带滤波、双积分对象必开(第 2 章「执行器与刚体模型」),纯一阶对象可整个关掉——一阶对象加 D 只换来噪声。
3.4 前馈¶
反馈只在误差出现之后动手;已知的需求(重力、摩擦、期望加速度)应当直接馈入。纯积分对象 \(\dot p=u-g\) 上常值扰动 \(g=1\):
纯 P(Kp=4): 稳态误差 = 0.2500(= g/Kp,I 未启用时静差按此式确定)
P + 精确前馈: 稳态误差 = 0.0000
前馈把"该给的量"给在误差之前,同一精度下反馈增益可以更低、噪声放大更小。机器人关节的重力前馈(\(G(q)\) 逐项)与惯量前馈(\(\ddot q_{ref}\cdot M\) 对角项)来源见 robotics-note 第 6 章「拉格朗日动力学与标准形式」;前馈误差直接进跟踪误差不进稳定裕度,这一性质在第 10 章「交互控制与模型预测」的接触场景同样使用。
4. 串级:把对象切成两层闭环¶
位置/速度串级(外环 P 输出速度参考、内环 PI 稳速度)解决的是扰动位置决定抑制成本的问题:扰动打在越靠内的环节,单环回路"看到"它时已经积分扩散。对象 \(u_1\to\frac{1}{0.05s+1}\to v\to\frac{1}{s}\to p\),常值扰动直接注入 \(v\) 通道,串级(内环 PI 5/100 + 外环 P 10)与同外环增益的单环 P 对比:
p 最大偏移: 串级 0.00026 单环 0.00521 (19.9 倍)
IAE: 串级 0.00005 单环 0.00950 (约 190 倍)
串级把扰动抑制任务交给带宽高一个数量级的内环,外环只需慢而稳。这正是第 2 章「执行器与刚体模型」DS402 三环的存在理由;上位自建串级时,内环采样周期须显著短于外环(比值即内环对外的近似一阶带宽分离,同一套相位预算)。差速底盘的对照见 ROS2-note 第 6 章「驱动开发与运动控制」:diff_drive_controller 的速度闭环在驱动器/电机层,其上层只有外环——与本章仿真结构一一对应。
ros2_control(Humble ros2-controllers 2.54.1)的分层与这套结构一致:forward_command_controller 只把话题指令按 interface_name(effort/velocity/…)直转给硬件接口、自身无闭环;pid_controller 用 control_toolbox 的 PID 闭合状态环后输出 effort——闭环放哪一层是显式选择,不是接口的固有属性。
离散实现的信号链与两处回写:
flowchart LR
set["设定值 r"] --> err["误差 e = r − y"]
err --> pid["P + I(z) + D(z)<br/>ZOH / Tustin 离散化"]
pid --> sat["输出限幅"]
sat --> plant["对象"]
plant --> y["测量 y"]
y -.-> err
sat -.->|"抗饱和回写"| pid
dt["dt:控制周期 = 采样周期"] -.-> pid
5. 离散实现与 dt 卫生¶
连续 PID 进计算机的三件离散化事务:积分用矩形或梯形(Tustin),微分用后向差分并挂滤波,全部按实际周期执行。最小正确骨架:
def pid_step(e, dt, x): # x = [integ, e_prev]
x[0] += e*dt # 积分:按真实 dt 累加
d = (e - x[1])/dt # 微分:后向差分
x[1] = e
return Kp*e + Ki*x[0] + Kd*d
dt 卫生的反例——控制器内部写死名义 dt=0.01、实际以 0.012 跑(对象 \(\frac{2}{s+2}\),同一组 PID):
dt 一致: t=15s 终值=0.99851 进入2%带最后越界 = 7.71s
dt 不一致: t=15s 终值=0.99612 进入2%带最后越界 = 9.40s
终值都被 I 项拉回(静差不是问题),问题在瞬态:积分与微分的有效增益各失真 20%(\(K_i\) 偏大、\(K_d\) 偏小方向不一),响应变钝。更隐蔽的是抖动型失真:周期在 8–12 ms 间浮动时,微分通道按拍间误差差分直接放大抖动。规矩两条:控制周期由硬件定时器驱动并测量记录(周期抖动的系统侧治理见 linux-note 第 7 章「内核、启动与实时调优」);dt 取测量值传入,不是常量。
采样率对微分噪声的放大也归此账:同一测量噪声 \(\sigma\),微分项噪声增益 \(\approx K_d\,\sigma/dt\)——dt 从 10 ms 提到 1 ms,噪声标准差放大 10 倍而信号微分不变;提采样率必须同步重整定 \(K_d\)(或改用带滤波的差分形式),这是「提高采样率总是更好」不成立的一处具体位置。
6. 抖动与观测噪声下的取舍¶
把本章的噪声账合并成一张决策表(对象为机械关节时):
| 症状 | 第一嫌疑 | 处置顺序 |
|---|---|---|
| 指令高频抖动 | 微分通道放大测量噪声 | 先降 \(K_d\)/加重滤波(小 \(N\)),再查编码器量化 |
| 换向点小幅极限环 | 库仑摩擦死区 + 积分累积 | 前馈 > 抗饱和 conditional > 死区补偿 |
| 大行程超调、回零砸 | windup | back-calculation,核执行器量程是否算进模型 |
| 提采样率后反而抖 | 微分增益随 \(1/dt\) 失真 | 重整定 \(K_d\),核对 dt 来源 |
| 周期 8–12 ms 浮动 | 系统调度抖动 | 实时优先级与周期治理(linux-note 第 7 章「内核、启动与实时调优」),算法侧改梯形积分 |
经验排序:机器人单关节上,模型项(重力/摩擦前馈)值 3 倍增益,抗饱和值 2 倍响应质量,\(K_d\) 精调值 20% 余量——调参的最后 10% 永远输给先把 dt 与噪声路径管对。对应靶子「调不好是噪声问题」的落锤结论:本清单里只有一行真凶是噪声,其余四行是模型与 dt 卫生。
7. 要点¶
- ZN 表的目标是高衰减度不是低超调,且不知道微分滤波在加相位——同一组参数 51%→96% 的超调差就是它的手笔;\(L/\tau\) 大或对象含积分/谐振时经典表失效,起点归起点、闭环必须仿真核验。
- 只要输出会截幅就要给积分器泄放路径:conditional 与 back-calculation 把回零下冲从 1.0 压到 0.04 量级。
- 微分的工程形态是三件套:挂测量值(免设定值冲击 150:0.2)、带滤波(增益封顶 \(K_dN\),\(N=8\sim20\) 起步)、双积分对象必开一阶对象可关。
- 前馈把已知需求给在误差之前:同一精度下反馈可以更低;常值扰动下 P+精确前馈稳态误差直接归零。
- 串级的收益按扰动位置计:内环带宽高一数量级时,同一扰动的偏移与 IAE 差约 20×/190×。
dt是 PID 的第四参数:写死名义值让有效增益失真 20%、响应拖 1.7 s;提采样率须同步重整定微分。
参考文献与延伸阅读¶
- Åström, K. J., & Hägglund, T. The Future of PID Control. Control Engineering Practice, 2001. DOI
- Skogestad, S. Simple Analytic Rules for Model Reduction and PID Controller Tuning. Journal of Process Control, 2003. DOI
- Ziegler, J. G., & Nichols, N. B. Optimum Settings for Automatic Controllers. Transactions of the ASME, 1942. DOI