坐标系基础:从像素到机器人的空间映射
做机器视觉的人,天天跟坐标系打交道。我刚开始接触这个领域时,被五个坐标系绕得晕头转向。后来在产线上调试一个抓取项目,因为坐标系搞反了,机器人直接撞上了夹具——嗯,从那以后我再也不敢轻视坐标系了。
说白了,九点标定的本质就是解决一个问题:怎么让相机看到的像素位置,变成机器人能理解的物理位置。这中间需要经过一系列坐标变换,每个坐标系都有自己的“语言”。
1. 像素坐标系 (Pixel Coordinate System)
这是最底层的坐标系。你想想看,相机拍到的图像是什么?是一堆像素点。像素坐标系就是描述这些像素位置的。
- 原点:通常位于图像左上角
- 单位:像素 (pixel)
- 表示:(u, v),u是列方向,v是行方向
- 范围:0 ≤ u ≤ 图像宽度-1,0 ≤ v ≤ 图像高度-1
get_image_size 先拿到图像尺寸,再确认像素坐标是否越界。调试阶段加个 disp_cross 把坐标点画出来,一眼就能看出对不对。
2. 图像坐标系 (Image Coordinate System)
像素坐标虽然直观,但它没有物理意义。图像坐标系就是把像素坐标“翻译”成以毫米为单位的物理坐标。
转换公式很简单:
x = (u - cx) * dx
y = (v - cy) * dy
其中:
- (cx, cy) 是图像主点坐标(单位:像素)
- dx, dy 是每个像素在x、y方向的物理尺寸(单位:mm/pixel)
3. 相机坐标系 (Camera Coordinate System)
相机坐标系是以相机光心为原点的三维坐标系。它把图像坐标系里的二维点,扩展到了三维空间。
| 轴 | 方向 | 说明 |
|---|---|---|
| Xc | 水平向右 | 与图像坐标系x方向一致 |
| Yc | 垂直向下 | 与图像坐标系y方向一致 |
| Zc | 沿光轴向前 | 指向被拍摄物体 |
这里有个关键概念——小孔成像模型。说白了,就是三维空间里的点,通过光心投影到成像平面上。这个投影关系可以用相机内参矩阵来描述。
4. 世界坐标系 (World Coordinate System)
世界坐标系是用户自定义的参考坐标系。你可以把它放在任何方便的位置。
我个人习惯把世界坐标系原点放在:
- 标定板的第一个角点
- 工作台面的某个固定标记
- 或者干脆跟机器人基坐标系重合
相机坐标系到世界坐标系的变换,就是所谓的外参。它包含旋转矩阵R和平移向量T:
Pw = R * Pc + T
其中Pw是世界坐标,Pc是相机坐标。
5. 机器人坐标系 (Robot Coordinate System)
终于到了最终目标——机器人坐标系。这是机器人自己理解的位置语言。
不同机器人的坐标系定义略有差异:
- 六轴机器人:通常基坐标系Z轴向上,X轴向前
- SCARA机器人:Z轴垂直,XY平面水平
- 协作机器人:跟六轴类似,但可能有自定义偏移
九点标定要做的,就是把世界坐标(或者直接是像素坐标)映射到机器人坐标。这个映射关系,就是标定矩阵。
6. 坐标系之间的变换关系
整个变换链条是这样的:
像素坐标 → 图像坐标 → 相机坐标 → 世界坐标 → 机器人坐标
但在实际九点标定中,我们通常跳过中间步骤,直接建立像素坐标到机器人坐标的映射。为什么可以这样?因为九点标定假设标定平面是刚性的,所有变换可以合并成一个矩阵。
这个矩阵的形式是:
[Xr] [a11 a12 a13] [u]
[Yr] = [a21 a22 a23] [v]
[1 ] [0 0 1 ] [1]
其中(Xr, Yr)是机器人坐标,(u, v)是像素坐标。六个未知数(a11到a23),理论上三个点就能解。但为了精度,我们通常用九个点做最小二乘拟合。
7. 知识体系总览
下面这张图把五个坐标系的关系画清楚了:
8. 实际项目中的坐标系选择
说了这么多理论,回到实际项目。我一般这样选:
- 固定相机(眼在手外):世界坐标系直接跟机器人基坐标系重合。标定一次管一年。
- 移动相机(眼在手上):世界坐标系放在标定板上。每次换夹具可能需要重新标。
- 多相机拼接:每个相机有自己的世界坐标系,再统一到一个全局坐标系。