第 12 章

回到淋浴

我们为什么会振荡,离边缘又有多近?

第 12 章:回到淋浴 ↗

用新眼光看淋浴

朱恩: 我把无人机的 PID 装到了淋浴上(同样利落的手感,按旋钮单位换算过)。结果它一会儿热、一会儿冷、又热……就跟第 0 章里的米卡一样。无人机可从来没这样过!

西奥: 无人机没有大延迟。淋浴有 2.5 秒的管道延迟。我们终于来弄清楚延迟到底会带来什么。

淋浴有两个慢的部分:管道,一个纯粹的 2.5 s 延迟;还有平滑器,也就是花洒头和管壁慢慢变热,时间常数是第 3 章的 τ=1\tau = 1 s(1 s 后,它已经把与新温度之间的差距缩小了 63 %)。

首先,关于第 0 章的“正常手”要坦白一件事。它转动旋钮的速度与水温偏差的感觉成正比:旋钮速度 =k⋅e= k\cdot\err{e},其中 k=0.8 %k = 0.8\,\% 每秒每摄氏度。速度与误差成正比,意味着旋钮的位置是过去误差的累积。这就是一个 I 控制器,其中 Ki=kK_i = k。

米卡: 等等,所以第 0 章里我是个 PID 控制器?嗯,是个 I 控制器。一个过于急切的 I 控制器。

延迟是摆动中的滞后

西奥: 我还是觉得延迟只会让一切变慢。它不应该能让任何东西变得不稳定。

先把管道的纯延迟单独拿出来看。想象一个正弦波从管道入口传到花洒头,中途完全不被平滑:出口的波形相同,只是晚了 2.5 s。相对于一次完整摆动,这算晚了多少?

第 12 章:回到淋浴 ↗

西奥: 等等。摆动周期是 5 秒时,热水正好在旋钮要冷水的时候到达。这不是变慢。这是反过来。

管道延迟始终是 2.5 s,但它造成的相位滞后取决于波摆得有多快。把滞后记作 ϕ\phi,延迟记作 LL。如果一次摆动需要 TT 秒(这里的 TT 是时间,不是温度),它的角速度就是每秒 ω=2π/T\omega=2\pi/T 弧度。滞后为正,表示输出落在输入后面。工程师把滞后写成负角度,所以下面的图是往下走的。

一次完整的摆动,就是第 5 章的旋转子转满一整圈:360°,也就是 2π 弧度。所以关键在于延迟占了一次摆动的多大比例:L/TL/T。

ϕ=LT⏟占一次摆动的比例⋅360∘=ωL 弧度,ω=2πT\phi = \underbrace{\frac{L}{T}}_{\text{占一次摆动的比例}}\cdot 360^\circ = \omega L \text{ 弧度},\qquad \omega = \frac{2\pi}{T}

第 12 章:回到淋浴 ↗

对于 5 秒的摆动,2.5 s 正好是半次摆动:180°。在这个纯延迟模型里,输出的每个波峰都正对着输入的波谷。淋浴的平滑器还会把快速摆动缩小;我们接下来就把它加进来。

米卡: 所以同样的 2.5 s,对慢悠悠的摆动只是轻轻推一下,对快速摆动却是整个翻过来。管道从来没变。变的是摆动!

一次一个摆动地测量淋浴

现在在管道延迟之外再加上平滑器。花洒头和管壁需要时间变热,所以整个淋浴既会延迟、也会平滑旋钮的变化。计划是这样的:用一个速度摆动旋钮,等节奏稳定下来,然后测两个数:

  • 增益(和控制器的增益是同一个词:输出的大小 ÷ 输入的大小):温度摆动有多大,和我们要求的混合水温的摆动相比。
  • 相位: 它落后多少,用角度表示:它占一次完整摆动的比例,乘以 360°。

每次测量都会在两个图上落下一个点。至少测量五种速度,慢的和快的都要。

第 12 章:回到淋浴 ↗

