机械臂知识库组装 · 控制 · 开发
图文组装
开发与控制

建模与正逆运动学

从 DH 参数模型到关节角与末端位姿。

建议配合对应视频学习,操作前先阅读本章注意事项。

为保证复现效果,请在资料中心下载最新版本的上位机软件(0.9.3 以上)、RoboDK 驱动脚本(1.1 以上)、API Demo(1.2 以上)。

一、DH参数

建模与正逆运动学 · 配图 1(点击放大)

图片来自于网络,侵删。

现在我们已经熟悉姿态的概念,但上述姿态主要是描述两个坐标系之间关系,那机械臂又如何运动呢?我们还需要了解DH参数、正逆运动学。

问题 答案
在描述多个关节连杆的空间关系时,为什么单纯使用齐次变换矩阵难以直接管理各关节的相对运动? 因为每个关节都有自己的坐标系,若仅依赖齐次变换矩阵,不同关节间的旋转轴与位置偏移很难形成统一规范。引入 Denavit-Hartenberg (DH) 参数就能以标准化方式定义相邻连杆的“旋转 + 平移”,简化整体推导。
为什么要学习正运动学?它的核心目标是什么? 正运动学关心给定关节角度,如何计算末端执行器在基坐标系下的位置与姿态。这是最基础的功能:示教器或控制程序需要知道末端当前在哪个点、朝向如何,才能进一步做路径规划或避障。
已经知道末端在哪里,为何还需要逆运动学? 逆运动学关心给定末端在空间中的目标位姿(坐标 + 姿态),如何求解对应的关节角度。若没有逆运动学,我们就无法指定“让末端移动到某个空间点”并求出关节动作。
DH 参数和正逆运动学是什么关系? DH 参数定义了各关节连杆之间的相对变换(齐次矩阵)。正运动学则基于这些连杆变换逐级相乘得到末端的位姿。逆运动学则逆向利用(或求解)同样的 DH 模型和矩阵来求解每个关节的角度。

1.1 机械臂的基本结构概念

1.1.1 关节(Joint)

在机器人或机械臂的多关节结构中,关节(Joint)是用来连接相邻连杆的机械机构,其作用是允许两段连杆之间产生相对运动。根据运动类型的不同,常见的关节可分为 旋转关节(Revolute Joint) 和 移动关节(Prismatic Joint),如下动画:

旋转关节 移动关节
原理示意图(非实物尺寸,点击放大) 原理示意图(非实物尺寸,点击放大)

1.1.1.1 旋转关节(Revolute Joint)

  1. 定义
    旋转关节允许相邻连杆绕某一固定轴做角度变化,就像一根“铰链”或“轴承”一样,故又称“铰链关节”或“R 关节”(英文里常用 R 表示 Revolute)。
  2. 运动特性
  • 关节的唯一运动自由度是“角度”,通常记作 θ。
  • 在二维示意图中,可以直观看到一个杆臂绕关节转动;在三维空间中,该关节的旋转轴可能是水平、垂直或某个倾斜方向。
  • 一般会有限位(机械或软件),保证关节旋转范围(如 -180° ~ +180°)。
    3. 举例

  • 六轴机械臂中,每个关节大多是旋转关节:像人类手臂的肩、肘、腕关节一样,可以绕各自的转轴旋转。

  • 机器人手指在爪子上的开合关节。
  • 一般六轴机械臂,六个关节都是旋转关节:

    建模与正逆运动学 · 配图 4(点击放大)
    - 甚至对于人型机器人,也基本都是旋转关节(Unitree H1)

    建模与正逆运动学 · 配图 5(点击放大)
    4. 优点 & 应用

  • 适合绝大多数需要灵活“摆动”或“定位”的任务场景,如焊接机器人、喷涂机器人等。

  • 结构相对成熟,伺服电机或减速机可直接驱动关节转动。

1.1.1.2 移动关节(Prismatic Joint)

