uvw对位平台,XXY,XYθ对位平台源码,halcon定位算法,C#联合halcon,含C#和halcon源码,开发平台,vs2015,halcon17
最近在折腾视觉对位系统时,发现不少同行在UVW和XXY平台的选择上容易犯选择困难症。今天就结合实战经验,聊聊怎么用C#和Halcon17搞一套靠谱的视觉对位系统。(悄悄说,文末有干货源码)
先说说UVW平台这哥们儿,它的三轴联动机制在精密调整时确实风骚——U轴负责水平平移,V轴垂直方向平移,W轴控制旋转。这种解耦设计在处理复杂位姿补偿时简直不要太爽。不过要注意坐标系转换这个坑,这里分享个坐标变换的代码片段:
// 将机械坐标转换为平台运动量 double theta = currentAngle * Math.PI / 180; // 角度转弧度 double deltaX = targetX - currentX; double deltaY = targetY - currentY; // UVW轴运动量计算 double U = deltaX * Math.Cos(theta) - deltaY * Math.Sin(theta); double V = deltaX * Math.Sin(theta) + deltaY * Math.Cos(theta); double W = targetAngle - currentAngle;Halcon的定位算法是整套系统的眼睛。模板匹配千万别直接用findshapemodel,建议先做个图像预处理。比如这个增强对比度的操作:
* 自适应直方图均衡 read_image (Image, 'pcb_sample') emphasize (Image, ImageEmphasize, 7, 7, 1.5) create_shape_model (ImageEmphasize, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 3, ModelID)开发环境搭建设个防坑指南:在VS2015里引用halcondotnet.dll时,记得把x64和x86的runtime都带上。遇到过好几次同事在32位系统跑64位dll的惨案,那报错提示简直能让人怀疑人生。
uvw对位平台,XXY,XYθ对位平台源码,halcon定位算法,C#联合halcon,含C#和halcon源码,开发平台,vs2015,halcon17
运动控制部分有个骚操作——把平台运动参数封装成JSON配置文件,改参数不用重新编译:
// 运动参数配置类 public class MotionConfig { public double Acceleration { get; set; } = 0.3; // 默认加速度 public double MaxSpeed { get; set; } = 100.0; // 单位mm/s public int Smoothness { get; set; } = 5; // 运动平滑等级 } // 读取配置文件 var config = JsonConvert.DeserializeObject<MotionConfig>(File.ReadAllText("motion_config.json"));实际调试时发现,Halcon的亚像素边缘检测在配合UVW平台时效果拔群。这个边缘提取代码实测有效:
edges_sub_pix (Image, Edges, 'canny', 1.5, 20, 40) segment_contours_xld (Edges, Contours, 'lines_circles', 5, 4, 2)源码里还有个宝藏——坐标系统一管理类。把机械坐标、视觉坐标、平台坐标的转换关系封装成静态方法,调用起来不要太方便:
public static class CoordTransformer { private static double _pixelScale = 0.02; // 像素当量 mm/pixel public static PointF VisualToMechanical(PointF visualPoint) { return new PointF(visualPoint.X * _pixelScale, visualPoint.Y * _pixelScale); } // 带旋转补偿的坐标转换 public static PointF RotateTransform(PointF point, float angle) { double radian = angle * Math.PI / 180; return new PointF( (float)(point.X * Math.Cos(radian) - point.Y * Math.Sin(radian)), (float)(point.X * Math.Sin(radian) + point.Y * Math.Cos(radian)) ); } }这套系统在实际跑起来时,发现个有意思的现象:Halcon17的HDevelop导出的C#代码,在模板匹配时偶尔会内存泄漏。后来改用using语句包住HObject对象才解决,所以大家记得做好资源释放。
需要完整源码的老铁可以到Github搜项目名"UVW-Alignment-System",里面包含了运动控制模块、视觉处理模块和平台模拟器。下回可以聊聊怎么用OpenCV实现类似功能,或者大家想看什么实战内容?评论区见~