想象一下你闭着眼睛去拿桌上的水杯,大概率会抓空或者打翻杯子。机器人也一样,它需要"眼睛"(相机)和"手"(机械臂)的精准配合才能完成抓取动作。这就是手眼标定的核心价值——建立视觉系统与机械臂之间的空间坐标转换关系。
在工业场景中,手眼标定主要分为两种配置模式:
我经手的项目中,约70%采用Eye-to-Hand模式,因为它安装简单且不受机械臂运动干扰。但遇到需要近距离动态跟踪的场景(比如传送带抓取),Eye-in-Hand才是更好的选择。
Halcon作为工业视觉的瑞士军刀,其vector_to_hom_mat2d算子能快速计算二维仿射变换矩阵。这个矩阵就像翻译官,能把相机看到的像素坐标"翻译"成机械臂能理解的物理坐标。举个例子:
去年给一家汽车零部件厂商实施项目时,我完整走通了这套标定流程。以下是经过实战验证的操作步骤:
采集9组对应点时,建议这样操作:
python复制# 伪代码演示Z字形采集路径
points = [
(1,1), (3,1), (2,1), # 第一行Z字
(2,2), (1,2), (3,2), # 第二行反Z字
(1,3), (3,3), (2,3) # 第三行Z字
]
实测发现这种走法比单纯行列扫描节省30%时间。记录数据时务必注意:
这是经过20+项目优化的代码模板:
halcon复制* 输入数据准备
image_x := [727.884, 2395.058, 1505.023, 666.948, 2678.36, 1505.023, 666.948, 2678.36]
image_y := [755.759, 664.057, 1289.824, 1787.698, 1707.432, 1505.023, 666.948, 2678.36]
robot_x := [-57.011, -33.521, -46.759, -58.678, -30.024, -46.759, -58.678, -30.024]
robot_y := [323.965, 324.565, 316.237, 309.794, 309.695, -46.759, -58.678, -30.024]
* 核心标定算子
vector_to_hom_mat2d(image_x, image_y, robot_x, robot_y, HomMat2D)
* 验证标定精度
affine_trans_point_2d(HomMat2D, 2094.344, 1326.878, Qx, Qy)
关键参数说明:
HomMat2D输出的3x3矩阵包含旋转、平移、缩放参数去年做的蜘蛛手机器人项目让我对动态跟随有了全新认知。传统静态抓取就像打固定靶,而动态跟随则是打移动靶,需要解决三个核心问题:
| 方案类型 | 精度 | 成本 | 适用场景 |
|---|---|---|---|
| 编码器触发 | ±1ms | 中 | 匀速传送带 |
| 光电传感器 | ±5ms | 低 | 低速运动物体 |
| 视觉时间戳 | ±10ms | 高 | 变速/不规则运动 |
我们最终选择"编码器+视觉"的混合方案。编码器记录传送带脉冲信号,当物体进入触发区域时:
普通线性预测在变速场景会翻车。我们改进的二次预测模型效果更好:
code复制预测位置 = 初始位置 + 平均速度*时间 + 0.5*加速度*时间²
实测显示,对于加速度<2m/s²的物体,预测误差可以控制在±0.5mm内。这个算法现在已经是我们的专利技术。
动态标定的核心是建立运动坐标系:
halcon复制* 创建运动模型
create_scaled_shape_model(模板图像, 'auto', 0, 0, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
* 实时跟踪
find_scaled_shape_model(当前图像, ModelID, 0, 0, 0.8, 1.2, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)
需要特别注意:
上个月遇到一个棘手案例:客户需要在曲面玻璃上贴装元件。常规平面标定误差达到3mm,后来我们开发出曲面自适应标定法。
create_surface_model构建三维映射关系这个方案使最终贴装精度达到±0.1mm,比客户要求还高50%。关键点在于:
车间环境光变化会导致标定失败,我们总结出"三防"原则:
有次客户产线出现诡异的位置漂移,最后发现是LED电源老化导致频闪。用这个代码检测很有效:
halcon复制* 检测亮度波动
for i := 1 to 100 by 1
grab_image(Image, AcqHandle)
get_image_size(Image, Width, Height)
intensity(Image, Image, Mean, Deviation)
disp_message(3600, '亮度: '+Mean, 'window', 12, 12, 'black', 'true')
endfor
标定不是一锤子买卖。去年有个项目上线3个月后精度突然下降,排查发现是机械臂谐波减速器磨损导致的。从此我们严格执行验证标准。
在标定区域均匀选取9个验证点:
验收标准:
精密场合要考虑热变形影响。我们的做法是:
这个Halcon代码片段可以实现自动补偿:
halcon复制* 读取温度传感器
read_temp_sensor(TempSensorHandle, Temperature)
* 查询补偿量
get_temperature_compensation(Temperature, CompX, CompY)
* 应用补偿
Qx_compensated := Qx + CompX
Qy_compensated := Qy + CompY
经过这些年的项目积累,我发现手眼标定就像给机器人配眼镜——配得准不准,直接决定它干活利不利索。最近在做一个医疗机器人项目,标定精度要求达到0.01mm级别,这又逼着我们开发出新的标定方法。技术这东西,永远都是在解决实际问题的过程中不断进化的。