1. 项目概述
这套基于Halcon的点胶机系统是我去年带队完成的一个工业自动化项目,核心目标是实现高精度、高效率的自动化点胶生产。系统整合了八台工业相机进行视觉定位,搭配六轴运动控制卡实现精准轨迹控制,最终在客户生产线上实现了99.2%的良品率。不过从开发到量产的过程可谓是一路踩坑,今天就把这些实战经验完整分享出来。
2. 系统架构设计
2.1 硬件组成
整套系统由以下几个关键硬件组成:
-
视觉系统:
- 8台Basler ace系列工业相机(2000万像素)
- 配套环形光源和条形光源
- 千兆网交换机
-
运动控制系统:
- 固高GTS-800六轴运动控制卡
- 6台安川伺服电机
- 精密直线模组
-
主控系统:
- 工业级工控机(i7-1185G7/32GB内存)
- 实时操作系统补丁
2.2 软件架构
软件部分采用分层设计:
code复制应用层:Halcon视觉算法 + 运动控制逻辑
中间层:相机驱动 + 控制卡驱动
底层:Windows RTX实时扩展
这种架构既保证了视觉处理的灵活性,又能满足运动控制的实时性要求。特别要注意的是,我们在工控机上安装了Windows RTX实时扩展,将运动控制线程的优先级提到最高,确保脉冲发送的时序精度。
3. 视觉系统实现
3.1 多相机协同工作
八台相机的同步是第一个技术难点。我们采用硬件触发+软件同步的方案:
-
硬件连接:
- 所有相机通过PTP协议进行时间同步
- 外接触发信号发生器统一触发
-
软件配置关键代码:
cpp复制// 相机初始化
for (int i = 0; i < 8; i++) {
HTuple hv_AcqHandle;
OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "progressive",
-1, "default", -1, "false", "default",
hv_CamNames[i], 0, -1, &hv_AcqHandle);
// 关键参数设置
SetFramegrabberParam(hv_AcqHandle, "TriggerMode", "On");
SetFramegrabberParam(hv_AcqHandle, "TriggerSource", "Line1");
SetFramegrabberParam(hv_AcqHandle, "grab_timeout", 5000);
}
注意事项:不同品牌的相机驱动名称不同,Basler用"GigEVision",海康需要改为"HikVision"。
3.2 视觉定位算法
采用Halcon的模板匹配结合亚像素边缘检测:
python复制# 创建形状模板
create_shape_model(TemplateImage, 5, 0, radians(360), "auto",
"use_polarity", "auto", "auto", ModelID)
# 匹配过程
find_shape_model(SearchImage, ModelID, 0, radians(360), 0.7,
3, 0.5, "least_squares", 0, 0.9, Row, Column, Angle, Score)
参数优化经验:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| NumLevels | 3-5 | 金字塔层数过高会降低小特征识别率 |
| Greediness | 0.7-0.9 | 平衡速度和准确性 |
| MinScore | 0.5 | 低于此分数视为匹配失败 |
4. 运动控制系统
4.1 六轴控制实现
运动控制卡采用固高GTS-800,通过以下代码实现多轴联动:
cpp复制// 初始化运动控制卡
GT_Open(0);
GT_LoadConfig("gts800.cfg");
// 运动参数设置
GT_SetVel(axis1, 100.0); // 单位:mm/s
GT_SetAcc(axis1, 500.0); // 单位:mm/s²
GT_SetDec(axis1, 500.0);
GT_SetSmooth(axis1, 50); // S曲线平滑系数
// 启动运动
GT_Update();
4.2 视觉-运动坐标转换
采用手眼标定实现视觉坐标到机械坐标的转换:
python复制def vision_to_robot(uv_point):
# 标定得到的4x4齐次变换矩阵
T = np.array([[0.998, -0.032, 0, 12.5],
[0.032, 0.998, 0, -8.7],
[0, 0, 1, 0],
[0, 0, 0, 1]])
robot_coord = T @ np.array([uv_point[0], uv_point[1], 0, 1])
return robot_coord[:2]
标定注意事项:
- 使用高精度棋盘格(我们用的是德国ISAR 15x15标定板)
- 标定点数不少于25个
- 标定时环境温度要与工作环境一致
5. 系统集成与优化
5.1 多线程架构
采用生产者-消费者模式处理多相机数据:
code复制主线程:运动控制和系统调度
线程1-8:相机采集
线程9:视觉处理
线程10:日志记录
关键同步机制:
- 使用Boost库的circular_buffer实现线程间数据交换
- 采用无锁队列减少线程阻塞
5.2 实时性能优化
- 内存管理:
cpp复制// Halcon对象必须及时清除
HObject image;
ReadImage(&image, "test.jpg");
// 处理代码...
ClearObj(image); // 必须调用
- 异常处理:
cpp复制try {
GT_Move(axis1, target_pos);
} catch (HException &e) {
GT_Stop();
logger.error("Motion error: {}", e.message);
}
6. 量产问题解决实录
6.1 典型问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 匹配得分波动大 | 光照变化 | 增加光源稳压器 |
| 运动轨迹偏差 | 温度漂移 | 每4小时自动标定一次 |
| 通信中断 | 网线干扰 | 改用工业级屏蔽网线 |
6.2 现场调试经验
-
振动问题:
- 发现点胶头在高频运动时出现振动
- 解决方案:在运动控制中加入S曲线加减速
cpp复制GT_SetSmooth(axis1, 30); // 平滑系数调优 -
温度影响:
- 车间温度变化导致机械臂重复定位精度下降
- 解决方案:增加温度传感器,建立温度补偿模型
python复制def temp_compensation(temp): return 0.02 * (temp - 25) # 25℃为标定温度
这套系统最终在客户现场稳定运行,将点胶良率从85%提升到99.2%,虽然调试过程遇到各种意外情况,但通过扎实的基础工作和充分的现场测试,最终交出了一份满意的答卷。对于工业自动化项目,我的体会是:实验室数据只能参考,真正的考验永远在现场。
