[手眼标定]二维平面的非旋转标定 - 1.眼在手外
二维平面的非旋转标定:眼在手外
在上一篇文章中,我们从完整的机器视觉坐标链出发,说明了手眼标定要解决什么问题。本文收缩到一个工业现场非常常见、也非常容易被误解的子问题:固定相机观察固定工作平面,机器人只在平面内做 X、Y 平移,机器人角度 R 在采集和运行时保持不变。
这个问题通常被称为“二维九点标定”“二维平面标定”或“眼在手外标定”。它的核心输出是一个固定的平面映射:
输入是图像像素坐标,输出是机器人基坐标系或指定用户坐标系中的毫米坐标。它可以稳定解决平面定位和 XY 引导,但它不是完整的六自由度手眼变换,也不能自动处理机器人 R 改变、目标高度变化或任意三维点。
本文会依次说明系统边界、坐标定义、九点采样、仿射模型与平面单应性、数据采集、运行计算、方向处理、误差验收和现场排错。所有示意图和数值都用于解释模型;示例矩阵来自项目中的平面标定记录,不能直接复制到另一台设备。
1. 先从一个具体工位开始
想象一个固定在工作台上方的工业相机。机器人携带一个圆形标记,在相机视野内移动到九个位置。每到一个位置,机器人控制器给出一个平面坐标,视觉程序给出圆心像素坐标。
例如,机器人反馈某一时刻的目标点为 (250.0, -120.0) mm,视觉检测到圆心为 (1830, 1240) px。另一个位置可能是 (310.0, -80.0) mm,对应像素 (2720, 640) px。单独看任何一对数据都没有意义;把多组对应关系放在一起,才能估计像素坐标系与机器人平面坐标系之间的尺度、旋转、剪切和原点偏移。
完成标定后,量产时相机检测到产品特征 (u,v),程序通过同一个映射得到机器人目标 (X,Y),再把产品到实际吸取点的工艺偏移加入目标位姿,最后交给运动控制器。

图1:相机和工作平面在标定期间保持固定,机器人携带特征在平面内移动。每个样本都应同时保存像素点、机器人实际反馈点和采集时的固定 R 状态。
这个任务看似只是“找一个像素当量”,但实际至少包含以下关系:
- 像素横纵轴与机器人 X、Y 轴的方向关系;
- 像素到毫米的两个尺度;
- 相机安装角和工作平面位置造成的坐标旋转与偏移;
- 镜头畸变、透视和工作高度造成的非线性影响;
- 视觉特征点与机器人真正控制点之间的固定偏移。
因此,工程上不应把它简化成“X 加多少、Y 减多少”的两条经验公式。最终运行算法应使用经过验证的完整平面模型。
2. “眼在手外”和“非旋转”分别意味着什么
2.1 眼在手外
“眼在手外”表示相机与机器人基座之间的机械关系固定。相机通常安装在工作台、龙门架或独立支架上,机器人在相机视野中移动工件、标定件或工具。
在本文的二维模型中,不需要每次运行时重新计算相机相对于机器人基座的位姿,因为相机已经固定。待求的是一个适用于指定工作平面的像素到机器人坐标映射。
2.2 非旋转
“非旋转”不是说机器人机械上绝对不能旋转,而是说本标定模型假定:
- 采集标定点时机器人 R 保持同一个基准角
R0; - 运行时机器人仍以相同的 R 或同一固定工具方向使用映射;
- 视觉特征对应的点不会因为机器人 R 改变而绕某个旋转中心运动。
在这些条件下,像素点到机器人平面坐标可以用一个固定模型直接计算。如果运行时 R 改变,偏心特征会产生旋转引起的假位移;此时需要额外标定旋转中心和偏心向量,或者改用包含姿态的二维手眼模型。本文不把这部分混入非旋转映射。
2.3 本文模型的适用边界
| 条件 | 本文假设 | 条件变化后的影响 |
|---|---|---|
| 相机安装 | 相机与机器人基座固定 | 支架移动后映射整体失效 |
| 工作平面 | 标定板、产品特征和运行目标在同一平面 | Z 改变会产生尺度和透视误差 |
| 机器人运动 | 平面 XY 平移 | 机器人 R 改变时不能直接沿用 |
| 视觉特征 | 特征定义稳定、检测点含义一致 | 点序或特征定义改变会产生跳变 |
| 成像条件 | 镜头、焦距、分辨率、ROI、光照保持一致 | 成像模型和像素映射可能改变 |
| 输出坐标 | 固定的机器人基座或用户坐标系 | 坐标系切换需重新转换或验证 |
如果任务需要相机随末端运动,或者需要输出真实的三维相机到机器人刚体变换,应回到完整的眼在手上/眼在手外手眼标定,而不能把本文的二维矩阵当成通用三维外参。
3. 坐标系与运行路径
为了避免“矩阵方向看起来合理但结果相反”,先定义坐标系:
| 符号 | 含义 | 本文中的作用 |
|---|---|---|
| B | 机器人基坐标系 | 输出机器人目标位置 |
| C | 相机坐标系 | 表示成像和像素观测来源 |
| Π | 工作平面坐标系 | 表示被测点所在的二维物理平面 |
| P | 产品特征坐标系 | 表示视觉识别到的产品参考点和方向 |
| T | 工具 TCP 坐标系 | 表示实际吸取点或夹爪中心 |
在二维非旋转场景中,实际运行路径可以写成:
如果视觉输出的是产品参考点,而机器人需要的是工具 TCP 目标,还要再应用产品到工具的固定工艺关系:
在非旋转任务中,{}^{P}T_{T,\mathrm{grasp}} 的角度通常固定;如果产品方向会变化,则局部偏移应随产品坐标系旋转。不能把产品坐标中的偏移永久写成世界坐标中的固定 ΔX、ΔY。
4. 九点是采样布置,不是模型名称
“九点标定”描述的是常用的九组对应样本:九个图像点和九个机器人平面点。它本身没有规定必须使用仿射模型,也不等于某个厂商软件的专用算法。
九点的价值在于覆盖工作视野。一个合理的 3×3 布置通常包含四角、四边附近和中心点;如果视野较大或任务精度较高,可以扩展到 12~20 个甚至更多点。增加点数的目的,是改善参数估计和发现模型误差,而不是用点数替代几何条件。

