下達指令的兩種方式
假設你想讓一個馬達把機械臂轉到某個角度。有兩種根本不同的做法。第一種是發出指令然後相信它:「讓馬達以半功率運行兩秒。」你算出這應該能讓手臂停在想要的位置,按下啟動,然後就不管了。這就是開環控制——指令發出去,卻沒有任何東西回饋回來核對它是否奏效。
微波爐的計時器就是純粹的開環。你設定九十秒,它就加熱九十秒,然後停止。它從不測量你的食物是否真的熱了。如果一開始是凍的,端出來中間還是涼的——微波爐毫不知情,因為它從來不看結果,只看時鐘。
第二種方式是不斷核對。家用恆溫器不會讓暖爐運行固定的時間;它讀取室溫,與你設定的溫度比較,再根據差距開啟或關閉暖爐。如果窗戶開著、熱量不斷流失,恆溫器就乾脆讓暖爐多運行一會兒。它能糾正意外,因為它盯著結果看。這就是回饋控制,又稱閉環控制:輸出被測量出來,並回饋回去影響下一條指令。
目標值與唯一重要的那個數
要閉合這個環,控制器得知道「正確」是什麼樣子。那個目標就是目標值:你希望系統達到並保持的數值。在恆溫器上,它是你撥定的溫度。對一個機器人關節來說可能是「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 列印平台的步進馬達每收到一個脈衝就走固定一步;只要沒有東西反推,數脈衝就夠了——不需要感測器。
- 犯錯代價低、又容易察覺。如果微波爐沒把食物熱透,你再加熱二十秒就是了。是人閉合了這個環,機器自己就不必。
- 你根本測不到你在乎的那個量,或者感測器太慢、太嘈雜不可信。這時一條精心標定的開環指令,可能勝過一個抖動的測量值。