DH(Denavit–Hartenberg)矩阵
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θ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
- ααα 和 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)=c12s1200−s12c12000010L1c1+L2c12L1s1+L2s1201
其中 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矩阵的乘积。