视觉抓取标定全解析:从内参、手眼到九点标定及现场排查
2026/9/10 17:35:51 网站建设 项目流程

视觉抓取项目里,十个有八个精度投诉最后都查到了标定头上。视觉算法误检漏检通常是偶发问题,而标定出了问题,整个系统都会“不对劲”:像素坐标换算到机器人坐标后要么整体偏移,要么越靠近视野边缘偏差越大,甚至换个物料摆放角度就抓不准。这篇文章就把“视觉抓取-标定”这件事从原理到落地完整拆一遍,覆盖相机内参标定、手眼标定、九点标定、上下相机贴合标定,以及标定结果怎么验收、现场出了问题怎么排查。适合正在做视觉引导机械臂抓取、上下料、装配、贴合项目的工程师,也适合刚被老板安排去搞定一台“装好相机但抓不准”的机器人的新手——按这篇文章的思路走,至少能帮你少走一大半弯路。

1. 视觉抓取里的标定到底是什么

1.1 一套抓取系统里的坐标变换链条

视觉引导机械臂抓取,本质上就是回答一个问题:图像上的像素点,对应机械臂坐标系里的哪个位置?

要让机械臂去抓视野里看到的工件,必须把信息从像素坐标系一路变换到机械臂能理解的空间坐标系。这条链路里至少涉及三个坐标系:

  • 像素坐标系:图像上的行列坐标,单位是像素。
  • 相机坐标系:以相机光心为原点、光轴为Z轴的三维坐标系。
  • 机器人坐标系:机械臂基座或某个固定工装上的三维坐标系,机器人所有运动都基于这个坐标系。

“标定”干的事,就是把这条链路上每个环节的变换关系精确求出来。具体拆开看,视觉抓取项目里通常涉及三类标定:

  • 相机内参标定:求相机本身的焦距、主点、畸变系数,解决“图像坐标和相机坐标之间怎么换算”的问题。
  • 手眼标定:求相机坐标系与机器人坐标系之间的相对位姿(旋转+平移),解决“相机看到的物体在机器人坐标系下到底在哪”的问题。
  • 九点标定:在平面抓取场景中,直接建立像素坐标到机器人X、Y坐标的映射,属于一种更直接的“捷径”。

如果拿导航来类比,相机内参相当于地图本身的绘制精度,手眼标定相当于地图坐标系和GPS坐标系之间的偏移关系,九点标定则像你在一个桌面上用笔直接在屏幕上点哪是哪,不需要考虑地球曲率。三者解决的问题不同,实际项目中往往需要配合使用。

1.2 为什么标定决定了抓取的最终精度

很多刚接触视觉抓取的人会有个误解:觉得视觉算法识别精度高,抓取精度自然高。实际上,视觉算法只是告诉你“工件中心在图像第1234列、第567行”,如果标定矩阵误差大,后面换算出来的机器人坐标偏差可能达到几毫米甚至十几毫米。

我见过一个典型案例:项目现场用高分辨率工业相机识别定位,算法检测精度达到亚像素级别,结果机械臂抓取时始终偏了大约2毫米,怎么调视觉参数都没用。最后排查发现,是相机安装支架在换产时被叉车撞了一下,手眼标定矩阵已经失效。标定是系统的“地基”,地基歪了,楼上算法再精也没用。

不同应用场景对抓取精度的要求差异很大,标定需要投入的精力也不同:

场景类型典型精度要求标定侧重
机器人码垛/搬运1~2 mm九点标定或低精度手眼标定即可
上下料/机床取放0.5~1 mm九点+内参标定,需关注Z向高度
3C装配/插件0.05~0.3 mm完整手眼标定+高精度内参标定
螺丝锁付/点胶0.3~0.5 mm手眼标定+九点联合修正
视觉贴合/对位0.05~0.2 mm上相机+下相机联合标定,逐项补偿

