想象一下,你正和朋友一起搭一座乐高机器人。两个人各拿一本示意图:你说“先转三十度再插上去”,朋友坚持“插上之后再拧角度”。图纸画法完全不同,你们对着同一堆积木吵得不可开交。这时你俩终于达成协议:从今天起,每两块积木的连接说明都统一写成四个数字——“伸出多远、歪斜几度、垫高几许、旋转多少”。只要这四个数不变,谁照着搭,结果都一模一样。这就是DH参数法的灵魂。 机器人世界里的机械臂,就是由一根根金属“积木”(连杆)和一个个电机“关节”串起来的。1955年,Denavit和Hartenberg两位学者发明了这套标准化“搭积木语言”:只需四个参数——连杆长度 \(a\)、连杆扭转 \(\alpha\)、关节距离 \(d\)、关节角度 \(\theta\)——就能精确描述相邻两块“积木”之间怎么连接。有了这套语言,工程师可以把每一段关系写成矩阵,再连乘起来,轻松算出机械臂末端的手在哪儿、朝哪个方向;反过来推每个关节转多少,就是逆运动学。从汽车工厂的六轴焊接臂到手术机器人,DH参数法都是机器人运动学的地基。这篇文章,就带你用搭乐高的直觉,读懂机器人的“内部地图”。

岗位关联

掌握DH参数法,你就握住了机器人的“通用语言”——它是机器人算法工程师做运动规划、仿真与标定的基本功,也是通往高级机器人控制的第一把钥匙。

目录
  1. 可视化演示
  2. DH参数起源
  3. 四个核心参数
  4. 坐标系建立
  5. 变换矩阵
  6. 正运动学求解
  7. 逆运动学分析
  8. 工程应用实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

分步展示DH参数坐标系建立、齐次变换矩阵推导与多关节机器人正向运动学求解过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

步骤1:DH坐标系建立 Zi轴沿关节i旋转方向 Xi轴沿公垂线指向下一关节 a_i, α_i, d_i, θ_i 四个参数描述相邻坐标系变换关系。

DH参数起源

想象一下这样的场景:你和朋友合伙搭乐高机器人,你习惯“先转三十度再插上”,朋友却坚持“插上之后才拧角度”。图纸各画一套,两个人对着同一个机器人吵得不可开交。直到有一天你们达成共识:从今天起,每一块积木的连接说明书都统一写成“伸出多远—歪斜几度—垫高几许—旋转多少”四个数字。世界一下子清净了。

机器人学也经历了同样的“混战”。20世纪50年代,机械臂开始走进工厂,每个团队都用自己的方式描述连杆位置,文档之间很难对接。1955年,Denavit和Hartenberg发表了那篇里程碑论文,提出一套标准化连杆参数表示法:用四个参数唯一确定相邻两个关节坐标系之间的位姿关系。从此,描述机械臂就像填写统一格式的乐高说明书,任何团队拿到图纸都能复现同一台机器。

这套方法的精髓是把机械臂拆成一段段“连杆”和一个个“关节”,在每个关节处固定一个坐标系。四个参数——连杆长度 \(a\)、连杆扭转 \(\alpha\)、关节距离 \(d\)、关节角度 \(\theta\)——恰好决定了相邻两个坐标系如何相对放置。于是,每个关节都被浓缩成一个数学公式,整条手臂变成一串可以计算的“坐标转换器”。

有了统一说明书,团队不再为“你的图纸还是我的图纸”内耗。任何两块积木之间的连接,都被锁进四个数字的标准化描述里。DH参数法在机器人圈的地位,就相当于那本大家都认可的统一乐高手册——简单、通用、几十年不过时。

Tii−1=Ai(θi,di,ai,αi)\displaystyle T_i^{i-1} = A_i(\theta_i, d_i, a_i, \alpha_i)
这个式子的意思是:相邻两个关节坐标系之间的位置和朝向,完全由括号里这四个DH参数决定。改一个数字,机械臂的“脸”就变了。
  1. 变换矩阵符号\(T_i^{i-1}\) 读作“第 \(i\) 个坐标系相对第 \(i-1\) 个坐标系”,它是一个 \(4\times4\) 的坐标转换器,把机械臂上某点的坐标从一个关节换算到上一个关节。
    Tii−1T_i^{i-1}
  2. 连杆算子\(A_i\) 是第 \(i\) 段连杆对应的变换算子,像乐高说明书上的一块“积木卡片”,封装了这一段积木的全部连接信息。
    AiA_i
  3. 四个参数\((\theta_i, d_i, a_i, \alpha_i)\) 正是DH四参数,它们按固定顺序参与运算,任何顺序颠倒都会得到错误的位姿。
    (θi,di,ai,αi)(\theta_i, d_i, a_i, \alpha_i)
  4. 等号的含义该式描述了“相邻坐标系的关系完全由四个数字锁死”。你看,整个公式没有一个多余的符号,这就是标准化语言的简洁力量。
    Tii−1=Ai(θi,di,ai,αi)\displaystyle T_i^{i-1} = A_i(\theta_i, d_i, a_i, \alpha_i)

