1. 手眼标定基础:理解“眼在手外”与“眼在手上”
在工业自动化领域,手眼标定是连接视觉系统与机械运动系统的关键桥梁。简单来说,它解决的是“相机看到的点”和“机械手实际位置”之间的坐标转换问题。根据相机安装位置的不同,手眼标定主要分为两种模式:
- 眼在手外(Eye-to-Hand):相机固定在工作区域上方,像一位居高临下的观察者。这种模式下,相机视野范围大,适合检测静态物体或大范围运动轨迹。我曾在点胶机项目中采用这种布局,相机能同时监控整个PCB板上的点胶位置。
- 眼在手上(Eye-in-Hand):相机安装在机械臂末端,如同给机器人装上了移动的眼睛。这种配置在贴合工艺中特别实用,相机可以跟随机械手移动,近距离观察待贴合部件的细节。
两种模式的核心差异在于坐标系的转换关系。眼在手外模式下,需要建立的是相机坐标系到机器人基坐标系的固定映射;而眼在手上则需要考虑相机随机械臂运动时的动态坐标转换。实际选择时,我通常会考虑以下因素:
- 工作空间大小(眼在手外适合大范围)
- 精度要求(眼在手上通常精度更高)
- 机械结构限制(有些场景无法固定相机)
2. 硬件准备与九点标定板制作
九点标定的准确性很大程度上取决于标定板的质量。根据我的经验,一个合格的标定板需要满足:
材质选择:推荐使用厚度2mm以上的阳极氧化铝板,这种材料热膨胀系数低,我在高温车间实测形变小于0.01mm。如果预算有限,也可以用高精度印刷的亚克力板替代,但要注意环境湿度影响。
图案设计:标准的3×3圆形阵列是最佳选择,圆直径建议为视野范围的1/8~1/10。我曾试过十字标靶,但圆心检测的重复精度比十字交点高约30%。
安装要求:
- 眼在手外:标定板必须与机器人末端工具保持平行,建议使用精密水平仪调整,倾斜角度超过1°就会引入明显误差
- 眼在手上:需要设计专用夹具,确保标定板在机械臂运动过程中不发生晃动
这里分享一个自制标定板的参数表格:
| 参数项 | 推荐值 | 允许误差 |
|---|---|---|
| 圆直径 | 10mm | ±0.02mm |
| 圆心距 | 25mm | ±0.05mm |
| 表面粗糙度 | Ra≤0.8μm | - |
| 圆度 | ≤0.01mm | - |
3. 眼在手外模式九点标定全流程
3.1 图像采集与圆心定位
首先将标定板放置在机器人工作范围内,保持与相机光轴垂直。我习惯用以下Halcon代码进行圆心检测:
read_image (Image, 'calib_9points.jpg') * 使用稳健的阈值分割方法 binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold) * 形态学处理消除噪点 opening_circle (Region, RegionOpening, 3.5) * 精确提取圆形特征 shape_trans (RegionOpening, Circles, 'outer_circle') * 获取圆心坐标 area_center (Circles, Area, Row, Column)关键技巧:
- 照明要均匀,我常用环形光源+漫射板组合,确保亮度差异不超过10%
- 采集多张图像取平均值,可以降低随机噪声影响
- 对圆心坐标进行排序,确保与机械手运动顺序一致(Z字形是最稳妥的方案)
3.2 机械坐标记录要点
控制机器人TCP末端依次对准每个圆心时,要注意:
- 工具坐标系必须提前校准好,我遇到过因工具坐标系偏差导致整体标定失败的情况
- 移动速度建议设为50mm/s以下,高速运动可能引起振动误差
- 每个点停留至少0.5秒,确保位置完全稳定
记录坐标的典型格式:
robot_x := [100.0, 50.0, 0.0, 100.0, 50.0, 0.0, 100.0, 50.0, 0.0] robot_y := [0.0, 0.0, 0.0, 50.0, 50.0, 50.0, 100.0, 100.0, 100.0]3.3 矩阵计算与验证
使用Halcon的核心算子进行变换矩阵计算:
vector_to_hom_mat2d (image_row, image_col, robot_x, robot_y, HomMat2D)验证阶段我通常会:
- 随机选取3个未参与标定的验证点
- 计算像素坐标到机械坐标的转换误差
- 要求X/Y方向误差均小于0.3个像素(按500万像素相机计算约合0.015mm)
保存矩阵时建议添加时间戳:
write_tuple (HomMat2D, 'calib_matrix_'+date_time()+'.tup')4. 眼在手上模式的特殊处理
眼在手上模式的最大挑战是相机随机械臂运动带来的坐标系变化。我在SCARA机器人项目中发现几个关键点:
标定板固定要求:必须牢固固定在工作平台上,我曾用磁力表座固定时发生微移,导致后续所有产品出现0.5mm偏差
运动路径规划:
- 保持标定板始终在相机视野中心区域
- 避免机械奇异点位置
- 各轴应单独运动测试,确认无干涉
数据采集技巧:
- 每个点位采集3次取平均值
- 记录时包含机械臂各关节角度(用于后期诊断)
典型代码结构:
* 移动机械臂到第1个点 move_robot_to_position(1) * 延时确保稳定 wait_seconds(0.3) * 采集图像 grab_image (Image) * 计算圆心 find_calib_points(Image, row1, col1) * 记录机械坐标 get_robot_position(robot_x1, robot_y1)5. 标定结果优化与故障排查
5.1 常见误差来源
根据我的调试经验,误差主要来自:
- 机械背隙(特别是老旧设备)
- 相机镜头畸变(建议先做镜头校正)
- 温度变化(连续工作4小时后建议重新验证)
5.2 精度提升技巧
加权标定法:对中心区域点赋予更高权重
* 定义权重矩阵 weights := [1.0, 1.2, 1.0, 1.2, 1.5, 1.2, 1.0, 1.2, 1.0] * 带权重的标定 create_matrix(9,1,weights,WeightMatrix) hom_vector_to_hom_mat2d(image_row,image_col,robot_x,robot_y,WeightMatrix,HomMat2D)多位置验证法:在不同Z轴高度验证,确保三维空间一致性
动态补偿技术:对于高速应用,可以建立速度-误差补偿模型
5.3 典型故障处理
问题1:标定后出现系统性偏移
- 检查工具坐标系是否正确
- 确认标定板与机器人基坐标系的关系
问题2:边缘点误差明显增大
- 可能是镜头畸变未校正
- 检查机械臂在该位置的重复精度
问题3:矩阵计算失败
- 检查输入数据是否有NaN值
- 确认点数不少于4组(建议始终用9点)
在最近的一个显示屏贴合项目中,通过采用加权标定+温度补偿,我们将定位精度从±0.1mm提升到了±0.03mm,产品良率直接提高了8个百分点。这让我深刻体会到,好的标定不仅是技术活,更需要现场调试经验的积累。