建议做项目之前先把精度目标定下来,再决定标定方案投入多少精力。只做搬运却上全套高精度手眼标定,浪费开发时间;做3C贴合却只做九点标定,精度肯定不够。

2. 相机内参标定:先让图像坐标“说真话”

2.1 张正友标定法在标什么

相机内参标定是所有视觉抓取项目的第一步。相机镜头存在两个天然问题:一是焦距、主点这些参数不是出厂铭牌写的那个理想值,二是镜头畸变导致图像边缘的直线变弯。内参标定就是把这些“不理想”的量精确测出来。

现在工业界最常用的方法就是张正友标定法。它本质上是一种基于平面靶标的标定方法:拍摄不同姿态下的棋盘格,提取角点,然后求解单应矩阵,再通过多张图片的约束联立计算出内参。

内参标定最终得到的是这么几个东西:

  • 内参矩阵 K:包括 fx、fy(焦距在x、y方向的像素尺度)、cx、cy(主点坐标)。
  • 畸变系数:径向畸变 k1、k2、k3,切向畸变 p1、p2。

像素坐标和相机坐标的关系可以写成:像素坐标 = K × [R|t] × 世界坐标。其中 R、t 是棋盘格平面相对相机的外参,每拍一张图都会变,但 K 始终不变。这也是张正友标定法能成立的核心:利用同一个内参矩阵在多张不同位姿的棋盘格图像中都不变这一约束,把内参解出来。

为什么张正友法成了主流?对比其他方法:

  • DLT直接线性变换:需要精确的三维控制点,现场搭建麻烦。
  • Tsai两步法:径向畸变模型假设较强,对现代广角镜头和鱼眼镜头适配差。
  • 张正友法:只需要一个打印的棋盘格,拍摄十几张照片即可,鲁棒性好,OpenCV、MATLAB、Halcon都原生支持。

说白了,张正友法用最简单的设备和最少的操作解决了最核心的问题,这就是它被广泛采用的原因。

2.2 棋盘格标定的现场实操

棋盘格标定的完整流程我总结如下,照着做基本不会出大问题:

第一步,准备标定板。标定板的规格选择很有讲究,方格边长要与工作距离、视野大小匹配,通常让棋盘格在图像中占视野的1/3到1/2比较合适。比如视野范围300mm左右,方格边长20mm或30mm比较合适;视野范围100mm左右,方格边长10mm比较合适。注意标定板的“规格”通常用内角点数来描述,比如“9×6”代表有9列6行内角点,并不是棋盘格的总格数。

第二步,采集图像。拍摄15到20张棋盘格位姿不同的图像,要求覆盖视野中心和四个边缘,同时要有不同角度的倾斜(让棋盘格平面和相机光轴成一定角度),但不要倾斜到角点检测失败。现场操作时有一个技巧:固定相机,移动标定板;如果相机装在机械臂上,就让机械臂带着相机在不同位姿拍摄固定不动的标定板。

第三步,角点检测与标定计算。OpenCV环境里用cv2.findChessboardCorners提取角点,然后用cv2.calibrateCamera计算内参;ROS2环境里可以直接跑camera_calibration功能包,按界面提示移动标定板,标定结果会以yaml文件保存。

第四步,看重投影误差。标定完成后,OpenCV会返回一个RMS重投影误差,代表角点检测位置和根据标定结果反投影位置的偏差。我的经验:小于0.1像素说明标定质量很好,0.1到0.3像素可接受,超过0.5像素说明数据里有问题,需要检查标定板是否弯曲、有没有模糊图像混入、图片数量是否太少。

2.3 内参标定最容易忽略的细节