四个核心参数

拿起一块积木,想把它装到前一块上面。你心里默默回答四个问题:第一,它要向前伸出多长?第二,装上去后要不要歪着脖子?第三,它和前一块之间要垫多高?第四,它自己还要转多少度?这四个答案写在纸上,别人就能100%还原你的动作。这就是DH四参数给你的“物理手感”。

数学家把这四个问题翻译成了四个符号:连杆长度 \(a\)、连杆扭转 \(\alpha\)、关节距离 \(d\)、关节角度 \(\theta\)。其中 \(a\) 像积木“伸出去的距离”,\(\alpha\) 像积木“歪脖子的角度”,\(d\) 像两块积木之间“垫块的高度”,\(\theta\) 像积木“转角的度数”。它们共同构成从第 \(i-1\) 个关节坐标系走到第 \(i\) 个坐标系的两段平移和两段旋转。

标准DH定义更精确:\(\theta_i\) 是绕 \(z_{i-1}\) 轴从 \(x_{i-1}\) 轴旋转到 \(x_i\) 轴的角度;\(d_i\) 是沿 \(z_{i-1}\) 轴从 \(x_{i-1}\) 轴到 \(x_i\) 轴的距离;\(a_i\) 是沿 \(x_i\) 轴从 \(z_{i-1}\) 轴到 \(z_i\) 轴的距离;\(\alpha_i\) 是绕 \(x_i\) 轴从 \(z_{i-1}\) 轴旋转到 \(z_i\) 轴的角度。一句话:\(a\) 和 \(\alpha\) 描述“连杆本身长什么样”,\(d\) 和 \(\theta\) 描述“关节怎么动”。

这四条“组合拳”就像乐高说明书上的四步标准动作:转一下、垫一下、伸一下、歪一下。顺序不能乱,每一下都有固定的对象。理解了它们在空间几何中的含义,后面所有公式都只是把这四步精确地“算出来”而已。

Ai=Rot⁡(zi−1,θi)⋅Trans⁡(zi−1,di)⋅Trans⁡(xi,ai)⋅Rot⁡(xi,αi)\displaystyle A_i = \operatorname{Rot}(z_{i-1}, \theta_i) \cdot \operatorname{Trans}(z_{i-1}, d_i) \cdot \operatorname{Trans}(x_i, a_i) \cdot \operatorname{Rot}(x_i, \alpha_i)
这个式子把四个DH参数翻译成四个基本动作:转、垫、伸、歪。动作顺序从左到右,像乐高说明书上的四步安装指令。
  1. 绕z转θ\(\operatorname{Rot}(z_{i-1}, \theta_i)\) 描述“关节转动”——沿着前一个坐标系 \(i-1\) 的 \(z\) 轴旋转关节角 \(\theta_i\),相当于拧动积木的转轴。
    Rot⁡(zi−1,θi)\displaystyle \operatorname{Rot}(z_{i-1}, \theta_i)
  2. 沿z移d\(\operatorname{Trans}(z_{i-1}, d_i)\) 描述“垫高或缩回”——沿着同一个 \(z\) 轴平移 \(d_i\) 距离,相当于在积木之间塞入不同厚度的垫片。
    Trans⁡(zi−1,di)\displaystyle \operatorname{Trans}(z_{i-1}, d_i)
  3. 沿x移a\(\operatorname{Trans}(x_i, a_i)\) 描述“向前伸臂”——沿着新坐标系 \(i\) 的 \(x\) 轴平移连杆长度 \(a_i\),相当于把积木往前伸出。
    Trans⁡(xi,ai)\displaystyle \operatorname{Trans}(x_i, a_i)
  4. 绕x扭转α\(\operatorname{Rot}(x_i, \alpha_i)\) 描述“歪脖子”——绕新的 \(x_i\) 轴扭转角度 \(\alpha_i\),相当于把积木斜着插紧。
    Rot⁡(xi,αi)\displaystyle \operatorname{Rot}(x_i, \alpha_i)

坐标系建立