图2:九点只是采样方式。真正需要选择的是平面仿射模型、平面单应性或其他经过验证的模型。
4.1 每个样本要保存什么
建议每个样本使用唯一 ID,并保存:
- 原始图像或可追溯的图像文件名;
- 视觉特征像素坐标
(u_i,v_i); - 机器人在采集时的实际反馈坐标
(X_i,Y_i); - 采集时的 R、Z、工具坐标、基坐标和用户坐标名称;
- 触发时间、曝光时间或图像序号;
- 特征检测质量、是否遮挡、是否过曝以及人工备注。
不要用机器人发送的目标坐标代替曝光时刻的实际反馈坐标。静态采集也要等机器人停止和机械振动衰减后,再锁存位姿和图像。
4.2 为什么不能只在中心采点
如果所有点都集中在视野中心,模型可能在中心附近残差很小,但在边缘出现明显的系统偏差。仿射模型的参数对点的空间分布很敏感;单应性和畸变参数更是需要覆盖足够大的成像区域。
采样点之间应保持足够的几何跨度,避免近似共线或形成很小的区域。视野边缘的点不能因为难检测就全部删掉,否则验收数据无法代表真实生产范围。
5. 仿射模型:二维平面标定的常用起点
5.1 模型表达
平面仿射映射为:
展开后:
六个参数分别描述二维线性部分和原点平移。线性部分可以同时表达:
- X、Y 两方向的尺度;
- 图像轴与机器人轴之间的旋转;
- 图像 Y 轴向下带来的符号关系;
- 相机或坐标系不完全正交时的剪切项。
仿射模型不要求图像中的坐标轴与机器人坐标轴平行,也不要求 X、Y 像素当量完全相同。它比“每个像素固定多少毫米”更完整。
5.2 最小二乘求解
每个对应点提供两条方程。把所有样本堆叠起来,可以写成:
理论上,三组不共线点就可以确定六个参数。工程上应使用更多点,通过最小二乘或加权最小二乘求解,并保留独立验证点。
普通最小二乘的目标是:
如果不同点的视觉检测不确定度明显不同,可以使用权重矩阵;如果存在异常点,应先检查图像和采集记录,再决定是否使用鲁棒估计。不能只为了让 RMSE 变小而无依据地删除数据。
5.3 一个项目矩阵的解释示例
某组项目数据得到的仿射关系约为:
局部变化近似为:
因此在这台设备、这套坐标定义和这次标定中,图像向右大致对应机器人 X 增大,图像向下大致对应机器人 Y 减小。这个符号来自完整矩阵和实际安装方向,不能推广为所有相机都“X 加、Y 减”。换相机安装方向、机器人坐标系或图像翻转方式后,必须重新估计并验证矩阵。
6. 平面单应性:透视不可忽略时的模型
如果固定相机有明显倾斜、视野较大,或者工作平面透视变化超出仿射模型的误差预算,可以使用平面单应性:
令:
则运行时必须先归一化:
漏掉 w 的归一化,是把单应性错误当成仿射矩阵使用的典型错误。
单应矩阵整体乘以任意非零常数表示同一个映射,因此有八个独立自由度。理论上至少需要四组满足非退化条件的对应点;工程上仍建议采集更多覆盖全视野的点。