建模与正逆运动学 · 配图 6(点击放大)

  1. 定义
    移动关节允许相邻连杆沿某个方向做直线滑动或伸缩,因此也叫“滑动关节”或“P 关节”(英文用 P 表示 Prismatic)。
  2. 运动特性
    - 关节的唯一运动自由度是“长度”或“直线位移 d”。
    - 常见结构:一个气缸、液压缸、丝杠,或线性滑轨等,使连杆能在该轴向上移动。
    - 一般也会有限位,如 0~100 mm、0~200 mm 等。
  3. 举例
    - 直线模组:在一条直线导轨上移动的单元,被广泛用于自动化搬运、3D 打印机等。
    - 具有伸缩臂的机械臂,一段能沿中心轴抽拉、改变整体长度。
  4. 优点 & 应用
    - 对需要“平移或伸缩”动作的场合特别直观(例如需要在水平面上快移、或抓取时做线性插入、拔出)。
    - 某些工业场景结合旋转关节与移动关节,可实现更大工作空间,或者简化特定方向的运动控制。
人手 协作机械臂 人型机器人
建模与正逆运动学 · 配图 7(点击放大) 建模与正逆运动学 · 配图 8(点击放大) 建模与正逆运动学 · 配图 9(点击放大)

连杆(Link)在机器人多关节结构中指的是 连接关节与关节之间的刚性构件,它将一个关节传递的运动或力延伸到下一个关节或末端执行器。

  1. 机械臂的骨架
  • 在多关节机器人中,关节和连杆相互交替:关节→连杆→关节→连杆……形成机械臂的基本骨架。连杆不可主动运动,但通过关节的活动获得整体运动能力。
    2. 尺寸与形状

  • 连杆具有固定的长度和几何形状,通常由金属或复合材料制成,确保在高负载、快速运动时具备足够的刚度和强度。

  • 对于机器人运动学建模,常关注连杆的参考长度(在 DH参数 中用 a 等符号描述)。
    3. 坐标系设置

  • 为了分析运动学,每个连杆会在其起始关节或末端关节处定义一个坐标系,并根据不同坐标系间的相对位置与姿态,用齐次变换矩阵或 DH 参数进行描述。

    建模与正逆运动学 · 配图 10(点击放大)
    4. 动力学与负载(扩展概念)

  • 虽然连杆本身只是传递力和运动的构件,但在动力学分析中,需要知道连杆的质量、转动惯量等,以计算运动过程中的力矩、加速度或能耗。

  • 在一般的入门学习中,我们多关注连杆长度、位置关系等几何属性。

    建模与正逆运动学 · 配图 11(点击放大)

1.2 DH 参数的由来与目的

有朋友会问:“我只想知道末端在哪里、要怎么到那里。能不能别让我量一大堆麻烦的数据?为什么非要学DH?”

目标:把整条机械臂拆成“关节‑关节”小段:

  • 核心任务:描述每个关节相对前一个关节的 位姿。
  • 把这些“小段”对应的齐次矩阵连乘 ⇒ 得到整机 正运动学,为轨迹规划、逆运动学打基础。

我们已有武器:齐次变换矩阵

T=[RP 0 0 01]=[r11r12r13x r21r22r23y r31r32r33z 0001]

它一次性打包 旋转 R 与 平移 P。 但难点是:现实中很难直接量出 R 和 P 的全部 12 个数字。

思路转变:量“几何量”替代“量矩阵”

  • 对相邻关节,总能找到四个易测、可重复的几何量
    1. a:两 Z 轴公共垂线长度(沿 X)
    2. α:两 Z 轴绕 X 的夹角
    3. d:当前关节沿自身 Z 的平移量
    4. θ:当前关节绕自身 Z 的旋转角
  • 这四个量 ⇢ 可直接生成齐次矩阵,形成 Denavit–Hartenberg (DH) 参数法。

DH 的核心操作

  1. 放坐标系(遵循 DH 规则)
    - Zi 对准关节轴
    - 公共垂线方向设为 Xi
    - Yi=Zi×Xi
  2. 读取四个参数 (a,α,d,θ)
    - 其它杆件形状、厚度、孔位一律忽略——对位姿链无影响。

为何偏选 DH

  • 简洁:4 个量 → 1 个 4×4 矩阵
  • 复用:换机器人只需重测这 4 个量
  • 通用:教材、工业软件、科研论文广泛采用;“改进 DH 法”依旧同一套路

结论:学 DH 的目的,是用最少、最可靠的几何量,快速搭建整条“位姿骨架”。正 / 逆运动学、动力学分析都建立在这条骨架之上。

