标准DH参数建模指南

建立标准DH (Standard DH) 坐标系是机器人建模中最关键、也最容易出错的步骤。如果坐标系建错了,后续算出来的 \(\theta, d, a, \alpha\) 全都会错,导致正逆运动学完全失效。

标准 DH 的核心逻辑是:坐标系 \(\{i\}\) 建立在连杆 \(i\) 的末端(即关节 \(i+1\) 的轴线上)


第一阶段:画轴线 (确定 Z 轴)

规则:\(Z_i\) 轴位于关节 \(i+1\) 的轴线上。

  1. 标识关节轴线

    • 画出每一个关节(Joint 1, Joint 2, … Joint n)的运动轴线。

    • 如果是旋转关节,轴线就是旋转中心轴。

    • 如果是移动关节,轴线就是伸缩移动的方向。

  2. 确定 Z 轴方向

    • \(Z_0\):沿 关节 1 的轴线。

    • \(Z_1\):沿 关节 2 的轴线。

    • \(Z_{i}\):沿 关节 \(i+1\) 的轴线。

    • \(Z_{n-1}\):沿 关节 \(n\) 的轴线。

    • \(Z_n\) (末端):通常没有关节 \(n+1\) 了,所以 \(Z_n\) 可以任意定义,但习惯上让它与 \(Z_{n-1}\) 平行,或者指向工具的进给方向。


第二阶段:找公垂线 (确定原点 \(O\) 和 X 轴)

这是最难的一步。我们需要确定坐标系 \(\{i\}\) 的原点 \(O_i\)\(X_i\) 轴。

核心原则:\(X_i\) 必须同时垂直于 \(Z_{i-1}\)\(Z_i\)(即沿着公垂线方向)。

我们需要处理 \(Z_{i-1}\)\(Z_i\) 之间的三种空间关系:

情况 1:两轴异面(既不平行也不相交)

  • 找公垂线:在空间中,异面直线之间只有一条最短的公垂线。

  • 确定原点 \(O_i\):公垂线与当前轴 \(Z_i\) 的交点,就是坐标系 \(\{i\}\) 的原点。

  • 确定 \(X_i\):沿着公垂线,\(Z_{i-1}\) 指向 \(Z_i\)

情况 2:两轴平行

  • 找公垂线:平行线之间有无数条公垂线。

  • 确定原点 \(O_i\)

    • 通常选择一条公垂线,使得它通过前一个坐标系的原点(这样 \(d_i=0\),简化计算)。

    • 或者根据机器人的物理对称性选择一个明显的“中心”。

  • 确定 \(X_i\):沿着选定的公垂线,\(Z_{i-1}\) 指向 \(Z_i\)

情况 3:两轴相交

  • 确定原点 \(O_i\):两条轴线的交点就是原点。

  • 确定 \(X_i\)

    • 根据叉乘规则:\(X_i = Z_{i-1} \times Z_i\)(或者反方向)。

    • 也就是垂直于 \(Z_{i-1}\)\(Z_i\) 构成的平面。


第三阶段:推导参数 (提取 \(\theta, d, a, \alpha\))

现在坐标系画好了,我们只需要“看图说话”,量出相邻两个坐标系 \(\{i-1\}\)\(\{i\}\) 之间的 4 个参数。

请记住口诀:“先两轴,后两面”

  • 定义:沿 \(X_i\) 轴,从 \(Z_{i-1}\)\(Z_i\) 的距离。

  • 测量:就是公垂线的长度。

  • 正负号:永远非负(因为 \(X_i\) 就是沿着公垂线定义的)。

  • 定义:绕 \(X_i\) 轴,从 \(Z_{i-1}\) 旋转到 \(Z_i\) 的角度。

  • 测量:把 \(Z_{i-1}\) 平移过来,看它转多少度能和 \(Z_i\) 重合。

  • 正负号:右手定则(大拇指指向 \(X_i\),四指从 \(Z_{i-1}\) 抓向 \(Z_i\))。

  • 定义:沿 \(Z_{i-1}\) 轴,从 \(X_{i-1}\)\(X_i\) 的距离。

  • 测量:两个公垂线(\(X\)轴)在 \(Z\) 轴上的截距。

  • 注意:如果是移动关节,这个 \(d_i\) 就是变量 \(q_i\)

4. 关节角 \(\theta_i\) (Joint Angle)

  • 定义:绕 \(Z_{i-1}\) 轴,从 \(X_{i-1}\) 旋转到 \(X_i\) 的角度。

  • 测量:两个 \(X\) 轴的夹角。

  • 注意:如果是转动关节,这个 \(\theta_i\) 就是变量 \(q_i\)(当机器人处于初始姿态时,算出来的常数部分就是 offset)。


示例:如何处理 Base Frame \(\{0\}\)

这也是新手常犯错的地方。标准 DH 规定:

  • \(Z_0\) 沿关节 1 轴线。

  • 原点 \(O_0\) 可以任意选择(通常选在地面或者底座中心)。

  • \(X_0\) 怎么定?

    • 为了简化 \(\theta_1\) 的计算,通常让 \(X_0\)\(X_1\) 平行(当关节1角度为0时)。

    • 这样初始状态下 \(\theta_1 = 0\)

总结检查表

步骤动作结果
1标出所有关节轴得到 \(Z_0, Z_1, \dots, Z_{n-1}\)
2\(Z_{i-1}\)\(Z_i\) 的公垂线得到 \(X_i\) 的方向
3找公垂线与 \(Z_i\) 的交点得到原点 \(O_i\)
4补全 \(Y_i\) (右手定则)得到完整坐标系 \(\{i\}\)
5\(a_i\)\(X_i\) 方向上 \(Z\) 轴间距
6\(\alpha_i\)\(X_i\) 旋转看 \(Z\) 夹角
7\(d_i\)\(Z_{i-1}\) 方向上 \(X\) 轴间距
8\(\theta_i\)\(Z_{i-1}\) 旋转看 \(X\) 夹角

建立好坐标系后,将提取出的参数填入 Link([theta, d, a, alpha]) 即可完成建模。