4. 机器人视觉坐标系与手眼标定基础
在 Teledyne 视觉引导系统中,一个像素点从相机图像走到机器人末端执行器,至少要跨越四个坐标系。理解这四个坐标系的定义、轴向约定以及它们之间的变换链,是后续手眼标定、抓取位姿计算和误差排查的基础。本节先建立坐标系定义,再给出变换关系与标定思路。
四个坐标系的定义与轴向约定
像素坐标系(Pixel / Image Coordinate):以图像左上角为原点,u 轴向右、v 轴向下,单位为像素。它描述的是目标在图像中的位置,例如圆心位于 (u=642.3, v=518.7)。像素坐标本身没有物理尺度,必须结合相机内参才能还原为空间方向。
相机坐标系(Camera Coordinate):原点位于相机光心,Zc 轴沿光轴指向被观测场景,Xc 向右、Yc 向下(与像素轴方向一致,便于内参表达)。单位为毫米。相机坐标系是视觉测量的“物理出口”,像素点经内参反投影后在此获得方向射线。
机器人基坐标系(Base Coordinate):原点通常位于机器人底座安装面中心,Zb 轴竖直向上,Xb、Yb 由机器人厂家定义(多数六轴机器人为 Xb 指向正前方)。它是整个工作单元的公共参考系,机器人各关节角度最终都换算到基坐标系下的末端位姿。
工具坐标系(Tool / TCP Coordinate):原点位于工具中心点 TCP,Zt 轴一般沿工具接近方向(指向工件为负或正取决于约定),Xt、Yt 由工具姿态决定。抓取时我们真正关心的是 TCP 到达目标位姿,而不是法兰盘中心。
坐标系之间的变换链
四个坐标系构成一条有向变换链:像素 → 相机 → 机器人基坐标 → 工具。每一段都由一个齐次变换矩阵描述,形式为 4×4 矩阵,包含 3×3 旋转 R 和 3×1 平移 t。
第一段“像素 → 相机”由相机内参完成。设内参矩阵 K,焦距 fx、fy,主点 (cx, cy),则像素点 (u, v) 对应的归一化方向为:
x_n = (u - cx) / fx
y_n = (v - cy) / fy
射线方向 = [x_n, y_n, 1]^T (相机坐标系下,未定尺度)
第二段“相机 → 基坐标”由手眼关系决定,即相机相对机器人的外参。若相机固定在机器人之外(Eye-to-Hand),该变换是常量矩阵 T_base_cam;若相机装在末端(Eye-in-Hand),则它随机器人运动,需结合当前末端位姿换算。
第三段“基坐标 → 工具”由机器人正运动学与工具偏置共同决定。控制器给出法兰位姿 T_base_flange,再左乘工具偏置 T_flange_tool,得到 T_base_tool。抓取目标在基坐标下的位姿 T_base_target 与 T_base_tool 对齐时,即认为 TCP 到达目标。
手眼标定的两种构型
手眼标定要解决的核心问题是:求相机坐标系与机器人坐标系之间的固定变换。根据相机安装方式不同,分为两种构型。
Eye-to-Hand(相机固定):相机安装在工作台支架上,不随机器人运动。此时相机与基坐标系的变换 T_base_cam 是常量。标定时让机器人带着标定板(或标定针)在相机视野内走多个位姿,记录每个位姿下机器人法兰位姿 T_base_flange 与标定板在相机中的位姿 T_cam_board,通过求解 AX=XB 形式的方程组得到 T_base_cam。这种构型视野稳定,适合大范围抓取。
Eye-in-Hand(相机随动):相机固定在机器人末端。此时相机与法兰的变换 T_flange_cam 是常量,而相机与基坐标的关系随位姿变化。标定同样走多组位姿,求解的是 T_flange_cam。这种构型适合近距离高精度定位,但视野随运动变化。
标定实操:以 Eye-to-Hand 为例
假设使用 Teledyne 面阵相机与六轴机器人,标定板为 9×12 圆点阵列,点间距 10 mm。操作流程如下:
- 将标定板固定在机器人末端或工作台上,确保标定板与机器人相对位置在标定过程中不变。
- 手动示教机器人,使标定板在相机视野内呈现至少 8~12 个不同位姿,覆盖视野的四个象限和不同倾斜角。每个位姿记录机器人法兰位姿(x, y, z, rx, ry, rz)和相机拍摄的标定板图像。
- 用相机标定算法提取每张图像中圆点中心的像素坐标,结合已知点间距求解标定板在相机坐标系下的位姿 T_cam_board。
- 将每组 T_base_flange 与 T_cam_board 代入手眼方程,用最小二乘求解 T_base_cam。
- 验证:选取未参与标定的 3 个位姿,用求得的 T_base_cam 预测标定板在基坐标下的位置,与实际机器人位姿对比。若平移残差小于 0.5 mm、旋转残差小于 0.5°,认为标定合格。
像素到抓取位姿的完整计算示例
设某次检测到目标圆心像素坐标 (u=642.3, v=518.7),相机内参 fx=1250.0、fy=1250.0、cx=640.0、cy=512.0。则归一化方向为:
x_n = (642.3 - 640.0) / 1250.0 = 0.00184
y_n = (518.7 - 512.0) / 1250.0 = 0.00536
射线方向(相机系)= [0.00184, 0.00536, 1.0]^T
若已知目标平面在相机坐标系下的深度 Zc = 420 mm,则目标在相机系下的坐标为:
Xc = 0.00184 × 420 = 0.773 mm
Yc = 0.00536 × 420 = 2.251 mm
Zc = 420.0 mm
再经 T_base_cam 变换到基坐标系,得到目标在基坐标下的位置。最后结合抓取姿态(例如工具 Zt 垂直向下),构造 T_base_target,与 T_base_tool 对齐后发送给机器人控制器执行。
整个链条中,任何一段变换的误差都会累积到最终抓取精度。实际调试时,建议先单独验证内参(用标定板重投影误差判断,一般要求小于 0.2 像素),再验证手眼外参(用独立位姿残差判断),最后验证工具偏置(用 TCP 触碰已知点判断)。分段验证比一次性看抓取结果更容易定位问题。