搭积木前,你得先定义清楚“前”和“上”。对一块楔形乐高,你说“往前装”,到底往哪边?DH法做了一件很聪明的事:给每个关节贴一张坐标标签,规定 \(z\) 轴沿着关节的转动轴,\(x\) 轴沿着两根相邻转轴之间的“最近连线”,\(y\) 轴按右手定则补齐。标签贴法全世界统一,谁来了都不会搞混。

具体规则是这样的:先把坐标系的 \(z\) 轴放在关节轴上;然后观察相邻两个关节轴 \(z_{i-1}\) 和 \(z_i\),它们大多是空间中既不平行也不相交的“异面直线”,在几何上存在一条唯一的公垂线(同时垂直于两条直线的最短连线),就让 \(x_i\) 轴沿着这条公垂线、指向 \(z_i\) 那一侧;最后用右手定则 \(y_i = z_i \times x_i\) 补上 \(y\) 轴。

这套规则的巧妙之处在于:\(a_i\) 和 \(\alpha_i\) 正好“隐身”在坐标系的几何关系里——\(z_{i-1}\) 与 \(z_i\) 的公垂线长度就是 \(a_i\),两轴夹角就是 \(\alpha_i\)。原点设在 \(x_i\) 轴与 \(z_i\) 轴的交点。基座坐标系记为第0号,末端工具坐标系记为第 \(n\) 号,中间每个关节对应一个编号,像乐高工厂给每块积木喷上的序列号。

给积木贴“坐标标签”不再是个人风格问题,而是有严格考试答案的:先找两根转轴的最短距离,把 \(x\) 标签贴在那条最短连线上,再用右手定则划出 \(y\) 标签。所有人都贴同一个位置,机械臂的“坐标系地图”才是唯一的。

ai=dist⁡(zi−1,zi),αi=∠(zi−1,zi)\displaystyle a_i = \operatorname{dist}(z_{i-1}, z_i), \qquad \alpha_i = \angle(z_{i-1}, z_i)
这个式子告诉我们:连杆长度 \(a\) 和扭转角 \(\alpha\) 不是凭空挑出来的,而是由两根关节轴的几何关系唯一决定。
  1. 公垂线距离\(\operatorname{dist}(z_{i-1}, z_i)\) 是两关节轴之间的最短距离,数值上等于连杆长度 \(a_i\),且方向沿 \(x_i\) 轴正向。
    dist⁡(zi−1,zi)=ai\displaystyle \operatorname{dist}(z_{i-1}, z_i) = a_i
  2. 空间夹角\(\angle(z_{i-1}, z_i)\) 是两轴之间的空间夹角,绕 \(x_i\) 轴测量,数值上等于连杆扭转 \(\alpha_i\)。
    ∠(zi−1,zi)=αi\displaystyle \angle(z_{i-1}, z_i) = \alpha_i
  3. 异面直线公垂线空间中两条不平行也不相交的直线,存在唯一一条公垂线同时垂直于它们,这就是 \(x_i\) 轴存在的几何依据。
    xi⊥zi−1,xi⊥zi\displaystyle x_i \perp z_{i-1}, \quad x_i \perp z_i
  4. 右手定则补y\(y_i = z_i \times x_i\) 由向量叉乘给出,保证每个坐标系的 \(x\)、\(y\)、\(z\) 三轴构成标准右手系。
    yi=zi×xi\displaystyle y_i = z_i \times x_i

变换矩阵

每块积木上都贴了一张“转换纸条”,正面写着四步动作,背面是一个 \(4\times4\) 的数表。想知道末端积木相对底座在哪,就把从底座到末端的所有纸条按顺序叠乘。千万不要拿错顺序——先放底座那张,再放中间那张,最后才是手那张。

把第2节的四次基本变换代入并整理,就得到DH法最核心的公式——相邻坐标系的齐次变换矩阵。它把“转、垫、伸、歪”四个动作融进一个矩阵:

若关节是旋转关节,矩阵里的 \(\theta_i\) 是变量;若是移动关节,\(d_i\) 是变量;其余参数在机械臂设计定型后就是常数。整条手臂的末端变换等于这些矩阵按顺序连乘。每个变换矩阵就像一张乐高“转换纸条”,把四步动作打包成一个黑盒。工程师不必时刻盯着里面的三角函数,只需要正确调用它——就像你不需要重学几何也能拼好积木。

