下达指令的两种方式
假设你想让一个电机把机械臂转到某个角度。有两种根本不同的做法。第一种是发出指令然后相信它:「让电机以半功率运行两秒。」你算出这应该能让手臂停在想要的位置,按下启动,然后就不管了。这就是开环控制——指令发出去,却没有任何东西反馈回来核对它是否奏效。
微波炉的计时器就是纯粹的开环。你设定九十秒,它就加热九十秒,然后停止。它从不测量你的食物是否真的热了。如果一开始是冻的,端出来中间还是凉的——微波炉毫不知情,因为它从来不看结果,只看时钟。
第二种方式是不断核对。家用恒温器不会让暖炉运行固定的时间;它读取室温,与你设定的温度比较,再根据差距开启或关闭暖炉。如果窗户开着、热量不断流失,恒温器就干脆让暖炉多运行一会儿。它能纠正意外,因为它盯着结果看。这就是反馈控制,又称闭环控制:输出被测量出来,并反馈回去影响下一条指令。
目标值与唯一重要的那个数
要闭合这个环,控制器得知道「正确」是什么样子。那个目标就是目标值:你希望系统达到并保持的数值。在恒温器上,它是你拨定的温度。对一个机器人关节来说可能是「90 度」,对一台轮式机器人来说则是「每秒 1.5 米」。目标值就是你的愿望,用一个数字表达出来。
然后传感器报告实际正在发生什么——就叫它测量值。现在控制器手里有两个数,愿望和现实,并从中构成整个控制领域里最重要的那个量:误差信号。误差就是目标值减去测量值。如果你想要 90 度而关节在 75 度,误差就是 +15。如果关节冲过头到了 95 度,误差就是 −5。这一个数字——你偏离了多远、朝哪个方向——就是反馈控制器真正唯一需要的输入。
error = set_point - measurement set_point = 90 deg (what you want) measurement = 75 deg (what the sensor reads) error = +15 deg (positive: still too low, push up) # after an overshoot measurement = 95 deg error = -5 deg (negative: too high, ease back)
为什么要把一切归结成一个数?因为这让控制器的工作变得简单而通用。控制器不需要懂温度、角度或速度——它只需要一条把误差变成动作的规则:误差大就用力推,误差小就缓一缓,误差为零就说明到了。著名的 PID 控制器正是这样一条规则,但即便最简单的控制器,也不过是一个把误差变成指令的配方。
看着误差归零
来看这个环运转起来。假设关节从 75 度起步,目标值是 90。误差是 +15,于是控制器驱动电机正向转。随着关节摆向 90,测量值上升,误差收缩:+15,然后 +9,再到 +3。聪明的控制器会在误差变小时放缓力道,就像接近停车标志时把脚从油门上抬起。目标是让误差一路滑落到零,并停在那里。
但惯性是真实存在的。如果控制器推得太猛,关节就会越过 90,比如冲到 95。此时测量值高于目标值,于是误差变号:本来是 +3,转眼成了 −5。这个变号就是控制器该反向的信号——去刹车,或朝另一个方向回推。系统可能会在目标上下来回摆动几次,每一摆都比上一摆小,最后才稳定下来。它稳定得多快、多平顺,属于阻尼与超调的话题;眼下的关键是:误差的符号在每一个周期都告诉控制器该往哪个方向修正。
注意这每一步都依赖于什么:一个传感器。没有测量值就没有误差,没有误差就没有东西可以反馈。这就是为什么闭合环路必须有传感器——关节上的编码器、房间里的温度计、轮子上的测速计。传感器是那只眼睛,让控制器看见自己行动的结果。把眼睛拿走,你就又回到了微波炉,盲目地加热一段固定时间。
什么时候开环其实就够用了
很容易得出闭环总是更好的结论,但事实并非如此。反馈是有代价和复杂度的:你需要传感器、布线,还有一个聪明到能读懂它的控制器。开环更便宜、更简单、做起来更快。诚实的工程问题不是「哪个更好?」,而是「结果需要核对吗?」
- 任务可预测、扰动极小。带动 3D 打印平台的步进电机每收到一个脉冲就走固定一步;只要没有东西反推,数脉冲就够了——不需要传感器。
- 犯错代价低、又容易察觉。如果微波炉没把食物热透,你再加热二十秒就是了。是人闭合了这个环,机器自己就不必。
- 你根本测不到你在乎的那个量,或者传感器太慢、太嘈杂不可信。这时一条精心标定的开环指令,可能胜过一个抖动的测量值。