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 |

同一套参数,两种约定算出的矩阵不同,千万别混用。
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)
变换顺序:
- 先绕 x i − 1 x_{i-1} xi−1 轴旋转 α i − 1 α_{i-1} αi−1 再平移 a i − 1 a_{i-1} ai−1
- 再绕 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−1 与 x 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矩阵的乘积。