图3:仿射模型保持平行线关系,单应性可表达固定平面上的透视变化。选择模型时应比较独立验证误差,而不是只比较训练点的残差。
6.1 仿射还是单应性
| 现场条件 | 优先考虑 | 说明 |
|---|---|---|
| 镜头畸变已校正、相机近似垂直、工作区较小 | 仿射 | 参数少、稳定、便于诊断 |
| 相机明显倾斜、工作区较大、平面透视明显 | 单应性 | 能表达平面投影的透视变化 |
| 镜头畸变明显 | 先去畸变,再拟合 | 单应性不能完整替代镜头畸变模型 |
| 不同高度或非平面目标 | 三维模型或分层配方 | 单一二维映射不再成立 |
不要因为单应性参数更多,就默认它一定比仿射准确。点数不足、点分布退化或视觉噪声较大时,复杂模型可能过拟合。模型选择应结合独立验证点、工作区边缘误差和实际任务指标。
7. 畸变、图像坐标和物理平面
7.1 镜头畸变应在平面拟合前处理
径向畸变和切向畸变会使同一物理平面的映射在图像边缘产生系统误差。常见流程是:
- 先完成相机内参和畸变标定;
- 对检测到的像素点去畸变,或在统一模型中处理畸变;
- 再用去畸变后的点拟合平面仿射或单应性;
- 运行时使用完全相同的去畸变方式和内参。
如果图像经过缩放、裁剪、旋转或 ROI 变换,内参中的焦距、主点和像素坐标原点也要同步更新。只改变视觉软件里的 ROI,却继续使用旧矩阵,是常见的比例和偏移错误来源。
7.2 图像 Y 轴向下不需要手动再翻转
许多图像坐标约定中,u 向右、v 向下;机器人坐标的 Y 轴方向由机器人基座和用户坐标定义决定。这个方向关系应由矩阵参数自动表达。
正确做法是:
不要在得到 (X,Y) 后再凭经验执行 Y=-Y,除非该步骤明确属于坐标系定义并经过独立验证。重复翻转会造成方向相反,甚至在某些角度下看起来像一个“差不多”的结果。
7.3 物理平面高度必须一致
二维映射描述的是特定工作平面。标定板在 Z_0,量产目标在 Z_0+\Delta Z 时,透视相机的像素尺度和位置关系会变化。误差通常随目标离光轴距离增大而增大。
正视针孔模型下,标定平面距离相机为 h、目标离光轴横向距离为 r、高度变化为 \Delta z 时,一个近似量级为:
因此“中心点很准、边缘点变差”可能不是矩阵求解失败,而是目标高度或镜头透视不符合平面假设。
8. 数据采集:一套可执行的九点流程
8.1 准备机械和视觉条件
- 把标定板或标定特征固定在实际工作平面;
- 固定相机、镜头、焦距、对焦、光圈和支架;
- 确认机器人当前工具、基座和用户坐标定义;
- 固定图像分辨率、ROI、曝光、增益和光源;
- 让机器人以生产时的固定 R 到达多个覆盖点;
- 确认标定特征在整个视野内都能清晰、完整、稳定检测。
8.2 采集每个点
每个点执行同样的顺序:
- 机器人移动到目标点;
- 等待运动停止、机械振动衰减;
- 读取并锁存实际反馈的 X、Y、R、Z;
- 触发相机并保存图像或图像 ID;
- 检测视觉特征像素坐标;
- 保存样本 ID、机器人实际位姿和视觉结果;
- 立即检查是否有遮挡、过曝、模糊、错误匹配或异常跳点。
图像和机器人位姿必须属于同一采集事件。网络传输、软触发延迟或读取顺序错误,会把时序误差表现成平面映射误差。
8.3 点位布置建议
- 采样范围覆盖生产区域,而不是只覆盖视野中心;
- 点之间保持足够距离,避免点集近似共线;
- 旋转角 R 在所有点保持
R0; - Z、工作高度和工具定义保持一致;
- 至少保留若干不参与拟合的独立验证点;
- 记录每个点的图像质量和检测置信度。
所谓 Z 字形、蛇形或顺时针走点只是运动顺序。数学上真正重要的是覆盖范围、几何分布和数据配对。
9. 运行时计算:从像素点到机器人 XY
运行阶段应严格复用标定阶段的坐标定义和处理顺序:先检测像素特征,再执行与标定时一致的去畸变或平面校正,随后应用平面映射,最后把结果交给产品工艺和 TCP 控制逻辑。每一步的输入输出都应记录清楚,避免把视觉坐标、机器人目标坐标和工具偏移混在同一个变量中。

