1. 项目概述
这个自动钻孔机项目是我去年完成的一个实际工业自动化案例,主要实现了基于机器视觉的精确定位钻孔功能。整套系统由C#编写的上位机软件、Halcon视觉处理模块和雷塞SMC606运动控制器三大部分组成,已经稳定运行了8个月,累计完成超过50万次钻孔操作。
1.1 核心需求解析
客户需要一台能自动识别金属板材上预设标记点并进行精准钻孔的设备,主要技术指标包括:
- 定位精度:±0.05mm
- 处理速度:单点识别+钻孔≤3秒
- 兼容板材尺寸:300×300mm至1200×800mm
- 钻孔直径范围:Φ2mm-Φ12mm
经过方案论证,最终确定的硬件配置为:
- 工业相机:500万像素Basler ace系列
- 镜头:12mm定焦工业镜头
- 光源:红色环形LED光源
- 运动控制:雷塞SMC606六轴控制器
- 伺服电机:400W交流伺服驱动
2. 系统架构设计
2.1 软件架构
采用典型的三层架构设计:
code复制[用户界面层]
↓
[业务逻辑层] ←→ [Halcon视觉处理]
↓
[设备控制层] ←→ [SMC606运动控制]
2.2 硬件通信拓扑
code复制工业相机 → GigE → 工控机
↓
SMC606 ←→ 伺服驱动器
↓
钻孔主轴
3. Halcon视觉处理实现
3.1 图像采集配置
在Halcon中配置相机参数时,特别注意以下关键设置:
csharp复制HTuple hv_AcqHandle;
HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1,
"default", -1, "false", "default", "cam1", 0, -1, out hv_AcqHandle);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 5000);
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "Gain", 1.2);
注意:曝光时间需要根据实际打光情况调整,我们最终采用5000μs的曝光配合f/8的光圈,获得了最佳成像效果。
3.2 定位算法实现
采用基于形状匹配的定位方案,核心代码如下:
csharp复制HObject ho_Image, ho_Edges;
HTuple hv_ModelID, hv_Rows, hv_Cols;
// 创建形状模板
HOperatorSet.ReadImage(out ho_Image, "template.png");
HOperatorSet.CreateShapeModel(ho_Image, "auto",
new HTuple(-30).TupleRad(), new HTuple(60).TupleRad(),
"auto", "auto", "use_polarity", "auto", "auto",
out hv_ModelID);
// 实时匹配
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
HOperatorSet.EdgesSubPix(ho_Image, out ho_Edges, "canny",
1.5, 20, 40);
HOperatorSet.FindShapeModel(ho_Edges, hv_ModelID,
new HTuple(-30).TupleRad(), new HTuple(60).TupleRad(),
0.7, 1, 0.5, "least_squares", 0, 0.9,
out hv_Rows, out hv_Cols, out _, out _);
4. 运动控制集成
4.1 SMC606控制器配置
通过以太网连接控制器时,需要注意:
- 确保控制器IP与工控机在同一网段
- 设置正确的子网掩码(通常255.255.255.0)
- 禁用Windows防火墙或添加例外规则
初始化代码示例:
csharp复制SMC606Controller controller = new SMC606Controller();
if (!controller.Connect("192.168.1.100"))
{
throw new Exception("控制器连接失败!");
}
// 设置运动参数
controller.SetAxisParam(1, AxisParam.MaxVelocity, 200);
controller.SetAxisParam(1, AxisParam.MaxAccel, 100);
controller.SetAxisParam(1, AxisParam.MaxDecel, 100);
4.2 坐标转换算法
视觉坐标到机械坐标的转换是关键,我们采用的转换公式:
code复制机械X = (图像Col - 中心X) × 像素当量 + 基准X
机械Y = (中心Y - 图像Row) × 像素当量 + 基准Y
其中像素当量通过标定获得,实现代码:
csharp复制double pixelScale = 0.02; // mm/pixel
double baseX = 100.0, baseY = 50.0;
double centerX = 1280/2, centerY = 1024/2;
public PointF VisionToMachine(double row, double col)
{
float x = (float)((col - centerX) * pixelScale + baseX);
float y = (float)((centerY - row) * pixelScale + baseY);
return new PointF(x, y);
}
5. 系统集成与调试
5.1 工作流程实现
完整的自动钻孔流程:
- 相机触发拍照
- Halcon处理图像获取坐标
- 坐标转换
- 运动控制定位
- 主轴下压钻孔
- 返回待机位置
主控制循环代码框架:
csharp复制while (true)
{
// 1. 获取图像
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
// 2. 视觉定位
FindMarkPosition(ho_Image, out hv_Rows, out hv_Cols);
// 3. 坐标转换
PointF drillPos = VisionToMachine(hv_Rows[0].D, hv_Cols[0].D);
// 4. 运动控制
controller.MoveTo(drillPos.X, drillPos.Y);
controller.DrillDown();
Thread.Sleep(300);
controller.DrillUp();
// 5. 判断是否继续
if (IsCycleFinished()) break;
}
5.2 调试经验分享
-
视觉定位不稳定问题:
- 现象:同一位置重复识别结果波动>0.1mm
- 排查:发现是光源频闪导致
- 解决:改用直流供电光源,增加稳压器
-
运动末端振动问题:
- 现象:钻孔停止时出现轻微振动
- 排查:加速度曲线设置不合理
- 解决:采用S型速度曲线,调整参数:
csharp复制controller.SetAxisParam(1, AxisParam.Jerk, 500);
-
坐标转换误差问题:
- 现象:四个角落位置误差较大
- 排查:镜头畸变未校正
- 解决:使用Halcon的相机标定功能,生成校正映射表
6. 关键问题解决方案
6.1 多孔位记忆功能
为实现批量加工,开发了孔位记忆系统:
csharp复制List<PointF> drillPoints = new List<PointF>();
public void AddDrillPoint(PointF point)
{
drillPoints.Add(point);
SaveToFile("drill_points.csv"); // 保存到CSV文件
}
public void RunBatchDrilling()
{
foreach (var point in drillPoints)
{
controller.MoveTo(point.X, point.Y);
ExecuteDrilling();
}
}
6.2 异常处理机制
完善的异常处理保证系统可靠性:
csharp复制try
{
// 运动控制代码
controller.MoveTo(x, y);
}
catch (SMC606Exception ex)
{
LogError($"运动控制错误:{ex.Message}");
controller.EmergencyStop();
MessageBox.Show("运动控制异常,请检查硬件连接!");
}
7. 性能优化技巧
-
视觉处理优化:
- 使用ROI缩小处理区域
- 将形状模板转为NCC模板提升速度
- 启用Halcon的多线程处理
-
运动控制优化:
- 采用前瞻算法规划路径
- 设置合理的加减速参数
- 启用硬件位置比较输出
-
系统级优化:
- 将视觉处理和运动控制分线程运行
- 使用内存映射文件共享数据
- 禁用Windows不必要的后台服务
8. 项目交付文档
完整项目包含以下文档:
- 电气原理图(PDF格式)
- BOM清单(Excel格式)
- 操作手册(包含安全注意事项)
- API接口说明
- 维护指南
- 校准规程
特别提醒:所有文档都应包含版本控制信息,我们采用"年.月.序号"的版本号规则,如"23.08.01"表示2023年8月第1版。
在实际部署时发现,通过合理设置Halcon的匹配参数,可以将识别速度从最初的1.2秒提升到0.4秒左右。具体做法是:
- 将金字塔级别从5减少到3
- 将匹配分数阈值从0.7提高到0.8
- 使用预处理后的模板图像
运动控制方面,经过实测发现将SMC606的伺服更新周期从2ms调整为1ms后,定位精度提升了约30%,但会略微增加CPU负载。对于大多数应用,2ms周期已经足够。
