ABB 机器人与视觉系统的自动标定是消除手眼安装误差、实现视觉坐标到机器人基坐标精准映射的核心环节,核心分为「手眼标定(Eye-in-Hand/Eye-to-Hand)」和「坐标转换自动校准」两大类型,以下结合 ABB 机器人的 RAPID 编程、视觉系统工具链(如 Halcon / 康耐视 VisionPro),给出标准化自动标定流程、关键配置和实战案例,覆盖主流工业场景。
一、先明确标定类型(核心前提)
根据相机安装方式,自动标定分为两种核心模式,需先匹配现场硬件布局:
| 标定类型 | 相机安装位置 | 适用场景 | 标定核心目标 |
|---|---|---|---|
| Eye-to-Hand(眼在手外) | 固定在机器人工作区域旁 / 机架上 | 静态抓取、流水线质检 | 标定「相机坐标系→机器人基坐标系」转换矩阵 |
| Eye-in-Hand(眼在手上) | 安装在机器人末端法兰 / 夹爪上 | 动态抓取、复杂路径定位 | 标定「相机坐标系→机器人工具坐标系」转换矩阵 + 手眼关系 |
二、自动标定核心原理
三、标准化自动标定流程(以 Eye-to-Hand 为例,最常用)
步骤 1:硬件与环境准备
步骤 2:视觉系统单目标定(先校准相机自身)
自动标定前需先完成相机内参标定(消除镜头畸变),以 Halcon 为例:
步骤 3:机器人端自动移动程序编写(RAPID)
编写 RAPID 程序,控制机器人带动标定板移动到预设的 6 个以上姿态,每个姿态触发视觉采集:
rapid
PROC Auto_Cali_Move()
! 初始化变量
num pose_idx:=1; ! 姿态索引
num cali_poses{6,3}:=[[500,300,200],[550,350,200],[500,400,200],[450,350,200],[500,300,250],[500,400,250]]; ! 6个标定姿态的X/Y/Z坐标
robtarget cali_tgt; ! 标定目标位姿
bool cali_ok:=FALSE; ! 标定完成标志
! 循环移动到每个标定姿态
WHILE pose_idx<=6 DO
! 1. 机器人移动到当前标定姿态
cali_tgt.trans.x:=cali_poses[pose_idx,1];
cali_tgt.trans.y:=cali_poses[pose_idx,2];
cali_tgt.trans.z:=cali_poses[pose_idx,3];
cali_tgt.rot:=Quaternion(0,0,1,0); ! 姿态角(可根据需求调整)
MoveJ cali_tgt, v100, z50, tool0; ! 关节移动到目标位姿
WaitTime 0.5; ! 稳定后触发视觉采集
! 2. 发送触发信号给视觉系统(Socket通讯)
SocketSend("Trigger_Cali",5000); ! 发送“触发标定”指令到视觉PC端口5000
! 3. 接收视觉反馈的标定板像素坐标
SocketRecv(cali_pix[pose_idx,1],cali_pix[pose_idx,2],5000); ! 接收X/Y像素坐标
! 4. 记录机器人当前笛卡尔坐标
cali_robot[pose_idx,1]:=cali_tgt.trans.x;
cali_robot[pose_idx,2]:=cali_tgt.trans.y;
cali_robot[pose_idx,3]:=cali_tgt.trans.z;
pose_idx:=pose_idx+1;
ENDWHILE
! 5. 发送所有数据给视觉系统,请求计算转换矩阵
SocketSend("Calc_Matrix",5000);
SocketSendArray(cali_robot,cali_pix,5000); ! 发送机器人坐标和像素坐标数组
! 6. 接收视觉返回的转换矩阵并保存
SocketRecvMat(cali_mat,5000); ! 接收3×4转换矩阵
PersSet("Cali_Matrix",cali_mat); ! 保存到永久变量,供抓取程序调用
cali_ok:=TRUE;
ENDPROC步骤 4:视觉系统自动计算转换矩阵(Halcon 示例)
视觉 PC 接收机器人坐标和像素坐标后,通过 Halcon 自动计算「像素坐标→机器人坐标」转换矩阵:
hdevelop
! 1. 读取机器人发送的坐标数据
read_socket_data ('192.168.1.100', 5000, Robot_XYZ, Pixel_XY)
! 2. 转换坐标格式(像素→世界)
gen_calib_data ('calibration_object', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', CameraParam) ! 加载相机内参
set_calib_data_calib_object (CalibDataID, 0, 'calibration_object_descr_3d.txt') ! 加载标定板3D描述
! 3. 遍历所有标定姿态,添加标定数据
for Index := 0 to 5 by 1
! 机器人坐标(世界坐标)
X := Robot_XYZ[Index,0]
Y := Robot_XYZ[Index,1]
Z := Robot_XYZ[Index,2]
! 添加标定点
find_calib_object (Image, CalibDataID, 0, 0, Index, [], [])
set_calib_data_observ_points (CalibDataID, 0, 0, Index, Row, Column, [])
! 4. 自动计算手眼转换矩阵
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'extrinsic', CamPose) ! 外参(转换矩阵)
! 5. 将矩阵发送给ABB机器人
send_socket_data ('192.168.1.101', 5000, CamPose)步骤 5:机器人端坐标转换与验证
四、Eye-in-Hand 模式自动标定(补充)
若相机安装在机器人末端,需额外标定「工具坐标系与相机坐标系」的关系,核心差异:
五、ABB 官方工具:RobotWare 视觉标定包(简化版)
若使用 ABB 官方视觉集成方案(如与康耐视 / 基恩士合作),可直接调用 RobotWare 的「Visual Calibration」功能包,实现一键自动标定:
六、常见问题与优化
| 标定异常现象 | 排查 / 优化方向 |
|---|---|
| 标定误差>0.5mm | 1. 标定板未固定(增加工装);2. 标定姿态数量不足(≥8 个);3. 相机曝光不稳定(设为手动曝光);4. 机器人未做精度补偿(执行 MasterCal) |
| 自动标定中途中断 | 1. 通讯超时(延长 Socket 超时时间至 2000ms);2. 标定板超出相机视野(调整移动范围);3. 像素坐标识别失败(清洁标定板 / 调整光源) |
| 标定后抓取偏差随位置变化 | 1. 相机安装松动(重新紧固);2. 转换矩阵未考虑机器人姿态补偿(添加姿态修正项);3. 镜头畸变未校准(重新做相机内参标定) |