内参标定原理不复杂,但现场标定总容易栽在一些细节上:

  • 标定板必须平整。打印的棋盘格贴在硬纸板上容易弯曲,尤其是尺寸大时。要求高的场景建议用陶瓷或玻璃基材的标定板,几十块钱一张的亚克力板在温差大的车间也容易变形。
  • 标定板和现场抓取必须在同一工作距离附近。镜头对焦后,内参才会稳定。标定时标定板放得远,使用时工件放得近,焦距不同,标定结果就失效。
  • 变焦镜头标定完就不能再动焦距。工业上只要结构允许,尽量用定焦镜头,省去很多麻烦。
  • 光照要均匀,不能过曝。标定板高光反射导致角点检测偏移,是重投影误差偏大的常见原因。现场如果灯光太强,可以在标定板上加偏振片,或者调整光源角度。

相机内参标定不是一劳永逸的。镜头松动、更换镜头、相机剧烈碰撞后,内参都可能发生变化。稳妥的做法是在项目交付时把标定现场的照片、参数文件、重投影误差一并归档,后续如果精度异常,先对照归档数据判断内参是否漂移。

3. 手眼标定:让机械臂“按图索骥”

3.1 眼在手上还是眼在手外

相机内参标定解决的是图像到相机坐标系的换算,但相机坐标系并不等于机器人坐标系。手眼标定解决的就是这两个坐标系之间的旋转和平移关系,即“手”和“眼”的相对位姿。

手眼标定根据相机安装方式分为两种:

安装方式英文名相机位置典型场景优势劣势
眼在手上Eye-in-Hand相机装在机械臂末端近距离抓取、有限空间内作业、对遮挡敏感的装配场景视野随着机械臂移动,灵活性高;可以靠近工件,精度高每次运动后视野变化,需要实时标定信息
眼在手外Eye-to-Hand相机固定在工作台上方或侧方固定视野的大范围抓取、上下料、码垛标定一次长期使用;视野固定,便于设计光源;相机不受机械臂振动影响容易被机械臂本体遮挡;离工件远时精度受限制

实际抓取项目里,眼在手外用得更多,因为视野稳定、标定后不需要经常修正。眼在手上则常用于机械臂需要“凑近看”的场景,比如狭窄空间内的对孔插入,或者工件放在深料框里需要避障观察。

3.2 手眼标定的数学原理

手眼标定核心是一个矩阵方程:

AX = XB

这个方程怎么来?拿眼在手上举例,机械臂末端从位姿A1运动到位姿A2,机械臂控制器能告诉你末端在这两个位姿之间的变换关系;相机从位姿B1变化到B2,通过观察固定不动的标定板,可以算出相机在这两个位置之间的变换关系。A和B已知,X就是相机相对机械臂末端的固定变换,是我们要解的目标。

方程AX=XB看着简单,实际解起来需要至少两组运动数据才能约束住旋转和平移。OpenCV的cv2.calibrateHandEye函数封装了完整求解过程,支持Tsai、Park、Horaud、Andreff等几种解法。

这里有个关键点:数据采集的质量决定了手眼标定的精度。如果你的机械臂在标定时只有平移运动、没有旋转,那方程里的旋转约束就缺失了,解出的X在旋转分量上误差巨大。正确做法是在标定过程中让末端姿态充分变化,旋转角度尽量大,同时配合一定的平移,覆盖工作空间的不同位置。

3.3 手眼标定实操流程

以下以 Eye-in-Hand 为例,完整走一遍流程:

第一步,固定标定板。把棋盘格标定板固定在工作台上,确保标定过程中不会移动。如果现场有振动源,要等振动停了再采集。

第二步,设置机械臂采集位姿。让机械臂带着相机移动15到20个不同位姿,每个位姿都要求标定板完整出现在视野内。位姿之间既要旋转也要平移,旋转角度建议每次达到15度以上,同时保证标定板在图像中的占比不低于30%。

第三步,同步记录数据。每个位姿下需要记录两组数据:机械臂末端的位姿(从控制器读取,通常是四元数+平移向量格式)和图像中棋盘格相对相机的外参(用cv2.solvePnP求解)。

第四步,调用OpenCV函数求解:

