机器人基础与坐标系变换:从刚体运动到数学表达
各位同学,欢迎来到第二章。上一章我们聊了3D视觉的整体框架,这一章得把数学底子打牢。说实话,很多做视觉的工程师,算法调得挺溜,一碰到手眼标定就卡壳——问题往往就出在坐标系变换上。
我个人习惯,讲变换之前,先让大家理解一个核心问题:机器人为什么要做坐标变换?
你想想看,机器人末端抓着一个工件,相机装在某个固定位置。相机看到的坐标,是相机坐标系下的;机器人要抓取,需要的是机器人基坐标系下的坐标。这两个坐标系之间怎么换算?这就是本章要解决的事。
2.1 刚体变换:位置+姿态
一个刚体在三维空间里,有6个自由度——3个平移,3个旋转。说白了,就是你能把它挪到哪儿,以及它朝哪个方向摆着。
我在项目里遇到过一个问题:一个六轴机器人抓取工件,明明视觉定位的坐标是对的,但抓过去就是偏的。查了半天,发现是旋转部分算错了。所以,位置和姿态,一个都不能少。
核心概念:刚体变换 = 旋转 + 平移。旋转描述"朝向",平移描述"位置"。
2.2 旋转矩阵:最直观的旋转表达
旋转矩阵是一个3×3的正交矩阵,行列式为+1。它把三维空间中的一个向量,旋转到另一个方向。
公式很简单:v' = R · v,其中R是旋转矩阵,v是原向量,v'是旋转后的向量。
旋转矩阵有几个性质,我建议你记住:
- 正交性:RT = R-1,转置等于逆
- 行列式为+1:保证是纯旋转,没有缩放
- 组合性:多次旋转可以连乘,R总 = R3 · R2 · R1
举个例子,绕Z轴旋转θ角的旋转矩阵:
R_z(θ) = [cosθ -sinθ 0]
[sinθ cosθ 0]
[0 0 1]
小技巧:我写代码时,习惯用右手定则判断旋转正方向——拇指指向旋转轴正方向,四指弯曲方向就是正旋转。
2.3 欧拉角:直观但容易踩坑
欧拉角用三个角度表示旋转,比如常见的RPY(Roll-Pitch-Yaw,横滚-俯仰-偏航)。
为什么说它容易踩坑?万向锁。当俯仰角达到±90°时,横滚和偏航会失去一个自由度,变成同一个轴。我曾经在调试一个协作机器人时,就因为欧拉角万向锁,导致机器人姿态突然跳变,差点撞到工件。
欧拉角的另一个问题是顺序依赖。同样的三个角度,按XYZ顺序和ZYX顺序旋转,结果完全不同。所以,用欧拉角一定要明确旋转顺序。
| 表达方式 | 优点 | 缺点 |
|---|---|---|
| 旋转矩阵 | 无奇异性,组合方便 | 9个参数,冗余 |
| 欧拉角 | 直观,3个参数 | 万向锁,顺序依赖 |
| 四元数 | 无奇异性,插值平滑 | 不够直观 |
2.4 四元数:工业界的首选
四元数是一个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。它用4个参数表示旋转,没有奇异性。
为什么工业界偏爱四元数?三个原因:
- 无万向锁:随便你怎么转,不会丢失自由度
- 插值平滑:球面线性插值(SLERP)可以生成平滑的旋转过渡
- 计算高效:比旋转矩阵少一个参数,组合运算也快
四元数转旋转矩阵的公式(单位四元数):
R = [1-2(y²+z²) 2(xy-wz) 2(xz+wy)]
[2(xy+wz) 1-2(x²+z²) 2(yz-wx)]
[2(xz-wy) 2(yz+wx) 1-2(x²+y²)]
避坑指南:我曾经在标定程序里,四元数忘记归一化,结果旋转矩阵不正交,标定结果全错。记住:四元数必须归一化,即 w² + x² + y² + z² = 1。
2.5 齐次变换矩阵:统一平移和旋转
齐次变换矩阵是一个4×4的矩阵,把旋转和平移统一到一个矩阵里:
T = [R t]
[0 1]
其中R是3×3旋转矩阵,t是3×1平移向量。用齐次坐标表示点:P' = T · P,一次矩阵乘法就完成了旋转+平移。
为什么用齐次坐标?因为链式变换方便。比如从相机到机器人基座的变换:
Tbase_to_cam = Tbase_to_endeff · Tendeff_to_cam
这就是手眼标定的核心思想——通过多个变换矩阵的连乘,把相机看到的坐标转换到机器人坐标系下。
2.6 知识体系总览
下面这张图,把本章的核心知识点串起来了。我建议你保存下来,后面学手眼标定时随时回来对照。
2.7 实战建议:怎么选?
说了这么多,到底用哪个?我个人的经验:
- 人机交互界面:用欧拉角,操作员看得懂
- 内部计算:用四元数,稳定高效
- 标定算法:用齐次变换矩阵,链式变换方便
- 可视化调试:用旋转矩阵,直接看数值变化