标准DH参数建模指南
建立标准DH (Standard DH) 坐标系是机器人建模中最关键、也最容易出错的步骤。如果坐标系建错了,后续算出来的 \(\theta, d, a, \alpha\) 全都会错,导致正逆运动学完全失效。
标准 DH 的核心逻辑是:坐标系 \(\{i\}\) 建立在连杆 \(i\) 的末端(即关节 \(i+1\) 的轴线上)。
第一阶段:画轴线 (确定 Z 轴)
规则:\(Z_i\) 轴位于关节 \(i+1\) 的轴线上。
标识关节轴线:
画出每一个关节(Joint 1, Joint 2, … Joint n)的运动轴线。
如果是旋转关节,轴线就是旋转中心轴。
如果是移动关节,轴线就是伸缩移动的方向。
确定 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 个参数。
请记住口诀:“先两轴,后两面”。
1. 连杆长度 \(a_i\) (Link Length)
定义:沿 \(X_i\) 轴,从 \(Z_{i-1}\) 到 \(Z_i\) 的距离。
测量:就是公垂线的长度。
正负号:永远非负(因为 \(X_i\) 就是沿着公垂线定义的)。
2. 连杆扭转角 \(\alpha_i\) (Link Twist)
定义:绕 \(X_i\) 轴,从 \(Z_{i-1}\) 旋转到 \(Z_i\) 的角度。
测量:把 \(Z_{i-1}\) 平移过来,看它转多少度能和 \(Z_i\) 重合。
正负号:右手定则(大拇指指向 \(X_i\),四指从 \(Z_{i-1}\) 抓向 \(Z_i\))。
3. 关节偏置 \(d_i\) (Link Offset)
定义:沿 \(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]) 即可完成建模。