import cv2 import numpy as np # robot_poses: 列表,每个元素是4x4齐次矩阵,机械臂末端位姿 # target_poses: 列表,每个元素是4x4齐次矩阵,标定板在相机坐标系下的位姿 robot_rotation = [] robot_translation = [] for pose in robot_poses: rvec, _ = cv2.Rodrigues(pose[:3, :3]) robot_rotation.append(rvec) robot_translation.append(pose[:3, 3]) cam_rotation = [] cam_translation = [] for pose in target_poses: rvec, _ = cv2.Rodrigues(pose[:3, :3]) cam_rotation.append(rvec) cam_translation.append(pose[:3, 3]) R_cam2gripper, t_cam2gripper = cv2.calibrateHandEye( robot_rotation, robot_translation, cam_rotation, cam_translation, method=cv2.CALIB_HAND_EYE_TSAI )

第五步,验证结果。不要只看标定计算的数值,要实际验证。一个最简单的方法:让机械臂带着相机移动到几个新的位姿,用标定结果把标定板中心换算到机械臂基座坐标系,和实际值对比。如果误差在可接受范围内,说明标定结果可靠。

Eye-to-Hand 的流程类似,区别在于标定板固定在机械臂末端,相机固定不动,机械臂带着标定板做多组位姿运动。采集中要确保标定板始终在相机视野内。求解目标变成了相机到机器人基座的固定变换。

手眼标定的常见失败原因:机械臂位姿数据精度不足(机器人本体精度差时尤其明显)、标定过程只有平移没有旋转、标定板反光或模糊导致外参求解不准确、数据采集数量太少。遇到标定结果反复变化,优先检查这几项。

4. 九点标定:平面抓取里最实用的“捷径”

4.1 九点标定的原理

九点标定是视觉引导平面抓取最常用的方法,也是现场工程师最“稀罕”的方法。相比手眼标定要解完整6自由度矩阵,九点标定直接建立像素坐标到机器人X、Y坐标的映射。前提是相机光轴与工作平面垂直,工件始终在一个平面内运动。

这个映射可以用单应矩阵 H 表示:

[X机器人, Y机器人, 1]^T = H × [u像素, v像素, 1]^T

H有8个自由度,理论上4个点就能解,但4个点对噪声太敏感。用9个点做最小二乘拟合,才能把示教误差、机械臂重复定位误差平均掉,得到更稳定的结果。这就是“九点”这个数字的来历——不是必须9个点,而是9个点性价比最好。

九点标定和手眼标定有什么区别?一句话总结:手眼标定求的是三维空间里的完整位姿变换(包括旋转矩阵和三维平移向量),九点标定求的是平面上的2D映射。如果你的机器人只在平面上运动、抓取姿态始终朝下,九点标定就够了;如果工件有角度、需要在不同高度或姿态下抓取,就需要手眼标定,或者“手眼主抓姿态、九点修正平面”的组合方案。

4.2 现场操作步骤与计算

九点标定操作步骤不难,但细节决定成败:

第一步,把相机固定好,调整到工作平面垂直、视野覆盖抓取区域。这个“垂直”非常关键,相机一旦倾斜,平面映射关系就会被破坏。

第二步,机械臂末端装一根尖锐的针尖或吸嘴,在相机视野范围内规划一个3×3的网格。网格范围要尽量覆盖整个抓取区域,不要只集中在视野中心的小块区域。

第三步,示教器上让机械臂针尖依次走到9个点,记录每个点在机器人坐标系下的X、Y坐标。同时,用视觉系统拍下针尖在每个点的像素坐标。

第九个点记录完,图像坐标和机器人坐标就凑齐了9对对应点。计算映射矩阵的代码非常简单:

import cv2 import numpy as np # pixel_points: 9个像素坐标点,shape=(9,2) # robot_points: 9个机器人坐标点,shape=(9,2) H, _ = cv2.findHomography(pixel_points, robot_points)

Halcon里则直接调用vector_to_hom_mat2d