Tii−1=[cos⁡θi−sin⁡θicos⁡αisin⁡θisin⁡αiaicos⁡θisin⁡θicos⁡θicos⁡αi−cos⁡θisin⁡αiaisin⁡θi0sin⁡αicos⁡αidi0001]T_i^{i-1} =\begin{bmatrix}\cos\theta_i & -\sin\theta_i\cos\alpha_i & \sin\theta_i\sin\alpha_i & a_i\cos\theta_i\\\sin\theta_i & \cos\theta_i\cos\alpha_i & -\cos\theta_i\sin\alpha_i & a_i\sin\theta_i\\0 & \sin\alpha_i & \cos\alpha_i & d_i\\0 & 0 & 0 & 1\end{bmatrix}
这张“数表”是整篇文章的心脏:每一行、每一列都有几何含义,把旋转和平移统一成一次矩阵乘法。
  1. 姿态旋转块左上角 \(3\times3\) 矩阵由 \(\theta_i\) 和 \(\alpha_i\) 混合构成,负责描述坐标系 \(i\) 相对坐标系 \(i-1\) 的姿态旋转。
    R=[cos⁡θi−sin⁡θicos⁡αisin⁡θisin⁡αisin⁡θicos⁡θicos⁡αi−cos⁡θisin⁡αi0sin⁡αicos⁡αi]R = \begin{bmatrix} \cos\theta_i & -\sin\theta_i\cos\alpha_i & \sin\theta_i\sin\alpha_i \\ \sin\theta_i & \cos\theta_i\cos\alpha_i & -\cos\theta_i\sin\alpha_i \\ 0 & \sin\alpha_i & \cos\alpha_i \end{bmatrix}
  2. 位置平移列右上角 \(3\times1\) 向量存放坐标系 \(i\) 的原点在坐标系 \(i-1\) 中的位置,由 \(a_i\) 和 \(d_i\) 贡献。
    p=[aicos⁡θiaisin⁡θidi]\boldsymbol{p} = \begin{bmatrix} a_i\cos\theta_i \\ a_i\sin\theta_i \\ d_i \end{bmatrix}
  3. 第三行特殊结构第三行前两列为0,第三、四列为 \(\sin\alpha_i\)、\(\cos\alpha_i\),体现绕 \(x\) 轴扭转 \(\alpha_i\) 对姿态的影响。
    [0sin⁡αicos⁡αidi]\begin{bmatrix} 0 & \sin\alpha_i & \cos\alpha_i & d_i \end{bmatrix}
  4. 齐次底行最后一行 \([0\ \ 0\ \ 0\ \ 1]\) 是齐次坐标的“缩放因子占位”,有了它,旋转和平移才能统一到一次矩阵乘法里。
    [0001]\begin{bmatrix} 0 & 0 & 0 & 1 \end{bmatrix}

正运动学求解

你照着说明书从底座一块一块往手上搭,搭完全程,末端那块积木落在桌上哪个位置、指向哪个方向,自然就知道了。正运动学就是这个“顺着搭”的过程:已知每个关节转了多少,求手在哪里。

标准做法分三步:第一步,填一张DH参数表,把每个关节的 \(a\)、\(\alpha\)、\(d\)、\(\theta\) 一行行写清楚,就像列乐高零件清单;第二步,把每一行参数带入变换矩阵公式,写出每个 \(T_i^{i-1}\);第三步,把矩阵从左到右连乘,得到末端相对基座的位姿 \(T_n^0\)。以常见的六轴机械臂为例,末端位姿就是六张“转换纸条”的乘积:

拿到 \(T_6^0\) 后,左上 \(3\times3\) 块是旋转矩阵,可用来提取姿态角;右上 \(3\times1\) 列就是手腕位置坐标。仿真、离线编程、轨迹规划都会反复调用这段“从角度到位姿”的映射。正运动学就是“按图施工”:每一步都由DH四参数严格规定,最后一块积木的空间位置透明可算。这也是为什么工业界敢先在虚拟仿真里验证动作——因为正解公式和真实几何严格一致。

T60=T10 T21 T32 T43 T54 T65\displaystyle T_6^0 = T_1^0 \, T_2^1 \, T_3^2 \, T_4^3 \, T_5^4 \, T_6^5
这个式子说:从底座到末端,六个关节各自贡献一个变换矩阵,按编号顺序乘在一起,结果就是手的精确位置和朝向。
  1. 末端位姿矩阵\(T_6^0\) 是工具坐标系 \(\{6\}\) 相对基座坐标系 \(\{0\}\) 的位姿,既包含末端位置,也包含末端朝向。
    T60T_6^0
  2. 相邻矩阵链\(T_1^0, T_2^1, \ldots, T_6^5\) 依次表示“第1关节相对底座”、“第2关节相对第1关节”……“第6关节相对第5关节”,一环扣一环。
    T10 T21 T32 T43 T54 T65\displaystyle T_1^0 \, T_2^1 \, T_3^2 \, T_4^3 \, T_5^4 \, T_6^5
  3. 连乘顺序矩阵按关节索引从小到大连乘,顺序严格固定;一旦交换顺序,得到的是另一条完全不存在的“幻影手臂”位姿。
    TabTcd≠TcdTab(a≠c 时一般不等)\displaystyle T_a^b T_c^d \neq T_c^d T_a^b \quad (a\neq c\text{ 时一般不等})
  4. 末行检查最终 \(T_6^0\) 的最后一行仍为 \([0,0,0,1]\),乘积是合法齐次变换矩阵,可以直接提取位置和姿态。
    [0001]\begin{bmatrix} 0 & 0 & 0 & 1 \end{bmatrix}

