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参数表的步骤,我总结了一下:
- 确定关节轴:画出机器人的所有关节轴线,标出z轴方向(沿关节旋转或移动方向)。
- 建立坐标系:每个关节建立一个坐标系。x轴沿相邻z轴的公垂线方向。
- 填写参数:按照上面的表格,逐一确定a、α、d、θ四个参数。
- 验证:用已知的位姿(比如机器人处于零位时)检查变换矩阵是否正确。
举个例子,一个简单的两连杆平面机器人:
连杆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参数表多练几遍,找个六轴机器人的手册,自己建一遍模型,比看十遍书都管用。