vector_to_hom_mat2d(Px, Py, Qx, Qy, HomMat2D)

其中P是像素坐标,Q是机器人坐标。生产运行时,视觉输出的像素坐标乘上H矩阵,就直接得到机器人基座坐标系下的XY值。Z值通常由工艺确定(比如固定高度抓取),或者另加高度补偿。

标定完一定要验证。我习惯的做法:留出至少3个点不参与计算,标定完成后让机械臂走这几个点,比较视觉换算坐标和实际示教坐标的偏差。全部参与拟合也能算,但用留出点验证更有说服力。RMS误差一般要求在0.1~0.3mm以内,超过0.5mm就需要检查流程了。

4.3 上下相机贴合标定的要点

热词里“上下相机引导贴合”是很多贴合、对位设备的核心需求。这类设备通常有两到三个相机:一个上相机(朝下)拍摄产品位置,一个下相机(朝上)拍摄要贴合的物料位置。如何把两个相机看到的物体统一到同一个运动坐标系里,是贴合精度的关键。

上下相机贴合标定的基本思路:

  • 先标定上相机到运动轴(X、Y平台或机械臂)的映射,通常就是一组九点标定。
  • 再标定下相机到运动轴的映射,同样用九点标定,但标定物需要放在下相机视野内。
  • 两套映射都统一到同一个运动坐标系后,贴合时的补偿值等于:上相机计算出的产品偏差 + 下相机计算出的物料偏差,再叠加两个相机安装位置之间的固定偏移。

实际操作中有一个容易被忽略的点:两个相机的视野中心并不重合,中间隔着一段物理距离。这段距离如果不准确,贴合时就会出现系统性偏差。解决办法是找一个基准mark点,分别用上相机和下相机定位它在各自坐标系下的坐标,把两个相机通过这个mark点关联起来。

贴合的精度要求通常比普通抓取高一个量级,很多项目要求0.05mm级别,单单九点标定往往不够。我遇到过的情况是:九点标定做得很标准,但贴合精度就是卡在0.1mm以下不去。最后发现是两个相机的高度没有校准,导致不同高度的视觉测量结果存在视差。所以做贴合项目,一定要把高度信息纳入标定流程,最好加上激光测高或Z轴高度反馈。

5. 标定结果评估与现场问题排查

5.1 怎么判断标定“靠不靠谱”

标定做完不代表万事大吉,必须有量化的评价手段。三类标定各有各的评估重点:

  • 内参标定:看重投影误差,一般要求小于0.3像素,追求高精度时争取0.1像素以内。
  • 手眼标定:最可靠的是实测验证。让机械臂带相机移动到几个新位姿,通过手眼矩阵把标定板中心换算到机器人坐标系,和实际位置对比,误差应在项目精度要求的1/3以内。
  • 九点标定:看RMS误差和留出点验证。用参与计算的点反算,RMS通常很小;关键是留出点验证,能真实反映标定矩阵的泛化效果。

这里额外说一句:标定的目标精度和最终抓取精度不是一回事。最终抓取精度还受机械臂本身重复定位精度、工件夹具定位误差、视觉算法检测误差等多方面影响。标定只是保证“视觉告诉机器人的位置是准的”,机器人能不能走到这个位置,是机械臂自身精度的范畴。做项目规划时要把这些误差源分开考虑,不要全都归咎于标定。

5.2 实战排查表

实际项目里标定出问题,现象往往就那几类。我整理了一份排查表,按“先查机械、再查视觉、最后才考虑重新标定”的顺序排查,能省不少时间:

