机器人基础与坐标系变换:从刚体运动到数学表达

各位同学,欢迎来到第二章。上一章我们聊了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 知识体系总览

下面这张图,把本章的核心知识点串起来了。我建议你保存下来,后面学手眼标定时随时回来对照。

坐标系变换知识体系 刚体变换 平移 (3自由度) 旋转 (3自由度) 齐次变换矩阵 旋转矩阵 欧拉角 四元数 核心要点 • 刚体变换 = 旋转 + 平移,共6自由度 • 旋转矩阵无奇异性,欧拉角直观但有万向锁 • 四元数是工业首选,必须归一化 • 齐次变换矩阵统一旋转和平移,链式变换的核心工具

2.7 实战建议:怎么选?

说了这么多,到底用哪个?我个人的经验:

  • 人机交互界面:用欧拉角,操作员看得懂
  • 内部计算:用四元数,稳定高效
  • 标定算法:用齐次变换矩阵,链式变换方便
  • 可视化调试:用旋转矩阵,直接看数值变化