1. 机器人运动学基础:刚体空间描述、齐次变换矩阵、DH参数建模法详解

大家好,我是你们的老朋友。今天咱们来啃机器人运动学这块硬骨头。说实话,我刚入行那会儿,觉得运动学就是一堆矩阵乘法,枯燥得很。直到有一次在产线上调试六轴机器人,发现末端执行器怎么都对不准工件,折腾了两天,最后发现是坐标系定义出了偏差——从那以后,我再也不敢小看这些基础了。

运动学是什么?说白了,就是研究机器人怎么动、动到哪里去的问题。你给每个关节一个角度,末端执行器会跑到什么位置?反过来,你想让末端去抓个杯子,每个关节该转多少度?前者叫正运动学,后者叫逆运动学。今天咱们先把正运动学的底子打牢。

1.1 刚体在空间中的描述

机器人手臂的每个连杆,都可以看作一个刚体。刚体在三维空间里有几个自由度?六个。三个位置(x, y, z),三个姿态(绕x、y、z轴的旋转)。

描述位置很简单,一个3x1的向量就搞定。但描述姿态就有点讲究了。我个人习惯用旋转矩阵,因为它最直观,也最好跟后面的齐次变换矩阵衔接。

核心概念:一个刚体在空间中的位姿 = 位置向量 + 姿态矩阵。姿态矩阵是一个3x3的正交矩阵,它的三个列向量分别代表刚体自身坐标系的x、y、z轴在参考坐标系下的方向。

举个例子,假设有个坐标系{B},它相对于参考坐标系{A}的姿态用旋转矩阵 ARB 表示。那么{B}中一个点P,在{A}中的坐标就是:

^A P = ^A R_B * ^B P + ^A P_B

这里 APB 是{B}的原点在{A}中的位置。嗯,这里要注意,旋转矩阵的乘法不满足交换律,先转后移和先移后转,结果完全不一样。我在项目中就吃过这个亏,当时写代码时把顺序搞反了,仿真看着没问题,一上真机就撞限位。

1.2 齐次变换矩阵

刚才那个公式写起来有点啰嗦,每次都要写旋转加平移。有没有更简洁的方式?有,齐次变换矩阵就是干这个的。

我们把3x3的旋转矩阵和3x1的平移向量,塞进一个4x4的矩阵里:

| R   P |
| 0   1 |

这样,一个4x4的齐次变换矩阵 T,就同时包含了旋转和平移信息。点P的坐标变换就变成了:

^A P_h = ^A T_B * ^B P_h

其中 AP_h 和 BP_h 是齐次坐标,就是在原来的三维坐标后面加个1。

我的小技巧:齐次变换矩阵的逆矩阵,不需要真的去求逆。因为旋转矩阵的逆就是它的转置,平移部分也只需要做个变换。公式是:

T^(-1) = | R^T   -R^T * P |
          | 0      1        |

这个在代码里能省不少计算量。

你想想看,有了齐次变换矩阵,我们就可以把机器人的一系列运动,表示成矩阵的连乘。比如从基座到末端,中间经过关节1、关节2……每个关节的变换矩阵乘起来,就是末端相对于基座的位姿。这就是正运动学的核心思想。

1.3 DH参数建模法

好了,现在问题来了:每个关节的变换矩阵怎么定义?总不能每次都手算吧?Denavit和Hartenberg这两位老前辈,在1955年提出了一套标准方法,就是DH参数法。

DH参数法用四个参数来描述相邻两个连杆之间的变换关系:

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

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

T_i = Rot(x, α_{i-1}) * Trans(x, a_{i-1}) * Rot(z, θ_i) * Trans(z, d_i)

展开后就是:

| cosθ_i   -sinθ_i   0   a_{i-1} |
| sinθ_i*cosα_{i-1}  cosθ_i*cosα_{i-1}  -sinα_{i-1}  -d_i*sinα_{i-1} |
| sinθ_i*sinα_{i-1}  cosθ_i*sinα_{i-1}   cosα_{i-1}   d_i*cosα_{i-1} |
| 0          0          0   1 |

避坑指南:我曾经在建立六轴机器人DH参数时,把a和d搞反了。结果仿真出来的运动轨迹完全不对,末端执行器直接飞到天上去。后来逐行检查才发现,标准DH和改进DH的坐标系定义顺序不一样。标准DH是把坐标系建在连杆的前端,改进DH建在后端。用之前一定要搞清楚你用的是哪种。

建立DH参数表的步骤,我总结了一下:

  1. 确定关节轴:画出机器人的所有关节轴线,标出z轴方向(沿关节旋转或移动方向)。
  2. 建立坐标系:每个关节建立一个坐标系。x轴沿相邻z轴的公垂线方向。
  3. 填写参数:按照上面的表格,逐一确定a、α、d、θ四个参数。
  4. 验证:用已知的位姿(比如机器人处于零位时)检查变换矩阵是否正确。

举个例子,一个简单的两连杆平面机器人:

连杆1:a1 = L1, α1 = 0, d1 = 0, θ1 = 变量
连杆2:a2 = L2, α2 = 0, d2 = 0, θ2 = 变量

那么从基座到末端的变换矩阵就是 T = T1 * T2。乘出来之后,末端的位置就是:

x = L1*cosθ1 + L2*cos(θ1+θ2)
y = L1*sinθ1 + L2*sin(θ1+θ2)

你看,这就是正运动学的解析解。对于更复杂的六轴机器人,原理完全一样,只是矩阵乘法更繁琐一些。不过现在有各种数学库,比如Eigen、NumPy,几行代码就能算出来。

总结一下今天的内容:

  • 刚体位姿 = 位置 + 姿态,用旋转矩阵描述姿态
  • 齐次变换矩阵把旋转和平移统一成4x4矩阵,方便连乘
  • DH参数法用四个参数标准化了相邻连杆的变换关系
  • 正运动学就是把这些变换矩阵乘起来,得到末端位姿

下一章,咱们会深入讲逆运动学,也就是怎么根据末端位姿反推关节角度。那才是真正考验算法功底的地方。到时候我会分享一个我在项目里用过的迭代求解方法,保证实用。

今天就到这儿。记住,运动学是机器人控制的基石,基础不牢,地动山摇。回去把DH参数表多练几遍,找个六轴机器人的手册,自己建一遍模型,比看十遍书都管用。