TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

正运动学:DH 参数与指数积(PoE)、双连杆平面臂及 3 自由度手腕

状态:草稿(2026-10-18),实测。 数据直接在笔记本电脑(Apple M1 Max,macOS 26.5)上通过 Python 3.9.6 及 numpy 2.0.2 计算得出。 时间为 7 次重复的中间值(舍弃首次)。原始数据与代码:工作目录 measure/robot-arm-basics/的 arm.py, m03_fk.py, out/m03_fk.json。示例臂为虚拟设计,无实际机器人实测值(未进行硬件实测)。参考资料查阅于 2026-10-18。 撰写规则:以实测数据为基础,未能测得的标为“未实测”,无法确认的标为“未确认”。

目录

1. 直觉:从简单的方向开始

只要知道手臂的所有关节角度,球拍的位置就会唯一确定。从肩膀到手肘比划一把尺子,再从手肘到手腕比划一把尺子, 不断重复这个过程即可。这就是正运动学(forward kinematics)。答案始终唯一且计算简便。

相反的方向,即“为了把球拍放在那个位置、以那个角度放置,关节应该转动多少度”,则可能存在多个答案或无解,因而难得多。这就是第 4 篇中的 逆运动学。必须先准确建立正运动学,才能校验逆运动学的答案。

2. 图示:本系列的示例臂

예제 팔: 6축 팔꿈치형 + 구형 손목(옆에서 본 모습) 1 요(수직축) 2 어깨 피치 3 팔꿈치 피치 4·5·6 손목 d1 = 0.30 a2 = 0.40 d4 = 0.35 d6 = 0.15 라켓 i a α d θ 1 0 +90° 0.30 θ1 2 0.40 0 0 θ2 3 0 +90° 0 θ3 4 0 −90° 0.35 θ4 5 0 +90° 0 θ5 6 0 0 0.15 θ6 길이 단위 m. 표준 DH. 손목 세 축이 한 점(손목 중심)에서 만난다.
图示:6 自由度肘式机械臂与球面手腕。连杆长度与 DH 表

示例臂的结构类似于人手臂。

在开源硬件方面,放弃该结构而采用 在 2 轴正交龙门架上搭载 2~3 轴手腕的设计也是一个强有力的候选方案。Google DeepMind 的系统也将 6 自由度工业机械臂安装在了 2 轴线性龙门架上(arXiv:2408.03906 II-A 节)。由于龙门架的正运动学和逆运动学几乎只涉及加法,我们将在第 4 篇中单独计算其优势。

3. 计算

3.1 双连杆平面臂

连杆长度为 L1、L2,关节角度为 q1、q2 的平面臂末端点如下。

x = L1·cos q1 + L2·cos(q1 + q2)
y = L1·sin q1 + L2·sin(q1 + q2)

该公式将成为第 4 篇逆运动学、第 5 篇雅可比矩阵以及第 9 篇动力学的共同出发点。示例臂中由第 2、3 个关节构成的平面问题正是如此。

3.2 DH 参数

如果关节有六个,就需要依次连接坐标系六次。DH(Denavit–Hartenberg)惯例仅需为每根连杆提供四个数字即可定义下一个坐标系。

符号 含义
θ_i 绕 z 轴旋转的角度(若是旋转关节,这就是关节变量)
d_i 沿 z 轴方向的平移
a_i 沿新 x 轴方向的平移(连杆长度)
α_i 绕新 x 轴旋转的角度(下一个关节轴的扭转)

本文采用“绕 z 轴旋转 θ 并平移 d,再沿 x 轴平移 a 并旋转 α”的顺序(通常称为标准 DH)。根据教科书的不同,也有顺序和下标各异的修正 DH。Modern Robotics 的附录 C 定义的顺序为 α_{i−1}, a_{i−1}, d_i, φ_i。即使是相同的机械臂,如果惯例不同,表中的数字也会不同,因此 如果从他人处获取表格,必须首先确认其所用的惯例。

def dh_T(a, alpha, d, th):            # 표준 DH: Rz(θ)·Tz(d)·Tx(a)·Rx(α)
    ct, st, ca, sa = cos(th), sin(th), cos(alpha), 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.0 ]])

def fk_dh(q):
    T = np.eye(4)
    for (a, alpha, d), qi in zip(DH, q):
        T = T @ dh_T(a, alpha, d, qi)
    return T                            # 라켓 좌표계 {E} 를 로봇 바닥 {B} 에서 본 4×4

3.3 指数积(PoE)

DH 需要为每根连杆指定坐标系,且指定规则较为繁琐。指数积(product of exponentials, PoE)公式仅使用两个坐标系:基座坐标系以及所有关节为 0 时的球拍位姿 M。并且,它将每一个关节视为“绕某一轴旋转的螺旋运动(screw motion)”。

