1. 机器人运动学基础:刚体变换与齐次坐标、DH参数建模法、正运动学与逆运动学求解

各位同学,欢迎来到《STM32机器人运动学标定与参数优化性能调优实战》的第一章。

说实话,做机器人这么多年,我见过太多人一上来就调PID、写控制算法,结果机械臂动起来歪歪扭扭,定位误差大得离谱。为什么?因为运动学基础没打牢。你想想看,连机器人每个关节转到哪、末端执行器在什么位置都算不准,后面的优化全是空中楼阁。

这一章,我们就从最根本的东西讲起。我会结合自己在STM32上做六轴机械臂控制的实际经验,把刚体变换、齐次坐标、DH参数、正逆运动学这些概念,掰开了揉碎了讲清楚。

本章核心目标: 掌握用数学语言描述机器人空间位姿的能力,能够独立完成任意串联机器人的运动学建模与求解。

1.1 刚体变换与齐次坐标——机器人的“空间语言”

机器人运动学,说白了就是研究“谁在哪儿、怎么到那儿去”的问题。刚体变换就是描述这个“谁”和“哪儿”的数学工具。

一个刚体在三维空间里有6个自由度:3个平移(x, y, z)和3个旋转(绕x、y、z轴的角度)。我们用一个4×4的齐次变换矩阵,就能把这6个自由度全部装进去。

我个人习惯把齐次变换矩阵写成这样:

| R(3×3)   T(3×1) |
| 0 0 0     1     |

左上角的3×3是旋转矩阵,右上角的3×1是平移向量。最后一行固定是[0 0 0 1],这是齐次坐标的“身份证”。

为什么要用4×4矩阵而不是3×4?嗯,这里有个关键点:只有4×4矩阵才能通过矩阵乘法把旋转和平移“打包”在一起运算。我在做STM32的矩阵运算库时,专门为4×4矩阵做了硬件加速优化,效果非常明显。

我的经验: 在STM32上做齐次变换运算时,建议用float32类型。double虽然精度高,但计算量翻倍,对实时性影响很大。除非你做精密标定,否则float32完全够用。

1.2 DH参数建模法——串联机器人的“身份证”

DH参数法,是Denavit和Hartenberg两位老先生在1955年提出的。到现在快70年了,依然是机器人运动学建模的黄金标准。

每个关节用4个参数描述:

参数 符号 物理含义 我的理解
连杆长度 ai-1 沿xi-1轴,从zi-1到zi的距离 说白了就是两个关节轴之间的“硬距离”
连杆扭角 αi-1 绕xi-1轴,从zi-1到zi的角度 两个关节轴之间的“扭转程度”
关节距离 di 沿zi轴,从xi-1到xi的距离 相邻连杆沿关节轴的“偏移量”
关节角度 θi 绕zi轴,从xi-1到xi的角度 这就是我们实际控制的电机角度

我曾经在一个六轴协作机器人项目里,因为DH参数表里一个扭角符号写反了,导致正运动学算出来的末端位置差了5厘米。查了整整两天才找到问题。从那以后,我每次建DH模型都会画一张坐标系图,一个一个参数对着检查。

下面这张图是我当年做项目时画的DH坐标系建立流程,现在拿出来给大家参考:

DH参数建模流程 1. 确定关节轴线 2. 建立基坐标系 3. 逐关节建坐标系 4. 提取DH参数 5. 构建变换矩阵 6. 验证与调试 ⚠ 关键提醒: • 坐标系建立时,z轴必须与关节旋转轴重合 • 相邻坐标系之间的变换顺序不能搞反:先绕x转α,再沿x移a,再绕z转θ,最后沿z移d • 我建议每建完一个关节的坐标系,就停下来验证一下x轴方向是否正确

1.3 正运动学求解——从关节空间到笛卡尔空间

正运动学,就是已知每个关节的角度,求末端执行器在空间中的位置和姿态。说白了,就是“我让电机转到这个角度,手应该在哪里”。

