第二章:机器人运动学基础——坐标系与变换、位姿描述、DH参数法

各位同学,大家好。今天咱们来聊聊机器人运动学的基础。说实话,这部分内容看着有点抽象,但它是后续所有编程和调试的根基。我当年刚入行时,也觉得坐标系变换就是一堆数学公式,直到在产线上被一个位姿偏差折腾了整整两天……嗯,从那以后,我再也不敢小看它了。

2.1 坐标系与空间变换

机器人要动,首先得知道“自己在哪”。这就要靠坐标系。

我们常用的坐标系有三种:

  • 世界坐标系:固定在机器人基座上的参考系,所有运动都基于它。
  • 工具坐标系:固定在机器人末端执行器(比如焊枪、夹爪)上,随它一起动。
  • 工件坐标系:固定在被加工工件上,方便编程时直接描述工件上的点。

你想想看,如果焊枪要在一个倾斜的工件上画一条直线,直接在世界坐标系里编程得多麻烦?但如果你把坐标系建在工件上,那就简单了——沿着工件表面走就行。

核心概念:坐标系变换的本质,就是将一个点在一个坐标系下的坐标,换算到另一个坐标系下。说白了,就是“换个角度看问题”。

变换包括平移和旋转。平移好理解,就是沿着X、Y、Z轴移动。旋转呢?绕X轴转叫Roll,绕Y轴转叫Pitch,绕Z轴转叫Yaw。这三个角度合起来,就能描述任意姿态。

我的小习惯:在调试现场,我习惯先用示教器手动把机器人移到目标位置,然后直接读取当前位姿数据。这样比纯计算快得多,也避免了坐标系换算的坑。

2.2 位姿描述:位置 + 姿态

机器人的“位姿”,就是位置和姿态的合称。位置用坐标 (x, y, z) 表示,姿态用欧拉角 (Rx, Ry, Rz) 或四元数表示。

为什么要有两种表示方式?

  • 欧拉角:直观,容易理解。但有个大问题——万向锁。当某个轴转到90度时,另外两个轴会失去自由度,导致姿态突变。
  • 四元数:数学上更稳定,没有万向锁问题。但看着像四个数字 (w, x, y, z),不太直观。

我个人建议:调试时用欧拉角,方便观察和调整;写程序时用四元数,避免姿态跳变。我在一个焊接项目里就吃过亏——用欧拉角做插补,结果焊枪在某个点突然翻转了180度,差点把工件撞废。

避坑指南:我曾经在调试一个六轴机器人时,发现它走到某个位置后姿态突然“抽风”。查了半天,原来是欧拉角表示时,Rx从179度变到了-179度,看似只变了2度,但实际绕了358度。换成四元数就没事了。

2.3 DH参数法:建立机器人运动学模型

DH参数法,全称Denavit-Hartenberg参数法。它是描述机器人连杆之间相对位置和姿态的标准方法。说白了,就是给每个关节建一个坐标系,然后用四个参数把它们串起来。

四个参数分别是:

参数 含义 影响
θ (theta) 关节角 绕Z轴旋转的角度
d 连杆偏距 沿Z轴的平移距离
a 连杆长度 沿X轴的平移距离
α (alpha) 连杆扭角 绕X轴旋转的角度

每个关节对应一组DH参数。有了这些参数,就能算出末端执行器相对于基座的位置和姿态。这就是所谓的“正运动学”。

反过来,知道末端位姿,反推每个关节的角度,就是“逆运动学”。逆运动学比正运动学复杂得多,因为同一个末端位姿可能对应多组关节角度解。

实际应用:在机器人编程时,我们通常只关心末端位姿。至于每个关节怎么转,控制器会自动用逆运动学算出来。但如果你要自己写运动控制算法,或者做离线仿真,那DH参数就是绕不开的基础。

2.4 知识体系总览

下面这张图,是我自己整理的本章知识结构。你可以把它当作一个“地图”,学完后再回来看,会更有感觉。

机器人运动学基础 坐标系与变换 位姿描述 DH参数法 世界坐标系 工具坐标系 工件坐标系 位置 (x,y,z) 姿态 (Rx,Ry,Rz) 四元数表示 关节角 θ 偏距 d 杆长 a 扭角 α 应用:正运动学 → 逆运动学 → 轨迹规划 三者共同构成机器人运动学的基础框架

2.5 代码示例:DH参数正运动学计算

下面是一个简单的Python示例,演示如何用DH参数计算末端位姿。实际项目中,你可能会用更成熟的库,但理解原理很重要。

import numpy as np

def dh_transform(theta, d, a, alpha):
    """
    根据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参数
# 关节1:theta=30°, d=0, a=1, alpha=0
# 关节2:theta=45°, d=0, a=0.8, alpha=0

T1 = dh_transform(np.radians(30), 0, 1, 0)
T2 = dh_transform(np.radians(45), 0, 0.8, 0)

# 末端相对于基座的变换矩阵
T_end = T1 @ T2

print("末端位姿矩阵:")
print(T_end)

调试小技巧:如果你在仿真中看到机器人末端位置和预期不符,先别急着改代码。把每个关节的DH参数单独打印出来,检查θ、d、a、α是否和机器人手册一致。我遇到过好几次,问题出在参数符号上——比如a的正负号搞反了。

好了,这一章的内容就到这里。坐标系、位姿描述、DH参数,这三块是机器人运动学的基石。你想想看,没有坐标系,机器人连自己在哪都不知道;没有位姿描述,它不知道怎么抓东西;没有DH参数,它连怎么动都算不出来。所以,别嫌基础,多练练手,后面学轨迹规划和编程时,你会感谢现在的自己。


公众号:蓝海资料掘金营,微信deep3321