【学习笔记】机器人视觉中的三个坐标系:从像素到真实位置的“三级跳”
最近在做视觉相关的项目(YOLO 检测 + 机器人定位),被图像坐标系、相机坐标系、机器人坐标系这三个概念绕了好几天。翻了很多资料,结合自己的手写笔记整理出这篇博客,用自己的方式讲清楚:这三个坐标系分别是什么?它们之间怎么转换?为什么还要做相机标定?
适合和我一样刚入门视觉/机器人方向的同学阅读,公式不多,但每个公式都讲清楚在干嘛。
一、先抛一个问题:YOLO 检测出的框,为什么不能直接拿来用?
假设我们用 YOLO 在画面里检测到一个目标,输出是这样的:
目标框:左上角 (120, 80),右下角 (300, 260)
类别:杯子
置信度:0.92
这个 (120, 80) 是什么单位?——像素。它只告诉我们“杯子在画面的哪个位置”,但机器人真正关心的是:
- 杯子离我多远?
- 在我左前方还是右前方?
- 我机械臂要伸到哪个三维坐标去抓?
像素坐标回答不了这些问题。所以我们需要一条转换链,把“画面里的像素位置”一步步翻译成“机器人坐标系下的真实三维位置”。这条链上有三个关键节点,就是本文要讲的三个坐标系。
二、三个坐标系分别是什么
| 坐标系 | 原点在哪 | 轴的指向 | 单位 | 回答的问题 |
|---|---|---|---|---|
| 图像坐标系 (u, v) | 画面左上角 | u 向右(列),v 向下(行) | 像素 | 目标在图片的哪个像素 |
| 相机坐标系 (Xc, Yc, Zc) | 相机光心 | Zc 向前(沿光轴),Xc 左右,Yc 上下 | 米 | 目标在相机前方的三维位置 |
| 机器人坐标系 (Xr, Yr, Zr) | 机器人本体 | Xr 向前,Yr 向左,Zr 向上 | 米 | 目标相对于机器人在哪里 |
2.1 图像坐标系 (u, v)
这是最“接地气”的一个坐标系:
- 原点
(0, 0)在画面左上角; u轴向右,代表像素的列号;v轴向下,代表像素的行号;- 单位是像素(pixel)。
YOLO、SSD 这些目标检测网络输出的 bounding box 坐标,全部都在这个坐标系下。它只描述“像素在哪里”,不带任何物理尺寸信息。
(0,0) ────────────→ u
│
│ ┌─────────┐
│ │ 目标框 │
│ └─────────┘
▼
v
2.2 相机坐标系 (Xc, Yc, Zc)
把原点搬到相机的光心(镜头中心),三个轴这样定义:
- Zc 轴:沿光轴向前,代表目标离相机的距离(深度);
- Xc 轴:左右方向;
- Yc 轴:上下方向;
- 单位是米,是真实的物理单位。
💡 光轴是什么?
镜头光学系统的对称中心线,从镜头中心垂直向前延伸出去。光轴 ≈ 相机“正前方”的方向。
主点 (cx, cy) 就是光轴在图像平面上的落点。注意:主点 ≠ 图像中心,只是近似相等,实际装配中会有几像素的偏差。
2.3 机器人坐标系 (Xr, Yr, Zr)
最后把原点搬到机器人本体上(通常选底盘中心或机械臂基座):
- Xr 轴:向前;
- Yr 轴:向左;
- Zr 轴:向上。
这个坐标系下的坐标,才是机器人控制器能直接用来规划运动、抓取物体的坐标。
三、三者的内在联系:一条“三级跳”转换链
把三个串起来,就是视觉定位的完整流水线:
真实世界中的物体
│
│ ① 相机投影成像(小孔成像模型)
▼
┌────────────────────────┐
│ 图像坐标系 (u, v) │ ← YOLO 直接输出的就是这里
└────────────────────────┘
│
│ ② 乘内参矩阵 K + 深度 Zc
▼
┌────────────────────────┐
│ 相机坐标系 (Xc, Yc, Zc)│
└────────────────────────┘
│
│ ③ 乘外参矩阵 [R | T]
▼
┌────────────────────────┐
│ 机器人坐标系(Xr,Yr,Zr) │ ← 机器人真正能用的坐标
└────────────────────────┘
用一句口诀概括:
内参:图像 → 相机;外参:相机 → 机器人。
3.1 第二跳:像素 → 相机坐标(用内参)
根据小孔成像模型,由像素坐标反推相机坐标的公式是:
Xc = (u - cx) * Zc / fx
Yc = (v - cy) * Zc / fy
其中:
fx, fy:像素焦距,代表相机“看东西放大了多少倍”。- 传统相机的物理焦距 f 单位是毫米;
- 而
fx = f / Sx(Sx 是单个像素的物理尺寸),单位变成了像素; fx对应水平方向的投影尺度,fy对应垂直方向。
cx, cy:主点坐标,即光轴在图像中的像素位置。
这四个数 fx, fy, cx, cy 组成一个 3×3 的相机内参矩阵 K:
K = [ fx 0 cx ]
[ 0 fy cy ]
[ 0 0 1 ]
深度 Zc 怎么来?
- 如果用深度相机(RealSense、D435i 等),直接读;
- 如果用单目相机,可以用一些几何估法,比如已知目标真实高度 H:
Zc = H * F / h
(F 是物理焦距,h 是目标在图像中的像素高度,本质是相似三角形。)
3.2 第三跳:相机坐标 → 机器人坐标(用外参)
Pr = R * Pc + T
R:旋转矩阵,描述相机朝哪个方向安装(俯仰、偏航、翻滚);T:平移向量,描述相机光心在机器人坐标系下的位置。
这两个合起来就是外参——它们描述的不是相机本身的光学特性,而是相机和机器人之间的装配关系。
四、为什么必须做相机标定?
上面这条转换链里,我们用到了:fx, fy, cx, cy、畸变系数、R, T。这些数字既不能从镜头外壳上读出来,也不能靠猜。这就是相机标定要解决的问题。
4.1 不标定会怎样?
- 每颗摄像头都不一样——物理焦距有公差、传感器像素排布有偏差,主点
(cx, cy)往往不在图像正中心; - 镜头有畸变——尤其广角镜头,边缘的直线会被拍弯(径向畸变),不校正的话画面边缘的目标反推出来的三维位置会偏得很离谱;
- 相机装在机器人上的角度是装配出来的——不可能完美朝前,也不可能光心正好落在机器人原点;
- 不标定 = 拿一把刻度不准的尺子量东西——内参外参不准,“像素→米”这一步就没有可信的换算依据,机器人算出来的目标位置全是错的,抓取必然打偏。
4.2 常用标定方法
① 内参标定——张正友标定法(Zhang's Method)
工业界事实标准,OpenCV 里直接调 cv2.calibrateCamera() 就能跑。
做法:
- 打印一张棋盘格标定板(黑白方格,方格边长已知,比如 25 mm);
- 手持标定板,从不同距离、不同角度、倾斜着拍十几张照片(要求覆盖画面各个角落,包含俯仰和旋转);
- 程序自动检测每张图里棋盘格的角点像素坐标;
- 由于棋盘格的真实物理坐标是已知的(格子边长已知),通过多组“物理坐标 ↔ 像素坐标”的对应关系,反解出内参矩阵 K 和畸变系数。
② 外参标定——手眼标定(Hand-Eye Calibration)
- 问题:求相机坐标系和机器人坐标系之间的
R, T; - 做法:让机器人带着相机(或在相机视野内)看一个已知位置的标定板,变换几个不同位姿,记录机器人关节角度 + 棋盘格图像坐标,解一个经典的
AX = XB方程; - 分两类:
- Eye-in-Hand:相机装在机械臂末端,跟着机械臂一起动;
- Eye-to-Hand:相机固定在外部场景中,机械臂在视野里动。
五、一张图总结
┌─────────────┐ 内参 K + Zc ┌─────────────┐ 外参 R,T ┌─────────────┐
│ 图像坐标系 │ ─────────────▶ │ 相机坐标系 │ ───────────▶ │ 机器人坐标系 │
│ (u, v) │ 像素→米 │ (Xc,Yc,Zc) │ 相机→机器人 │ (Xr,Yr,Zr) │
│ 像素单位 │ │ 米单位 │ │ 米单位 │
└─────────────┘ └─────────────┘ └─────────────┘
▲ ▲ ▲
│ │ │
YOLO 输出 相机标定得到 K 手眼标定得到 R,T
六、写在最后
这三个坐标系的本质,是一层层把“我们看到的图像”还原成“真实世界里的位置”:
- 图像坐标系是算法(YOLO)直接能看懂的语言;
- 相机坐标系是相机自身视角下的三维空间;
- 机器人坐标系是机器人本体能用的运动指令语言。
而相机标定,就是给整条转换链提供可信的“尺子”:
- 内参标定校准镜头本身(放大率 fx/fy、主点 cx/cy、畸变);
- 外参标定校准相机和机器人之间的安装位姿(R, T)。
搞懂了这条链,再去看双目视觉、手眼标定、物体抓取这些进阶内容,就不会再被一堆坐标变换绕晕了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)