1.3 定义DH参数(经典/标准法)

关于 DH 参数的说明:

网络上关于 DH 参数的教程众多,定义方式也不尽相同,常见差异主要在于:

  • 所采用的 坐标系放置规则不同(即经典 DH 与改进 DH 混用)
  • 关节编号与坐标系编号不统一,导致理解混乱

由于目前并没有一个被所有人完全统一接受的“权威标准”,本课程采用林沛群老师的DH 定义方式。

若你在其他资料中看到不同版本的 DH 表达,请不必困惑或争论。只要我们合理放置坐标系,按照统一规则使用四个参数 (a,α,d,θ) 正确构建出齐次变换矩阵,都是可以的。

请把重点放在 建立清晰一致的坐标系、理解四个几何量的意义与作用,细节取舍不必过于纠结。

下面介绍的主要是旋转关节的DH参数。

1.3.1. 放置连杆坐标系(i)

建模与正逆运动学 · 配图 12(点击放大)

图片来自林老师课程。

步骤 操作 目的与要点
①设 Zi 与第i 个关节 旋转轴(或 移动方向)重合 保证关节变量仅影响Zi
②找公共垂线 在Zi−1 与 Zi 之间找最短连线(公垂线,Common Normal),其方向即 Xi 若两Z 轴相交,则令 Xi 通过交点且 ai=0
③得 Yi 右手系:Yi=Zi×Xi 保证Xi,Yi,Zi 正交、右手

下面用一些动画加深理解:

图片来源于网络

动画 解释
原理示意图(非实物尺寸,点击放大) Zi方向与第 i 个关节 旋转轴(或 移动方向)重合(这里是基座关节)
原理示意图(非实物尺寸,点击放大) 对于Base坐标系,X轴的方向是任意的;
对于后续的关节,X轴方向就有限制了(见后文)
原理示意图(非实物尺寸,点击放大) Yi的方向遵循右手准则
原理示意图(非实物尺寸,点击放大) 加入另一个关节,Z的方向和旋转方向一致,Zi 的方向应使得 θi>0 时是 右手法则方向的旋转,即四指指向旋转方向

1.3.2 四个 DH 参数 (ai, αi, di, θi)

参数 测量方向 几何含义
连杆长度ai 沿 Xi 沿Xi轴,Zi−1和Zi之间的距离
扭转角αi 绕 Xi 绕Xi轴,Zi−1 到 Zi 的扭转角,取值 (−π,π],逆时针为正
关节偏移di 沿 Zi−1 沿Zi−1轴,Xi−1和Xi之间的距离;对 移动关节 为关节变量
关节角θi 绕 Zi−1 绕Zi−1轴,Xi−1和Xi之间的夹角,逆时针为正;对 旋转关节 为关节变量
  • 对旋转关节:θi 为变量,di 为常量
  • 对移动关节:di 为变量,θi 为常量(可置 0)
动画 解释
原理示意图(非实物尺寸,点击放大) DH的四个参数从两个关节Z轴的公垂线 (Common normal)定义后产生。公垂线也是两个Z轴之间最短连线
原理示意图(非实物尺寸,点击放大) Xi与公垂线共线,方向从 Zi−1 到 Zi
注意:如图,第二个关节坐标系原点是可以在关节外部的(DH建模考虑的是连杆Link,而不是真实的物理分布)
原理示意图(非实物尺寸,点击放大) 关节偏移di:沿Zi−1轴,Xi−1和Xi之间的距离;
原理示意图(非实物尺寸,点击放大) 关节角θi:绕 Zi−1轴,Xi−1和Xi之间的夹角;
原理示意图(非实物尺寸,点击放大) 连杆长度ai(图中为r):沿Xi轴,Zi−1和Zi之间的距离
原理示意图(非实物尺寸,点击放大) 扭转角αi:绕Xi轴,Zi−1 到 Zi 的扭转角

助记点:

  • Z轴好确定,根据旋转或移动方向即可,那再只要确定X轴即可方便得到DH参数,X轴如何确定?
  • 在为相邻关节放置坐标系时,有两种做法:
  1. 让 上一节坐标系的 Xi−1轴沿公共垂线(common normal);
  2. 让 下一节坐标系的 Xi 轴沿公共垂线。
