記帳難題
想像有人遞給你一台六關節機器人手臂,要你把它的形狀寫下來,好讓電腦預測夾爪最終停在哪裡。聽起來簡單,可一旦開始清點就麻煩了:每個關節與下一個相隔一段距離,每節連桿有固定長度,每段相對前一段可能扭轉了一定角度,而每個馬達又會轉過某個角度。一台六關節手臂有幾十條這樣的小幾何事實。如果沒有一套記錄的規矩,兩位工程師描述同一台機器人時會寫成兩種樣子——他們的數字對不上。
我們想要的是一份運動學模型:用數字忠實地描述串聯機械臂的各剛性部件如何連接。麻煩在於幾何的自由度太多。你可以在自己隨意選定的座標系裡測量每節連桿,把參考軸放在順手的位置,結果得到一份正確卻互不相容的描述。我們需要一套約定——關於把尺和量角器放在哪裡的共同規則——這樣任何人面對同一台機器人,都會寫下同一張表。
每個關節四個數字
Denavit–Hartenberg 配方先給每節連桿附上一個座標系,並遵守嚴格規則:每個座標系的 z 軸沿其關節的運動軸方向——轉動關節繞之旋轉的那條線,或滑動關節移動的方向。z 軸定下後,約定再把每個 x 軸放在某關節軸與下一關節軸之間的公垂線上。這條規則就是全部訣竅:它把座標系釘得如此之死,以至於從一節連桿的座標系挪到下一節,只需四個參數。
這四個參數有樸素的物理含義。連桿長度 a 是相鄰兩關節軸之間的距離,沿公垂線測量。連桿扭角 α 是相鄰關節軸之間的夾角——下一根軸相對這一根傾斜了多少。連桿偏距 d 是沿關節軸滑動多遠才到達下一節連桿的公垂線。關節角 θ 則是繞關節軸的轉動。想像從一個關節走到下一個:你沿一座橋走過 a,扭轉 α,沿立柱滑上 d,再繞它轉過 θ。
於是整台機器人濃縮成一張小表:每個關節一列,四欄分別是 a、α、d、θ。一台六關節手臂就成了整潔的六列四欄網格。這張表就是機器人的幾何指紋——小到能用電子郵件寄出,精確到足以從頭重建全部數學。
從表格的一列到正運動學
表格的每一列都化為一個齊次變換——一個 4×4 矩陣,把旋轉與平移打包成一個物件,於是用它乘以某點的座標,就能一次性地把該點移動並重新定向。四個 DH 參數直接填入一個固定公式:沿 x 軸並繞 x 軸的兩個類螺旋步驟(用 a 和 α),以及沿 z 軸並繞 z 軸的兩個步驟(用 d 和 θ)。填進這四個數字,就得到把你從一節連桿的座標系送到下一節的矩陣。
如今串接變得優美而簡單。要算出夾爪在基座座標系中的位置,你只需按順序把各關節矩陣相乘:基座到關節 1,再關節 1 到 2,依此向外直到末端。乘積是一個最終的 4×4 矩陣,給出夾爪的位置與姿態。把它們全部相乘的這一步,正是正運動學:給定各關節角度,算出手在哪裡。
T_base_to_tool = A1 * A2 * A3 * A4 * A5 * A6 # Each A_i is the 4x4 transform built from one DH row: # A_i = RotZ(theta_i) * TransZ(d_i) * TransX(a_i) * RotX(alpha_i) # For a revolute joint, theta_i is the moving variable. # For a prismatic joint, d_i is the moving variable. # Multiply in order; the result gives the tool's pose in the base frame.
這正是 DH 表如此寶貴的原因:它不只是寫下機器人的方式,更是一份免費奉送正運動學計算的配方。改變一個關節角,換入新的 θ,重新相乘,你立刻就知道夾爪的新位姿。
易踩的坑與現代替代方案
第一個坑:哪個參數會動取決於關節類型,搞混了會悄無聲息地破壞模型。對轉動(旋轉)關節,角度 θ 是變數而 d 是固定常數;對移動(滑動)關節,偏距 d 是變數而 θ 固定。開始填數字前,務必先給每一列標註其關節類型。
第二個坑:這套約定有兩種流派。經典(標準)DH 與改進型 DH 把每節連桿的座標系附在不同的一端,並對矩陣中四個步驟重新排序。兩者都正確,但用一種流派寫成的表,若餵給期望另一種的軟體,就會算出錯誤結果。務必註明一張表用的是哪種流派。
DH 參數在關節軸平行或近乎平行時也很吃力,此時公垂線變得難以定義,微小的測量誤差會被放大。部分因為這個原因,現代工具鏈常常跳過手工推導的 DH 表。機器人越來越多地用 URDF 描述——一種 XML 檔案,逐一列出每個連桿與關節及其完整位姿,無需特殊的選軸規則——或用螺旋理論描述,直接在基座座標系中為每個關節指定一根運動軸。這些方式更易編寫、更不易出錯,也能與模擬器和視覺化工具良好配合。