機器人真正要回答的問題
上一篇指南把運動鏈正向走了一遍:已知一組關節角度,正運動學能精確告訴你手部最終落在哪裡。這個答案令人滿意,卻不是機器人通常被問到的問題。沒人會對機器人說「把第二個關節設成 37 度」,人們只會說「去抓那個杯子」。機器人知道它希望末端執行器達到的位姿——也就是位置和姿態——它必須反推出哪一組關節角度能讓末端到達那裡。這個反向問題就是逆運動學,簡稱 IK。
可以把這種差別想成算術與代數的區別。正運動學是把數字代入公式算出結果——永遠只有一個乾淨的答案。逆運動學則是給你結果、要你反推輸入,這是更難的方向。從關節角度到手部位姿的映射橫跨兩個不同的空間:角度位於關節空間(每個關節一個數),手部位姿位於任務空間(夾爪在房間裡的位置)。IK 就是把你從任務空間送回關節空間的那座橋。
為什麼反向映射很難
正運動學有個令人安心的性質:每個輸入恰好對應一個輸出。逆運動學卻同時在兩個方向上打破這個承諾。第一,一個目標可能有很多個有效解。把你自己的手臂伸出去觸碰前方某一點:你可以把肘部抬高,也可以把肘部壓低,都能碰到。機械臂也有同樣的自由度——工程師稱這些為「肘上」和「肘下」構型,兩者都能把手放在完全相同的位置。一條典型的六關節機械臂,對同一個目標位姿可能有多達八個不同的解。
第二,一個目標可能根本無解。如果你要求機械臂去搆它可達工作空間之外的點——可達工作空間是手能在物理上達到的所有位姿的集合——那就根本不存在能到達那裡的關節角度。讓它去拿一個比完全伸直還遠一公分的杯子,誠實的回答是「我搆不到」。優秀的 IK 代碼必須識別這種情況並回報失敗,而不是返回會把手臂甩到錯誤位置的垃圾角度。
還有第三層複雜。如果機械臂的關節數比任務嚴格所需的還多——也就是冗餘機械臂,比如用七關節臂去做一個六維任務——那它不只是有幾個解,而是有無窮多個連續的解族。你可以讓肘部沿一道弧線擺動,而手卻紋絲不動。這對於避障是一份禮物,但也意味著「那個」答案並不存在;你必須從中挑一個。
解析法 IK:手算三角形
對於幾何結構整齊的機械臂,你可以像做幾何作業那樣求解 IK:用三角學,手算,一次性,提前算好。這就是解析逆運動學——也叫閉式 IK,因為答案是一個精確的公式,而非近似。你輸入目標位姿,關節角度就直接算出來,就像把數字代進一元二次方程式求根公式一樣。
經典的成全條件是球形手腕——最後三個旋轉關節的軸線都相交於一點。這種佈置讓你能把問題乾淨地一分為二:手腕點的位置由前三個關節決定,手的姿態由後三個關節決定。於是變成兩個小三角問題,而不是一個糾纏的六維大問題。大多數工業機械臂都特意設計成球形手腕,正是因為這個原因——它讓機械臂能以閉式求解。
Two-link arm in a plane, hand target = (x, y), link lengths L1, L2:
r2 = x*x + y*y # squared distance to target
cos_e = (r2 - L1*L1 - L2*L2) / (2*L1*L2)
if cos_e < -1 or cos_e > 1:
FAIL -> target is outside the reachable workspace
elbow = acos(cos_e) # the +/- below give the two solutions
shoulder = atan2(y, x) - atan2(L2*sin(elbow), L1 + L2*cos(elbow))
# solution A: (shoulder, +elbow); solution B: mirror with -elbow
# the two signs are the elbow-up and elbow-down configurations回報是巨大的。閉式解在微秒級就能算完,一次性找出所有解,而且永遠不會卡住或亂跑。代價是它只對具有正確特殊結構的機械臂存在,而且推導是一項費力的、與具體幾何強綁定的工作——若改動機械臂的尺寸而破壞了那種結構,或加一個關節,你可能就得從頭重新推導一遍。
數值法 IK:猜測、檢驗、微調、重複
當不存在乾淨的公式時——奇怪的幾何、訂製的機械臂,或多帶了關節的——你就退而求助於數值逆運動學。它不去精確求解方程式,而是悄悄逼近答案:從一個猜測出發,一步步改進,直到手離目標足夠近。這和你伸手搆東西時差一點就調整一下是同一種本能:看到差距,就再往前探一點。
讓這種微調變得精確的引擎是雅可比矩陣。雅可比是一個矩陣,它針對機械臂當前的位姿,告訴你每個關節的微小轉動會如何帶動手移動。正著讀,它從關節運動預測手的運動;把它求逆,它就告訴你哪些關節運動能產生你想要的手部運動——也就是能縮小到目標距離的那個微小動作。
- 先給關節角度一個猜測(通常就用機械臂當前的位姿)。
- 對猜測跑一遍正運動學,量出誤差:在位置和姿態上,手離目標還差多少?
- 用求逆後的雅可比把這個手部誤差換算成對每個關節角度的微小修正。
- 施加這個修正,然後回到第 2 步。每一輪都讓誤差變小。
- 當誤差降到容差以下就停止——若誤差不再縮小,則在固定次數後放棄。
這個迴圈妙在極其通用——給它任意一條機械臂和一個正運動學函數,它就會去嘗試,不需要任何手工推導。但這份通用是有代價的。它只返回一個解(取決於從你的初始猜測出發恰好收斂到哪一個),如果需要很多次迭代它可能會慢,而且它會在奇異點附近卡住——奇異點是機械臂某一時刻在某個方向上失去移動能力的位姿,此時雅可比無法被乾淨地求逆。在這種位姿附近,所求的關節修正量會爆炸式增大,而幼稚的求解器就會亂抖。
選對工具
這兩種方法與其說是對手,不如說是適合不同活計的工具。解析法 IK 在速度、完整性和可靠性上取勝:每次呼叫只需微秒,一次性給出所有解,不會卡住。對於產線上一台標準六軸機械臂、一天跑同一個閉式求解器一百萬次的場景,它就是正確的選擇。
數值法 IK 在靈活性上取勝。它能處理沒有閉式解的機械臂、希望挑一個既巧妙又能避障的構型的冗餘機械臂,以及幾何結構在不同實驗間會變的研究型機器人。代價是速度,以及必須提防奇異點和糟糕的初始猜測——但同一套機制還能自然地擴展去滿足次要目標,比如讓手保持在目標上的同時把肘部收攏。
實踐中這條界線是模糊的。許多系統在機械臂結構允許時跑解析法 IK,否則退回數值求解器。而當冗餘機械臂有無窮多個答案時,數值法可以遊走的自由反倒成了頭號賣點——那份多餘的運動正是你將在冗餘指南裡遇到的零空間運動:手保持不動,肘部卻重新安排去做點有用的事。