JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

計算力矩:抵消機器人自身的物理特性

把機器人的動力學模型送回控制器,讓剩下的系統表現得像一個簡單乖巧的彈簧。

核心思想:抵消你能預測的部分

機械臂很難控制,因為它會以複雜的方式「反抗」。重力對每個連桿的拉扯,會隨手臂折疊的姿態而不同;當一個關節快速擺動時,它會透過耦合力把其他關節甩來甩去;而沉重的前臂比輕巧的腕部更難加速。一個普通的 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)
外環 PD 選定加速度;內環逆動力學支付物理帳單。

現在看看控制器從外部看到了什麼。物理被抵消後,你的指令 a 與實際加速度之間剩下的關係就只是「加速度等於指令」——正是那個承諾過的雙積分器。在這個乾淨系統之上,一個對誤差作用的普通比例–微分迴路表現得非常漂亮:誤差方程變成教科書式的彈簧–阻尼器。你像選彈簧剛度那樣選 Kp、像選減震器那樣選 Kd,就能得到你想要的精確收斂行為,並且在每個關節、每個姿態下都完全一致。

代價:你的抵消只能和模型一樣好

上面的一切都假設模型是精確的。它從來都不是。每個連桿的質量、其重心位置、每個關節的摩擦、夾爪裡未知的負載——這些全都進入抵消公式,而它們全都只能近似已知。模型算錯的部分不會憑空消失;它會作為一股殘餘力直接漏出來,而那個乾淨的雙積分器本應沒有這種力。

好消息是,外環 PD 仍能清理掉小的殘差——一個稍微算錯的重力項,看起來不過是它可以頂回去的輕微擾動。壞消息是,較大或系統性的誤差,會損害正是讓這套方法吸引人的那一點:完美的、與姿態無關的解耦會瓦解,而恰恰在手臂運動快、動力學最關鍵的時候,追蹤受損最嚴重。抵消的好壞,永遠不會超過你對機器人的了解程度。

正是這一個弱點,引出了本章其餘的大部分內容。自適應控制 線上調整不確定的模型參數,一邊執行一邊學習真實的連桿質量和摩擦。穩健控制 則換一種思路,設計一個無需辨識誤差、就能在整段模型誤差範圍內保持穩定的控制器。而 滑模控制 加入一個強力的修正項,不論模型漏掉了什麼,都強行把誤差驅向零。計算力矩是那個乾淨的理想;這些則是與不完美的現實模型共處的工具。