图4:运行时每张图像都应沿着同一条处理链计算。映射得到的是机器人平面上的特征点,实际到达的工艺点还需要叠加产品到工具的偏移。
9.1 仿射运行公式
给定去畸变后的当前像素点 p=(u,v):
如果视觉软件输出的矩阵已经把像素映射为机器人绝对坐标,就直接使用这个结果。不要再额外加一个“九点原点偏移”,除非该偏移是矩阵定义的一部分且已在验证中确认。
9.2 单应性运行公式
对于单应矩阵:
运行前应检查 w 是否接近零。如果 w 异常,通常说明点超出模型有效区域、矩阵方向或参数保存错误,不能继续把结果当作机器人目标。
9.3 如果还需要产品方向
本篇的非旋转定位可以只输出 XY;如果产品方向也需要传给机器人,应使用两个有序特征点,而不是直接读取原始图像角度。
设图像中方向特征的端点为 p_1=(u_1,v_1)、p_2=(u_2,v_2),先分别映射到机器人平面:
再计算:
这样得到的角度是在机器人平面坐标系中的方向。必须保持点的语义和顺序一致;交换点序会造成约 180° 跳变。圆、无向直线和对称矩形还可能出现 180° 或 90° 歧义,应使用不对称特征、固定点序或工艺允许的等价角度处理。
9.4 运行时伪代码
1 | |
10. 残差与验收:怎样判断映射真的可用
10.1 每个点的空间残差
对第 i 个验证点,设真实机器人平面坐标为 q_i=(X_i,Y_i),映射预测为 \hat q_i=(\hat X_i,\hat Y_i),定义:
常见统计量包括:
还应报告最大误差、X/Y 有符号偏差、视野中心与边缘的误差分布。单独报告平均误差容易掩盖少数边缘点的严重失配。

