先感知,再修正
想像你在一條筆直的路上開車。你不會把方向盤打到某個精確的角度、鎖死雙臂、然後聽天由命。你會瞥一眼車道,發現自己在往左偏,就向右輕推,再瞥一眼,再推回來。你每秒鐘都在跑一個小小的迴路:看自己在哪裡,和想去的地方比一比,然後做出微小的修正。路可能彎彎曲曲,車可能往一邊拽,你卻始終能保持置中——因為你一直在檢查自己轉向的結果。
溫控器也是一樣。它不會把加熱器開固定的幾分鐘;它測量室溫,和你設定的數值比較,然後相應地開關加熱。你往杯子裡倒水到某條刻度線時,你的手也是這樣:你盯著水位上升,快到時就放緩。這個模式——感知、比較、行動、重複——是機器人控制中最重要的一個觀念,本主線後面的一切都建立在它之上。
每秒運行許多次的迴路
當工程師把那種習慣變成機器自己會做的事,他們稱之為回饋控制:機器人把自身動作的結果回饋回它對下一步該怎麼做的決定裡。這不再是一條單向的指令——「馬達,轉到這裡」——而是動作和測量構成了一個圓環。系統的輸出繞回來,影響下一次的輸入。這個圓環就是回饋迴路,給它起這個名字正是本指南的核心。
關鍵的細節在於它轉得有多快。一個人開車轉向,大約每秒閉合這個迴路幾次。而一個機器人關節通常每秒閉合它幾百次甚至幾千次。每一圈都是同樣的三拍——測量你在哪裡,算出你偏了多遠,發力去縮小差距——只是它們發生得太快,以至於在我們看來動作平滑而連續。機器人其實只是在用微小而不斷的修正,一點一點地逼近它的目標。
每個迴路都有的四個部件
把任何一個回饋迴路拆開,你都會找到同樣的四個部件。一旦你能叫出它們的名字,你幾乎能讀懂機器人學裡的任何一張控制框圖,因為它們永遠是這四樣東西接成一個圓環。
- 設定值:你想到達的地方。這是目標——車道中心、你撥定的室溫、你想讓關節達到的角度。驅動迴路的這一對,參見設定值與誤差信號。
- 測量值:你實際所在的位置,由感測器讀出。對一個機器人關節來說,這通常是一個旋轉編碼器在報告真實的角度。沒有測量,就沒有回饋。
- 誤差:設定值減去測量值——你究竟偏了多遠,以及朝哪個方向偏。正誤差也許意味著「你還沒到目標」;負誤差則是「你衝過頭了」。
- 修正動作:控制器發給致動器的指令——比如給一個直流馬達的電壓——它被選來縮小誤差。誤差越大,推得越用力;誤差接近零,就放緩。
請注意,誤差是迴路的核心。控制器所做的一切,都是對那一個數字的反應。最簡單又好用的規則就是「按誤差成比例地發力」,而整個機器人學裡最常見的控制器——你接下來就會遇到的那個——幾乎完全是由對誤差、以及誤差隨時間如何變化的巧妙反應方式搭起來的。
為什麼這勝過一條固定指令
要體會迴路為什麼重要,想像一個必須把手臂保持水平的馬達。盲目的做法是發一條固定指令:「施加恰好足夠把手臂托在水平位置的力」,然後揚長而去。這就是開環控制——指令發出一次,不做任何檢查。在某個一切完美、標定剛好的日子裡,它能行。麻煩在於,世界從來沒有那麼乾淨。
現在在手臂上靠一個小重物,或者讓馬達熱起來使它推得稍微弱一點,又或者乾脆承認你對「恰好足夠的力」的猜測略有偏差。那條固定指令對這些一無所知,於是手臂垂了下去,而且一直垂著。一條盲目的、一次性的命令,沒有辦法察覺自己錯了,更別說修正。任何把系統推離目標的東西——多出來的負載、摩擦、一陣風、製造上的小毛病——都叫做擾動,而開環控制對它們全都束手無策。
把迴路閉合,故事就完全不同了。手臂一垂,編碼器立刻報告出更低的角度,誤差變大,控制器自動推得更用力,直到手臂回到水平——然後穩穩托住它,每時每刻都恰好用擾動所要求的那麼大的力。它從來不需要事先知道重量、溫度或摩擦。它只需要盯著誤差並做出反應。這種對比正是開環與閉環控制要講的內容,也是幾乎每一台真實機器人都跑閉環的原因。
後面一切的主幹
退一步看,這個迴路簡單得驚人:一個設定值、一個測量值、一個誤差、一個動作,接成一個每秒旋轉許多次的圓環。同樣的這個圓環,讓自動駕駛汽車在車道線之間轉向,讓無人機頂著一陣風懸停,讓一件手術器械穩穩地對抗人手的顫抖。各個部件會變得更精巧,但形狀從不改變。
本主線裡其餘的一切,都是對這個迴路某一部分的更深入審視。動作究竟應該如何依賴於誤差?這給你PID 控制及其三個項。怎樣整定這個反應,使它既堅定又不來回晃?這就是增益與整定和穩定性。當馬達已經推到極限、再也推不動時會怎樣?這就是飽和與積分飽和。把這個迴路的圖像裝在腦子裡,那麼上面每一個話題,都會作為你已經理解的東西的一處精修而落地。