JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

饱和、积分饱和与 PID 之后的进阶

会让教科书控制器失灵的现实陷阱,以及处理它们的下一阶方法。

电机的力气是有上限的

在纸面上,控制器想发出多大的指令都行。PID 控制器根据机器人当前位置与目标位置之间的误差算出一个数值,再把它交给电机。但真实的电机是有上限的:供电电压是固定的,电流超过某个值就会过热,输出力矩也存在一个根本无法突破的峰值。当控制器要求的力超过硬件能给的,指令就会被「削顶」。这种削顶就叫执行器饱和

想象你踩油门,而油门已经踩到底了。你再怎么用力,车也不会加速更快——踏板已经饱和。控制器的处境一模一样:超过极限后,再要求更多也得不到任何回报。饱和不是故障,每个真实系统都有它。危险在于:控制器内部的运算并不知道电机已经「听不进去了」,它会继续按照「指令完整执行了」的假设去计算。

积分饱和:积分项越堆越高

PID 里的积分项,存在的意义就是消灭那个顽固的残余偏差。当比例项和微分项都稳定下来后,往往还会留下一个小小的恒定误差——重力把手臂往下拉、摩擦力把它拖住。这个挥之不去的偏移就叫稳态误差,而积分项靠「把误差随时间累加起来」来消除它:只要还有缺口,积分就会不断增长,直到累积出足够的力把缺口彻底补平。

现在把它和饱和叠加起来。假设机器人离目标很远,电机已经顶到最大输出。误差始终很大,因为机器人在物理上根本动不了更快——而积分项还在尽职尽责地一秒一秒累加这个巨大的误差,膨胀到一个惊人的数值。这种在饱和期间失控般的累积,就叫积分饱和(integrator wind-up)。

破坏会在终点处显现。当机器人终于到达目标,误差翻转为零——但臃肿的积分项不会瞬间消失。它必须靠一段方向相反、长度相当的反向误差来「放掉」。于是机器人会径直冲过目标,严重过冲,然后不得不往回摆,有时还要来回振荡好几下才停下。一个在温和仿真里看起来很正常的控制器,可能在真实执行器一饱和的那一刻就变得狂野、失稳。

让 PID 守规矩的实用防护

好消息是:积分饱和有一套久经考验的对策,而且加起来都很省事。抗积分饱和的核心思路只有一句话——别再骗积分项了。要让它知道电机实际输出了多少,这样在饱和期间,它就不会再去累加那些它根本无能为力的误差。

  1. 钳制积分。只要指令处于饱和状态,就停止往累积误差里继续添加,并给积分项设一个合理的上限。这是最简单的抗积分饱和手段,往往单靠它就够用。
  2. 反算补偿。把「请求的指令」与「被削顶后的指令」之差反馈回积分器,在电机顶满时温和地把它「放水」排掉。这样积分项是平滑退掉的,而不是一下子全卸。
  3. 限制目标值及其变化率。别下达执行器根本跟不上的跳变指令。让目标平滑地爬升,控制器从一开始就不会去要求不可能的事,也就根本不会陷入饱和。
  4. 对微分项做滤波。微分项响应的是误差的变化率,这让它对传感器噪声极其敏感。原始噪声会被放大成抖动的指令。给微分项加一个轻度低通滤波,或把微分增益调小一点,就能让它继续发挥作用,而不至于对每一个带噪的读数都大喊大叫。

要注意,这几项防护多半会和你的增益整定相互牵连。一个为追求速度而调得激进的控制器,会更频繁地饱和、积分饱和也更严重,所以抗积分饱和和整定最好放在一起考虑,而不是当成两件互不相干、事后再补的事。目标是:即便硬件被逼到极限,整个回路依然可预测,并保持稳定性

下一步去哪:PID 之后

PID 之所以是机器人领域的主力,是有道理的:它简单、稳健,几乎不需要机器人的模型。但它把每个关节孤立地对待,对自己正在对抗的物理一无所知——重力、惯性、关节之间的耦合。对于又快、又重、或需要紧密协调的运动,这些盲点就开始让你付出代价,而上面那些补丁能做的也就到此为止。

下一阶就是「进阶控制」这一章,那里的控制器会用机器人的动力学模型来规划自己的指令。计算力矩控制会预先抵消掉重力和惯性,剩下的活儿就轻松得能交给一个简单的反馈回路。模型预测控制(MPC)会往未来看好几步,而且关键在于——它能把执行器的极限当作如实的约束直接纳入,于是从一开始就不会发出会导致饱和的指令。而线性二次型调节器(LQR)以及更广义的最优控制,则通过最小化一个你自己定义的代价函数来整定整个回路,在精度与代价之间求得平衡。