第 12 章
回到淋浴
我们为什么会振荡,离边缘又有多近?
用新眼光看淋浴
朱恩: 我把无人机的 PID 装到了淋浴上(同样利落的手感,按旋钮单位换算过)。结果它一会儿热、一会儿冷、又热……就跟第 0 章里的米卡一样。无人机可从来没这样过!
西奥: 无人机没有大延迟。淋浴有 2.5 秒的管道延迟。我们终于来弄清楚延迟到底会带来什么。
淋浴有两个慢的部分:管道,一个纯粹的 2.5 s 延迟;还有平滑器,也就是花洒头和管壁慢慢变热,时间常数是第 3 章的 s(1 s 后,它已经把与新温度之间的差距缩小了 63 %)。
首先,关于第 0 章的“正常手”要坦白一件事。它转动旋钮的速度与水温偏差的感觉成正比:旋钮速度 ,其中 每秒每摄氏度。速度与误差成正比,意味着旋钮的位置是过去误差的累积。这就是一个 I 控制器,其中 。
米卡: 等等,所以第 0 章里我是个 PID 控制器?嗯,是个 I 控制器。一个过于急切的 I 控制器。
延迟是摆动中的滞后
西奥: 我还是觉得延迟只会让一切变慢。它不应该能让任何东西变得不稳定。
先把管道的纯延迟单独拿出来看。想象一个正弦波从管道入口传到花洒头,中途完全不被平滑:出口的波形相同,只是晚了 2.5 s。相对于一次完整摆动,这算晚了多少?
西奥: 等等。摆动周期是 5 秒时,热水正好在旋钮要冷水的时候到达。这不是变慢。这是反过来。
管道延迟始终是 2.5 s,但它造成的相位滞后取决于波摆得有多快。把滞后记作 ,延迟记作 。如果一次摆动需要 秒(这里的 是时间,不是温度),它的角速度就是每秒 弧度。滞后为正,表示输出落在输入后面。工程师把滞后写成负角度,所以下面的图是往下走的。
一次完整的摆动,就是第 5 章的旋转子转满一整圈:360°,也就是 2π 弧度。所以关键在于延迟占了一次摆动的多大比例:。
对于 5 秒的摆动,2.5 s 正好是半次摆动:180°。在这个纯延迟模型里,输出的每个波峰都正对着输入的波谷。淋浴的平滑器还会把快速摆动缩小;我们接下来就把它加进来。
米卡: 所以同样的 2.5 s,对慢悠悠的摆动只是轻轻推一下,对快速摆动却是整个翻过来。管道从来没变。变的是摆动!
一次一个摆动地测量淋浴
现在在管道延迟之外再加上平滑器。花洒头和管壁需要时间变热,所以整个淋浴既会延迟、也会平滑旋钮的变化。计划是这样的:用一个速度摆动旋钮,等节奏稳定下来,然后测两个数:
- 增益(和控制器的增益是同一个词:输出的大小 ÷ 输入的大小):温度摆动有多大,和我们要求的混合水温的摆动相比。
- 相位: 它落后多少,用角度表示:它占一次完整摆动的比例,乘以 360°。
每次测量都会在两个图上落下一个点。至少测量五种速度,慢的和快的都要。
平滑器会缩小快速摆动,而管道不断增加相位滞后。把增益和相位对摆动速度画出来,这两条曲线就是伯德图(也常写作波特图)。合在一起,它们就是淋浴的频率响应:它如何对待每一种摆动速度。这里的输入是混合水的温度,所以慢摆动的增益是 1。如果改用旋钮位置的比例作为输入,增益会大 45 倍。要从公式得到频率响应,令 :正是找到第 11 章那条边缘的那一招。(这一招之所以管用,是因为淋浴本身是稳定的,所以它的摆动会进入一个我们能测量的稳定节奏。)
平滑器对旋转子做了什么
西奥: 又是第 4 章的招数:猜答案还是同一个旋转子,只是大小和角度不同。
把旋转子 放进平滑器的规则里,箭头 就必须满足 。用第 7 章的箭头来看: 的长度是 ,向上指的角度是 。除以它,就是按这个长度缩小、再往回转这个角度。慢摆动几乎察觉不到。快摆动会被压扁,滞后逐渐接近四分之一圈,但永远不会超过。
朱恩: 找到了!在 0.95 rad/s 附近,淋浴自己就会把摆动上下颠倒。记住这个速度。
离悬崖有多近?
现在把回路闭合:手 → 旋钮 → 管道 → 皮肤 → 手。跟着一次摆动绕完一整圈。对第 0 章的手来说,绕回路一圈就是 (小圆圈代表回路,因为 已经用来表示延迟了):
摆动的那堆面积
米卡: 我的手会把误差堆起来。一堆面积会对摆动做什么?
余弦下方的面积是正弦,落后四分之一次摆动:90° 的滞后,每一种速度都是。而且慢摆动堆出来的面积更大,因为每个鼓包要持续更久才被抵消:大小按 变化。第 5 章说过,速度是位置的 倍。堆积正好反过来:除以 。这就是回路里的 。
反馈做的是减法(误差 = 目标 − 温度)。那是一个 ×(−1),也就是第 5 章的半圈,所以波被翻转一次。如果绕回路一圈还正好让它延迟 180°,两次翻转就抵消了,每一次修正都与摆动完全合拍,就像在恰好的时刻推一把秋千。如果回路把波以原来的大小送回来(增益为 1),摆动就会自己维持下去;大于 1,它就会越来越大。这又是第 10 章的 ,只不过是在直线 上:翻转过来、大小不变地回来的一圈,就是 。
朱恩: 对于这个简单的淋浴回路,相位在一个关键的摆动速度处下降到 −180°。在相位图上找到那个速度,然后在增益图上读取同一速度下的回路增益。它是低于还是高于 1?
滑动直到总和超过 180°,在 0.45 和 0.46 rad/s 之间。正好穿过的地方约为 0.457 rad/s,摆动回来时是原来的 0.72 倍,所以手还能再强大约 1 ÷ 0.72 ≈ 1.4 倍,才会到达边缘。
新词
- 增益裕度
- 在 −180° 对应的频率处,回路增益达到 1 之前,你可以把控制器的增益放大多少倍。低于 1 = 已经掉下悬崖。
- 相位裕度
- 在回路增益正好为 1 的速度处,还要额外多少滞后才会到 −180°。越多越安全;常见目标是 45°–60°(下面的绕个小弯会解释原因)。
相位裕度是乔装的阻尼
朱恩: 为什么是 45° 到 60°?谁定的?
对于第 7 章那种简单回路,相位裕度和阻尼比是一起变的。大约 43° 对应 ζ = 0.4(25 % 超调),52° 对应 ζ = 0.5(16 %),59° 对应 ζ = 0.6(不到 10 %)。这些配对对第 7 章最简单的回路 是精确的。所以 45°–60° 的裕度意味着 ζ ≈ 0.4–0.6:比第 7 章的 0.7–1 更爱弹跳。尽管如此,它仍是常见的目标,因为裕度也是离悬崖的安全距离(模型可以错到什么程度),而不只是对超调的承诺。回路里有管道时,它是很好的参考,但不是精确的定律。
对我们的淋浴来说, 的相位在 rad/s 处到达 −180°,对应的摆动周期约为 13.8 s。正常手()的增益裕度只有大约 1.4,相位裕度约 22°(在它的回路增益为 1 的 0.34 rad/s 处,相位是 −158°)。离边缘很近!更用力的手把增益翻倍:1.4 ÷ 2 = 0.7,掉下悬崖。这正是它一直稳定不下来的原因。
先预测一下! 假设管道长度翻倍(5 s 延迟)。仍然稳定的最大手部增益会怎样变化?
米卡: 管道翻倍,手差不多得减半。而且边缘处的摆动也变慢了:将近 24 秒!
西奥: 好吧,我收回。延迟不只是让事情变慢:它会吃掉相位裕度,而相位裕度是你和振荡之间唯一的屏障。
终于看懂第 0 章的淋浴
这是你在第 0 章的亲身经历。如果你的摆动接近边缘,它们的周期应该接近回路预测的值。有个转折:人并不都是同一种控制器。
速度手(只要感觉不对就一直转旋钮)是一个 I 控制器:它的边缘在 13.8 s 一次的摆动。位置手(“太烫了,把旋钮放到这儿”)像一个 P 控制器:。位置手没有那堆面积,所以没有自己的 90°:只能靠管道和平滑器凑够 180°,这发生在更快的摆动上, rad/s(朱恩的上下颠倒速度)。也就是 6.6 s 一次的摆动,对任何大于约 0.031 旋钮/°C 的 都是如此。大多数人是两者的混合。(正常的机器手摆得比 13.8 s 稍慢一些,约 15.5 s,因为它正好处在边缘内侧;更用力的手的摆动约 11.6 s,是被旋钮撞到两端给压扁了。)
米卡: 所以我把旋钮猛地拧到某个位置时,我就是一只位置手。我那六秒一次的摆动,来自管道和平滑器,而不是手笨。
设计一个机器人淋浴器
现在来打败我们自己的手。机器人用 PI:P 对当前的温度误差作出反应,I 记住累积的误差。两者合起来,旋钮能及时反应,同时由 I 找到合适的长期位置。
朱恩: 简单。我要用大增益,就像在无人机上那样:又快又利落。已经调好了。看我的!
朱恩: ……它开始等幅振荡(幅度不增不减,自己停不下来),热—冷—热,每 6 秒一次,就像第 0 章里的位置手。大增益把增益为 1 的摆动速度推过了 −180° 摆动速度。一点相位裕度都没有了。
纸上 10 s,淋浴里 6 s
朱恩的增益满足 (每秒),正好等于 。PI 的零点落在平滑器的极点上,把它抵消了(零极点对消),剩下 。在纸上,这个回路在 处到达 −180°,对应 10 s 一次的摆动。但朱恩的回路远远越过了边缘,所以旋钮从一端猛撞到另一端,这些猛撞的摆动大约每 6.3 s 一次:接近位置手的 6.6 s。
西奥: 无人机能用大增益,是因为它几乎没有滞后。在这里,鲁棒意味着温和:给延迟留出裕度。试试我的温和增益,大约 、。
P 对现在作出反应,I 对那堆面积作出反应。加一点现在,旋钮就会早一点动,这能把相位还回来:这叫相位超前,用西奥的增益,在原来的 −180° 摆动速度处约有 37°。
一个裕度良好的 PI 大约 9.4 秒就能稳定下来,不会反复大幅摆动。这比普通人的手(它花了将近一分钟来回摆动才平静下来)以及大多数人都要强。不过它赢不了物理规律:还没到达的水,任何东西都无法对它作出反应。工程师确实有一个应对长延迟的技巧,叫做史密斯预测器,它在控制器内部运行管道的一个小型仿真。那就是另一个笔记本里的故事了。
鲁棒性才是真正的一课。你对淋浴的模型永远不完美:管道可能更长,热水器可能更弱。裕度告诉你模型可以错多少,而且是一个你能感受到的数字。相位裕度(以弧度计)除以增益为 1 的摆动速度,就是延迟裕度:回路还能承受多少秒额外的管道。
西奥: 正常手只能承受大约 1.1 s 的额外管道。我的温和机器人能承受 3.5 s。这就是鲁棒的意思。
管道短一点,还是热水器快一点?
米卡: 我们直接买个更快的热水器不行吗?
把平滑时间减半(τ = 0.5 s),速度手的边缘只从 1.12 提高到 1.21 %/(°C·s)。把管道减半(1.25 s),边缘能提高到 2.06。对位置手来说,更快的热水器甚至更糟:它的边缘从 0.031 降到 0.025 旋钮/°C,因为平滑器原本一直在悄悄缩小快速摆动。敌人是延迟,而不是迟钝。
机器人到底是怎么转旋钮的
机器人代码把 PI 写成旋钮速度:只要误差存在,I 就持续转动旋钮,而 P 对误差的变化做出反应。启动时,P 还会根据当前误差给旋钮一个立即的移动。这与位置规则一致,除非旋钮到达端点限位。
我们现在理解了什么
我们搞清楚了什么
- 延迟 会让一个摆动滞后 :对慢摆动没什么影响,对快摆动影响很大。
- 一堆面积(I)让每个摆动滞后 90°;平滑器最多滞后 90°;管道滞后 ,没有上限。
- 输入正弦波并测量增益和相位,就得到频率响应;把它画出来,就是伯德图,而它其实就是 。
- 对于这个简单的淋浴回路,当回路达到 −180° 相位且增益为 1 时,等幅振荡就开始了;增益越大,摆动幅度就越大,直到限制因素介入。
- 增益裕度和相位裕度衡量的是距离那个悬崖还有多远。延迟越长,裕度越小,所以你需要更温和的控制。
- 我们在第 0 章中的摆动,就是一个裕度太小的控制器(也就是我们)。
现在工具齐了:反馈、PID、极点、裕度。是时候来真格的了:风、包裹掉落,还有带噪声的传感器。你能让无人机保持在 2 米吗?