方案 谁占公共垂线? 对分叉链影响
A Xi−1(上一节) 祖先坐标系的X 只能指向一个后继,若一关节分出多支链,就不能同时对齐多条公共垂线。
B Xi(下一节) 每个子链的Xi 都沿自己与祖先轴的公共垂线,祖先坐标系无需改变,即可挂多个分支。

我们一般选择第 2 种,这样对“分叉链”更高效,因为同一个祖先关节可以向多个子链各自指出一条公共垂线;而若采用第 1 种方案,祖先的 Xi−1轴只能指向其中 1 个子链。
* 末端法兰连杆 Frame{n}

  • 为了简化,通常取Xn取Xn−1同方向
    • 旋转关节:即关节偏移dn=0,关节角θn为任意值(通常选择0)
    • 偏移关节:即关节角度θn=0,关节偏移dn为任意值(通常选择0)

1.3.3 例子

这里举一些常见机械臂例子

表中图示坐标系颜色说明(红蓝标反了):

  • 红色:Z
  • 蓝色:X
  • 绿:Y

R:Revolute(旋转关节)

P:Prismatic(滑动关节)

上述自由度组合是常见结构,部分类型在特定实现中可能会有所不同。

名称 自由度组合 应用方向 图示 DH表
Planar Elbow(平面肘型) R–R 或 R–R–R 教学、二维轨迹仿真 建模与正逆运动学 · 配图 23(点击放大) 建模与正逆运动学 · 配图 24(点击放大)
Elbow Robot(肘型机械臂) R–R–R(3D) 工业搬运、焊接 建模与正逆运动学 · 配图 25(点击放大) 建模与正逆运动学 · 配图 26(点击放大)
Anthropomorphic(类人型) R–R–R–R–R–R 服务、人机协作 建模与正逆运动学 · 配图 27(点击放大) 建模与正逆运动学 · 配图 28(点击放大)
当前机械臂 R–R–R–R–R–R 教学 建模与正逆运动学 · 配图 29(点击放大) 建模与正逆运动学 · 配图 30(点击放大)
SCARA(顺应装配臂) R–R–P 平面装配、电子制造 建模与正逆运动学 · 配图 31(点击放大) 建模与正逆运动学 · 配图 32(点击放大)
CNC Robot(数控机器人) 结构不固定(常为P-P-P) 精密切削、自动加工 建模与正逆运动学 · 配图 33(点击放大) 建模与正逆运动学 · 配图 34(点击放大)

你可能观察到:

  • Anthropomorphic 和当前机械臂的α5存在负数,那它的正负如何定义?

建模与正逆运动学 · 配图 35(点击放大)

  • 因为αi:绕Xi轴,Zi−1 到 Zi 的扭转角,取值 (−π,π],逆时针为正
  • 则α5:绕X5轴,Z4 到 Z5 的扭转角方向为顺时针,所以为负
  • Zi 的方向是沿着关节轴i,也就是有两个方向的选择,根据惯例,Zi方向选择倾向于:

  • 对 旋转关节:Zi 的方向应使得 θi>0 时是 右手法则方向的旋转,即四指指向旋转方向

  • 对 移动关节:Zi 的方向应与 di>0 的平移方向一致。

不过就算你选的方向不按这个原则也没事,只要你的坐标系定义是“自洽”的(剩余几个参数也跟着调整),齐次变换结果就会正确, 但一旦 Z 轴方向变了而其余参数未作相应修改,齐次变换矩阵就会出错。如当前机械臂的例子:

  • 如Z4朝外:q4,q5的扭转角α分别为−90,+90
  • 如Z4朝内:q4,q5的扭转角α分别为90,−90
Z4朝外 Z4朝内
建模与正逆运动学 · 配图 36(点击放大) 建模与正逆运动学 · 配图 37(点击放大)
建模与正逆运动学 · 配图 38(点击放大) 建模与正逆运动学 · 配图 39(点击放大)

可以看到,这个会影响最终的DH参数表,但并不影响你建模计算,只要第四个关节的正角度旋转方向定义也对应的变化了,只要你代码对应变化即可。

课程中我使用的是Z4朝外。

二、正逆运动学

