Home / 机器人经典基础 / Denavit–Hartenberg:把一台机械臂写成一串坐标变换

001|Denavit–Hartenberg:把一台机械臂写成一串坐标变换

系列首页 · 时间线 · 下一篇

原论文:Jacques Denavit、Richard S. Hartenberg,A Kinematic Notation for Lower-Pair Mechanisms Based on Matrices,1955,Journal of Applied Mechanics 22(2):215–221。出版记录。网页后来的数字化日期不应替代1955年的发表年份。

先接住前作的问题

本系列从阅读指南提出的“把感知、几何、控制分开检查”开始。这里没有一篇必须假定为直接前驱的系列论文:最先要补上的接口是,编码器给出的关节变量,如何变成任务描述使用的末端坐标?D-H解决这层理想几何表示,尚不处理测量噪声、执行力矩或接触变形。后面的任务速度控制会使用这层几何关系求雅可比;指数积表示则是一条平行表示路线,并不是把D-H参数重新命名。

五个前置概念

理解这篇文章最需要的五个概念是:刚体变换描述位置与朝向;坐标系规定数值的参照;齐次坐标统一旋转和平移;关节变量描述允许运动;矩阵乘法顺序对应链条中的组合顺序。

一、问题设定:编码器角度怎样变成夹爪位姿

机械臂关节编码器给出若干角度,但任务描述通常是“夹爪位于桌面上的某一点”。两者之间需要一个几何模型。困难不是三角函数本身,而是每根连杆都有自己的方向,旋转和平移的顺序不能任意交换。

考虑一条串联运动链,输入是关节变量 q=(q1,…,qn)q=(q_1,\ldots,q_n) 与固定连杆参数,输出是末端相对基座的位姿 0Tn{}^0T_n。位姿包括位置和姿态,不能用三个位置坐标替代六维刚体关系。

要素 几何建模中的含义
状态输入 转动关节角或移动关节位移
固定信息 相邻关节轴的相对位置与方向
输出 基座到末端的刚体变换
优化目标 正向运动学本身是求值问题,没有训练损失
前提 刚体连杆、明确的关节连接、统一单位与坐标方向

刚体模型不等于物理系统完全刚硬。它是忽略弹性变形后的近似。制造误差、减速器回差和温度变化都会使理论末端位置与实测位置不同,这些偏差需要标定或更丰富模型处理。

论文建立了用矩阵描述低副机构运动关系的统一记号。它的贡献属于表示方法:把空间机构的连接关系转换为可以系统组合的代数关系。

把“关节角到末端位姿”写清楚后,下一步不是求控制输入,而是选择一套让局部几何关系可以连续相乘的坐标约定。

二、固定坐标约定,再把四个变换乘开

每个 AiA_i 都是4×4齐次变换。左上3×3块表示旋转,右上3×1列表示平移,最后一行为 [0,0,0,1][0,0,0,1]。平移加入齐次坐标后,也能与旋转一起通过矩阵乘法组合。

以下使用现代常见的标准D-H约定:关节 ii 的运动轴为 zi−1z_{i-1},aia_i 是公共法线方向的距离,αi\alpha_i 是相邻轴的扭转角,did_i 和 θi\theta_i 分别是轴向平移与绕轴转角。

Ai=Rz(θi)Tz(di)Tx(ai)Rx(αi),T0n=A1A2⋯An.A_i=R_z(\theta_i)T_z(d_i)T_x(a_i)R_x(\alpha_i),\qquad T_0^n=A_1A_2\cdots A_n.

先把变换方向钉牢:本篇用 Ai=i−1TiA_i={}^{i-1}T_i,把在坐标系 ii 表达的点转换为坐标系 i−1i-1 的坐标,即 i−1p=Ai ip{}^{i-1}p=A_i\,{}^ip。因此 0Tn=A1⋯An{}^0T_n=A_1\cdots A_n;右边的变换先作用于点。令 cθ=cos⁡θic_\theta=\cos\theta_i、sθ=sin⁡θis_\theta=\sin\theta_i,四步乘开得到

