传感器也在骗你
前十六章有一个从没被质疑的假设:控制器读到的那个数是真的。这一章把它拆开。传感器可以用三种方式骗你——抖、粗、晚——而它们的后果完全不在一个量级上,也完全不该用同样的办法对付。
同一个环,同一组 PID 参数,过冲 15.4%。现在分别给它三种传感器缺陷:
甲:读数上有 ±0.02 的随机噪声(信号本身是 1.0 量级,所以是 2% 的噪声)。
乙:读数只有 0.1 的分辨率(也就是说,0.94 和 0.96 都会被读成 0.9)。
丙:读数晚 3 秒才到(对象的惯性是 5 秒 + 5 秒)。
三种骗法,一张表
| 传感器 | 过冲 | 稳态时的抖动 | 执行器抖动 | 相对干净时 | IAE |
|---|---|---|---|---|---|
| 干净 | 15.4% | 0.00000 | 0.00031 | 1× | 5.84 |
| 有噪声(±0.02) | 15.3% | 0.00275 | 0.94523 | 3024× | 7.27 |
| 读数很粗(0.1 一档) | 15.4% | 0.00000 | 0.12521 | 401× | 5.68 |
| 读数晚 3 秒 | 70.3% | 0.00111 | 0.00099 | 3× | 13.09 |
这张表的形状非常干净,值得逐列读:
「过冲」那一列:噪声 15.3%、量化 15.4%,和干净时(15.4%)几乎一模一样。而延迟是 70.3%,翻了四倍多。
「执行器抖动」那一列:噪声 3024 倍,量化 401 倍,而延迟只有 3 倍。
两列的排序完全相反。
噪声和量化花的是执行器的钱,延迟花的是稳定性的钱。
为什么?因为稳定性只由一件事决定:绕环一圈的相位滞后(第 10 章)。
- 噪声不改变任何信号的相位——它是加在信号上面的东西,不是对信号做的变换。所以它一度相位都不加,稳定性纹丝不动。它只是把垃圾送进控制器,控制器忠实地把垃圾翻译成动作。
- 量化同理:它是一个瞬时的非线性,不引入滞后。(它会引入一个死区,让小误差被忽略——但那不动摇稳定性。)
- 延迟是唯一一个加相位的。而相位就是那堵墙。
所以对付它们的手段也完全不同:噪声用滤波(花一点相位去换),延迟只能去缩短(没有别的办法)。
而这里有个陷阱,是本章最实用的一句话:滤波不是免费的。一个低通滤波器就是一级惯性,它会往环里加相位滞后。所以「传感器噪声大 → 加个滤波」这个看似无害的动作,实际上是拿稳定裕度去换执行器寿命。第 14 章那个「还能再晚 2.71 秒」的预算,滤波器要从里面扣。
更糟的是这件事经常发生在两拨人之间:写控制逻辑的人调好了参数,运维的人觉得指标太毛刺、给它加了个五点滑动平均。两边都没做错事,环炸了。
采样:一种伪装成别的东西的延迟
现实中的传感器几乎都是离散采样的:每秒读一次、每分钟聚合一次、每天出一张报表。而采样和上面三种病都不太一样,它有自己的两个后果。
后果一:采样本身就是延迟
你在第 3.7 秒读了一个值,然后要用到第 4 秒下一次读数为止。在这段时间里,你手上的信息平均过期了半个采样周期。
采样周期 Ts 造成的等效延迟 ≈ Ts / 2 # 所以: # 1 秒采样一次 → 相当于往环里塞了 0.5 秒的纯延迟 # 1 分钟聚合一次 → 相当于 30 秒的纯延迟 # 每天一张报表 → 相当于 12 小时的纯延迟 ★ 这笔账要直接记到第 14 章那个「还能再晚多少秒」的预算里。
这解释了一个常见的困惑:「我把监控从 1 秒粒度改成 10 秒粒度,只是为了省点存储,为什么自动扩容开始震荡了?」——因为你往那个环里加了 5 秒的纯延迟,而它的延迟预算可能本来就只剩几秒。
后果二:混叠
如果被测的东西变化得比采样还快,你看到的会是一个完全虚构的慢速信号:
真实频率 采样频率 你会「看见」
──────────────────────────────────────
9 Hz 10 Hz 1 Hz
11 Hz 10 Hz 1 Hz
49 Hz 50 Hz 1 Hz
60 Hz 50 Hz 10 Hz
100.5 Hz 100 Hz 0.5 Hz
★ 采样定理:采样频率必须高于信号最高频率的两倍,
否则高频信号会「折叠」成一个不存在的低频信号。
# 最恶劣的地方在于:那个假信号看起来完全正常。
# 它平滑、连续、有规律 —— 而它对应的真实现象根本不存在。
那个 100.5 Hz 被 100 Hz 采成 0.5 Hz 的例子特别值得记住:真实信号每秒振荡一百次,你的图上会画出一条两秒一个周期的优美正弦波。你会去给这条曲线找解释,而它是采样制造出来的幻觉。
这也是为什么正经的采集链路里,模数转换之前必须有一个模拟低通滤波器(叫抗混叠滤波器)——一旦混叠发生,事后没有任何算法能挽救,因为信息已经真的丢了。
日常语境里「传感器精度高」是个笼统的褒义词。而这一章说明它至少是四个互不相干的维度:
- 噪声(precision / 重复性):同一个真值,读多次会散多开。
- 分辨率(resolution):最小能分辨的差别(那个 0.1 一档)。
- 准确度(accuracy):读数有没有系统性的偏差。本章没细讲它,因为对闭环来说,一个恒定的偏差只会让系统稳定在一个偏掉的值上——它是精度问题,不是稳定性问题。
- 带宽 / 延迟:它多久之后才反映真值的变化。
选传感器时,工程师最容易只盯着前两项(因为规格书上写得最大),而对闭环来说最要命的是第四项。一个又准又稳但慢半拍的传感器,可能比一个粗糙但快的传感器糟糕得多。
热电偶 vs 热电阻。热电阻(PT100)更准更稳,热电偶响应更快。教科书会告诉你按温度范围和精度选,而控制工程师的第一问常常是「哪个快」——因为在一个闭环里,那 3 秒的热惯性会直接吃掉你的相位预算。不装保护套管的裸热电偶响应快得多,代价是寿命短——这笔交易的本质就是本章这张表。
你的 P99 延迟指标。它通常是「一分钟窗口的 P99」,也就是说它至少晚 30 秒(半个窗口)。如果你的熔断器、限流器、扩容器读的是这个指标,那它们全都在一个至少 30 秒延迟的环里。而它们的动作往往是按秒级设计的。
季度财报。一个上市公司调整策略的反馈环,传感器周期是三个月,加上编制和发布的时间,延迟接近半年。按第 11 章那条律,这个环能用的「力度」极小——而市场却期待管理层对每个季度的数字做出反应。结构上,这个环被要求以远超它延迟预算的力度运行。结果就是我们熟悉的那种战略反复。
用第 11 章那条律算一笔账:假设你的环延迟预算是 2.71 秒(第 14 章那个例子),你加了一个时间常数 1 秒的低通滤波。这个滤波在穿越频率处贡献的相位滞后大约是 arctan(ωT)——如果 ω ≈ 0.39 rad/s,那就是约 21°。你一口气花掉了 60° 相位裕度里的三分之一,就为了让曲线好看一点。
更好的做法,按优先级排:
- 从源头降噪。屏蔽、接地、换传感器位置、去掉那个干扰源。这是唯一不花相位的办法。
- 只滤微分项,别滤整条通路。噪声真正被放大的地方是微分项(第 7 章),比例和积分项对噪声本来就不敏感(积分甚至天然是个滤波器)。所以标准做法是给 D 项单独加滤波,而不是给测量值加滤波。
- 如果真要滤整条通路,把它的相位计入预算,重新验算裕度。而不是加完就走。
还有一个更根本的选项,是下一卷的内容:不要只靠一个传感器。如果你有一个模型和一个测量,可以把两者融合起来——那样得到的估计比单靠平滑好得多,而且付的相位代价小得多。第 19 章讲这件事。
C延迟最要命。读数晚 3 秒,过冲从 15.4% 变成 70.3%,IAE 从 5.84 涨到 13.09。而噪声和量化对过冲的影响小到测不出来(15.3% 和 15.4%)。
但另外两个绝不是「无害」:噪声让执行器抖动涨了 3024 倍,量化涨了 401 倍。它们花的是执行器的寿命和能耗,不是稳定性。两笔账都是真账,只是记在不同的本子上。
A 「噪声最要命,因为它随机」——随机性听起来最吓人,但对一个线性环来说,零均值的噪声不改变任何动力学性质。控制器会忠实地把噪声翻译成动作(所以执行器很累),但环的稳定性、过冲、调节时间都不变。「看起来乱」和「会失控」是两回事。 B 「量化最要命」——量化确实制造了一个死区(误差小于半档时控制器完全看不见),而死区在某些系统里会造成极限环(第 16 章)。但它同样不加相位,所以不动摇稳定性。它在这个例子里的代价是 401 倍的执行器抖动。 D 「三个差不多」——这一章存在的理由就是它们差得非常远,而且是在不同的维度上差。把三种传感器缺陷混为一谈,会导致你用错误的手段去对付它们:给延迟加滤波(更糟),或者为了降噪去牺牲带宽(用要命的换不要命的)。这一章的一句话
传感器骗你的三种方式里,只有「晚」会让环失稳——而「晚」恰好是最不显眼、最容易在别的改动里被顺手加进来的那一种。
下一章换个思路:既然反馈必须先看见误差才能动手,那有没有办法在误差发生之前就动手?有,而且效果惊人——同一个扰动,纯反馈的峰值偏差是 0.1286,加上前馈之后是 0.0003。更有意思的是:就算前馈模型错了一半,配上反馈仍然能把偏差压掉一半。