第2章:机器人运动学基础

各位工程师朋友,大家好。今天我们来聊聊机器人运动学。说实话,这是整个运动控制加速器课程里最“数学”的一章,但也是后续所有内容的地基。我个人习惯是,先把坐标系搞明白,再去碰那些复杂的控制算法。你想想看,连机器人的手在哪儿都不知道,怎么让它干活?

2.1 坐标变换:让机器人“认识”空间

机器人运动学,说白了就是研究机器人怎么动,而不关心它为什么动。我们只关注位置、姿态、速度这些几何关系。

首先,你得有个坐标系。我刚开始做项目时,犯过一个低级错误:把基坐标系和工具坐标系搞反了。结果机器人一启动,直接往反方向冲过去……嗯,从那以后,我每次上电前都会先检查坐标系定义。

核心概念:坐标变换就是将一个点从一个坐标系“翻译”到另一个坐标系。比如,你拿着一个螺丝刀,螺丝刀尖在工具坐标系下的坐标是(0,0,100),但机器人基座想知道这个点相对于自己的位置,就需要做变换。

常见的变换有两种:

  • 平移变换:坐标系原点移动了,但方向没变。比如你把桌子往右推了1米。
  • 旋转变换:坐标系方向变了,但原点没动。比如你把手机转了个角度。

实际应用中,往往是平移和旋转混在一起。我建议你直接用齐次矩阵来处理,省心省力。

2.2 齐次矩阵:一个矩阵搞定所有

为什么要用齐次矩阵?因为用普通矩阵处理旋转还行,但加上平移就麻烦了。齐次矩阵把旋转和平移塞进一个4x4的矩阵里,一次乘法搞定。

// 齐次矩阵的通用形式
// [ R   t ]
// [ 0   1 ]
// 其中R是3x3旋转矩阵,t是3x1平移向量

// 示例:绕Z轴旋转45度,再沿X轴平移10个单位
double T[4][4] = {
    {cos(45°), -sin(45°), 0, 10},
    {sin(45°),  cos(45°), 0,  0},
    {0,         0,        1,  0},
    {0,         0,        0,  1}
};

我在项目中遇到过一个问题:连续做多次变换时,矩阵乘法的顺序特别容易搞错。记住一个原则:左乘是相对于固定坐标系,右乘是相对于当前坐标系。这个坑我踩过两次,后来干脆在代码里加注释,每次乘之前都写清楚是左乘还是右乘。

小技巧:调试时,可以把齐次矩阵打印出来,检查最后一列是不是平移量,左上角3x3是不是单位正交矩阵。如果发现数值不对,八成是旋转矩阵没归一化。

2.3 正运动学:已知关节角度,求末端位置

正运动学,就是给你每个关节的角度,让你算出机器人手在哪儿。这其实是个“正向”问题,相对简单。

标准做法是:从基座开始,依次乘上每个关节的齐次矩阵。比如一个六轴机器人,就是T0 * T1 * T2 * T3 * T4 * T5,最后得到末端位姿。

// 正运动学伪代码
Matrix4x4 forwardKinematics(double q1, q2, q3, q4, q5, q6) {
    Matrix4x4 T = identity();  // 从基座开始
    T = T * dhTransform(q1, 0, a1, alpha1);  // 关节1
    T = T * dhTransform(q2, 0, a2, alpha2);  // 关节2
    // ... 依次类推
    T = T * dhTransform(q6, 0, a6, alpha6);  // 关节6
    return T;
}

这里有个关键点:DH参数。每个关节有四个参数:θ(关节角)、d(连杆偏距)、a(连杆长度)、α(连杆扭转)。我建议你把这些参数定义成一个结构体,方便复用。

注意:DH参数有两种标准——标准DH和改进DH。它们的坐标系定义不同,千万别混用。我曾经在项目里混用了两种,结果仿真和实际机器人对不上,排查了整整两天。

2.4 逆运动学:已知末端位置,求关节角度

逆运动学就难多了。给你一个目标位置,让你算出每个关节该转多少度。这玩意儿没有通用解法,得看机器人构型。

常见的解法有:

  • 解析法:适合有特殊构型的机器人,比如腕部三个关节轴线交于一点(PIpper准则)。我一般优先用解析法,速度快、精度高。
  • 数值法:比如牛顿-拉夫森迭代。适合通用构型,但可能收敛慢,或者陷入局部最优。
  • 几何法:针对特定构型,比如SCARA机器人,直接用几何关系算。
// 逆运动学(数值法)伪代码
bool inverseKinematics(Matrix4x4 target, double* q) {
    for (int i = 0; i < MAX_ITER; i++) {
        Matrix4x4 current = forwardKinematics(q);
        Matrix4x4 error = target - current;
        if (norm(error) < EPSILON) return true;
        
        // 计算雅可比矩阵
        Matrix J = computeJacobian(q);
        // 用伪逆法更新关节角
        q = q + pinv(J) * error;
    }
    return false;  // 没收敛
}

我个人习惯是,先试试解析法,不行再上数值法。而且数值法一定要设最大迭代次数,不然遇到奇异位形就死循环了。

避坑指南:逆运动学可能有多个解(比如肘部向上或向下),你得根据实际工况选一个。我曾经遇到过机器人突然“翻肘”的情况,就是因为没限制关节范围。后来我在代码里加了关节限位检查,每次求解后都验证一下。

2.5 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图。你可以看到,坐标变换是基础,齐次矩阵是工具,正运动学和逆运动学是应用。三者环环相扣。

机器人运动学知识体系 坐标变换 平移变换 旋转变换 复合变换 齐次矩阵 4x4变换矩阵 旋转+平移合一 左乘/右乘规则 运动学 正运动学 逆运动学 DH参数 核心逻辑 坐标变换 → 齐次矩阵(数学工具)→ 正/逆运动学(应用) 正运动学:关节角 → 末端位姿(唯一解) 逆运动学:末端位姿 → 关节角(多解/无解)

好了,这一章的内容就这些。记住,运动学是机器人控制的“眼睛”,你看不见关节怎么动,就谈不上控制。下一章我们会深入动力学,到时候你会感谢今天打下的基础。


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