问题现象可能是原因排查方法
整体偏移固定值机器人坐标系和相机映射坐标系原点没对齐对比示教点与视觉换算坐标,计算固定偏移并补偿
视野边缘误差大、中心精度好镜头畸变未校正,或内参标定时标定板没有覆盖视野边缘重新内参标定,确保拍摄图片覆盖边缘区域
某个点误差特别大九点标定时该点示教记录错误,或机械臂重复定位异常剔除该点重新拟合,或重新示教该点
标定结果反复不稳定标定板不平、光源闪烁、机器人位姿数据波动固定标定板、稳定光源、检查机器人通讯数据
过一段时间精度漂移相机支架松动、机械臂撞机后变形、镜头松动紧固结构件,确认机械臂本体精度后重新标定
手眼标定后旋转方向总差一点标定数据中旋转分量不足重新采集,增加姿态变化明显的位姿
上相机和下相机贴合时系统性偏移双相机坐标系统一后缺少固定偏移补偿用基准mark点重新建立两个相机的关联

现场排查最重要的原则是:一次只改一个变量。很多人调标定问题时,同时换光源、改代码、重新示教,结果问题解决了也不知道是哪一步起了作用。严谨的做法是:保留现场记录,每调整一个环节就验证一次,把原因和结果对应起来。

5.3 搜索“标定”时容易混进来的其他方向

搜索“机器人视觉标定”时,搜索引擎会带出来一批相邻但不完全相同的标定概念,我在项目中也经常被人问到,这里简单做个分流:

  • Kalibr标定:一种支持多相机、相机与IMU联合标定的开源工具,常用在视觉惯性导航、移动机器人SLAM领域。视觉抓取项目如果涉及移动抓取(AGV+机械臂),会用到相机到IMU的外参标定,Kalibr是主流工具。
  • Lidar IMU标定:激光雷达和惯性测量单元的联合标定,主要用在地图构建、定位导航,和纯视觉抓取不是一回事,但做移动抓取机器人时会遇到。
  • D435i、ZED 2i相机标定:这类深度相机的内参和IMU外参可以用官方工具标定。RealSense有Dynamic Calibration工具,ZED官方也提供标定工具,Ubuntu 24.04环境下跑ROS2相机标定可以用camera_calibration功能包,流程和通用棋盘格标定一致。
  • ROS2机械臂视觉抓取仿真:在Gazebo、Isaac Sim等仿真环境里跑视觉抓取时,同样需要把标定这步走一遍。仿真环境的好处是相机内参是理想值,你可以先忽略标定误差专心调算法,等真机部署时再重新标定。
  • 汽车驾驶辅助标定、底盘标定、CANape标定、MCU标定、电机零位标定:这些属于汽车电子和电机控制领域的“标定”,和视觉抓取的“标定”完全不是一个概念。搜“标定”时容易混入,大家注意区分就好。比如“有感PMSM零位标定”是电机电角度初始位置标定,属于驱动控制;CANape是汽车ECU标定工具。视觉抓取项目里遇到这些热词,直接过滤即可。

做移动机器人项目时,标定链条会比固定抓取长:相机内参 → 相机与IMU外参 → IMU与底盘外参 → 底盘标定 → 手眼标定。链路越长,每个环节的误差越需要控制,建议用仿真环境先走通整个标定流程,再真机部署。

最后分享一个我实际项目里的经验:标定这件事,算法不是最难的,最难的是流程固化。很多现场标定出问题,都是因为操作人员图省事,标定板随手一放、拍摄数量不够、光源没有调到标准状态。我后来的做法是把标定流程写成SOP,每个环节明确“怎么做、达到什么标准算合格”,比如重投影误差超过0.3像素必须重新采集、九点标定的RMS超过0.3mm必须重新示教。项目交付后,现场人员照着SOP操作,再也没出现过标定相关的投诉。

如果你是第一次做视觉抓取项目,我建议先别急着上最复杂的标定方案。先把内参标定做扎实,再用九点标定跑通一套最简单的平面抓取,最后根据精度需求决定要不要上完整手眼标定。这样每一步的问题都能定位清楚,不至于一上来就被一堆矩阵方程搞晕。标定是一门“慢工出细活”的功夫,多花半天在现场把数据采好,能省下后面一个月调精度的痛苦。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询