
最近在做视觉相关的项目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 │ │ ┌─────────┐ │ │ 目标框 │ │ └─────────┘ ▼ v2.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 / SxSx 是单个像素的物理尺寸单位变成了像素fx对应水平方向的投影尺度fy对应垂直方向。cx, cy主点坐标即光轴在图像中的像素位置。这四个数fx, fy, cx, cy组成一个3×3 的相机内参矩阵 KK [ fx 0 cx ] [ 0 fy cy ] [ 0 0 1 ]深度 Zc 怎么来如果用深度相机RealSense、D435i 等直接读如果用单目相机可以用一些几何估法比如已知目标真实高度 HZc H * F / hF 是物理焦距h 是目标在图像中的像素高度本质是相似三角形。3.2 第三跳相机坐标 → 机器人坐标用外参Pr R * Pc TR旋转矩阵描述相机朝哪个方向安装俯仰、偏航、翻滚T平移向量描述相机光心在机器人坐标系下的位置。这两个合起来就是外参——它们描述的不是相机本身的光学特性而是相机和机器人之间的装配关系。四、为什么必须做相机标定上面这条转换链里我们用到了fx, fy, cx, cy、畸变系数、R, T。这些数字既不能从镜头外壳上读出来也不能靠猜。这就是相机标定要解决的问题。4.1 不标定会怎样每颗摄像头都不一样——物理焦距有公差、传感器像素排布有偏差主点(cx, cy)往往不在图像正中心镜头有畸变——尤其广角镜头边缘的直线会被拍弯径向畸变不校正的话画面边缘的目标反推出来的三维位置会偏得很离谱相机装在机器人上的角度是装配出来的——不可能完美朝前也不可能光心正好落在机器人原点不标定 拿一把刻度不准的尺子量东西——内参外参不准“像素→米”这一步就没有可信的换算依据机器人算出来的目标位置全是错的抓取必然打偏。4.2 常用标定方法① 内参标定——张正友标定法Zhangs 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。搞懂了这条链再去看双目视觉、手眼标定、物体抓取这些进阶内容就不会再被一堆坐标变换绕晕了。