写在前面

本文参考Craig 的《Introduction to Robotics(机器人学导论)》

Craig 的 MDH 方法特别适合处理树状结构(分叉)的机器人,因为它的坐标系 是固连在连杆 上的,且原点通常位于连杆 的前端(即关节 的位置),而标准 DH 的坐标系 固连在连杆 上但原点在连杆的后端(关节 i+1i+1i+1)。

以下是按照 MDH 方法 定义关节空间(建立坐标系)的详细步骤:

建立坐标系 (Frame Assignment)

假设我们有连杆 i−1i-1i1 和连杆 iii,以及连接它们的关节 iii

Step 1: 确定 Z 轴(ZiZ_iZi)
  • 定义ZiZ_iZi 轴的方向沿着关节 iii 的旋转轴(或移动轴)
  • 注意区别:在标准 DH 中,ZiZ_iZi 通常是关节 i+1i+1i+1 的轴;而在 Craig MDH 中,ZiZ_iZi 就是当前关节 iii 的轴
Step 2: 确定 X 轴 (Xi−1X_{i-1}Xi1)

这是 MDH 的核心。我们需要定义前一个坐标系的 X 轴。

  • 定义Xi−1X_{i-1}Xi1 轴沿着 Zi−1Z_{i-1}Zi1ZiZ_iZi 两个轴之间的公垂线(Common Normal)
  • 方向:从 Zi−1Z_{i-1}Zi1 指向 ZiZ_iZi
  • 特殊情况
  • 如果 Zi−1Z_{i-1}Zi1ZiZ_iZi 平行:公垂线有无数条,通常选择通过前一连杆坐标原点的那个,或者使得 di=0d_i=0di=0 的那个
  • 如果 Zi−1Z_{i-1}Zi1ZiZ_iZi 相交:Xi−1X_{i-1}Xi1 垂直于由这两个轴构成的平面(即叉乘方向 Zi−1×ZiZ_{i-1} \times Z_iZi1×Zi
Step 3: 确定原点 (OiO_iOi)
  • 定义:坐标系 {i}\{i\}{i} 的原点 OiO_iOi 位于 XiX_iXi 轴与 ZiZ_iZi 轴的交点
  • 这意味着坐标系 {i}\{i\}{i} 是建立在关节 iii 上的
Step 4: 确定 Y 轴 ()
  • 根据右手定则:Yi=Zi×XiY_i = Z_i \times X_iYi=Zi×Xi

定义四个 DH 参数

在 Craig 的 MDH 中,变换是从坐标系 {i−1}\{i-1\}{i1}{i}\{i\}{i}。参数的下角标非常重要,请注意 aaaα\alphaα 的下标是 i−1i-1i1

  1. 连杆长度 ai−1a_{i-1}ai1 (Link Length):
    沿 Xi−1X_{i-1}Xi1 轴测量的,Zi−1Z_{i-1}Zi1ZiZ_iZi 的距离
  2. 连杆扭角 αi−1\alpha_{i-1}αi1 (Link Twist):
    Xi−1X_{i-1}Xi1 轴旋转的角度,使得 Zi−1Z_{i-1}Zi1 转到与 ZiZ_iZi 平行
  3. 连杆偏距 did_idi (Link Offset):
    沿 ZiZ_iZi 轴测量的,Xi−1X_{i-1}Xi1XiX_iXi 之间的距离
  4. 关节角 θi\theta_iθi (Joint Angle):
    ZiZ_iZi 轴旋转的角度,使得 Xi−1X_{i-1}Xi1 转到与 XiX_iXi 平行
不得不说的是

DH参数和用旋转矩阵+位移向量描述任意两个关节的关系,本质上是等价的,

通常来说,DH 参数是一种“结构化、少参数”的描述(严格说是对相邻刚体变换的特定参数化),真正算位姿时通常都会把它变成4×4 齐次变换矩阵再连乘


旋转矩阵 BAR{}^A_B RBAR 的获取

数值定义:BAR{}^A_B RBAR 的每一列就是坐标系 B 的三个主轴单位向量(x^B,y^B,z^B\hat{x}_B, \hat{y}_B, \hat{z}_Bx^B,y^B,z^B)在坐标系 A 中的投影(分量)

(点积推导)通过将 B 系的基向量投影到 A 系的基向量(x^A,y^A,z^A\hat{x}_A, \hat{y}_A, \hat{z}_Ax^A,y^A,z^A)上得到:BAR=[x^B⋅x^Ay^B⋅x^Az^B⋅x^Ax^B⋅y^Ay^B⋅y^Az^B⋅y^Ax^B⋅z^Ay^B⋅z^Az^B⋅z^A]{}^A_B R = \begin{bmatrix} \hat{x}_B \cdot \hat{x}_A & \hat{y}_B \cdot \hat{x}_A & \hat{z}_B \cdot \hat{x}_A \\ \hat{x}_B \cdot \hat{y}_A & \hat{y}_B \cdot \hat{y}_A & \hat{z}_B \cdot \hat{y}_A \\ \hat{x}_B \cdot \hat{z}_A & \hat{y}_B \cdot \hat{z}_A & \hat{z}_B \cdot \hat{z}_A \end{bmatrix}BAR= x^Bx^Ax^By^Ax^Bz^Ay^Bx^Ay^By^Ay^Bz^Az^Bx^Az^By^Az^Bz^A

假设坐标系 B 的三个轴单位向量在坐标系 A 中表示为:

  • Ax^B{}^A\hat{x}_BAx^B:B 系 x 轴在 A 系中的描述
  • Ay^B{}^A\hat{y}_BAy^B:B 系 y 轴在 A 系中的描述
  • Az^B{}^A\hat{z}_BAz^B:B 系 z 轴在 A 系中的描述

那么,从结果上来看,BAR{}^A_B RBAR 就是直接由这三列向量拼成的:
BAR=[∣∣∣Ax^BAy^BAz^B∣∣∣]{}^A_B R = \begin{bmatrix} | & | & | \\ {}^A\hat{x}_B & {}^A\hat{y}_B & {}^A\hat{z}_B \\ | & | & | \end{bmatrix}BAR= Ax^BAy^BAz^B

然后如果两个关节不香菱,那么我们会使用逐级传递的方式,得到两个目标关节之间的关系


位移向量APBORG{}^A P_{BORG}APBORG的获取

本质上就是 从当前坐标系A原点,到目标关节坐标系原点的向量,在系A中的表达


最后把 BAR{}^A_B RBARAPBORG{}^A P_{BORG}APBORG拼起来,就是变换矩阵 (Transformation Matrix)

MDH 的变换顺序是:先绕 X 轴动,再绕 Z 轴动

即:Frame{i−1}→Rotx(α),Transx(a)Intermediate→Rotz(θ),Transz(d)Frame{i}Frame \{i-1\} \xrightarrow{Rot_x(\alpha), Trans_x(a)} \text{Intermediate} \xrightarrow{Rot_z(\theta), Trans_z(d)} Frame \{i\}Frame{i1}Rotx(α),Transx(a) IntermediateRotz(θ),Transz(d) Frame{i}

公式为:ii−1T=Rotx(αi−1)⋅Transx(ai−1)⋅Rotz(θi)⋅Transz(di){}^{i-1}_i T = Rot_x(\alpha_{i-1}) \cdot Trans_x(a_{i-1}) \cdot Rot_z(\theta_i) \cdot Trans_z(d_i)ii1T=Rotx(αi1)Transx(ai1)Rotz(θi)Transz(di)

展开后的矩阵形式(实际用于计算的矩阵):
ii−1T=[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]{}^{i-1}_i T = \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}ii1T= cosθisinθicosαi1sinθisinαi10sinθicosθicosαi1cosθisinαi100sinαi1cosαi10ai1disinαi1dicosαi11

其中的旋转矩阵部分ii−1R{}^{i-1}_i Rii1R(左上角 3×33\times33×3)就是用来做速度和静力变换的核心

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