Ai=[cθ−sθcαsθsαaicθsθcθcα−cθsαaisθ0sαcαdi0001].A_i=\begin{bmatrix} c_\theta&-s_\theta c_\alpha&s_\theta s_\alpha&a_ic_\theta\\ s_\theta&c_\theta c_\alpha&-c_\theta s_\alpha&a_is_\theta\\ 0&s_\alpha&c_\alpha&d_i\\ 0&0&0&1 \end{bmatrix}.

右列为什么是 (aicos⁡θi,aisin⁡θi,di)(a_i\cos\theta_i,a_i\sin\theta_i,d_i),而不是 (ai,0,di)(a_i,0,d_i)?因为沿局部 xx 的位移还要经过绕 zz 的旋转。原创教学检查:取 θi=90∘,ai=2,di=1,αi=0\theta_i=90^\circ,a_i=2,d_i=1,\alpha_i=0,局部原点映到 (0,2,1)(0,2,1),局部点 (1,0,0)(1,0,0) 映到 (0,3,1)(0,3,1)。若程序给出 (2,1,1)(2,1,1),通常把平移放到了错误坐标系。逆变换则为 [R⊤,−R⊤t;0,1][R^\top,-R^\top t;0,1],不是简单把三个平移数字变号。

转动关节通常把 θi\theta_i 作为变量,其余参数固定;移动关节通常把 did_i 作为变量。这里的“固定”是相对当前机构设计与标定值而言,并不意味着它们没有估计误差。

为什么只需要四个参数?任意两个坐标系的关系一般需要六个自由度,但D-H并不允许随意选择两个系:坐标轴按照相邻关节轴及其公共法线建立,利用了机构结构。减少参数来源于约定,不是减少真实机构的空间自由度。

矩阵写对只解决一节连杆;把它放进关节循环时,还要保证变量、零位与相乘方向在整条链上保持一致。先用两连杆算例检查这一点,再看证据到底覆盖了什么。

三、沿运动链实现递推,并用两连杆查错

输入:每个关节类型、a、alpha、d、theta,以及当前关节变量q
T = 单位齐次矩阵
按基座到末端的顺序遍历关节i:
    若为转动关节,将qi与角度零偏组合成theta_i
    若为移动关节,将qi与位移零偏组合成d_i
    Ai = Rz(theta_i) * Tz(d_i) * Tx(a_i) * Rx(alpha_i)
    T = T * Ai
输出:T,以及需要时保存的所有中间连杆变换

这段伪代码是教学实现。标准D-H和改进D-H使用不同的坐标附着及变换顺序,不能把其中一种参数表塞进另一种代码。判断约定是否一致,应检查关节轴、索引和变换方向,而不能只看变量名相同。

设两根连杆长度都为1,两个关节均绕垂直纸面的轴旋转。忽略基座和工具偏移,末端位置为:

x=cos⁡q1+cos⁡(q1+q2),y=sin⁡q1+sin⁡(q1+q2).x=\cos q_1+\cos(q_1+q_2),\quad y=\sin q_1+\sin(q_1+q_2).

取 q1=90∘,q2=−90∘q_1=90^\circ,q_2=-90^\circ,第一根连杆向上,第二根相对第一根向右转90度,所以末端为 (1,1)(1,1)。第二项用的是角度之和,而非单独的 q2q_2,因为第二关节角描述相对运动。

这个例子还说明两个不同问题:正向运动学给定角度求位置;逆运动学给定位置找角度。相同位置可能对应肘上与肘下构型,D-H只提供方程,并不替你选择逆解分支。

下面先用图检查局部平移随坐标轴旋转这一具体操作,再分清这个教学检验与1955年原文机构例子的证据地位。

四、读图检验矩阵方向,再核对原文证据

D–H 手算:平移必须跟着局部坐标轴转;这张图把正文的 90° 例子投影到 xy 平面,两点的高度都为 1
原创教学图:本文手算与几何示意;核对相关原文。非原论文图,非实验数据。

读图:这张图把正文的 90° 例子投影到 xy 平面,两点的高度都为 1。局部 x 轴已经指向世界 y,故沿局部 x 再走一步应增加世界 y;不能把平移列直接当作世界 x 位移。