图5:训练集残差用于检查拟合,留出集用于检查泛化,任务集用于检查完整抓取链。三者不能互相替代。
10.2 三层验证
| 验证层次 | 典型数据 | 主要结论 |
|---|---|---|
| 模型层 | 参与拟合的点 | 参数是否能解释采样数据 |
| 映射层 | 未参与拟合的点、视野边缘点、重复采样 | 模型在工作区内是否稳定 |
| 任务层 | 实际产品、实际 TCP、真实放置或抓取 | 完整工艺误差是否满足要求 |
像素重投影误差很小,并不等于机器人 XY 误差很小;平面映射残差很小,也不等于 TCP 或抓取点一定准确。验收应使用与工艺目标一致的参考测量。
10.3 固定点回归实验
一个很有效的现场实验是:把同一个固定物理点放在工作平面上,让机器人或相机在多个拍照位置采集该点。每次通过映射得到的机器人坐标,都应落在允许误差范围内。
如果结果随视野位置呈现规律性变化,优先检查镜头畸变、仿射模型不足、工作高度和单应性;如果结果整体同向偏移,优先检查原点、TCP、用户坐标和矩阵平移项;如果结果随时间变化,优先检查温漂、支架松动和光学状态。
11. 常见错误与排查顺序
| 现象 | 常见原因 | 建议排查 |
|---|---|---|
| 所有点整体同向偏移 | 原点、用户坐标、TCP 或平移项错误 | 用已知参考点检查矩阵输出含义 |
| X/Y 方向反了 | 手动翻转图像 Y、矩阵方向取反、坐标系不一致 | 只使用完整矩阵,做单轴移动验证 |
| 中心准、边缘差 | 畸变、透视、模型不足、采样覆盖不足 | 比较仿射与单应独立残差 |
| 误差随高度变化 | 标定平面与产品平面不一致 | 固定 Z、建立高度配方或升级三维模型 |
| 误差随机器人速度变化 | 图像与实际位姿不同步、运动模糊 | 静态采集、硬件触发、检查时间戳 |
| 只在换 ROI 后出错 | 图像坐标原点和内参变化 | 重新计算内参或平面映射 |
| 旋转后位置偏移 | 非旋转模型被用于改变 R 的场景 | 标定旋转中心和偏心,或固定 R |
| 产品角度跳 180° | 特征点序交换或目标对称 | 使用有序、不对称特征 |
| 训练误差小、留出误差大 | 点数少、点集退化、模型过拟合 | 增加覆盖点,检查矩阵条件数 |
| 运行一段时间后漂移 | 支架、镜头、光源或温度变化 | 重新固定机械并做重复性验证 |
排查时应保留原始图像、原始位姿和版本化参数。只保存最后一个矩阵,无法判断问题来自视觉检测、坐标方向、机械变化还是运行时程序。
12. 只平移时,哪些问题不能由本篇解决
12.1 不能辨识旋转中心和偏心向量
如果所有采集姿态的 R 都相同,视觉特征相对机器人旋转中心的偏心会被吸收进平面映射的原点和平移项中。数据中没有足够的角度变化,就不能从中唯一分离旋转中心、偏心向量和固定目标位置。
因此,九点平移标定与旋转中心标定是两件不同的工作:前者建立固定角度下的平面位置映射,后者需要改变 R 并观察特征轨迹。
12.2 不能恢复完整三维外参
一个平面映射只保证指定工作平面上的点转换正确。它不直接给出相机光心的三维位置、相机相对基座的完整姿态,也不能让任意深度的点都使用同一个矩阵。
如果产品有明显高度差、表面不共面或任务需要 Z、Rx、Ry,应使用相机三维测量、PnP、深度信息或完整手眼标定。
12.3 不能替代 TCP 和机器人本体验证
映射输出的是被检测特征点在机器人坐标系中的位置。机器人实际执行的是 TCP 或法兰目标;两者之间的关系需要单独标定和验证。机器人报告的绝对位置精度、工具挠曲和负载变化也不会被一个二维矩阵自动消除。
13. 交付时应保存什么
一个可维护的二维非旋转标定结果,至少应包含:
- 仿射矩阵或单应矩阵及其变换方向;
- 相机内参、畸变参数、分辨率和 ROI;
- 标定工作平面高度、机器人 R0、工具和坐标系名称;
- 全部原始采样点、参与拟合点与独立验证点;
- 求解方法、残差统计、P95、最大误差和验收日期;
- 相机、镜头、支架、标定板和机器人配置的版本信息;
- 产品特征到实际工具点的抓取偏移或反向示教结果。
参数文件中不要只写一个没有单位和方向说明的 3×3 矩阵。看到矩阵时,维护人员必须能够回答:输入是什么坐标、输出是什么坐标、单位是什么、有效高度是什么、是否已去畸变、R 是否固定。
14. 最终结论
二维平面的非旋转标定,解决的是一个边界清晰的问题:在固定相机、固定工作平面和固定机器人 R 的条件下,建立像素坐标到机器人 XY 坐标的稳定映射。
可靠的实施路径是:
- 明确眼在手外和非旋转假设;
- 固定相机、工作平面、R、Z 和成像条件;
- 用覆盖全视野的多点采集建立像素与机器人实际坐标对应;
- 根据透视程度选择仿射或平面单应性;
- 先处理畸变,再在运行时使用同一模型;
- 用留出点、边缘点和实际任务点验收;
- R、Z、镜头、ROI、支架或 TCP 发生变化后重新评估。
“九点”是采样方式,“仿射/单应性”是模型选择,“眼在手外”是机械安装形式,“非旋转”是运动约束。把这四个概念分开,二维平面标定就会从一组经验补偿值,变成一套可以解释、验证和维护的工程模型。