2. 机器人学基础(上)
各位好,欢迎来到第二章。这一章我们聊聊机器人学里最基础、也最绕不开的东西——刚体变换。说白了,就是搞清楚「一个物体在空间里到底在哪儿、朝哪个方向」。你想想看,如果连这个都说不清楚,那后面的手眼标定、抓取规划根本无从谈起。
我刚开始做机器人视觉那会儿,总觉得这些数学工具是纸上谈兵。直到有一次在产线上调试,机械臂死活抓不准工件,折腾了两天才发现——原来是旋转矩阵用错了顺序。嗯,从那以后我再也不敢小看这些基础概念了。
1. 刚体变换:位置 + 姿态 = 位姿
一个刚体在三维空间里,有6个自由度:3个平移(x, y, z)加上3个旋转(绕哪个轴转多少度)。我们把位置和姿态合在一起,叫做位姿。
核心公式:空间中一点 P,在坐标系 {A} 下的坐标,可以通过旋转矩阵 R 和平移向量 t 变换到坐标系 {B} 下:
P_B = R * P_A + t
其中 R 是 3x3 的旋转矩阵,t 是 3x1 的平移向量。
我个人习惯把位姿想象成「一把尺子加一个指南针」。尺子告诉你多远,指南针告诉你朝向。两者缺一不可。
2. 旋转矩阵:9个数,3个自由度
旋转矩阵 R 是一个 3x3 的正交矩阵,行列式为 +1。它用 9 个数表达了 3 个自由度,所以内部有冗余约束。我见过不少新手直接拿 9 个数去优化,结果矩阵变得不正交了——这就是个坑。
| 特性 | 说明 |
|---|---|
| 正交性 | R^T * R = I,即矩阵的逆等于转置 |
| 行列式 | det(R) = +1,保证是右手系 |
| 组合 | 连续旋转用矩阵乘法:R_total = R2 * R1 |
避坑指南:我曾经在代码里直接对旋转矩阵做线性插值,结果插出来的矩阵行列式不再是 1,导致后续计算全崩。记住:旋转矩阵不能直接插值,要用四元数或轴角。
3. 欧拉角:直观但容易踩坑
欧拉角用三个角度(比如绕 Z 轴转 γ,绕 Y 轴转 β,绕 X 轴转 α)来描述旋转。听起来很直观对吧?但这里有个大坑——万向锁。
当中间轴旋转到 ±90° 时,第一个轴和第三个轴会重合,丢失一个自由度。我在做机械臂逆解时遇到过这个问题,姿态突然跳变,吓得我赶紧换成了四元数。
常用的欧拉角顺序有 ZYX、ZYZ、XYZ 等。不同顺序得到的角度完全不同,所以一定要明确约定。我个人习惯用 ZYX(即先绕 Z,再绕 Y,最后绕 X),因为和大多数工业机器人的约定一致。
小技巧:如果你非要用欧拉角,尽量让中间轴远离 ±90°。如果无法避免,就切换到四元数。
4. 四元数:无奇点,可插值
四元数 q = w + xi + yj + zk,其中 w 是实部,(x, y, z) 是虚部。它用 4 个数表达 3 个自由度,没有奇点,而且可以平滑插值(球面线性插值,SLERP)。
我记得第一次用四元数做姿态平滑时,效果惊艳——机械臂的运动不再有突兀的抖动。从那以后,我所有的姿态计算都优先用四元数。
| 表示方法 | 优点 | 缺点 |
|---|---|---|
| 旋转矩阵 | 直观,容易组合 | 9个数冗余,不能直接插值 |
| 欧拉角 | 直观,3个数 | 万向锁,顺序依赖 |
| 四元数 | 无奇点,可插值,紧凑 | 不够直观,需要转换 |
5. 齐次坐标:把旋转和平移统一起来
齐次坐标的核心思想很简单:把一个 3D 点 (x, y, z) 扩展成 4D 向量 (x, y, z, 1),然后用一个 4x4 的齐次变换矩阵 T 同时表达旋转和平移。
T = [ R t ]
[ 0 1 ]
其中 R 是 3x3 旋转矩阵,t 是 3x1 平移向量。
这样做的好处是:连续变换可以用矩阵乘法串联,非常优雅。比如从基座标到工具坐标的变换:T_base_to_tool = T_base_to_flange * T_flange_to_tool。
为什么用齐次坐标? 因为矩阵乘法可以串联,而串联是机器人运动学的核心。你想想看,从基座标到末端,中间可能经过五六次变换,用齐次矩阵一次乘法搞定。
6. 坐标系定义:基座标、工具、用户、工件
在机器人系统里,我们通常定义以下几个关键坐标系:
- 基座标系 {Base}:固定在机器人底座上,是机器人的参考系。所有运动学计算都基于它。
- 工具坐标系 {Tool}:固定在机器人末端执行器上。抓取时,我们关心的是工具中心点(TCP)的位置。
- 用户坐标系 {User}:由用户自定义,通常和工作台或传送带对齐。方便编程时用相对坐标。
- 工件坐标系 {Object}:固定在工件上。视觉系统检测到的位姿通常就是工件坐标系相对于相机坐标系的变换。
我建议你在项目一开始就画清楚这些坐标系的关系图,否则后面很容易搞混。我曾经见过一个项目,因为基座标和用户坐标系搞反了,机械臂直接往桌子上撞——嗯,那场面挺尴尬的。
7. 实践建议:如何组织你的变换链
在实际项目中,我通常这样组织坐标系:
- 固定基座标:机器人安装好后,基座标就固定了。不要轻易改动。
- 标定工具坐标系:用四点法或六点法标定 TCP。这一步精度直接影响抓取效果。
- 定义用户坐标系:根据工作台或传送带的位置,定义一个方便编程的用户坐标系。
- 视觉检测工件:用相机检测工件位姿,得到工件坐标系相对于相机坐标系的变换。
- 手眼标定:计算相机坐标系到机器人基座标系(或工具坐标系)的变换。这是整个系统的核心。
我的习惯:把所有变换都写成齐次矩阵形式,用代码库(比如 Eigen、OpenCV 的 Rodrigues 函数)统一管理。不要手算,不要混用表示法,否则 debug 到天亮。
好了,这一章的内容就到这里。刚体变换和坐标系定义是机器人视觉的基石,后面的手眼标定、抓取规划都建立在这些概念之上。建议你动手画一画坐标系关系图,写几段代码验证一下变换矩阵的计算——纸上得来终觉浅,绝知此事要躬行。