1. 手眼标定基础概念与原理
想象一下你闭着眼睛去拿桌上的水杯,大概率会抓空或者打翻杯子。机器人也一样,它需要"眼睛"(相机)和"手"(机械臂)的精准配合才能完成抓取动作。这就是手眼标定的核心价值——建立视觉系统与机械臂之间的空间坐标转换关系。
在工业场景中,手眼标定主要分为两种配置模式:
- Eye-to-Hand:相机固定在工作区域上方(就像监控摄像头)
- Eye-in-Hand:相机安装在机械臂末端(类似戴在手上的GoPro)
我经手的项目中,约70%采用Eye-to-Hand模式,因为它安装简单且不受机械臂运动干扰。但遇到需要近距离动态跟踪的场景(比如传送带抓取),Eye-in-Hand才是更好的选择。
Halcon作为工业视觉的瑞士军刀,其vector_to_hom_mat2d算子能快速计算二维仿射变换矩阵。这个矩阵就像翻译官,能把相机看到的像素坐标"翻译"成机械臂能理解的物理坐标。举个例子:
- 相机检测到杯子中心在图像(1000,800)位置
- 通过标定矩阵转换后得到机械臂坐标系(250,300)
- 机械臂就能精准移动到该坐标完成抓取
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 固定相机标定全流程实战
去年给一家汽车零部件厂商实施项目时,我完整走通了这套标定流程。以下是经过实战验证的操作步骤:
2.1 硬件准备要点
- 标定板选择:推荐使用Halcon标准的3x3圆点标定板(直径建议8-10mm),我试过用棋盘格标定板,但圆心定位精度比角点高5%左右
- 安装高度:相机到标定板的距离要保证所有标志点清晰入镜,通常景深的1/3处最理想
- 机器人姿态:保持TCP工具端垂直向下,我吃过亏——倾斜角度超过5°会导致标定误差放大
2.2 数据采集避坑指南
采集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%时间。记录数据时务必注意:
- 图像坐标取圆心检测结果的亚像素坐标
- 机器人坐标读取法兰中心点数据
- 每个点位停留2秒消除机械振动影响
2.3 Halcon标定代码详解
这是经过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矩阵包含旋转、平移、缩放参数- 验证时误差应<0.3mm,否则需要检查数据采集过程
3. 动态跟随技术深度解析
去年做的蜘蛛手机器人项目让我对动态跟随有了全新认知。传统静态抓取就像打固定靶,而动态跟随则是打移动靶,需要解决三个核心问题:
3.1 时间同步方案对比
| 方案类型 | 精度 | 成本 | 适用场景 |
|---|---|---|---|
| 编码器触发 | ±1ms | 中 | 匀速传送带 |
| 光电传感器 | ±5ms | 低 | 低速运动物体 |
| 视觉时间戳 | ±10ms | 高 | 变速/不规则运动 |
我们最终选择"编码器+视觉"的混合方案。编码器记录传送带脉冲信号,当物体进入触发区域时:
- 相机拍照获取初始位置(t0时刻)
- 编码器持续发送位移量(Δt)
- 机器人根据公式计算实时位置:X = X0 + v*Δt
3.2 运动预测算法优化
普通线性预测在变速场景会翻车。我们改进的二次预测模型效果更好:
code复制预测位置 = 初始位置 + 平均速度*时间 + 0.5*加速度*时间²
实测显示,对于加速度<2m/s²的物体,预测误差可以控制在±0.5mm内。这个算法现在已经是我们的专利技术。
3.3 Halcon实现关键代码
动态标定的核心是建立运动坐标系:
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)
需要特别注意:
- 模板图像要在最佳光照条件下采集
- 尺度范围(0.8~1.2)要根据物体变形程度调整
- 分数阈值设为0.9可过滤80%的误匹配
4. 复杂场景下的标定技巧
上个月遇到一个棘手案例:客户需要在曲面玻璃上贴装元件。常规平面标定误差达到3mm,后来我们开发出曲面自适应标定法。
4.1 多平面标定策略
- 在工件表面不同高度放置标定板(至少3个平面)
- 对每个平面执行标准标定流程
- 使用
create_surface_model构建三维映射关系
这个方案使最终贴装精度达到±0.1mm,比客户要求还高50%。关键点在于:
- 相邻标定板高度差控制在20-50mm
- 每个平面采集15个点以上
- 用RANSAC算法剔除异常点
4.2 环境光干扰应对
车间环境光变化会导致标定失败,我们总结出"三防"原则:
- 防反光:标定板用哑光材质,我试过喷哑光漆效果不错
- 防阴影:增加环形光源,保证照度>1000lux
- 防频闪:相机曝光时间设为光源周期的整数倍
有次客户产线出现诡异的位置漂移,最后发现是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
5. 标定结果验证与优化
标定不是一锤子买卖。去年有个项目上线3个月后精度突然下降,排查发现是机械臂谐波减速器磨损导致的。从此我们严格执行验证标准。
5.1 九点验证法
在标定区域均匀选取9个验证点:
- 机械臂移动到理论位置
- 相机检测实际位置偏差
- 计算RMSE(均方根误差)
验收标准:
- 单点误差<0.15mm
- RMSE<0.1mm
- 最大偏差<0.2mm
5.2 温度补偿方案
精密场合要考虑热变形影响。我们的做法是:
- 在机械臂关键部位贴温度传感器
- 建立温度-补偿量查找表
- 实时应用补偿值
这个Halcon代码片段可以实现自动补偿:
halcon复制* 读取温度传感器
read_temp_sensor(TempSensorHandle, Temperature)
* 查询补偿量
get_temperature_compensation(Temperature, CompX, CompY)
* 应用补偿
Qx_compensated := Qx + CompX
Qy_compensated := Qy + CompY
经过这些年的项目积累,我发现手眼标定就像给机器人配眼镜——配得准不准,直接决定它干活利不利索。最近在做一个医疗机器人项目,标定精度要求达到0.01mm级别,这又逼着我们开发出新的标定方法。技术这东西,永远都是在解决实际问题的过程中不断进化的。