平滑器会缩小快速摆动,而管道不断增加相位滞后。把增益和相位对摆动速度画出来,这两条曲线就是伯德图(也常写作波特图)。合在一起,它们就是淋浴的频率响应:它如何对待每一种摆动速度。这里的输入是混合水的温度,所以慢摆动的增益是 1。如果改用旋钮位置的比例作为输入,增益会大 45 倍。要从公式得到频率响应,令 s=iωs = i\omega:正是找到第 11 章那条边缘的那一招。(这一招之所以管用,是因为淋浴本身是稳定的,所以它的摆动会进入一个我们能测量的稳定节奏。)

G(iω)=e−iωL1+iωτ,∣G∣=11+ω2τ2,∠G=−arctan⁡(ωτ)−ωLG(i\omega) = \frac{e^{-i\omega L}}{1 + i\omega\tau}, \qquad |G| = \frac{1}{\sqrt{1+\omega^2\tau^2}}, \qquad \angle G = -\arctan(\omega\tau) - \omega L

第 12 章:回到淋浴 ↗

朱恩: 找到了!在 0.95 rad/s 附近,淋浴自己就会把摆动上下颠倒。记住这个速度。

离悬崖有多近?

现在把回路闭合:手 → 旋钮 → 管道 → 皮肤 → 手。跟着一次摆动绕完一整圈。对第 0 章的手来说,绕回路一圈就是 G∘G_{\circ}(小圆圈代表回路,因为 LL 已经用来表示延迟了):

G∘(s)=ks⏟手⋅45 e−2.5ss+1⏟淋浴G_{\circ}(s) = \underbrace{\frac{k}{s}}_{\text{手}}\cdot\underbrace{\frac{45\,e^{-2.5s}}{s+1}}_{\text{淋浴}}

反馈做的是减法(误差 = 目标 − 温度)。那是一个 ×(−1),也就是第 5 章的半圈,所以波被翻转一次。如果绕回路一圈还正好让它延迟 180°,两次翻转就抵消了,每一次修正都与摆动完全合拍,就像在恰好的时刻推一把秋千。如果回路把波以原来的大小送回来(增益为 1),摆动就会自己维持下去;大于 1,它就会越来越大。这又是第 10 章的 1+C P=01 + C\,P = 0,只不过是在直线 s=iωs = i\omega 上:翻转过来、大小不变地回来的一圈,就是 G∘(iω)=−1G_{\circ}(i\omega) = -1。

朱恩: 对于这个简单的淋浴回路,相位在一个关键的摆动速度处下降到 −180°。在相位图上找到那个速度,然后在增益图上读取同一速度下的回路增益。它是低于还是高于 1?

第 12 章:回到淋浴 ↗

滑动直到总和超过 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°(下面的绕个小弯会解释原因)。

对我们的淋浴来说,G∘G_{\circ} 的相位在 ω≈0.457\omega \approx 0.457 rad/s 处到达 −180°,对应的摆动周期约为 13.8 s。正常手(k=0.008k = 0.008)的增益裕度只有大约 1.4,相位裕度约 22°(在它的回路增益为 1 的 0.34 rad/s 处,相位是 −158°)。离边缘很近!更用力的手把增益翻倍:1.4 ÷ 2 = 0.7,掉下悬崖。这正是它一直稳定不下来的原因。

先预测一下! 假设管道长度翻倍(5 s 延迟)。仍然稳定的最大手部增益会怎样变化?

第 12 章:回到淋浴 ↗

第 12 章:回到淋浴 ↗

米卡: 管道翻倍,手差不多得减半。而且边缘处的摆动也变慢了:将近 24 秒!

西奥: 好吧,我收回。延迟不只是让事情变慢:它会吃掉相位裕度,而相位裕度是你和振荡之间唯一的屏障。

终于看懂第 0 章的淋浴

这是你在第 0 章的亲身经历。如果你的摆动接近边缘,它们的周期应该接近回路预测的值。有个转折:人并不都是同一种控制器。

第 12 章:回到淋浴 ↗

