2、机械臂运动学基础(上):坐标系与变换(齐次变换矩阵)、DH参数法建立模型

各位同学,欢迎来到运动学基础的上半部分。说实话,很多初学者一上来就被「运动学」三个字吓住了。其实没那么玄乎——你想想看,我们平时用手去拿杯子,大脑是怎么算的?眼睛看到杯子位置,大脑算出肩膀、肘部、手腕该转多少角度,然后肌肉执行。机械臂也是一样的道理,只不过我们用数学来描述这个过程。

我个人习惯把运动学分成两块:正运动学逆运动学。今天我们先啃正运动学这块硬骨头——给你每个关节的角度,算出末端到底在哪儿。说白了,就是建立从「关节空间」到「笛卡尔空间」的映射关系。

2.1 坐标系与空间描述

先问个问题:你怎么描述一个点在空间中的位置?

很简单,三个坐标 (x, y, z) 就搞定了。但机械臂有六个关节,每个关节都有自己的坐标系。我们需要知道这些坐标系之间怎么互相转换。

我在项目中遇到过这样一个坑:现场调试时,机械臂末端明明应该对准工件,结果差了5毫米。查了半天,原来是工具坐标系没标定好。你看,坐标系这东西,差之毫厘谬以千里。

核心概念:描述一个刚体在空间中的位姿,需要位置(3个自由度)和姿态(3个自由度),共6个自由度。

姿态的描述方式有很多种:旋转矩阵、欧拉角、四元数。今天我们先聚焦旋转矩阵,它是理解齐次变换矩阵的基础。

2.2 齐次变换矩阵

齐次变换矩阵,说白了就是一个4×4的矩阵,把旋转和平移打包在一起。为什么是4×4?因为3×3的旋转矩阵只能处理旋转,加上平移就变成非线性了。加一个维度,把问题线性化——这是数学上很漂亮的一个技巧。

它的形式长这样:

| R   P |
| 0   1 |

其中 R 是 3×3 的旋转矩阵,P 是 3×1 的平移向量。最后一行是 [0 0 0 1]。

嗯,这里要注意:齐次变换矩阵的乘法顺序很重要。我记得刚入行时,有一次把 T1 * T2 写成了 T2 * T1,结果仿真出来的轨迹完全乱套。你想想看,先旋转再平移,和先平移再旋转,结果能一样吗?

我的经验:写代码时,我习惯把每个变换矩阵单独定义,然后按顺序相乘。不要试图一步到位,容易出错。调试时打印中间结果,一眼就能看出问题。

2.3 DH参数法——建立模型的利器

好了,现在我们有工具了(齐次变换矩阵),但怎么把它用到机械臂上?总不能每个关节都手动推导吧?

1955年,Denavit 和 Hartenberg 两位老哥提出了一个标准方法——DH参数法。这个方法的核心思想是:用四个参数来描述相邻两个关节坐标系之间的变换关系。

这四个参数分别是:

参数 符号 含义
连杆长度 ai-1 沿 xi-1 轴,从 zi-1 到 zi 的距离
连杆扭角 αi-1 绕 xi-1 轴,从 zi-1 到 zi 的角度
连杆偏距 di 沿 zi 轴,从 xi-1 到 xi 的距离
关节角 θi 绕 zi 轴,从 xi-1 到 xi 的角度

有了这四个参数,相邻坐标系之间的变换矩阵就可以写成标准形式:

T = Rot_x(α) * Trans_x(a) * Rot_z(θ) * Trans_z(d)

展开后就是:

| cosθ   -sinθ   0   a |
| sinθ*cosα  cosθ*cosα  -sinα  -d*sinα |
| sinθ*sinα  cosθ*sinα  cosα   d*cosα |
| 0      0       0   1 |
避坑指南:我曾经在建立六轴机器人模型时,把 DH 参数的符号搞反了。结果正运动学算出来,末端位置在第三象限,实际应该在第一象限。后来花了整整一天才找到问题——α 的正负号定义错了。所以,建立 DH 参数表时,一定要对照机器人实际结构,逐项确认。

2.4 六轴机械臂的DH参数建模

以典型的六轴工业机器人为例,我们建立它的DH参数模型。先画出坐标系,然后填表。

我个人习惯先画一个简图,标出每个关节的 z 轴方向。z 轴沿着关节旋转轴,x 轴沿着公垂线方向。这个步骤看似简单,但很多人在这里栽跟头。

下面我用 SVG 画一个六轴机械臂的坐标系示意图,帮你理清思路:

六轴机械臂坐标系与DH参数示意图 基座 J1 z0 J2 z1 J3 z2 J4 z3 J5 z4 J6 z5 末端 z轴(关节旋转轴) 关节 连杆

有了坐标系,接下来就是填 DH 参数表。以常见的六轴机器人(比如 KUKA、ABB 的典型结构)为例:

关节 i ai-1 αi-1 di θi
1 0 0 d1 θ1
2 a1 -90° 0 θ2
3 a2 0 0 θ3
4 a3 -90° d4 θ4
5 0 90° 0 θ5
6 0 -90° d6 θ6

有了这张表,我们就可以写出每个关节的变换矩阵 T1 到 T6,然后相乘得到末端位姿:

T_06 = T1 * T2 * T3 * T4 * T5 * T6

这个 T_06 就是机械臂末端在基坐标系下的位姿。你给六个关节角度,它就能告诉你末端在哪儿、朝哪个方向。

实用技巧:我写代码时,会把 DH 参数定义成一个结构体数组,然后用循环计算每个变换矩阵。这样代码简洁,也方便调试。如果某个关节是移动关节(比如某些协作机器人),就把 θ 换成 d 作为变量。

2.5 正运动学计算示例

光说不练假把式。我们拿一个具体的例子来算算。

假设某六轴机器人的 DH 参数为:d1=0.3m, a1=0.1m, a2=0.4m, a3=0.05m, d4=0.35m, d6=0.1m。所有关节角度都设为 0°。

你猜末端在哪儿?

当所有关节角为 0 时,机械臂处于「直立」状态。代入公式计算:

T_06 = 
| 1  0  0  a1 + a2 + a3 |
| 0  0  1  d1 + d4 + d6 |
| 0 -1  0  0            |
| 0  0  0  1            |

代入数值:x = 0.1 + 0.4 + 0.05 = 0.55m,y = 0.3 + 0.35 + 0.1 = 0.75m,z = 0。

这个结果对不对?你可以想象一下:所有关节角为 0,机械臂应该是一个「L」形或者「Z」形,末端在 x 正方向和 y 正方向。嗯,跟计算结果吻合。

注意:不同厂家的机器人,DH 参数的定义可能略有差异。有的用标准 DH,有的用改进 DH。我曾经在对接一个国外品牌的机器人时,发现它的 DH 参数表跟我习惯用的不一样,折腾了两天才搞清楚。所以,拿到一台新机器人,第一件事就是确认它的 DH 参数定义方式。

2.6 小结

今天的内容,说白了就是两件事:

  • 齐次变换矩阵——描述坐标系之间关系的数学工具
  • DH参数法——建立机械臂模型的标准化方法

掌握了这两样,正运动学就基本拿下了。你想想看,有了 DH 参数表,写个循环就能算出末端位姿,多简单。

我个人觉得,学习运动学最好的方式就是动手算一遍。拿笔在纸上画坐标系,填 DH 参数,然后写几行代码验证。别怕麻烦,这一步走扎实了,后面的逆运动学、轨迹规划、碰撞检测都会轻松很多。

好,今天就到这儿。记住:坐标系是基础,DH 参数是工具,多练几次就熟了。


专注资料整理