逆运动学分析

现在把剧本反过来:你想让乐高机器人的手抓住桌上的水杯,却不能直接把手挪过去——你只能拧动肩、肘、腕这些关节。于是要倒着推算:每个关节各转多少度,手才能刚好落在杯子上?你很快就意识到,可能有几种姿势都能碰到杯子,比如“直臂够”和“弯腰够”。逆运动学就是这种“倒推关节角”的过程。

数学上,正运动学是函数 \(f(\boldsymbol{\theta}) = \boldsymbol{p}\),逆运动学则是已知末端位置 \(\boldsymbol{p}\) 和姿态 \(R\),反解关节角 \(\boldsymbol{\theta}\)。难点在于:解可能不存在、可能不唯一、还可能有无穷多组。目标点必须在机械臂的工作空间内才有解;同一个末端位姿常常对应多组关节角(比如肘在左还是肘在右);而冗余机械臂(自由度超过6)则存在无数种摆放方式。

求解方法分两大类:解析法要求机械臂满足特定几何条件,例如Pieper准则——相邻三轴交于一点,此时六轴臂的逆解可以写成封闭代数式,速度快、精度高;数值法则用牛顿-拉夫森迭代或雅可比伪逆,对任意结构都通用,但需要好的初值,可能陷入局部最优或奇异位形。

逆运动学就像“倒放乐高搭建视频”:只看到最后一帧手的姿态,却要猜每一步怎么拧。猜法不止一种,聪明的工程师会结合“手臂别撞东西”“姿势别太怪”等约束,挑一个最稳妥的姿势执行。

f(θ)=pdesired,θ=f−1(pdesired)\displaystyle f(\boldsymbol{\theta}) = \boldsymbol{p}_{\text{desired}}, \qquad \boldsymbol{\theta} = f^{-1}(\boldsymbol{p}_{\text{desired}})
这个式子把逆运动学概括为一个“反函数”问题:正着算函数 \(f\),反着解关节角 \(\boldsymbol{\theta}\)。但这个“反函数”往往一对多,要挑合理解。
  1. 正运动学映射\(f(\boldsymbol{\theta})\) 是把一组关节角 \(\boldsymbol{\theta}\) 映射到末端位置向量 \(\boldsymbol{p}\) 的函数,前面几节算的就是它。
    f(θ)\displaystyle f(\boldsymbol{\theta})
  2. 期望位置\(\boldsymbol{p}_{\text{desired}}\) 是希望末端到达的目标坐标,比如“水杯在桌面上的三维坐标”。
    pdesired\displaystyle \boldsymbol{p}_{\text{desired}}
  3. 逆映射符号\(f^{-1}\) 表示“反推关节角”的逆映射,它不像普通函数的反函数那样单值,而通常是一对多的关系。
    f−1(pdesired)\displaystyle f^{-1}(\boldsymbol{p}_{\text{desired}})
  4. 多解与约束工程中会额外加上关节限位、避碰、姿态偏好等约束,再在众多候选解中挑出唯一合理的那个。
    θ=arg⁡min⁡θ∥f(θ)−pdesired∥2+约束项\displaystyle \boldsymbol{\theta} = \arg\min_{\boldsymbol{\theta}} \| f(\boldsymbol{\theta}) - \boldsymbol{p}_{\text{desired}} \|^2 + \text{约束项}

工程应用实践

工厂里的机械臂实际上是“自动搭积木机”,但它有个现实问题:搭上几万次之后,积木可能磨小了一点,说明书却没有更新,手抓零件的误差就越攒越大。怎么破?定期“量尺寸、改说明书”——这就是工程中的运动学标定。

工程实践中,DH参数有三个关键用途:一是正运动学用于实时显示末端位姿、做碰撞检测和可视化;二是逆运动学用于轨迹规划,把目标点变成关节角的运动序列;三是标定,利用外部测量设备实测末端位置,反过来修正DH参数中的结构误差。

标定通常这样做:让机械臂走一组标定点,用激光跟踪仪或视觉系统测出末端实际位置,再与DH模型预测位置对比。这里的偏差既来自连杆长度误差,也来自扭转角误差和关节零点偏移。通过最小化所有标定点上预测与实测的偏差平方和,就能辨识出真实的参数误差:

