第一章 机器人运动学基础:位姿描述、齐次变换矩阵与DH参数法

各位同学,大家好。我是这门课的主讲工程师。今天咱们开始第一讲,也是整个轨迹规划的地基——机器人运动学基础

说实话,很多新手一上来就急着写插补代码,结果算出来的轨迹机器人根本走不对。为什么?因为连机器人的“胳膊”在空间里到底怎么摆的都没搞清楚。所以,咱们先把这第一步踩实了。

1.1 位姿描述:机器人到底在哪儿?

要控制机器人,首先得知道它在哪儿朝哪儿。这就是位姿描述要干的事。

位姿 = 位置 + 姿态。

  • 位置:就是空间里的一个点。用三维坐标 (x, y, z) 表示。这个简单,初中几何就学过。
  • 姿态:就是它“脸”朝哪个方向,“头顶”朝哪个方向。这个稍微复杂点,需要用旋转矩阵来描述。

我个人习惯把姿态想象成三个互相垂直的箭头,固定在机器人末端上。这三个箭头相对于世界坐标系的指向,就是姿态。

核心概念:一个刚体在空间中的自由度是6个(3个位置 + 3个姿态)。你想想看,如果只告诉机器人位置,不告诉它姿态,它可能“脸”朝下就把工件怼上去了,那不就出事故了吗?

1.2 齐次变换矩阵:把位置和姿态打包

有了位置和姿态,怎么把它们放在一起方便计算?答案就是齐次变换矩阵

它是一个 4x4 的矩阵:

| R(3x3)   P(3x1) |
| 0 0 0     1     |

左上角 3x3 是旋转矩阵(姿态),右上角 3x1 是位置向量。最后一行是固定的 [0 0 0 1]。

为什么要加这一行?说白了,就是为了把旋转和平移统一成一次矩阵乘法。否则你得先旋转再平移,写两行代码,麻烦不说,还容易出错。

我在项目中遇到过一件事:有个同事用欧拉角算姿态,结果在奇异点附近机器人直接“抽搐”了一下。后来我建议他改用齐次变换矩阵,把姿态用旋转矩阵表示,问题就解决了。因为矩阵运算没有万向锁的问题。

我的小技巧:写代码时,我习惯把齐次变换矩阵定义成一个结构体,包含旋转矩阵 R 和平移向量 P。这样代码可读性高,也方便调试。

1.3 DH参数法:给机器人关节建个“身份证”

好了,现在我们知道怎么描述一个点的位姿了。但机器人有6个关节,每个关节都在动,怎么描述它们之间的关系?

这就轮到 DH参数法 登场了。Denavit 和 Hartenberg 这两位前辈想了个办法:用4个参数,就能唯一确定相邻两个连杆坐标系之间的变换关系。

这4个参数是:

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

嗯,这里要注意:DH参数有两种约定——标准DH和改进DH。区别在于坐标系建在连杆的前端还是后端。我个人习惯用改进DH,因为它在处理树形结构机器人时更直观。

1.4 建立连杆坐标系的步骤

光讲理论不行,咱们来走一遍实际步骤。我以最常见的六轴工业机器人为例:

  1. 找出所有关节轴:画出每个关节的旋转轴(Z轴)。
  2. 确定相邻轴的关系:相邻两个Z轴之间的公垂线,就是X轴的方向。
  3. 确定Y轴:用右手定则,Y = Z × X。
  4. 填写DH参数表:按照上面的表格,把 a、α、d、θ 填进去。

我曾经带过一个实习生,他画坐标系时把Z轴方向搞反了,结果算出来的正运动学全是错的。排查了整整一下午才发现。所以,坐标系方向一定要统一,我建议都用右手系。

避坑指南:我曾经在调试一个焊接机器人时,发现末端轨迹总是偏几毫米。查了半天,原来是DH参数里连杆长度 a 的单位搞错了——图纸上是毫米,我代码里写成了米。这种低级错误,一错就是千倍误差,大家千万注意单位统一。

1.5 从DH参数到齐次变换矩阵

有了DH参数,怎么得到相邻连杆的变换矩阵?公式如下:

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参数代进去,就能得到6个变换矩阵。把它们连乘起来,就是机器人末端相对于基座的位姿。这就是正运动学

在实际项目中,我一般会写一个函数,输入DH参数,输出变换矩阵。然后循环调用6次,就得到末端位姿了。代码大概长这样:

def dh_transform(a, alpha, d, theta):
    ct = cos(theta)
    st = sin(theta)
    ca = cos(alpha)
    sa = sin(alpha)
    
    T = np.array([
        [ct, -st*ca,  st*sa, a*ct],
        [st,  ct*ca, -ct*sa, a*st],
        [0,   sa,     ca,    d],
        [0,   0,      0,     1]
    ])
    return T

这段代码我用了不下百次,从六轴机器人到协作机器人,再到AGV上的机械臂,都能用。说白了,DH参数法就是机器人运动学的“通用语言”。

1.6 本章小结

这一章咱们讲了三个核心概念:

  • 位姿描述:位置+姿态,6个自由度。
  • 齐次变换矩阵:把旋转和平移打包成4x4矩阵,方便计算。
  • DH参数法:用4个参数描述相邻连杆关系,建立整个机器人的运动学模型。

这些是后续所有轨迹规划、插补算法的基础。下一章,咱们会讲正运动学与逆运动学,到时候你会看到,今天学的齐次变换矩阵和DH参数,是怎么让机器人“算”出自己该往哪儿动的。

好,今天就到这儿。有问题随时交流。