DH 矩陣(Denavit-Hartenberg 矩陣)是 1955 年由 Denavit 和 Hartenberg 提出的一種機器人運動學建模方法,用于描述機器人連桿和關節之間的關系。該方法通過在機器人每個連桿上建立坐標系,并用 4×4 的齊次變換矩陣(DH 矩陣)描述相鄰連桿的空間關系,從而推導出末端執行器相對于基坐標系的位姿,建立機器人的運動學方程 。
DH 方法包括傳統 DH(Classic DH)和改進 DH(Modified DH),主要區別在于坐標系建立位置和參數變換順序 。每個連桿用 4 個參數(如關節角 θθθ、連桿長度 aaa、連桿偏移 ddd、連桿扭角 ααα)描述,轉動關節的關節變量為 θθθ,移動關節的關節變量為 ddd 。通過依次相乘各關節的 DH 矩陣,可得到機器人末端在基坐標系中的位姿,適用于機器人正運動學解算和 3D 模型運算 。
視頻鏈接
在本人復刻Dummy機械臂的時候,重溫DH矩陣,并做如下記錄:
DH 方法也被用于五軸機床等復雜系統的運動學建模和幾何誤差補償 。下面給出一份系統性、逐條拆解的 DH(Denavit–Hartenberg)矩陣教程。
1. 為什么要用 DH?
-
機器人/機床通常由 nnn 個連桿 +n+ n+n 個關節 串聯而成。
-
我們需要把 關節變量 qqq(轉動關節的 θθθ 或移動關節的 ddd)映射到 末端位姿 T(q)T(q)T(q),用于正運動學、仿真、控制、標定。
-
DH 提供一種最少參數、無歧義的建系規范,使所有運動學方程都可以用 4×4 齊次變換矩陣連乘得到:
T0n(q)=T01(q1)T12(q2)?T(n?1)n(qn)T_{0n}(q) = T_{01}(q_1)\,T_{12}(q_2)\cdots T_{(n-1)n}(q_n)T0n?(q)=T01?(q1?)T12?(q2?)?T(n?1)n?(qn?)
2. 兩種約定:Classic vs. Modified
對比項 | Classic DH (1955) | Modified DH (MDH, 1986) |
---|---|---|
坐標系位置 | 連桿 遠端(關節 i+1i+1i+1 處) | 連桿 近端(關節 iii 處) |
變換順序 | 先沿 ziz_izi? 旋轉/平移,再沿 xix_ixi? 平移/旋轉( 依次ziz_izi? 旋轉->ziz_izi? 平移,再沿 xix_ixi? 平移->xix_ixi? 旋轉) | 先沿 xi?1x_{i-1}xi?1? 平移/旋轉,再沿 ziz_izi? 旋轉/平移( 依次xi?1x_{i-1}xi?1? 旋轉->xi?1x_{i-1}xi?1? 平移,再沿 ziz_izi? 旋轉->ziz_izi? 平移) |
工業軟件 | RoboticsToolbox(MATLAB)、KUKAKRC、ABBRAPIDRobotics Toolbox (MATLAB)、\\KUKA KRC、ABB RAPIDRoboticsToolbox(MATLAB)、KUKAKRC、ABBRAPID | ROSMoveIt、OpenRAVE、URDF、SolidWorksROS MoveIt、OpenRAVE、\\URDF、SolidWorksROSMoveIt、OpenRAVE、URDF、SolidWorks |
參考 https://www.bilibili.com/video/BV1Ue4y1R7QJ/?spm_id_from=333.337.search-card.all.click&vd_source=6c355cf343a2ceefccfcf5bb64aee668
同一套參數,兩種約定算出的矩陣不同,千萬別混用。
3. 四個參數幾何意義(以 MDH 為例)
在 Modified DH(MDH) 里,四個參數必須嚴格對應“前一連桿”和“當前關節”:
參數 | 下標 | 幾何意義 | 變量 |
---|---|---|---|
連桿扭角 ααα | αi?1α???αi?1? | 繞 xi?1x???xi?1? 軸,從 zi?1z???zi?1? 旋轉到 ziz?zi? 的角度 | 常數 |
連桿長度 aaa | ai?1a???ai?1? | 沿 xi?1x???xi?1? 軸,從 zi?1z???zi?1? 移動到 ziz?zi? 的距離 | 常數 |
關節角 θθθ | θiθ?θi? | 繞 ziz?zi? 軸,從 xi?1x???xi?1? 旋轉到 xix?xi? 的角度 | 轉動關節變量 |
連桿偏距 ddd | did?di? | 沿 ziz?zi? 軸,從 xi?1x???xi?1? 移動到 xix?xi? 的距離 | 移動關節變量 |
4. 變換矩陣公式(MDH)
變換順序:
- 先繞 xi?1x_{i-1}xi?1? 軸旋轉 αi?1α_{i-1}αi?1? 再平移 ai?1a_{i-1}ai?1?
- 再繞 ziz_izi? 軸旋轉 θiθ_iθi? 再平移 did_idi?
4×4 齊次矩陣 Ti?1,iT_{i-1,i}Ti?1,i? 應該是:
Ti?1,i(qi)=Rot(x,αi?1)Trans(x,ai?1)Rot(z,θi)Trans(z,di)T_{i-1,i}(q_i) = \mathrm{Rot}(x,\alpha_{i-1})\,\mathrm{Trans}(x,a_{i-1})\, \mathrm{Rot}(z,\theta_i)\,\mathrm{Trans}(z,d_i)Ti?1,i?(qi?)=Rot(x,αi?1?)Trans(x,ai?1?)Rot(z,θi?)Trans(z,di?)
展開后:
Ti?1,i=[cos?θi?sin?θi0ai?1sin?θicos?αi?1cos?θicos?αi?1?sin?αi?1?disin?αi?1sin?θisin?αi?1cos?θisin?αi?1cos?αi?1dicos?αi?10001]T_{i-1,i} = \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 & a_{i-1} \\ \sin\theta_i\cos\alpha_{i-1} & \cos\theta_i\cos\alpha_{i-1} & -\sin\alpha_{i-1} & -d_i\sin\alpha_{i-1} \\ \sin\theta_i\sin\alpha_{i-1} & \cos\theta_i\sin\alpha_{i-1} & \cos\alpha_{i-1} & d_i\cos\alpha_{i-1} \\ 0 & 0 & 0 & 1 \end{bmatrix}Ti?1,i?=?cosθi?sinθi?cosαi?1?sinθi?sinαi?1?0??sinθi?cosθi?cosαi?1?cosθi?sinαi?1?0?0?sinαi?1?cosαi?1?0?ai?1??di?sinαi?1?di?cosαi?1?1??
- ααα 和 aaa 的下標是 i?1i-1i?1(因為它們屬于“前一連桿”的幾何屬性)
- θθθ 和 ddd 的下標是 iii(關節變量屬于“當前關節”)
5. 建立坐標系(MDH 流程)
步驟 | 做什么 | 對哪個標號 | 關鍵要點 |
---|---|---|---|
0 | 編號 | 關節 i=1…ni=1…ni=1…n | 基座系為 000,末端系為 nnn |
1 | 畫 ziz?zi? | 對 i=0…ni=0…ni=0…n | ziz?zi? 與關節 iii 的軸線重合,方向自定 |
2 | 找 xi?1x???xi?1? | 對 i=1…ni=1…ni=1…n | xi?1x???xi?1? 是 zi?1z???zi?1? 與 ziz?zi? 的公垂線,方向從 zi?1z???zi?1? 指向 ziz?zi? |
3 | 定 Oi?1O???Oi?1? | 對 i=1…ni=1…ni=1…n | Oi?1O???Oi?1? 位于 zi?1z???zi?1? 與 xi?1x???xi?1? 的交點 |
4 | 畫 yi?1y???yi?1? | 對 i=1…ni=1…ni=1…n | yi?1=zi?1×xi?1y??? = z??? × x???yi?1?=zi?1?×xi?1?,右手定則 |
5 | 重復 1?41-41?4 | 直到 i=ni=ni=n | 末端系 nnn 的原點放在工具中心 |
6 | 量 444 個參數 | 對 i=1…ni=1…ni=1…n | αi?1、ai?1、θi、diα???、a???、θ?、d?αi?1?、ai?1?、θi?、di?,按定義測量 |
6. 完整示例:2 自由度平面 RR 機械臂
- 關節 1、2 平行于 zzz 軸,連桿長度 L1L1L1、L2L2L2。
- 所有 αi=0,di=0,a1=L1,a2=L2α_i = 0,d_i = 0,a_1 = L1,a_2 = L2αi?=0,di?=0,a1?=L1,a2?=L2。
iii | θiθ_iθi? | did_idi? | aia_iai? | αiα_iαi? |
---|---|---|---|---|
111 | θ1θ?θ1? | 000 | L1L1L1 | 000 |
222 | θ2θ?θ2? | 000 | L2L2L2 | 000 |
計算末端位姿:
T02=T01(θ1)T12(θ2)=[c12?s120L1c1+L2c12s12c120L1s1+L2s1200100001]T_{02} = T_{01}(\theta_1)\,T_{12}(\theta_2) = \begin{bmatrix} c_{12} & -s_{12} & 0 & L_1c_1 + L_2c_{12} \\ s_{12} & c_{12} & 0 & L_1s_1 + L_2s_{12} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}T02?=T01?(θ1?)T12?(θ2?)=?c12?s12?00??s12?c12?00?0010?L1?c1?+L2?c12?L1?s1?+L2?s12?01??
其中 c1=cosθ1,s1=sinθ1,c12=cos(θ1+θ2)…c? = cosθ?, s? = sinθ?, c?? = cos(θ?+θ?)…c1?=cosθ1?,s1?=sinθ1?,c12?=cos(θ1?+θ2?)…
7. 常見陷阱
- 坐標系畫錯:Classic/Modified 的 xix_ixi?、ziz_izi? 定義不同,容易混。
- 移動關節變量:在 MDH 中,移動關節變量是 did_idi?,不是 θiθ_iθi?。
- 參數符號:有的教材把 aia_iai? 寫成 rir_iri?,把 αiα_iαi? 寫成 φiφ_iφi?。
- 零位對齊:機器人出廠零位 ≠DH≠ DH=DH 零位,需加 offsetoffsetoffset。
- URDF ? DH 轉換:ROS 的 URDF 用 MDH,但標簽的 rpy/xyzrpy/xyzrpy/xyz 順序是 xyzxyzxyz 而非 xαzθxα zθxαzθ,需要二次解析。
8. Python 代碼(以 MDH 為例)
import numpy as npdef dh_matrix(theta, d, a, alpha):"""返回 4×4 DH 變換矩陣(MDH 約定)"""ct, st, ca, sa = np.cos(theta), np.sin(theta), np.cos(alpha), np.sin(alpha)return np.array([[ct, -st*ca, st*sa, a*ct],[st, ct*ca, -ct*sa, a*st],[0, sa, ca, d ],[0, 0, 0, 1 ]])# 2R 機械臂參數
L1, L2 = 1.0, 0.5
q1, q2 = np.deg2rad(30), np.deg2rad(45)T01 = dh_matrix(q1, 0, L1, 0)
T12 = dh_matrix(q2, 0, L2, 0)
T02 = T01 @ T12print("End-effector position:", T02[:3, 3])
9. 進階話題
- 標定:用激光跟蹤儀或視覺測量實際 DHDHDH 參數誤差,建立誤差模型 ΔTΔTΔT。
- 微分運動學:對 DHDHDH 矩陣求偏導得到雅可比 J(q)J(q)J(q)。
- 樹形/閉環結構:標準 DHDHDH 僅適用于串聯鏈,需引入虛擬關節或 URDFURDFURDF 的
<joint type="floating">
。
一句話總結:
DH矩陣=機械桿件的“身份證”+坐標系“說明書”,只要遵循同一套約定,就能把任何串聯機構轉換成一串4×4矩陣的乘積。DH 矩陣 = 機械桿件的“身份證” + 坐標系“說明書”,只要遵循同一套約定,就能把任何串聯機構轉換成一串 4×4 矩陣的乘積。DH矩陣=機械桿件的“身份證”+坐標系“說明書”,只要遵循同一套約定,就能把任何串聯機構轉換成一串4×4矩陣的乘積。