标定就是给乐高机器人“重新量尺寸”:积木旧了、变形了,把新尺寸写回说明书,机械臂就重新精准了。DH参数法不仅是纸上公式,更是贯穿机器人出厂、调试、维护全生命周期的基础设施——它让“自动搭积木机”日复一日地稳、准、快。

min⁡Δξ∑k=1N∥pksim−pkmeas∥2\displaystyle \min_{\Delta\boldsymbol{\xi}} \sum_{k=1}^{N} \left\| \boldsymbol{p}_k^{\text{sim}} - \boldsymbol{p}_k^{\text{meas}} \right\|^2
这个式子是标定的“评分公式”:让说明书预测的位置,尽可能接近激光测出来的真实位置。偏差平方和越小,说明这本说明书越接近现实。
  1. 误差向量\(\Delta\boldsymbol{\xi}\) 是所有DH参数微小误差的集合,例如各连杆长度误差、扭转角误差和关节零点偏移。
    Δξ\Delta\boldsymbol{\xi}
  2. 模型预测位置\(\boldsymbol{p}_k^{\text{sim}}\) 是第 \(k\) 个标定点上,由当前DH模型计算的末端位置——“说明书说它应该在这”。
    pksim\displaystyle \boldsymbol{p}_k^{\text{sim}}
  3. 实测真实位置\(\boldsymbol{p}_k^{\text{meas}}\) 是第 \(k\) 个标定点上由测量设备得到的真实末端位置——“尺子说它实际在这”。
    pkmeas\displaystyle \boldsymbol{p}_k^{\text{meas}}
  4. 平方和最小化外层 \(\min\) 表示不断调整误差参数,让“说明书预测”与“现实测量”在全部 \(N\) 个点上的总偏差最小。
    min⁡Δξ∑k=1N∥pksim−pkmeas∥2\displaystyle \min_{\Delta\boldsymbol{\xi}} \sum_{k=1}^{N} \left\| \boldsymbol{p}_k^{\text{sim}} - \boldsymbol{p}_k^{\text{meas}} \right\|^2

AI 应用场景

工业机械臂的离线轨迹规划

阶段:运动规划与仿真验证

解决的问题:传统示教编程需要人工拖拽机械臂逐点记录路径,换产时停机好几天;人工示教还难以保证姿态平滑与避障合理。基于DH参数的正逆运动学模型,让工程师在虚拟环境里直接规划末端轨迹,再自动换算成关节角序列,大幅缩短部署时间。

具体案例:某汽车焊装车间的一台六轴点焊机器人要完成128个焊点。工程师导入工件CAD模型,基于DH模型为每个焊点调用逆运动学求关节角,并在仿真中校验无碰撞。整个换产从3天缩短到4小时,焊点位置误差低于0.6mm。

手术机器人运动学标定

阶段:参数辨识与精度优化

解决的问题:微创手术机器人结构紧凑、装配误差敏感,直接使用理论DH参数会导致末端偏移达到毫米级,这在手术中完全不可接受。借助DH标定方法,用外部测量设备采集末端位置,以模型预测与实测的残差最小化为目标,优化出真实的 \(a\)、\(\alpha\)、\(d\)、\(\theta\) 参数。

具体案例:某手术机器人研发团队用激光跟踪仪采集了100组末端位姿,完成DH参数辨识后,末端定位误差从2.3mm降至0.4mm,达到临床使用的精度门槛。

Python 演示

python39 行
import numpy as np  def dh_matrix(a, alpha, d, theta):    """根据DH四参数构造相邻坐标系变换矩阵"""    ct, st = np.cos(theta), np.sin(theta)    ca, sa = np.cos(alpha), np.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]    ])  def forward_kinematics(dh_params):    """把各个关节的DH参数拼成矩阵并依次连乘"""    T = np.eye(4)    for a, alpha, d, theta in dh_params:        T = T @ dh_matrix(a, alpha, d, theta)    return T  def main():    # 三段式机械臂: 腰部旋转 + 大臂 + 小臂    dh_params = [        (0, np.pi / 2, 0.3, np.pi / 6),        (0.6, 0, 0.0, np.pi / 4),        (0.5, 0, 0.0, np.pi / 5),    ]    T_end = forward_kinematics(dh_params)    pos = T_end[:3, 3]    print("末端位置: ({:.3f}, {:.3f}, {:.3f})".format(*pos))    print("末端旋转矩阵:")    print(T_end[:3, :3])  if __name__ == "__main__":    main()
目的:用Python实现DH正运动学——输入每个关节的四个DH参数,输出机械臂末端的精确位置和姿态矩阵。
  1. def dh_matrix(a, alpha, d, theta):定义DH四参数的变换矩阵构造器,是全文核心矩阵公式的代码化身。
  2. ct, st = np.cos(theta), np.sin(theta)提前算好三角函数,避免在矩阵字面量里重复计算。
  3. T = np.eye(4)初始化4×4单位矩阵,作为矩阵连乘的“起点底座”。
  4. T = T @ dh_matrix(...)把当前矩阵与下一关节矩阵相乘,这就是“转换纸条依次叠乘”。
  5. pos = T_end[:3, 3]取出矩阵右上角的3×1平移列,即末端位置坐标。

