DH(Denavit–Hartenberg)矩阵

DH 矩阵(Denavit-Hartenberg 矩阵)是 1955 年由 Denavit 和 Hartenberg 提出的一种机器人运动学建模方法,用于描述机器人连杆和关节之间的关系。该方法通过在机器人每个连杆上建立坐标系,并用 4×4 的齐次变换矩阵(DH 矩阵)描述相邻连杆的空间关系,从而推导出末端执行器相对于基坐标系的位姿,建立机器人的运动学方程 。

DH 方法包括传统 DH(Classic DH)和改进 DH(Modified DH),主要区别在于坐标系建立位置和参数变换顺序 。每个连杆用 4 个参数(如关节角 θ θ θ、连杆长度 a a a、连杆偏移 d d d、连杆扭角 α α α)描述,转动关节的关节变量为 θ θ θ,移动关节的关节变量为 d d d 。通过依次相乘各关节的 DH 矩阵,可得到机器人末端在基坐标系中的位姿,适用于机器人正运动学解算和 3D 模型运算 。

视频链接

在本人复刻Dummy机械臂的时候,重温DH矩阵,并做如下记录:

DH 方法也被用于五轴机床等复杂系统的运动学建模和几何误差补偿 。下面给出一份系统性、逐条拆解的 DH(Denavit--Hartenberg)矩阵教程。


1. 为什么要用 DH?

  • 机器人/机床通常由 n n n 个连杆 + n + n +n 个关节 串联而成。

  • 我们需要把 关节变量 q q q (转动关节的 θ θ θ 或移动关节的 d d d)映射到 末端位姿 T ( q ) T(q) T(q),用于正运动学、仿真、控制、标定。

  • DH 提供一种最少参数、无歧义的建系规范,使所有运动学方程都可以用 4×4 齐次变换矩阵连乘得到:

    T 0 n ( q ) = T 01 ( q 1 )   T 12 ( q 2 ) ⋯ T ( n − 1 ) n ( q n ) 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 + 1 i+1 i+1 处) 连杆 近端 (关节 i i i 处)
变换顺序 先沿 z i z_i zi 旋转/平移,再沿 x i x_i xi 平移/旋转( 依次 z i z_i zi 旋转-> z i z_i zi 平移,再沿 x i x_i xi 平移-> x i x_i xi 旋转) 先沿 x i − 1 x_{i-1} xi−1 平移/旋转,再沿 z i z_i zi 旋转/平移( 依次 x i − 1 x_{i-1} xi−1 旋转-> x i − 1 x_{i-1} xi−1 平移,再沿 z i z_i zi 旋转-> z i z_i zi 平移)
工业软件 R o b o t i c s T o o l b o x ( M A T L A B ) 、 K U K A K R C 、 A B B R A P I D Robotics Toolbox (MATLAB)、\\KUKA KRC、ABB RAPID RoboticsToolbox(MATLAB)、KUKAKRC、ABBRAPID R O S M o v e I t 、 O p e n R A V E 、 U R D F 、 S o l i d W o r k s ROS MoveIt、OpenRAVE、\\URDF、SolidWorks ROSMoveIt、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 x i − 1 xᵢ₋₁ xi−1 轴,从 z i − 1 zᵢ₋₁ zi−1 旋转到 z i zᵢ zi 的角度 常数
连杆长度 a a a a i − 1 aᵢ₋₁ ai−1 沿 x i − 1 xᵢ₋₁ xi−1 轴,从 z i − 1 zᵢ₋₁ zi−1 移动到 z i zᵢ zi 的距离 常数
关节角 θ θ θ θ i θᵢ θi z i zᵢ zi 轴,从 x i − 1 xᵢ₋₁ xi−1 旋转到 x i xᵢ xi 的角度 转动关节变量
连杆偏距 d d d d i dᵢ di 沿 z i zᵢ zi 轴,从 x i − 1 xᵢ₋₁ xi−1 移动到 x i xᵢ xi 的距离 移动关节变量

4. 变换矩阵公式(MDH)

变换顺序

  1. 先绕 x i − 1 x_{i-1} xi−1 轴旋转 α i − 1 α_{i-1} αi−1 再平移 a i − 1 a_{i-1} ai−1
  2. 再绕 z i z_i zi 轴旋转 θ i θ_i θi 再平移 d i d_i di

4×4 齐次矩阵 T i − 1 , i T_{i-1,i} Ti−1,i 应该是:

T i − 1 , i ( q i ) = R o t ( x , α i − 1 )   T r a n s ( x , a i − 1 )   R o t ( z , θ i )   T r a n s ( z , d i ) 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)

展开后:
T i − 1 , i = [ cos ⁡ θ i − sin ⁡ θ i 0 a i − 1 sin ⁡ θ i cos ⁡ α i − 1 cos ⁡ θ i cos ⁡ α i − 1 − sin ⁡ α i − 1 − d i sin ⁡ α i − 1 sin ⁡ θ i sin ⁡ α i − 1 cos ⁡ θ i sin ⁡ α i − 1 cos ⁡ α i − 1 d i cos ⁡ α i − 1 0 0 0 1 ] 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θisinθicosαi−1sinθisinαi−10−sinθicosθicosαi−1cosθisinαi−100−sinαi−1cosαi−10ai−1−disinαi−1dicosαi−11

  • α α α 和 a a a 的下标是 i − 1 i-1 i−1(因为它们属于"前一连杆"的几何属性)
  • θ θ θ 和 d d d 的下标是 i i i(关节变量属于"当前关节")

