沒有力的幾何——以及它的侷限
想像一台機械臂被定格在一張照片裡。你可以測量每個關節角度,再用正向運動學精確算出夾爪在空間中的位置。運動學是運動的幾何學:它只用角度、長度和形狀來回答「在哪裡」以及「各部件如何對齊」。它從不追問真實的馬達能否真的保持那個姿態,也不問你要多用力才能到達那裡。
現在讓照片動起來。關掉馬達,機械臂就會癱軟——在自身重量下向地面下垂。幾何並沒有任何改變;運動學描述的那些關節角度依然完全成立。改變的是:重力這個力,終於被允許發揮作用了。這一下垂,正是運動學無言以對、而動力學登場的時刻。
動力學研究的是物體為何以及如何運動——力與它所引起的運動之間的關係。對機器人來說,我們通常把每一段連桿建模為剛體,也就是一塊不彎曲、不變形的物質,並研究它的剛體動力學:它的質量如何對推力與拉力作出反應。運動學畫出了地圖;動力學則告訴你穿越其上每一段旅程的代價。
登場角色:質量、力、力矩、動量
動力學的角色不多,先認識一遍,後面整條學習路徑就會輕鬆許多。第一位是質量:一個物體含有多少物質,因而它有多「頑固」地抗拒速度的改變。裝滿貨物的購物車比空車更難推動——也更難停下。這種頑固就是慣性,而質量正是衡量它的那個數字。
接下來是力:一種推或拉,比如重力把機械臂往下拽,或你的手推開一扇門。沿直線施加的力,會改變物體沿那條線運動的快慢。但機器人主要在關節處旋轉,而力在旋轉世界裡的「表親」就是力矩——一種扭轉的努力。在靠近門軸處推門,幾乎紋絲不動;在門把手處推,門就輕鬆轉開。同樣的力,更大的力矩,因為力矩取決於你離轉軸有多遠。
力矩是機器人動力學的主角,因為它正是關節馬達實際輸出的東西。每個馬達為驅動其關節而必須提供的扭轉努力,就是關節力矩,而幾乎每一項動力學計算最終都在回答同一個問題:需要多大的關節力矩?太小,機械臂就會下垂或卡死;馬達的上限,就是它的驅動力預算。
最後一位角色是動量:大致就是質量乘以速度——一個運動物體攜帶了多少「運動量」。這就是為什麼又快又重的物體既危險又難以停下。機器人會同時追蹤線動量與角動量:移動底座所攜帶的直線動量,以及揮動機械臂所儲存的旋轉動量。動量是機器人啟動時必須積累、停止時必須卸去的東西——而驟然卸去它,正是快速機器人會猛地一頓的原因。
動力學在哪裡大顯身手
如果一台機器人無限緩慢地移動、且什麼都不搬運,你幾乎可以忽略動力學,只規劃幾何就行。真實的機器人沒那麼客氣。有三種情形迫使你必須建模力,而它們涵蓋了機器人難題中的大部分。
- 快速運動。當某個關節快速加速時,一段擺動的連桿會把其他連桿甩來甩去——這種鞭子般的效應由科里奧利項與離心項來刻畫。速度越快,這些由速度驅動的力就越大;忽略它們的控制器會衝過頭或晃動。
- 沉重負載。拎起一整桶油漆,你整條手臂的發力立刻不一樣。機器人必須不斷提供力矩,只為對抗重力維持住位置——這項工作叫重力補償——負載越重,每個馬達就有越多的力氣花在對抗重量上,而不是用於運動。
- 輕柔接觸。把插銷插入孔中,或與人握手,意味著機器人接觸到了世界,必須調控它壓得有多用力。接觸點處交換的力就是接觸動力學,處理不當就會刮花表面或捏碎雞蛋。在這裡你不能只規劃位置——你必須對力進行推理。
還有一個更安靜的反派,在和每個馬達作對:摩擦。齒輪與軸承內部的摩擦——關節摩擦——會在你發出的力矩到達連桿之前,悄悄吃掉其中一部分。它很小、很雜亂、很難精確建模,但忽略它會讓機器人在低速時遲鈍又不精確。
本學習路徑要搭建的那個方程
上面這一切,都可以收攏進一句簡潔的陳述裡,而本學習路徑之後會把它一塊塊拆開來講:機器人運動方程。它是一本記帳總帳,對每個關節、每一瞬間都說明:你提供的力矩,必須剛好用來讓機械臂加速、在高速下把它甩動、以及對抗重力把它撐住。
tau = M(q) * q_ddot + C(q, q_dot) * q_dot + g(q)
| | | |
torque inertia x velocity x gravity
you send acceleration velocity holding
(push the mass) (whip / Coriolis) term第一塊 M(q) 是質量(慣性)矩陣:它刻畫機械臂在當前姿態下有多重、質量攤得有多開,從而決定給定的加速度要花多少力矩。對單個物體而言,它的基本構件是慣性張量,描述那個物體的質量是如何圍繞其各軸分佈的。中間那一項匯集了科里奧利與離心效應,而最後一項 g(q),正是我們前面遇到的對抗重力維持位置的努力。
把這個方程從兩個方向來讀,你就得到了機器人動力學的兩大問題。從左往右讀——給定力矩,會產生什麼運動?——這就是正向動力學,每個物理模擬器的核心。從右往左讀——給定我想要的運動,我必須發出什麼力矩?——這就是逆向動力學,每個高性能控制器的核心。本學習路徑之後會教你如何填入、計算並運用每一項。