第二章:机器人运动学基础——刚体变换、齐次坐标、正运动学与逆运动学
各位同学,大家好。今天我们进入机器人学最核心的地基部分——运动学。说实话,这部分内容看起来有点数学味,但你别被吓到。我在做第一个机械臂项目时,就是因为没搞懂齐次坐标,结果调试了整整三天,最后发现是坐标系搞反了。嗯,从那以后,我对这部分内容就格外上心。
你想想看,人形机器人要抓东西,首先得知道自己的手在哪儿,目标在哪儿。这中间涉及的就是刚体变换和坐标系的转换。说白了,就是给机器人装上一套“GPS导航系统”。
2.1 刚体变换:让机器人知道自己在哪
刚体变换,我习惯叫它“不拆零件的搬家”。一个刚体在空间中运动,它的形状和大小不会变,只是位置和朝向变了。比如你的手掌,从桌面移到胸前,这就是一次刚体变换。
刚体变换包含两部分:
- 旋转——物体在空间中的朝向变化
- 平移——物体在空间中的位置变化
我在项目中遇到过一个问题:两个传感器装在机器人不同位置,它们各自测量到的数据,必须通过刚体变换统一到同一个坐标系下,才能融合使用。否则,数据就是乱的。
核心公式:
一个点P在坐标系{A}中的位置,变换到坐标系{B}中:
P_B = R_AB * P_A + t_AB
其中R_AB是旋转矩阵,t_AB是平移向量。
2.2 齐次坐标:把旋转和平移打包处理
为什么要引入齐次坐标?我刚开始学的时候也觉得多此一举。后来发现,如果不这么做,每次变换都要写一个旋转加一个平移,代码又长又容易出错。齐次坐标的精髓,就是把旋转和平移合并成一个4x4的矩阵。
怎么做的?很简单:
- 把一个三维点(x, y, z)变成四维(x, y, z, 1)
- 把旋转矩阵R和平移向量t拼成一个4x4矩阵
齐次变换矩阵 T = [ R t ]
[ 0 1 ]
这样一来,连续多次变换就变成了矩阵乘法。你想想看,本来要写好几行代码,现在一行搞定。我个人习惯在代码里把所有变换都写成齐次形式,调试起来特别方便。
我的小技巧:在写代码时,把齐次变换矩阵的最后一列单独拿出来检查。如果平移量突然变得很大,八成是旋转矩阵算错了。我曾经因为这个bug排查了一下午。
2.3 正运动学:给定关节角度,求末端位置
正运动学,说白了就是“已知关节怎么动,求手在哪儿”。比如你让人形机器人的肩关节转30度,肘关节转45度,那么手掌最终会在什么位置?这就是正运动学要解决的问题。
对于串联机器人,正运动学的标准方法是DH参数法。我建议你记住这个流程:
- 给每个关节建立坐标系
- 确定DH参数(a, α, d, θ)
- 写出每个关节的齐次变换矩阵
- 把所有矩阵乘起来
T_0n = T_01 * T_12 * T_23 * ... * T_(n-1)n
这个T_0n就是末端在基坐标系下的位姿。我在做六轴机械臂时,就是用这个方法,一行一行矩阵乘下来,最后验证结果跟实际测量一致,那种感觉真的很爽。
注意:DH参数有两种约定——标准DH和改进DH。它们的坐标系建立方式不同,千万别混用。我见过有人把两种混在一起,结果算出来的位置差了十万八千里。
2.4 逆运动学:给定末端位置,求关节角度
逆运动学比正运动学难得多。正运动学是“唯一解”,逆运动学是“多解甚至无解”。比如你要让手碰到桌面上一个点,肩关节和肘关节可以有多种组合方式——这就是多解。
逆运动学的解法主要有两种:
- 解析法——通过几何关系直接推导出公式,速度快,但只适用于特定构型
- 数值法——用迭代逼近的方式求解,通用性强,但计算量大
我个人习惯:如果机器人构型比较规整(比如有相邻关节轴线平行或垂直),优先用解析法。如果构型复杂,再用数值法。数值法我常用的是牛顿-拉夫森迭代。
避坑指南:
我曾经在一个人形机器人项目中,逆运动学算出来的角度让机器人摆出了“反关节”姿势——就是人类做不到的那种。后来发现是忽略了关节限位。所以,算完逆运动学一定要检查每个关节角度是否在物理允许范围内。
2.5 知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了。你顺着箭头看,就能明白运动学到底在讲什么。
2.6 本章小结
运动学是机器人抓取的“语言”。没有它,你连机器人的手在哪儿都不知道,更别提抓东西了。我个人建议你:
- 先把齐次坐标的矩阵乘法练熟,这是基本功
- 正运动学用DH参数法,多算几个例子找感觉
- 逆运动学先掌握解析法,再学数值法
- 每次算完,一定要做物理验证——让机器人实际动一动
好了,这一章就到这里。记住,运动学不难,难的是细心。我在项目里踩过的坑,希望你们都能绕过去。