常见误区

误区很多初学者以为移动关节没有关节角,所以在填DH参数表时直接把移动关节的θ写成0或者留空,甚至跳过这个参数。

正解DH模型里每个关节都定义完整的一组 \((a, \alpha, d, \theta)\)。旋转关节以θ为变量、移动关节以d为变量,但另一个参数依然存在,只是固定为常量。跳过或留空都会导致变换矩阵少一块,末端位置完全算错。就像搭积木时每一块连接都要回答四个问题,不能因为“这块不会转”就不回答“转了多少度”——答案可以是固定的0度。

为何常见:因为旋转关节给人印象最深的就是“转动角度”,而移动关节的θ不变化,容易被误认为不存在。

误区新手在做正运动学连乘时觉得“反正都是乘,先乘哪个都一样”,于是把矩阵顺序打乱,结果得到错误的末端位姿。

正解矩阵乘法不满足交换律,\(A \times B\) 与 \(B \times A\) 通常完全不同。DH变换矩阵必须严格按“从基座到末端”的关节索引顺序连乘。这就像搭乐高不能先搭第三层再搭第一层——顺序错了,积木就悬空了。

为何常见:小学算术里数字乘法交换律太根深蒂固,人们习惯性以为“乘法都可以换位置”。

误区看到 \(\alpha\) 和 \(\theta\) 都是角度,以为两个角都是绕同一个轴转,于是把DH矩阵中的旋转方向搞混。

正解\(\theta\) 是绕前一个坐标系的 \(z_{i-1}\) 轴旋转,\(\alpha\) 是绕新坐标系的 \(x_i\) 轴扭转。一个管“关节转动”,一个管“连杆歪斜”,旋转轴完全不同。就好比乐高里“拧连接栓”和“掰弯连接杆”是两个不同动作,不能混为一谈。

为何常见:四个参数中两个是长度、两个是角度,缩写又都是希腊字母,记混旋转轴是常见错因。

误区只要给了一个末端位姿,就一定能算出一组唯一的关节角。

正解逆解可能无解(目标超出工作空间)、多解(肘上/肘下、腕翻转)、甚至无穷解(冗余机械臂)。实际工程必须结合关节限位、避障、姿态偏好等约束来挑选最优解。就像伸手够杯子,可以直臂够、弯腰够、踮脚够,每种姿势都是解,但要选最舒服不撞墙的那个。

为何常见:正运动学是“角度到位姿”的确定映射,容易让人以为反方向也是唯一确定的。

误区机械臂末端不准时,初学者第一反应是“关节角零点没调好”,于是只调θ,忽略其他参数误差。

正解末端误差由 \(a\)、\(\alpha\)、\(d\)、\(\theta\)(零点)四个参数的误差共同贡献。尤其连杆长度误差和扭转误差在远距离处会被几何放大,专业标定必须同时辨识全部DH参数。就像一本乐高图纸,如果积木本身尺寸印错了,你光改“角度”那栏,依然拼不出精准的模型。

为何常见:关节角是唯一时时变化的量,人们容易把一切误差归咎于“看起来最活跃”的那个参数。

面试题

Q1. DH参数法中,描述相邻两关节轴之间夹角的是哪个参数?

单选题 · easy

  • A.连杆长度a
  • B.连杆扭转α← 正确答案
  • C.关节距离d
  • D.关节角度θ

答案:B。连杆扭转α定义的是相邻两个关节轴 \(z_{i-1}\) 与 \(z_i\) 的空间夹角,绕新的x轴测量。a是两轴的最短距离,d是沿z轴的平移量,θ是绕z轴的旋转角。好比乐高积木“歪脖子”的程度由α决定。

Q2. 在标准DH模型中,旋转关节的变量是哪个参数?

单选题 · easy

  • A.连杆长度a
  • B.连杆扭转α
  • C.关节角度θ← 正确答案
  • D.关节距离d