对于n自由度的串联机器人,正运动学就是n个齐次变换矩阵的连乘:

T_0n = T_01 × T_12 × T_23 × ... × T_(n-1)n

其中每个T_(i-1)i都是根据DH参数构建的4×4矩阵。

我在STM32上实现正运动学时,最常用的方法是写一个通用的DH变换函数:

void dh_transform(float a, float alpha, float d, float theta, float T[4][4]) {
    float ct = cosf(theta);
    float st = sinf(theta);
    float ca = cosf(alpha);
    float sa = sinf(alpha);
    
    T[0][0] = ct;    T[0][1] = -st*ca; T[0][2] =  st*sa; T[0][3] = a*ct;
    T[1][0] = st;    T[1][1] =  ct*ca; T[1][2] = -ct*sa; T[1][3] = a*st;
    T[2][0] = 0;     T[2][1] =  sa;    T[2][2] =  ca;    T[2][3] = d;
    T[3][0] = 0;     T[3][1] =  0;     T[3][2] =  0;     T[3][3] = 1;
}

注意: 在STM32上使用sinf/cosf时,记得开启FPU硬件浮点运算。如果不开启,软件模拟浮点运算的速度会慢10倍以上,严重影响控制周期。

正运动学计算量是固定的,n个关节就需要n次4×4矩阵乘法。对于六轴机械臂,在STM32F4上跑一次正运动学大约需要15-20微秒,完全满足1kHz控制频率的要求。

1.4 逆运动学求解——从笛卡尔空间回到关节空间

逆运动学就比正运动学麻烦多了。已知末端位姿,求每个关节的角度。说白了就是“手要到这里,电机该怎么转”。

逆运动学有几个特点,我当年踩过不少坑:

  • 多解性: 同一个末端位姿,可能有多种关节角度组合。比如六轴机械臂通常有8组逆解。
  • 奇异性: 在某些位姿下,关节速度会趋于无穷大。比如肘关节伸直时,肩关节的微小转动就会导致末端大幅移动。
  • 无解性: 目标位姿超出了机器人的工作空间。

对于六轴机械臂,逆运动学通常有两种解法:

方法 适用场景 计算量 我的评价
解析法(封闭解) 满足Pieper准则的机器人 小,微秒级 首选,稳定可靠
数值法(迭代法) 任意构型机器人 大,毫秒级 备选,注意收敛性

我个人强烈建议:能用解析法就别用数值法。解析法速度快、精度高、没有收敛问题。大多数工业机器人和协作机器人都满足Pieper准则(三个相邻关节轴交于一点),可以用解析法求解。

避坑指南: 我曾经在一个焊接机器人项目里用了数值法做逆解,结果在奇异位形附近迭代不收敛,导致机器人突然加速,差点撞到工件。后来改成解析法+奇异区域处理,问题彻底解决。

解析法求解逆运动学的一般步骤:

  1. 根据末端位姿矩阵,分离出位置向量和姿态矩阵
  2. 从腕部位置反推前三个关节的角度(肩、肘)
  3. 从姿态矩阵反推后三个关节的角度(腕)
  4. 根据关节限位和避障需求,选择最优解

在STM32上实现时,我建议把逆解函数设计成可配置的,允许用户指定“偏好解”的选择策略。比如“肘部朝上还是朝下”、“腕部翻转还是不翻转”。

1.5 本章小结

运动学是机器人控制的基石。这一章我们覆盖了:

  • 刚体变换与齐次坐标——描述空间位姿的数学语言
  • DH参数建模——串联机器人的标准化建模方法
  • 正运动学——从关节到末端的正向计算
  • 逆运动学——从末端到关节的反向求解

这些内容看起来是纯理论,但每一行代码、每一个公式,最终都会跑在你的STM32上,控制真实的电机转动。我建议你学完这一章后,立刻动手写一个正运动学函数,用你手头的机器人模型验证一下。纸上得来终觉浅,绝知此事要躬行。