核心思想:抵消你能預測的部分
機械臂很難控制,因為它會以複雜的方式「反抗」。重力對每個連桿的拉扯,會隨手臂折疊的姿態而不同;當一個關節快速擺動時,它會透過耦合力把其他關節甩來甩去;而沉重的前臂比輕巧的腕部更難加速。一個普通的 PID 控制器 把這一切都看成雜亂又不斷變化的擾動,永遠慢半拍地追在後面。
這裡有一個令人豁然開朗的洞見:上面那些幾乎沒有一樣是真正不可預測的。重力、耦合力、變化的等效質量——這一切都源自我們能寫下來的物理規律。機器人的 運動方程 是一條已知公式。那麼,與其把物理當成敵人、被動地去回應它,何不精確算出它會做什麼,並提前「買單」呢?
這就是 回饋線性化 背後的全部把戲。你給機器人包上一層數學,算出恰好能抵消重力、耦合項和變化慣量所需的力矩。剩下的部分——從外部看到的系統——不再是一台糾纏的非線性機構,而是表現得像控制理論中最簡單的對象:一個你可以直接推動的自由質量。機器人自身的物理特性,已被減掉了。
逐項拆解計算力矩控制律
機器人的運動方程有一個標準形式,讀懂它就掌握了全部要領。用關節角來寫,它說:所需力矩 等於(等效質量)乘以(加速度),加上(速度耦合力),再加上(重力)。每一項都有名字,也有明確的物理職責。
tau = M(q) * qddot + C(q, qdot) * qdot + g(q) q = joint angles (where the arm is) qdot = joint velocities (how fast it moves) qddot = joint accelerations (how fast that changes) M(q) = mass / inertia matrix -> resistance to acceleration C(...) = Coriolis & centrifugal -> forces that arise from the joint velocities g(q) = gravity vector -> pull of gravity in this pose tau = joint torques you command the motors to produce
第一項用到 質量(慣量)矩陣 M(q)。它刻畫了每個關節有多難加速,更關鍵的是,加速一個關節會如何推動相鄰的關節。它依賴於姿態 q,因為伸展的手臂與折疊的手臂慣量大不相同。中間一項是 科里奧利與離心項:只有在關節已經運動時才會出現的、那種旋轉甩動般的力。最後一項 g(q) 就是單純的 重力補償——每個電機僅僅為了讓手臂不下垂所必須維持的穩定力矩。
從期望運動 (q, qdot, qddot) 反推出所需力矩,正是 逆動力學 這個問題:給定你想讓手臂去到哪裡,倒推出能把它送過去的力。在實踐中,機器人用快速的 遞迴牛頓–歐拉演算法 來計算它——該演算法先沿手臂向外、再向內回掃,在一次高效遍歷中算出每個關節力矩,快到足以在每個控制週期重做一遍。
抵消之後,簡單的迴路就奏效了
下面是抵消的實際接線方式。你不直接命令最終力矩,而是先決定一個期望的加速度——也就是你想要的動作——再向逆動力學公式索取能產生該加速度的力矩。質量矩陣以及重力、科里奧利項都在當前姿態和速度下求值。其輸出是一條力矩指令;當模型正確時,它會讓關節恰好按你的要求加速。
Step 1 - outer loop picks a desired acceleration:
a = qddot_des + Kd*(qdot_des - qdot) + Kp*(q_des - q)
\__feedforward__/ \______ PD on the tracking error ______/
Step 2 - inner loop turns that into real torque:
tau = M(q)*a + C(q,qdot)*qdot + g(q)
Result, if the model is exact, the error e = q_des - q obeys:
eddot + Kd*edot + Kp*e = 0 (a clean, tunable spring-damper)現在看看控制器從外部看到了什麼。物理被抵消後,你的指令 a 與實際加速度之間剩下的關係就只是「加速度等於指令」——正是那個承諾過的雙積分器。在這個乾淨系統之上,一個對誤差作用的普通比例–微分迴路表現得非常漂亮:誤差方程變成教科書式的彈簧–阻尼器。你像選彈簧剛度那樣選 Kp、像選減震器那樣選 Kd,就能得到你想要的精確收斂行為,並且在每個關節、每個姿態下都完全一致。
代價:你的抵消只能和模型一樣好
上面的一切都假設模型是精確的。它從來都不是。每個連桿的質量、其重心位置、每個關節的摩擦、夾爪裡未知的負載——這些全都進入抵消公式,而它們全都只能近似已知。模型算錯的部分不會憑空消失;它會作為一股殘餘力直接漏出來,而那個乾淨的雙積分器本應沒有這種力。
好消息是,外環 PD 仍能清理掉小的殘差——一個稍微算錯的重力項,看起來不過是它可以頂回去的輕微擾動。壞消息是,較大或系統性的誤差,會損害正是讓這套方法吸引人的那一點:完美的、與姿態無關的解耦會瓦解,而恰恰在手臂運動快、動力學最關鍵的時候,追蹤受損最嚴重。抵消的好壞,永遠不會超過你對機器人的了解程度。
正是這一個弱點,引出了本章其餘的大部分內容。自適應控制 線上調整不確定的模型參數,一邊執行一邊學習真實的連桿質量和摩擦。穩健控制 則換一種思路,設計一個無需辨識誤差、就能在整段模型誤差範圍內保持穩定的控制器。而 滑模控制 加入一個強力的修正項,不論模型漏掉了什麼,都強行把誤差驅向零。計算力矩是那個乾淨的理想;這些則是與不完美的現實模型共處的工具。