原摘要确认包含两个空间机构应用例子,但这不是现代意义上的训练集或机器人成功率实验。

原版全文与两个机构原图仍未取得;本篇展开的是现代标准 D-H 教学矩阵,不能把手算例子当作 1955 年原实验。

原摘要关于记号不足的讨论。 作者试图补足完整运动学描述;不能据此判断所有既有记号都不可用。

原摘要关于矩阵代数的说明。 机构关系可统一组织成矩阵方程;不意味着逆运动学必有唯一闭式解。

原摘要说明两个空间机构例子。 方法不是只针对平面链条;例子的具体参数、图号和误差尚未核实。

现代齐次变换的直接代数检验。 给定约定可验证正向求值;不是原论文硬件实验结果。

这类奠基表示论文的证据重点是表达范围、特殊几何情况与等价性,训练步数和随机种子不适用。原文两个空间机构示例的具体设置与数值尚未核实。

局部矩阵和两连杆算例都通过,只能排除一类实现错误;真实机构的标定、闭链约束与变形仍在这个表示的保证之外。

五、从理想刚体走向标定与闭环约束

相邻轴平行、重合或相交时,坐标选择可能不唯一。不同参数表可以描述同一机构,但参数随几何变化的连续性可能较差。因此用于数值标定时,表示紧凑并不自动意味着条件数良好。

另一个常见错误是混淆主动运动与坐标变换。记号 TabT_a^b 应先明确究竟把哪一坐标系的向量映到哪一坐标系。最直接的检查是拿一个已知点,通过变换后再乘逆变换,看是否回到原点,同时检查旋转块满足正交性且行列式为1。

对闭链机构,沿不同链条抵达同一刚体得到的变换必须一致,因而还需要闭环约束。对柔性机械臂、齿隙和接触变形,单一刚体运动链只能描述理想几何,不能预测实际负载下的偏移。

六、追问:两条运动链到达同一工具时,怎样检查闭环几何是否一致?

两条运动链到达同一工具时,怎样检查闭环几何是否一致?

参考答案:设两条链按相同方向计算出 TaT_a、TbT_b,都是工具坐标到基座坐标的变换。闭环一致要求 Ta=TbT_a=T_b,等价于残差变换 E=Ta−1Tb=IE=T_a^{-1}T_b=I。只比较平移列会漏掉姿态不一致;若还未统一变换方向,相乘更没有这个含义。这是用Modern Robotics的下标与参照系讲法展开正文闭链约束的教学检查,不是1955年新增实验。

七、沿几何表示继续走向速度与动力学

  • 模块组合:任务速度控制从位姿对关节变量求导,新增的是任务速度到关节速度的映射;几何表本身并未给出控制律。
  • 平行路线:指数积表示用关节轴与指数映射组织正运动学,比较的是表示约定,不是D-H之后必然出现的同一套参数。
  • 模块组合:递推逆动力学在几何和运动之外加入质量、惯量与受力,回答实现给定运动需要多少力矩。

八、自测与参考答案

问题1:为什么D-H只有四个参数,却没有丢掉必要的相邻连杆信息?

参考答案:它不是描述任意给定的两个坐标系,而是按照关节轴结构选择坐标系。选择约定消除了部分任意性,留下描述相邻轴关系和关节运动的参数。若坐标系未按该规则建立,四参数形式未必适用。

问题2:两个程序使用同一张参数表却得到不同末端位置,首先应该检查什么?

参考答案:先检查标准与改进D-H、变换方向、角度单位、轴索引及基座/工具偏移。不要立即归因于浮点误差。用单关节与两连杆可手算情形逐项验证,可以定位是约定不同还是计算错误。

问题3:正向运动学完全正确,末端仍偏了5毫米,是否说明论文方法失效?

参考答案:不一定。代码可能准确计算了理想模型,但实际连杆长度、零位和工具坐标有误,或负载导致变形。应比较测量与模型假设,先标定,再判断是否需要弹性模型;几何求值准确与硬件定位准确是两层结论。