一句话理解:相机看到的是像素(行、列),机械臂认的是毫米(X、Y)------九点标定,就是在这两套"语言"之间架一座转换桥。
文章目录
- 一、前言
- 二、九点标定原理
- 三、眼在手外 vs 眼在手上
- 四、九点标定的实际操作流程
- 五、小结
一、前言
机器视觉引导机械臂抓取、贴装、分拣,本质上要解决一个问题:相机"看到"的目标,在图像里是一个像素坐标(如第 230 行、第 410 列),而机械臂只认识它自己坐标系下的物理坐标(如 X=120.5mm,Y=68.3mm)。这两套坐标系统既不同心,也不同向,甚至可能存在轻微的旋转、缩放、畸变。
九点标定要做的事,就是在相机视野内选取 9 个已知的参考点,分别记录它们的像素坐标和对应的真实物理坐标,再通过数学方法求出一套"换算公式" ------从此相机看到任何一个像素点,都能直接算出它在机械臂坐标系下对应的真实位置。

二、九点标定原理
2.1 坐标转换的本质:一个仿射变换
像素坐标系 (X,Y)(X, Y)(X,Y) 到机械臂坐标系 (X′,Y′)(X', Y')(X′,Y′) 的转换,通常用仿射变换来近似:
X′=aX+bY+cY′=a′X+b′Y+c′ X' = aX + bY + c \\ Y' = a'X + b'Y + c' X′=aX+bY+cY′=a′X+b′Y+c′
这套公式包含 6 个未知系数 a,b,c,a′,b′,c′a, b, c, a', b', c'a,b,c,a′,b′,c′,分别对应了两套坐标系之间可能存在的旋转、缩放、平移关系。
2.2 为什么要选 9 个点,而不是 3 个
理论上,X′=aX+bY+cX' = aX + bY + cX′=aX+bY+c 这一个方程,只需要 3 组不共线的点 就能解出 a,b,ca, b, ca,b,c 三个未知数(三元一次方程组)。Y′Y'Y′ 同理再用 3 个点就能解出 a′,b′,c′a', b', c'a′,b′,c′。
但实际系统中,相机标定板的制造误差、镜头畸变、机械臂重复定位精度等因素,都会让"理论值"和"实测值"存在偏差。如果只取 3 个点,一旦这 3 个点本身有误差,整个转换公式就会严重失真。
九点标定用 9 组点代替 3 组点,构造一个"超定方程组"(方程数远多于未知数),再用最小二乘法求出一组"总体误差最小"的系数------这样即便个别点存在噪声,也不会让整个标定结果"一点崩全盘崩"。
2.3 最小二乘法:九点如何"拟合"出最优系数
把 9 个点的像素坐标和物理坐标代入方程,就得到 9 组形如 Xi′=aXi+bYi+cX_i' = aX_i + bY_i + cXi′=aXi+bYi+c 的等式,写成矩阵形式:
X1Y11X2Y21⋮⋮⋮X9Y91abc \begin{bmatrix} X_1 & Y_1 & 1 \\ X_2 & Y_2 & 1 \\ \vdots & \vdots & \vdots \\ X_9 & Y_9 & 1 \end{bmatrix} \begin{bmatrix} a \\ b \\ c \end{bmatrix} X1X2⋮X9Y1Y2⋮Y911⋮1 abc
这是一个"方程数(9) > 未知数(3)"的超定方程组,无法找到让所有等式都严格成立的解,只能求一组**让"预测值与实测值之间误差平方和最小"**的近似解------这正是最小二乘法的核心思想。Y′Y'Y′ 方向同理再求一遍,就得到了完整的 6 个系数。
下图是一块典型的 3×3 九点标定板示意图,9 个圆点在像素坐标系下的位置会被逐一提取出来,作为拟合方程的输入数据:

三、眼在手外 vs 眼在手上
在做九点标定之前,必须先搞清楚相机和机械臂的安装关系------这决定了标定的方式和后续坐标换算的逻辑。
| 类型 | 相机安装位置 | 特点 |
|---|---|---|
| 眼在手外(Eye-to-Hand) | 相机固定安装在机械臂外部某个位置,不随机械臂运动 | 相机与机械臂基座的相对关系固定,标定一次长期有效 |
| 眼在手上(Eye-in-Hand) | 相机安装在机械臂末端(工具端),随机械臂一起运动 | 相机随末端姿态变化而变化,标定结果与机械臂末端的相对位置绑定 |
简单判断方法:相机会不会跟着机械臂一起动?不动就是"眼在手外",会动就是"眼在手上"。

