第二节 机械臂运动学基础:齐次变换矩阵、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参数法 正运动学建模 旋转矩阵 R 平移向量 t 齐次坐标 a (长度) α (扭角) d (偏距) θ (关节角) 矩阵连乘 末端位姿 关节空间→操作空间 目标:建立从关节角度到末端位姿的数学映射

这张图清晰地展示了三个核心概念之间的关系:齐次变换矩阵是基础工具,DH参数法提供了标准化的建模方法,正运动学则是最终的应用。三者环环相扣,缺一不可。

好了,这一节的内容就到这里。记住,运动学是机械臂控制的“语言”,学好了它,你才能和机器人顺畅地“对话”。

可可精品资料库