问题 正运动学 (FK) 逆运动学 (IK)
要解决什么? 关节角 → 末端位姿 末端目标位姿 → 关节角
典型场景 示教、仿真、雅可比计算 抓取、焊接、规划、避障
为什么重要 ① 确定当前姿态 ② 可视化轨迹 ① 让末端到目标 ② 生成平滑轨迹

本文只讨论 全旋转关节 (nR) 机械臂,例如 6R 工业机器人。

2.1 正运动学 —— “给角度,算末端”

这里用的是标准 DH。

  1. 建立 DH 表:(ai,αi,di,θi),i=1…n
    对纯旋转关节:di 为常量,θi 为变量。
  2. 单节变换矩阵 i−1!Ti 的推导

标准 DH 把 {i‑1} → {i} 的相对位姿拆成四个 可直接写出 的基本变换(利用我们学过的欧拉角和齐次变换):

顺序 基本操作 矩阵符号 4×4 形式
① 绕Zi−1 旋转 θi Rz(θi) [cθi−sθi00 sθicθi00\0010\0001]
② 沿Zi−1 平移 di Tz(di) [1000\0100\001di\0001]
③ 沿Xi 平移 ai Tx(ai) [100ai\0100\0010\0001]
④ 绕Xi 旋转 αi Rx(αi) [1000\0cαi−sαi0\0sαicαi0\0001]

记号:cθi=cos⁡θi,sθi=sin⁡θi

同理 cαi,sαi。

再连乘四步

i−1!Ti=Rz(θi)Tz(di)Tx(ai)Rx(αi)

逐行乘积(略去中间乘法步骤)得到

i−1!Ti=[cos⁡θi−sin⁡θicos⁡αisin⁡θisin⁡αiaicos⁡θisin⁡θicos⁡θicos⁡αi−cos⁡θisin⁡αiaisin⁡θi0sin⁡αicos⁡αidi0001]

这就是 标准 DH 单节变换矩阵,后续连乘全部 i−1!Ti 即可得到末端对基座的总变换。

  1. 连乘得到总变换

0!Tn=∏i=1ni−1!Ti=0!T11!T2…n−1!Tn

  1. 若有工具偏置

0!TTCP=0!Tnn!Ttool

其中 n!Ttool 为法兰 → 工具 (TCP) 的固定刚性变换。

  1. 提取结果
  • 位置向量 P=[xyz]T → 总矩阵第 1–3 行第 4 列
  • 姿态矩阵 R → 左上 3×3
  1. 代码示例

下载代码正运动学示例,并与robodk仿真结果对比

  1. 工作空间

机器人末端执行器(TCP)在关节限位内 能够到达的所有空间点 的集合。
若还考虑姿态,则称 可达位姿空间 (Task Space)。

建模与正逆运动学 · 配图 40(点击放大)

2.2 逆运动学 —— “给目标,算角度”

2.2.1 常用 IK 求解方法

方法 适用特点 核心要点
几何 / 解析解 轴线排布规则性强(如 6R 球腕) 拆腕点 → 代数 / 三角方程,结果封闭形式,速度快
代数(符号)解 复杂三维链,轴不共面时也可 用 Gröbner、Resultant 消元,代码生成如 IKFast
数值迭代 冗余 or 解析困难 误差函数 + Jacobian 伪逆 / LM → Newton 迭代
优化 / 约束解 同时满足多任务 以任务误差为成本,约束关节限位、碰撞,QP / SQP
学习‑基 / 数据驱动 非结构化机械臂、大量采样 神经网络、GPR 把 IK 当回归;需离线训练

实际工程:能用解析就用解析(最快、无发散)→ 解析不可得再退到数值 / 优化。

2.2.2 通用解析解计算步骤(6R 机械臂为例)

可参考论文,大致步骤如下:

  1. 准备
  • DH 参数 / 机器人几何
  • 目标位姿
    Tgoal=[RP 01]
    2. 分离位置与姿态

  • 若为球形腕,先求腕中心
    pw=P−d6Rz^
    3. 求前 3 轴

  • 解析 θ1,θ2,θ3

  • 得到基座 → 关节 3 的旋转
    0!R3=Rz(θ1)Ry(θ2)Ry(θ3)(示意)
    4. 求后 3 轴

  • 由

    R=0!R33!R6

    可得
    3!R6=(0!R3)TR
    - 从 3!R6 解析 θ4,θ5,θ6
    5. 组合与筛选

  • 关节限位、奇异、碰撞

  • 多解时按代价函数择优

