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

從關節角度到手部位置:正運動學

從機器人幾何中最友好的方向入手:已知每個關節角度,夾爪最終會停在哪裡?

你自己的手臂早已懂得答案

坐著別動,先定下三個角度:肩膀轉多少、手肘彎多少、手腕翹多少,然後保持不動。此刻你的指尖正停在房間裡某個確定的點上——你甚至可以用筆在那裡做個記號。你並沒有去想該把指尖放到哪裡;你只是定好了角度,位置就自然產生了。這個每天都在發生的小奇蹟,正是我們所說的正運動學:已知每個關節的角度,算出手臂末端會落在哪裡。

機器人手臂就是同一幅畫面,只是被剝到只剩金屬骨架。它是一串堅硬的連桿(大臂、小臂),由關節處的馬達連接起來。把每個關節角度告訴機器人,它的末端——也就是末端執行器,無論是夾爪、焊槍還是吸盤——就只可能停在一個確定的位置上。正運動學就是把這串角度變成一個位置和姿態的配方。

從關節空間到任務空間的映射

工程師喜歡給這套計算的兩端各起個名字。所有關節角度組成的完整列表,是關節空間中的一個點:如果你的手臂有六個馬達,把這六個數字一次性拍個快照,就是這個六維「關節可擺出的姿勢」空間裡的一個點。而夾爪最終停下的地方——它的位置以及朝向——則是任務空間中的一個點,也就是真正幹活的那個普通三維世界。

有了這兩個名字,正運動學就只是一個映射:你給它關節空間裡的一個點,它還你任務空間裡的一個點。讓這個方向如此友好的,是這個映射是一個真正的函數——一個輸入對應一個輸出,毫不含糊。餵進去一串角度,絕不會出現「到底是哪個位置?」的疑問。連桿是剛性的,角度是定死的,於是幾何只留下唯一一個可能的答案。

用手算一條兩連桿手臂

我們用一個最小卻有趣的機器人把它講具體:一條平放在桌面上的兩連桿手臂,就像從上往下看一隻彎著的手肘。第一根連桿長 L1,在肩膀處以角度 θ1 轉動,這個角從 x 軸起量。第二根連桿長 L2,在手肘處以角度 θ2 彎折,這個角相對於第一根連桿來量。我們想求出指尖落點的 (x, y)。

一段一段地走。手肘在第一根連桿的末端,沿方向 θ1 走出 L1 的距離,所以手肘位於 (L1·cos θ1, L1·sin θ1)。從手肘出發,第二根連桿沿著疊加後的角度 θ1 + θ2 指出去——因為它的彎折是疊在肩膀已經轉過的角度之上的。把第二段加上,你就到達了指尖。沿著手臂向外走時,角度只是一路累加上去;這種疊加正是整個思想的核心。

x = L1*cos(t1) + L2*cos(t1 + t2)
y = L1*sin(t1) + L2*sin(t1 + t2)

# try L1 = L2 = 1
#   t1 = 0,  t2 = 0     -> arm straight out
#                          (x, y) = (2, 0)
#   t1 = 90, t2 = 0     -> straight up
#                          (x, y) = (0, 2)
#   t1 = 0,  t2 = 90    -> forearm bent up
#                          (x, y) = (1, 1)
兩個項,每根連桿一個;手肘角度在第二項裡疊加到肩膀角度之上。

代幾個數進去,你就能感覺到這個函數在呼吸。手臂伸直(兩個角都為零)搆得最遠,伸出兩個連桿的長度。把手肘彎成直角,指尖就縮回到 (1, 1)。這裡沒有任何比正弦、餘弦更難的東西,可你已經為一個真實的——儘管很小的——機器人算出了正運動學。

為真實機器人堆疊座標系

我們那條平面手臂之所以靠加角度就能矇混過關,是因為一切都待在同一個平面裡。真實的手臂會在三維空間裡扭轉、傾斜,所以我們需要一套永遠不會跟丟的記帳技巧。這個技巧就是給每根連桿黏上一個小小的座標系——三根標著「前、左、上」的軸——再描述每個座標系相對於它前一個座標系是怎麼擺放的。

每一句「這個座標系相對於上一個怎麼擺放」,都被一個叫齊次變換矩陣的單一對象捕捉下來——一個緊湊的 4×4 方格,把一次旋轉(下一根連桿朝哪個方向扭)和一次平移(沿連桿走多遠)打包成一個步驟。今天你不需要親手去算它;只要相信一個矩陣的意思就是「先轉這麼多,再走這麼遠」。

現在就是回報時刻:要找出夾爪在哪裡,你把這些矩陣從肩到腕依次相乘,每個關節一個。每一次相乘,都是你剛才用手做的角度疊加在三維裡的版本——它把你從一根連桿的座標系帶到下一根。乘出來的積,是一個最終的變換,它精確地告訴你末端執行器在世界中處於什麼位置、朝向如何。這個一步步累乘的過程,配上一張記錄連桿長度與扭轉的表格,正是真實控制器每秒要算許多次的東西。

兩種語言,以及為什麼下一個問題更難

退一步你會發現,現在你有兩種方式描述同一個機器人。在關節空間裡,你說的是馬達的語言:「肩膀 30 度,手肘 45 度。」在任務空間裡,你說的是世界的語言:「夾爪在這個點,朝著這個方向。」兩者描述的是同一個構型;它們是同一時刻的兩種方言。

正運動學就是那個單向的翻譯——從馬達的語言翻到世界的語言——而且翻得毫無差錯,因為幾何已被完全確定。你用一串關節角度來規劃一次運動,就總能精確讀出每一瞬間手會在哪裡。正是這種可靠性,讓模擬器、安全校驗和動畫全都倚賴它。

但真實任務通常是從世界的語言開始的:「把夾爪放到這裡。」於是你需要反向翻譯——挑出能命中指定點的關節角度。這趟反向之旅,逆運動學,正是我們一直暗示的麻煩所在:一個目標可能有好幾種「抬肘」或「落肘」的姿勢都能搆到,也可能一種都沒有——如果它落在手臂搆不著的範圍之外。正因為你在這裡掌握了簡單的那個方向,你現在已經完全準備好去體會,為什麼困難的那個方向值得擁有自己專門的篇章了。