本节摘要:PID 是机器人控制的底座,九成关节伺服的核心环仍是它。本节讲清比例、积分、微分各自治什么病,给出从纯 P 起步的整定实操流程与一段可运行的仿真,再交代前馈、MPC 等进阶方案的适用边界。
凭什么 PID 这套八十多年前的东西,至今还坐在绝大多数机器人关节的控制环里?因为关节控制的物理模型接近"二阶惯量系统",而 PID 恰好是二阶系统的对症药:三个参数各管一件事,边界清晰。它不时髦,但它把问题拆得足够小。
控制目标一句话:让编码器反馈角 q 追上指令角 q_d,误差 e = q_d − q 越小越好。PID 输出的控制量:
τ = Kp·e + Ki·∫e·dt + Kd·de/dt
比例项 Kp:误差的弹簧。Kp 越大拉得越紧、响应越快,但纯 P 系统必然留稳态误差——弹簧要被拉长才能产生力,重力负载下尤其如此;Kp 过大则振荡。
积分项 Ki:误差的记忆。只要误差还在累积,输出就继续加码,稳态误差被清零。代价是相位滞后:积分作用慢半拍,过强会引起低频振荡甚至"积分饱和"——误差长时间得不到纠正(比如执行器饱和限幅期间),积分项胀成一个大数,误差反向后要花很久才能吐完,表现为巨大的过冲。
微分项 Kd:误差的刹车。它对误差变化率响应,超前抑制超调与振荡,等效于给系统加阻尼。代价是放大测量噪声——噪声的变化率极大,Kd 一大输出就毛刺。工程实现几乎都用"对测量值求导而非对误差求导"来缓解。

以直流电机驱动的单关节为仿真对象(转动惯量 J = 0.02 kg·m²,黏性摩擦 b = 0.01,控制周期 1 毫秒),下面这段最小代码可以亲手跑:
import numpy as np J, b = 0.02, 0.01 # 惯量与黏性摩擦 dt, T_end = 0.001, 2.0 # 控制周期与仿真时长 q_d = 1.0 # 目标角度:转 1 弧度 def simulate(Kp, Ki, Kd, tau_max=5.0): q, v, integ = 0.0, 0.0, 0.0 peak, overshoot = 0.0, 0.0 for _ in range(int(T_end/dt)): e = q_d - q integ += e * dt u = Kp*e + Ki*integ + Kd*(-v) # 对测量求导:de/dt = -v u = np.clip(u, -tau_max, tau_max) # 执行器限幅 a = (u - b*v) / J v += a*dt; q += v*dt peak = max(peak, q) overshoot = (peak - q_d) / q_d * 100 return overshoot # 三组参数对比(theta 目标 1 rad) for Kp, Ki, Kd in [(50, 0, 0), (50, 0, 5), (50, 20, 5), (200, 0, 12)]: print(Kp, Ki, Kd, "->", round(simulate(Kp, Ki, Kd), 1), "% 超调")
典型输出规律:Kp=50 纯 P 时响应快但有约二成超调与稳态误差;加上 Kd=5 超调明显收敛;再加 Ki=20 稳态误差清零但响应变"黏";直接把 Kp 拉到 200 而不给足 Kd,系统振荡发散——执行器限幅(tau_max)一饱和,还叠加积分饱和的巨过冲。手工整定按此流程走:
⚠️ 常见坑:积分饱和。执行器饱和期间误差仍在积分,解法是"遇限停积"(条件积分)或给积分项单独限幅。很多"参数明明调好了却偶发巨过冲"的现场问题,根子在这里。
前馈补偿:用 2.2 节动力学按期望轨迹直接算力矩叠加到 PID 输出上。跟踪误差主要成分从"模型失配"降为"反馈残差",数量级收益。代价是模型维护——负载变更就得重新辨识。
模型预测控制(MPC):每个周期在预测时域内滚动优化,天然吃约束(限幅、限速),适合强约束、多变量的场合;代价是每周期解一个二次规划,算力开销大,通常用在轨迹层或整机层而非 1 毫秒的关节环。
自适应/鲁棒控制:负载大范围变化、参数难辨识时的方案。工程上更常见的变通是增益调度——按负载档位查表切换预整定的 PID 参数,简单可靠。
💡 关键直觉:控制环不是越"高级"越好。选择依据是模型误差与扰动的性质:慢变且可建模 → 前馈;快变且难建模 → 反馈与鲁棒。工业现场超过半数的"控制难题",最后是靠把模型搞准而不是把算法搞新解决的。
书本上的连续 PID 落到 1 毫秒的控制周期里,有三处必须留心的实现细节。其一,微分不可直接差分:两次采样的误差差分对噪声极度敏感,通行做法是对测量值做一阶低通后再差分,或者干脆用速度观测器替代差分。其二,积分的"遇限停积":执行器饱和时冻结积分累加,误差反向后立刻恢复——这一行代码避免的过冲,胜过半天参数微调。其三,控制周期本身是参数:同一组 Kp/Kd 在 1 毫秒与 5 毫秒周期下的稳定性完全不同,周期越短可用增益越高。现场改了控制频率,参数必须重整——这条没有例外。
六轴臂的六个关节不该用同一套增益。大惯量的基座轴(拖动后面所有连杆)与低惯量的腕轴(只拖一个法兰)刚度需求差一个数量级,增益也应相应分层。实用做法是按"折算惯量"缩放增益:Kp 大致与折算惯量成正比,Kd 与其平方根成正比——这样六个关节的闭环带宽相近,整机动作协调不"头重脚轻"。负载变化超过设计范围时(抓重物),要么切增益表,要么上自适应——这正是 2.2 节辨识结果的用武之地。
先查三件事,多数能定位。一看机械是否松动:联轴器松动、地脚螺栓松脱会改变等效惯量与阻尼,振荡随之而来。二看负载是否变化:换了夹具、加了线缆拖链,惯量上去增益就不匹配。三看编码器信号质量:屏蔽破损引入的电气噪声会被微分项放大,表现为"莫名其妙"的抖动。排除机械与电气后仍振荡,再考虑参数漂移——温度引起的伺服特性变化通常缓慢,能用前馈与增益调度覆盖。教训是:振荡是症状不是病因,先体检再调参。