第二节 机械臂运动学基础:齐次变换矩阵、DH参数法、正运动学建模
各位同学,大家好。今天我们来聊聊机械臂运动学里最基础、也最绕不开的几个概念。说实话,我刚入行那会儿,看到一堆矩阵和参数就头疼。但后来发现,这些东西说白了就是一套“翻译工具”——把机械臂每个关节的转动,翻译成末端执行器在空间里的位置和姿态。
好,咱们不绕弯子,直接进入正题。
2.1 齐次变换矩阵:空间里的“坐标翻译官”
想象一下,你站在一个房间里,指着天花板说“那里有个灯”。这个“那里”是相对于你自身的位置。但如果换一个人站在门口,他说的“那里”可能就完全不一样了。机械臂也是这个道理——每个关节都有自己的“小世界”(坐标系),我们需要一个工具,把这些小世界统一起来。
这个工具就是齐次变换矩阵。它长这样:
| R t |
| 0 1 |
其中,R 是一个 3x3 的旋转矩阵,描述姿态;t 是一个 3x1 的平移向量,描述位置。最后一行是 [0 0 0 1],这是齐次坐标的固定格式。
我个人习惯把齐次变换矩阵理解成一个“复合动作”:先旋转,再平移。你在一个坐标系里有一个点,乘以这个矩阵,就得到了它在另一个坐标系里的坐标。
关键点:齐次变换矩阵是可逆的。如果你从坐标系A到坐标系B的变换是 T_AB,那么从B回到A就是 T_BA = inv(T_AB)。这在后面做逆运动学时会频繁用到。
我在项目中遇到过一个问题:两个工程师分别标定了机械臂的基座和末端,结果数据对不上。后来发现,就是齐次变换矩阵的乘法顺序搞反了。记住,矩阵乘法不满足交换律,左乘和右乘结果天差地别。
2.2 DH参数法:给关节“上户口”
有了齐次变换矩阵,理论上我们可以任意定义坐标系。但机械臂有那么多关节,每个关节都随意定义,那不乱套了?
Denavit 和 Hartenberg 这两位前辈想了个办法——用四个参数,就能唯一确定相邻两个关节坐标系之间的变换关系。这四个参数是:
| 参数 | 符号 | 含义 |
|---|---|---|
| 连杆长度 | ai-1 | 沿 Xi-1 轴,从 Zi-1 到 Zi 的距离 |
| 连杆扭角 | αi-1 | 绕 Xi-1 轴,从 Zi-1 到 Zi 的转角 |
| 连杆偏距 | di | 沿 Zi 轴,从 Xi-1 到 Xi 的距离 |
| 关节角 | θi | 绕 Zi 轴,从 Xi-1 到 Xi 的转角 |
你想想看,这四个参数其实非常直观:a 和 α 描述了连杆本身的几何形状,d 和 θ 描述了相邻连杆之间的连接关系。对于旋转关节,θ 是变量;对于移动关节,d 是变量。
一个小技巧:我建议你在建立DH参数表时,先把所有关节的坐标系画出来。画图比死记硬背公式管用得多。我曾经带过一个实习生,他对着公式算了半天算不对,我让他画个草图,五分钟就搞定了。
嗯,这里要注意:DH参数有两种约定——标准DH和改进DH。区别在于坐标系固连在哪个连杆上。我个人习惯用改进DH(也叫Craig版),因为它在处理树形结构或闭链机构时更自然。但如果你做串联机械臂,标准DH也完全够用。关键是,从头到尾只用一种,别混着来。
2.3 正运动学建模:从关节空间到操作空间
正运动学,说白了就是:给定每个关节的角度(或位移),求末端执行器的位姿。
这个过程非常机械(字面意思)。你只需要把每个相邻关节的齐次变换矩阵乘起来:
T_0n = T_01 * T_12 * T_23 * ... * T_(n-1)n
其中 T_0n 就是从基座到末端的总变换矩阵。这个矩阵的左上角 3x3 是末端姿态,右上角 3x1 是末端位置。
举个例子,一个六轴工业机器人,它的正运动学就是六个矩阵连乘。你可能会想,六个 4x4 矩阵乘起来,计算量不小啊。没错,所以实际工程中,我们通常会利用矩阵的稀疏性来优化计算,或者直接用数值方法。
避坑指南:我曾经在调试一台协作机器人时,发现正运动学算出来的位置和实际差了 2 毫米。查了半天,原来是 DH 参数表里一个连杆长度的小数点后第三位写错了。所以,参数标定一定要反复核对,尤其是从图纸或 CAD 模型里提取参数时。
下面我用一个简单的两连杆机械臂来演示正运动学建模过程。假设两个连杆长度分别为 L1 和 L2,关节角为 θ1 和 θ2。
# 伪代码示例
import numpy as np
def dh_transform(a, alpha, d, theta):
"""根据DH参数计算相邻坐标系变换矩阵"""
ct = np.cos(theta)
st = np.sin(theta)
ca = np.cos(alpha)
sa = np.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
# 两连杆机械臂的DH参数(标准DH)
# 连杆1: a=L1, alpha=0, d=0, theta=theta1
# 连杆2: a=L2, alpha=0, d=0, theta=theta2
L1 = 1.0
L2 = 0.8
theta1 = np.radians(30)
theta2 = np.radians(45)
T01 = dh_transform(L1, 0, 0, theta1)
T12 = dh_transform(L2, 0, 0, theta2)
T02 = T01 @ T12 # 正运动学结果
print("末端位置:", T02[:2, 3])
print("末端姿态(旋转矩阵):\n", T02[:2, :2])
运行这段代码,你就能得到末端执行器在基座坐标系下的位置和姿态。是不是很简单?
但实际工程中,机械臂的连杆数远不止两个,而且还有各种复杂的几何关系。这时候,我建议你使用符号计算工具(比如 SymPy)来推导正运动学表达式,而不是手算。手算不仅容易出错,而且效率极低。
核心思想:正运动学是机械臂控制的“前向通道”。无论你后面要做轨迹规划、逆运动学还是动力学控制,正运动学都是基础中的基础。把这个搞扎实了,后面的路就好走了。
最后,我用一张图来总结本章的知识体系。这张图是我自己画的,希望能帮你理清思路。
这张图清晰地展示了三个核心概念之间的关系:齐次变换矩阵是基础工具,DH参数法提供了标准化的建模方法,正运动学则是最终的应用。三者环环相扣,缺一不可。
好了,这一节的内容就到这里。记住,运动学是机械臂控制的“语言”,学好了它,你才能和机器人顺畅地“对话”。