T(q) = e^[S1]q1 · e^[S2]q2 · … · e^[S6]q6 · M

S_i = (ω_i, v_i),  ω_i = 관절 축 방향 단위 벡터,  v_i = −ω_i × p_i  (p_i 는 축 위의 아무 점)

所有的 S_i 和 M 都可以 仅凭零位时的单一状态 写出。这就是 Modern Robotics 第 4 章的空间形式 PoE 公式(4.14),该书也将不需要连杆坐标系作为其优点。指数矩阵具有罗德里格斯公式形式的闭式解。

def exp6(S, th):
    w, v = S[:3], S[3:]
    W = skew(w)
    R = np.eye(3) + sin(th)*W + (1 - cos(th))*W@W
    G = np.eye(3)*th + (1 - cos(th))*W + (th - sin(th))*W@W
    T = np.eye(4); T[:3, :3] = R; T[:3, 3] = G @ v
    return T

本系列的代码并非手写 S_i 和 M,而是通过 DH 表计算零位坐标系,并从中提取各关节的 z 轴和原点。这样便能直接校验这两种方法是否表示同一个机械臂。

3.4 球面手腕与手腕中心

如果手腕的三个轴交于一点,就会带来便利。无论第 4、5、6 个关节如何转动, 手腕中心的位置都不会改变。 手腕中心仅由第 1、2、3 个关节决定,从球拍位姿反推手腕中心也很简单。

손목 중심 = 라켓 중심 − d6 · (라켓 법선 방향, 곧 R 의 셋째 열)

第 4 篇将利用这一特性,将 6 自由度逆运动学拆分为“3 个位置”和“3 个方向”并通过闭式解求解。

4. 实测

4.1 DH 与 PoE 是否得出相同答案

在 −π 到 π 之间随机抽取 10,000 次关节角度,并逐元素比较两个函数的 4×4 结果矩阵。

项目 值
最大元素差 5.6×10⁻¹⁶
零位 M(位置) (0.40, 0, −0.20) m,球拍法向量向下(−z)

误差处于 float64 的舍入水平。在零位时球拍位于地面以下(−0.20 m),是因为肘部角度为 0 时下臂呈垂直下垂姿态。在实际机器人中,将这个“0 的含义”与编码器零点对齐是校准的第一步(4.3 节)。

4.2 计算时间

计算 单次耗时(µs)
双连杆平面闭式解(纯 Python) 0.41
6 自由度 DH(numpy 4×4 乘法 6 次) 15.2
6 自由度 PoE(numpy,6 个指数矩阵) 71.7
6 自由度雅可比矩阵(第 5 篇,在 DH 坐标系中) 102.6

PoE 比 DH 慢约 4.7 倍。这是因为除了各关节的正弦和余弦外,还需要进行多次 3×3 矩阵乘法和加法。1 kHz 的控制周期为 1,000 µs,因此即使在 Python 中,两者也都足够快。我们认为,当移植到微控制器时,像 DH 那样预先展开的公式会更具优势(未进行硬件实测)。

4.3 微小误差在球拍末端会放大为多少

即使正运动学准确,如果手臂的实际尺寸和编码器存在偏差也无济于事。我们引入了四种误差,在 5,000 个随机姿态下测量了球拍中心位置和球拍法向量方向的偏差程度。

작은 오차가 라켓 끝에서 몇 mm 가 되나 링크 길이 ±1 mm 0.98 / 1.94 관절 영점 ±0.1° 0.62 / 1.43 엔코더 12비트 0.27 / 0.65 엔코더 14비트 0.07 / 0.16 0 0.5 1 1.5 2 라켓 중심 위치 오차(mm). 막대는 중앙값, 가는 선 끝은 95백분위.
图示:连杆长度、关节零点、编码器分辨率误差转化为球拍位置误差的大小
误差原因 位置误差 中位值 / 95% 分位值 法向量方向误差 中位值 / 95% 分位值
连杆长度 ±1 mm(均匀分布,各关节独立) 0.98 / 1.94 mm 0°
关节零点 ±0.1° 0.62 / 1.43 mm 0.09 / 0.19°
12 位编码器(4,096 格/转)量化 0.27 / 0.65 mm 0.04 / 0.08°
14 位编码器(16,384 格/转)量化 0.07 / 0.16 mm 0.01 / 0.02°

5. 局限性

6. 总结

乒乓小结: 比划六次尺子就能得出球拍位置。但是,如果尺子的零点哪怕只偏了 0.1°,球就会偏离目标约 1 cm,所以一定要先对准零点!

参考资料

所有资料查阅于 2026-10-18。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论