一個方程,三種力
如果說運動學問的是「手臂在哪裡?」,那麼動力學問的是更難的問題:「要讓手臂這樣運動,需要付出什麼?」答案就是機器人運動方程——這一行式子記下了機械臂所經歷的每一次推動、旋轉與下墜。對於有多個關節的機器人,它寫作 M(q)q̈ + C(q,q̇)q̇ + g(q) = τ,其中 q 是關節角度的清單,q̇ 是它們運動的快慢,q̈ 是這個快慢變化的速度。
右邊的 τ(希臘字母 tau)是關節力矩——每個馬達必須提供的扭轉力。左邊把這份力分成三項任務:M(q)q̈ 是加速質量的代價,C(q,q̇)q̇ 是關節同時運動時出現的旋渦,g(q) 是對抗重力的開銷。可以把它讀作一份預算:馬達輸出的每一牛·米,都花在這三件事之一上。
質量矩陣:隨姿態變化的「重」
在牛頓的 F = ma 中,質量是單個數值。對帶關節的機器人來說,這個數值變成了一張網格,叫做質量(慣性)矩陣,記作 M(q)。它是隨姿態變化的「重」:推動一條伸展的手臂,比推動一條摺疊的手臂費力得多,儘管實際質量絲毫未變。這就是 M 依賴於位形 q 的原因——把肘部摺起來,矩陣裡的數字就變小。
這張網格還有非對角線上的元素,它們道出一個微妙的真相:加速一個關節,會推搡其他關節。讓肩部猛地前甩,即使肘部自己的馬達什麼也沒做,肘部也會被帶動。M 的對角線是每個關節「自身」的重;非對角線上的元素則是關節之間相互倚靠的方式。
這些數字從何而來?每個連桿抵抗轉動的能力由它的慣性張量刻畫——這是一個 3×3 的描述,說明單個物體的質量是如何圍繞其質心分布的。一根細長的桿繞自身長度軸旋轉很輕鬆,卻很難翻筋斗式地翻轉;慣性張量恰好編碼了這種不對稱。質量矩陣 M(q) 正是把所有連桿的慣性張量針對某一姿態融合在一起後得到的結果。
科里奧利與離心:因同時運動而生的力
中間一項 C(q,q̇)q̇ 裝著科里奧利與離心項。注意它對速度是二次的——每一項都含有兩個速度因子相乘——所以只有當關節真正在運動時它才會甦醒。靜止時它消失;讓東西轉起來,它便迅速增長。
離心部分是單個關節旋轉時向外的拉扯,轉得越快這股力越大——就是把水甩出旋轉雨傘的那種力。科里奧利部分更隱蔽:它只在兩個關節一起運動時出現,是一種側向力,源於一根連桿在掃動、而另一根正改變著它到軸的距離。想想花式滑冰選手收攏手臂以轉得更快——那加速正是同一效應的可見體現。
這些力既不是摩擦,也不是重力——它們既不創造也不消耗能量。它們只不過是用關節角度去描述一個旋轉的多關節物體時所要付出的代價。忽略它們,一台高速機器人在每條曲線軌跡上都會衝過頭,因為控制器從未把高速時累積起來的旋渦計算在內。
重力:僅僅為了靜止不動所需的力矩
最後一項 g(q) 是重力負載。與其他項不同,它根本不需要任何運動——即使一條靜止的手臂也能感受到它。把你的手臂筆直地伸出去,僅僅為了不讓它掉下來,你的肩膀就要費很大力氣;機器人的馬達面對的正是同樣的要求。由於重力的力臂隨姿態改變,g 依賴於 q:一條平伸的手臂所需的保持力矩,遠大於一條垂直下垂的手臂。
這正是重力補償的依據:控制器算出 g(q),並恰好下達這麼大的力矩,使手臂既不上抬也不下墜。重力被抵消後,肢體彷彿漂浮——你可以用一根指尖引導沉重的機械臂,因為馬達正悄悄替你扛著它的重量。這就是協作機械臂上「零重力」示教模式背後的把戲。
從期望的運動反推 τ——輸入 q、q̇、q̈,讀出所需力矩——這叫做逆動力學。重力補償是它最簡單的情形:把速度和加速度設為零,只問「什麼力矩能保持這個姿態?」,剩下的便只有 g(q)。再把另外兩項加回來,你就能下達完整、快速的軌跡指令。
tau = M(q) @ qddot + C(q, qdot) @ qdot + g(q) # Gravity compensation only (hold still): # qdot = 0, qddot = 0 -> tau = g(q) # Full inverse dynamics (follow a trajectory): # give desired q, qdot, qddot -> solve for tau
一眼讀懂整個方程
把三項並排放在一起,一幅清晰的圖景便浮現出來。每一項回答一個不同的問題,三者合起來,就解釋了馬達必須產出的每一牛·米。
- M(q)q̈ ——「加速有多難?」抵抗加速度的慣性;當 q̈ = 0(勻速)時消失。
- C(q,q̇)q̇ ——「高速時出現什麼旋渦?」科里奧利與離心力;當 q̇ = 0(靜止)時消失。
- g(q) ——「此刻重力要求什麼?」保持靜止所需的力矩;即使一切靜止也存在。
- τ ——馬達必須輸出的總和。真實機器人還會加上一項摩擦,代表關節與齒輪內部的阻力。
真實硬件還會誠實地加上一項:關節摩擦,即軸承與齒輪箱內部的阻力,理想方程把它略去了。預先算好 M、C、g 的控制器——這正是計算力矩控制的核心思想——之所以能讓機器人又快又準地運動,恰恰是因為它們提前預測了這些力,而不是等事後再去對抗。