速度手(只要感觉不对就一直转旋钮)是一个 I 控制器:它的边缘在 13.8 s 一次的摆动。位置手(“太烫了,把旋钮放到这儿”)像一个 P 控制器:G∘(s)=45K e−2.5s/(s+1)G_{\circ}(s) = 45K\,e^{-2.5s}/(s+1)。位置手没有那堆面积,所以没有自己的 90°:只能靠管道和平滑器凑够 180°,这发生在更快的摆动上,ω≈0.95\omega \approx 0.95 rad/s(朱恩的上下颠倒速度)。也就是 6.6 s 一次的摆动,对任何大于约 0.031 旋钮/°C 的 KK 都是如此。大多数人是两者的混合。(正常的机器手摆得比 13.8 s 稍慢一些,约 15.5 s,因为它正好处在边缘内侧;更用力的手的摆动约 11.6 s,是被旋钮撞到两端给压扁了。)

第 12 章:回到淋浴 ↗

米卡: 所以我把旋钮猛地拧到某个位置时,我就是一只位置手。我那六秒一次的摆动,来自管道和平滑器,而不是手笨。

设计一个机器人淋浴器

现在来打败我们自己的手。机器人用 PI:P 对当前的温度误差作出反应,I 记住累积的误差。两者合起来,旋钮能及时反应,同时由 I 找到合适的长期位置。

朱恩: 简单。我要用大增益,就像在无人机上那样:又快又利落。已经调好了。看我的!

第 12 章:回到淋浴 ↗

朱恩: ……它开始等幅振荡(幅度不增不减,自己停不下来),热—冷—热,每 6 秒一次,就像第 0 章里的位置手。大增益把增益为 1 的摆动速度推过了 −180° 摆动速度。一点相位裕度都没有了。

西奥: 无人机能用大增益,是因为它几乎没有滞后。在这里,鲁棒意味着温和:给延迟留出裕度。试试我的温和增益,大约 Kp≈1K_p \approx 1、Ki≈0.6K_i \approx 0.6。

P 对现在作出反应,I 对那堆面积作出反应。加一点现在,旋钮就会早一点动,这能把相位还回来:这叫相位超前,用西奥的增益,在原来的 −180° 摆动速度处约有 37°。

一个裕度良好的 PI 大约 9.4 秒就能稳定下来,不会反复大幅摆动。这比普通人的手(它花了将近一分钟来回摆动才平静下来)以及大多数人都要强。不过它赢不了物理规律:还没到达的水,任何东西都无法对它作出反应。工程师确实有一个应对长延迟的技巧,叫做史密斯预测器,它在控制器内部运行管道的一个小型仿真。那就是另一个笔记本里的故事了。

鲁棒性才是真正的一课。你对淋浴的模型永远不完美:管道可能更长,热水器可能更弱。裕度告诉你模型可以错多少,而且是一个你能感受到的数字。相位裕度(以弧度计)除以增益为 1 的摆动速度,就是延迟裕度:回路还能承受多少秒额外的管道。

第 12 章:回到淋浴 ↗

西奥: 正常手只能承受大约 1.1 s 的额外管道。我的温和机器人能承受 3.5 s。这就是鲁棒的意思。

我们现在理解了什么

我们搞清楚了什么

  • 延迟 LL 会让一个摆动滞后 ωL\omega L:对慢摆动没什么影响,对快摆动影响很大。
  • 一堆面积(I)让每个摆动滞后 90°;平滑器最多滞后 90°;管道滞后 ωL\omega L,没有上限。
  • 输入正弦波并测量增益和相位,就得到频率响应;把它画出来,就是伯德图,而它其实就是 G(iω)G(i\omega)。
  • 对于这个简单的淋浴回路,当回路达到 −180° 相位且增益为 1 时,等幅振荡就开始了;增益越大,摆动幅度就越大,直到限制因素介入。
  • 增益裕度和相位裕度衡量的是距离那个悬崖还有多远。延迟越长,裕度越小,所以你需要更温和的控制。
  • 我们在第 0 章中的摆动,就是一个裕度太小的控制器(也就是我们)。

现在工具齐了:反馈、PID、极点、裕度。是时候来真格的了:风、包裹掉落,还有带噪声的传感器。你能让无人机保持在 2 米吗?

第 12 章:回到淋浴 ↗