答案:C。旋转关节通过电机改变的是关节角θ,所以θ是变量;d是移动关节的变量,而a和α由机械臂结构决定、通常是常量。就像拧乐高转轴时,变的只有“旋转角度”这一栏。

Q3. 齐次变换矩阵的维度是多少?

单选题 · easy

  • A.二行二列的方阵
  • B.三行三列的方阵
  • C.四行四列的方阵← 正确答案
  • D.六行六列的方阵

答案:C。DH变换矩阵是4×4齐次矩阵,最后一行固定为[0,0,0,1]。它把三维旋转和平移统一到一次矩阵乘法中。就像一张乐高“转换纸条”恰好有16个格子,能同时记下“方向”和“位置”。

Q4. 正运动学求解的数学本质是:

单选题 · mid

  • A.多个变换矩阵求逆
  • B.多个变换矩阵连乘← 正确答案
  • C.单个矩阵做转置
  • D.多个矩阵逐元素相加

答案:B。正运动学把每个关节的DH矩阵按顺序连乘,得到末端位姿。求逆是逆运动学或反向变换的工具,转置和逐元素加和与位姿合成无关。这就像把一路上的乐高“转换纸条”按顺序叠起来。

Q5. 标准DH法中,x_i轴的方向通常取为:

单选题 · mid

  • A.沿关节i的旋转轴方向
  • B.沿z_{i-1}和z_i的公垂线方向← 正确答案
  • C.沿竖直向下的重力方向
  • D.沿连杆末端的外法线方向

答案:B。x_i轴沿z_{i-1}与z_i的公垂线方向,这是坐标系建立规则的核心。z轴才沿关节轴方向;重力和外法线与DH定义无关。好比乐高标签中“前后”方向由两根转轴的最短连线决定。

Q6. 六轴机械臂相邻三轴交于一点时,可用什么方法封闭求解逆运动学?

单选题 · mid

  • A.使用Pieper准则求解← 正确答案
  • B.使用牛顿法迭代求解
  • C.使用梯度下降迭代求解
  • D.使用蒙特卡洛随机采样

答案:A。Pieper准则指出,当六轴臂相邻三轴交于一点时(大多数工业六轴臂都满足),逆运动学可写成封闭代数式,快速精确。牛顿法、梯度下降和蒙特卡洛属于数值或随机方法,通用但速度慢、需要初值。

Q7. 下列哪些属于DH四参数的组成部分?

多选题 · mid

  • A.确定坐标系的连杆长度← 正确答案
  • B.描述连杆扭曲的扭转角← 正确答案
  • C.关联关节运动的旋转角← 正确答案
  • D.实测末端的直线速度

答案:ABC。DH四参数是连杆长度a、连杆扭转α、关节距离d、关节角度θ。末端速度属于运动学中的速度分析范畴,不是DH参数。就像乐高说明书四个数字里,不会包含“末端积木速度”这一项。

Q8. 逆运动学求解可能遇到哪些困难?

多选题 · hard

  • A.目标点超出工作空间导致无解← 正确答案
  • B.同一个末端位姿对应多组关节角← 正确答案
  • C.每个关节角必然有且仅有一个解
  • D.奇异位形附近雅可比矩阵病态← 正确答案

答案:ABD。逆运动学无解(目标不可达)、多解(肘上肘下)、奇异位形数值不稳定都是典型困难。C的说法是理想化误解——事实上逆解常常不唯一。如同一个乐高姿势往往有多种搭法,且某些极限角度会让计算“卡壳”。

Q9. 关于DH参数标定,下列说法正确的是:

多选题 · extreme

  • A.只需修正θ参数就能消除全部误差
  • B.用实测末端位置优化DH参数← 正确答案
  • C.标定后减小模型与实机的偏差← 正确答案
  • D.标定过程完全无需测量设备

答案:BC。标定用外部测量设备采集末端真实位置,以模型预测与实测的残差为目标优化DH参数,从而减小模型与实际机械臂的偏差。A只修正θ无法消除a、α、d的误差,D没有测量就无法辨识参数。就像改乐高说明书不能只改角度,还要拿尺子量才行。

Q10. 变换矩阵连乘时,如果交换两个相邻关节矩阵的顺序,会发生什么?

单选题 · hard

  • A.结果不变,矩阵乘法可交换
  • B.得到另一组完全不同的末端位姿← 正确答案
  • C.矩阵变成单位矩阵
  • D.矩阵维数变成3×3

答案:B。矩阵乘法不满足交换律,交换相邻关节矩阵会得到完全不同的末端位姿。这是因为旋转和平移的合成与顺序强相关。好比搭乐高先装手臂再装底座与先装底座再装手臂,得到的结构完全不同。