5. 建立坐标系(MDH 流程)

步骤 做什么 对哪个标号 关键要点
0 编号 关节 i = 1 ... n i=1...n i=1...n 基座系为 0 0 0,末端系为 n n n
1 z i zᵢ zi 对 i = 0 ... n i=0...n i=0...n z i zᵢ zi 与关节 i i i 的轴线重合,方向自定
2 x i − 1 xᵢ₋₁ xi−1 对 i = 1 ... n i=1...n i=1...n x i − 1 xᵢ₋₁ xi−1 是 z i − 1 zᵢ₋₁ zi−1 与 z i zᵢ zi 的公垂线 ,方向从 z i − 1 zᵢ₋₁ zi−1 指向 z i zᵢ zi
3 O i − 1 Oᵢ₋₁ Oi−1 对 i = 1 ... n i=1...n i=1...n O i − 1 Oᵢ₋₁ Oi−1 位于 z i − 1 zᵢ₋₁ zi−1x i − 1 xᵢ₋₁ xi−1 的交点
4 y i − 1 yᵢ₋₁ yi−1 对 i = 1 ... n i=1...n i=1...n y i − 1 = z i − 1 × x i − 1 yᵢ₋₁ = zᵢ₋₁ × xᵢ₋₁ yi−1=zi−1×xi−1,右手定则
5 重复 1 − 4 1-4 1−4 直到 i = n i=n i=n 末端系 n n n 的原点放在工具中心
6 量 4 4 4 个参数 对 i = 1 ... n i=1...n i=1...n α i − 1 、 a i − 1 、 θ i 、 d i αᵢ₋₁、aᵢ₋₁、θᵢ、dᵢ αi−1、ai−1、θi、di,按定义测量

6. 完整示例:2 自由度平面 RR 机械臂

  • 关节 1、2 平行于 z z z 轴,连杆长度 L 1 L1 L1、 L 2 L2 L2。
  • 所有 α i = 0 , d i = 0 , a 1 = L 1 , a 2 = L 2 α_i = 0,d_i = 0,a_1 = L1,a_2 = L2 αi=0,di=0,a1=L1,a2=L2。
i i i θ i θ_i θi d i d_i di a i a_i ai α i α_i αi
1 1 1 θ 1 θ₁ θ1 0 0 0 L 1 L1 L1 0 0 0
2 2 2 θ 2 θ₂ θ2 0 0 0 L 2 L2 L2 0 0 0

计算末端位姿:
T 02 = T 01 ( θ 1 )   T 12 ( θ 2 ) = [ c 12 − s 12 0 L 1 c 1 + L 2 c 12 s 12 c 12 0 L 1 s 1 + L 2 s 12 0 0 1 0 0 0 0 1 ] 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)= c12s1200−s12c12000010L1c1+L2c12L1s1+L2s1201

其中 c 1 = c o s θ 1 , s 1 = s i n θ 1 , c 12 = c o s ( θ 1 + θ 2 ) ... c₁ = cosθ₁, s₁ = sinθ₁, c₁₂ = cos(θ₁+θ₂)... c1=cosθ1,s1=sinθ1,c12=cos(θ1+θ2)...


7. 常见陷阱

  • 坐标系画错 :Classic/Modified 的 x i x_i xi、 z i z_i zi 定义不同,容易混。
  • 移动关节变量 :在 MDH 中,移动关节变量是 d i d_i di,不是 θ i θ_i θi。
  • 参数符号 :有的教材把 a i a_i ai 写成 r i r_i ri,把 α i α_i αi 写成 φ i φ_i φi。
  • 零位对齐 :机器人出厂零位 ≠ D H ≠ DH =DH 零位,需加 o f f s e t offset offset。
  • URDF ↔ DH 转换 :ROS 的 URDF 用 MDH,但标签的 r p y / x y z rpy/xyz rpy/xyz 顺序是 x y z xyz xyz 而非 x α z θ xα zθ xαzθ,需要二次解析。

8. Python 代码(以 MDH 为例)

python 复制代码
import numpy as np

def 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 @ T12

print("End-effector position:", T02[:3, 3])

9. 进阶话题

  • 标定 :用激光跟踪仪或视觉测量实际 D H DH DH 参数误差,建立误差模型 Δ T ΔT ΔT。
  • 微分运动学 :对 D H DH DH 矩阵求偏导得到雅可比 J ( q ) J(q) J(q)。
  • 树形/闭环结构 :标准 D H DH DH 仅适用于串联链,需引入虚拟关节或 U R D F URDF URDF 的 <joint type="floating">

一句话总结:
D H 矩阵 = 机械杆件的"身份证" + 坐标系"说明书",只要遵循同一套约定,就能把任何串联机构转换成一串 4 × 4 矩阵的乘积。 DH 矩阵 = 机械杆件的"身份证" + 坐标系"说明书",只要遵循同一套约定,就能把任何串联机构转换成一串 4×4 矩阵的乘积。 DH矩阵=机械杆件的"身份证"+坐标系"说明书",只要遵循同一套约定,就能把任何串联机构转换成一串4×4矩阵的乘积。