3.1 眼在手外:固定相机 vs 运动相机
眼在手外的场景下,又可以细分为"固定相机"和"运动相机"两种常见布局:
固定相机:相机架在工作台上方,始终俯视整个作业区域,
机械臂在相机视野内移动完成标定和抓取。
运动相机:相机安装在另一台独立的运动机构上(如滑台),
与机械臂各自独立运动,彼此通过标定建立坐标关系。
无论哪种布局,核心逻辑一致:相机的坐标系和机械臂的坐标系是两套独立、固定不变的参照系,九点标定要做的,就是找出这两套参照系之间"一次性"的转换关系。
3.2 眼在手上的特殊之处
由于相机装在机械臂末端,机械臂每移动一次姿态,相机的视角和位置都会跟着改变------这意味着标定不能像"眼在手外"那样简单地记录一组静态的坐标对应关系,而要同时考虑机械臂末端的姿态变化,标定过程相对更复杂,通常需要机械臂带动相机在多个不同姿态下采集标定点数据。
日常工业场景中,"眼在手外、固定相机"是最常见、最容易实施的方案,也是九点标定最典型的应用场景------本文后续的操作流程以此为例展开。
四、九点标定的实际操作流程
#mermaid-svg-OBv5yopH7gzzLhOL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OBv5yopH7gzzLhOL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OBv5yopH7gzzLhOL .error-icon{fill:#552222;}#mermaid-svg-OBv5yopH7gzzLhOL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OBv5yopH7gzzLhOL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OBv5yopH7gzzLhOL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OBv5yopH7gzzLhOL .marker.cross{stroke:#333333;}#mermaid-svg-OBv5yopH7gzzLhOL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OBv5yopH7gzzLhOL p{margin:0;}#mermaid-svg-OBv5yopH7gzzLhOL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OBv5yopH7gzzLhOL .cluster-label text{fill:#333;}#mermaid-svg-OBv5yopH7gzzLhOL .cluster-label span{color:#333;}#mermaid-svg-OBv5yopH7gzzLhOL .cluster-label span p{background-color:transparent;}#mermaid-svg-OBv5yopH7gzzLhOL .label text,#mermaid-svg-OBv5yopH7gzzLhOL span{fill:#333;color:#333;}#mermaid-svg-OBv5yopH7gzzLhOL .node rect,#mermaid-svg-OBv5yopH7gzzLhOL .node circle,#mermaid-svg-OBv5yopH7gzzLhOL .node ellipse,#mermaid-svg-OBv5yopH7gzzLhOL .node polygon,#mermaid-svg-OBv5yopH7gzzLhOL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OBv5yopH7gzzLhOL .rough-node .label text,#mermaid-svg-OBv5yopH7gzzLhOL .node .label text,#mermaid-svg-OBv5yopH7gzzLhOL .image-shape .label,#mermaid-svg-OBv5yopH7gzzLhOL .icon-shape .label{text-anchor:middle;}#mermaid-svg-OBv5yopH7gzzLhOL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OBv5yopH7gzzLhOL .rough-node .label,#mermaid-svg-OBv5yopH7gzzLhOL .node .label,#mermaid-svg-OBv5yopH7gzzLhOL .image-shape .label,#mermaid-svg-OBv5yopH7gzzLhOL .icon-shape .label{text-align:center;}#mermaid-svg-OBv5yopH7gzzLhOL .node.clickable{cursor:pointer;}#mermaid-svg-OBv5yopH7gzzLhOL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OBv5yopH7gzzLhOL .arrowheadPath{fill:#333333;}#mermaid-svg-OBv5yopH7gzzLhOL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OBv5yopH7gzzLhOL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OBv5yopH7gzzLhOL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OBv5yopH7gzzLhOL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OBv5yopH7gzzLhOL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OBv5yopH7gzzLhOL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OBv5yopH7gzzLhOL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OBv5yopH7gzzLhOL .cluster text{fill:#333;}#mermaid-svg-OBv5yopH7gzzLhOL .cluster span{color:#333;}#mermaid-svg-OBv5yopH7gzzLhOL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OBv5yopH7gzzLhOL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OBv5yopH7gzzLhOL rect.text{fill:none;stroke-width:0;}#mermaid-svg-OBv5yopH7gzzLhOL .icon-shape,#mermaid-svg-OBv5yopH7gzzLhOL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OBv5yopH7gzzLhOL .icon-shape p,#mermaid-svg-OBv5yopH7gzzLhOL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OBv5yopH7gzzLhOL .icon-shape .label rect,#mermaid-svg-OBv5yopH7gzzLhOL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OBv5yopH7gzzLhOL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OBv5yopH7gzzLhOL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OBv5yopH7gzzLhOL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 误差超出允许范围
误差合格
准备标定板
3×3均匀分布的9个标定点
相机拍摄标定板
记录9个点的像素坐标
控制机械臂依次移动到
9个点对应的物理位置
记录9个点的机械臂物理坐标
像素坐标与物理坐标
一一配对,共9组
最小二乘法拟合
求解6个变换系数
用公式验证:
任取标定板外一点测试误差
标定完成
保存换算公式投入使用
4.1 准备标定板
制作或采购一块带有 3×3 共 9 个标记点(常见为黑色圆点)的标定板,点与点之间的实际物理间距必须精确已知。
4.2 采集像素坐标
把标定板放入相机视野,拍摄图像,通过图像处理算法(如圆心检测、Blob 分析)自动识别出 9 个标记点的中心像素坐标,并按固定顺序(如从左到右、从上到下)记录下来。
4.3 采集物理坐标
控制机械臂末端依次移动到标定板上 9 个点对应的真实物理位置(通常借助视觉引导或人工精确对位),记录机械臂当前的坐标值。
4.4 配对与拟合
将第 4.2 步和第 4.3 步中按相同顺序记录的 9 组坐标一一配对,代入最小二乘法求解转换系数,得到最终的像素坐标→物理坐标换算公式。
4.5 验证精度
任意选取标定板范围内(或附近)的一个新点,用求出的公式计算它的理论物理坐标,再用机械臂实际移动过去测量,对比两者误差。误差在允许范围内,标定完成;误差过大,需要检查标定点采集是否存在系统性偏差,重新标定。
五、小结
- 九点标定解决的核心问题:建立相机像素坐标系与机械臂物理坐标系之间的转换关系。
- 原理上是一个仿射变换 ,6 个未知系数,通过 9 组已知点构造超定方程组,用最小二乘法求出误差最小的最优解。
- 标定前必须先分清眼在手外 还是眼在手上------这决定了标定方式的复杂度,前者更常见、更易实施。
- 标定流程本质是"采点---配对---拟合---验证"四步闭环,验证环节不可省略,它是判断标定是否真正可用的唯一标准。
觉得有收获?欢迎点赞收藏 😉