2.2.3 常见逆运动学求解器 IK Solvers

因逆运动学求解复杂,异常情况多,实际求解的时候,我们大多是调库,这里列出常见的求解库:

名称 解法类型 是否开源 语言/平台 多解支持 支持冗余臂 是否带约束 特点 / 备注
IKFast 解析解(Closed-form) 是 C++ / 可绑定 Python 是(完整枚举) 否 否 超快(毫秒级),支持打包成 Python 库,工业用最多
MoveIt! IK Plugins 数值 / 插件式 是 ROS / C++ 取决于插件 是 可配置 插件可用 IKFast、KDL、TRAC-IK 等
TRAC-IK 数值 + 优化 是 C++ / ROS 否(单解,初值相关) 是 是 替代 KDL,更快更稳
KDL (Kinematics and Dynamics Library) 数值牛顿迭代 是 C++ / Python(PyKDL) 否 是 弱 ROS 默认求解器之一,稳定但慢
Pinocchio 数值优化(几何+代数) 是 C++ / Python 否 是 是 快速,适合优化和控制
Robotics Toolbox for Python (RTB) 数值法(LM, QP, GN, NR) 是 Python 否(可手动多初值) 是 QP 支持 教学/研究利器,灵活但默认单解
Modern Robotics Library 解析 + 数值 是 Python / MATLAB / C++ 部分支持 否 弱 Kevin Lynch 教材配套,支持 IK_NR 等方法
Drake 数值优化 + 符号解混合 是 C++ / Python 依赖配置 是 强约束 高级建模与控制系统,MIT 出品
OpenRAVE (非维护) 支持 IKFast 是 C++ / Python 是(IKFast) 否 弱 主要为 IKFast 提供环境
RoboDK IKFast 封装(+ 数值补充) 否(商业) GUI + Python API 是(内置多解) 取决于插件 有限支持 商用软件,适合工业与路径仿真,可导出 Python 脚本
Unity Articulation IK 数值+Heuristic 否(商业/游戏引擎) Unity / C# 否 是 弱 用于游戏/VR仿真
PyBullet IK Solver 数值(Jacobian-based) 是 Python 否 是 轻约束 实时仿真用,精度不高,适合强化学习
V-REP / CoppeliaSim IK 数值 + 分支解 是(基础版) Lua / Python / GUI 可部分配置 是 GUI 设置 图形环境好,教学仿真首选
ROS2 Kinematics Plugins 数值 / 插件式 是 C++ / ROS2 同上 是 支持 ROS2 环境下的默认 IK 系统

“支持冗余臂”:能不能处理自由度 > 任务要求的机器人。

比如:

  • 末端只需要控制 x,y,z + 姿态(6 个变量)
  • 但机器人有 7 个关节(像 KUKA、Franka Panda)

这就叫冗余机器人,有无穷多个解。

支持冗余的求解器:

  • 能找到一个合适的解(可能是最近的、最省力的)
  • 有些还能“挑选”一个更优的解

“支持约束”:能不能考虑限制条件求解。

比如:

  • 关节不能超过最大角度
  • 不想靠近奇异点
  • 要避障,或只允许某些方向

支持约束的求解器:

  • 会在解的过程中自动避开这些“禁区”
  • 适合真实机器人控制或避障任务

场景推荐:

需求场景 推荐求解器
工业机器人控制、实时响应 IKFast、RoboDK
任意结构机器人、教学/研究 Robotics Toolbox (RTB)、Modern Robotics
冗余机械臂、路径优化 TRAC-IK、Pinocchio、Drake
强约束任务(关节限制/避障) IK_QP(RTB)、Drake
强仿真 / 虚拟仿真 PyBullet、CoppeliaSim、Unity Articulation

下载代码RTB逆运动学示例,并与robodk仿真结果对比

注意:在机械臂正前面求解较容易,背面容易失败

阅读位置保存在当前浏览器。更换域名、设备或浏览器后不会自动同步。

输入零件编号、章节名称或问题关键词。