机械手)联合编程"/>
C#(上位机)—Halcon(图像处理)—ADS(PLC)—Python(机械手)联合编程
最近参与到公司一个联合项目开发,经过近一个月的开发周期基本已经完成上位机需求,写篇博客以记录开发过程中碰到的一些疑难问题,方便日后查看学习。
一、项目内容
项目主要设计一套系统以完成对产品的缺陷检测、智能分拣、外观切割等操作。
具体流程:1、设计Halcon程序,驱动工业相机,完成烟包的中心点坐标、角度的测量;2、设计C#异步服务器(集成TCP和ADS通信),完成对抓取图片的数据通信及下位PLC通信:将角度坐标信息通过TCP传输客户端,将PLC状态信息通过ADS通信传输至PLC;3、设计Python异步客户端,实现TCP通信,接收服务器数据并驱动机械手操作。
二、设计思路
1、Halcon
目的在于获得烟包的中心点坐标及角度,并完成世界坐标系转换。
一开始思路是利用Blobe逼近ROI,再通过orientation_region算子得到角度,后发现对于不同照片,Blobe难以以固定的阈值得到ROI,故此法不可行;第二种思路是利用模板匹配,vector_angle_to_rigid来获得目标的中心点及角度,此法比较稳定,易于扩充需求,但是值得注意的是模板的标准问题,因为最终得到的角度是以模板为标准(0度)旋转得到的。另外考虑到烟包的正反面特性,建议提前做好正面、反面模板保存至本地,使用时再利用read_shape_model进行写入。
*烟包测量数据算法*
gen_empty_obj (Models)IndexS := []
IndexE := []
ModelIDs := []read_shape_model ('C:/Users/56234/Desktop/烟包检测/格调娇子/img_model_正面', ModelID0)
read_shape_model ('C:/Users/56234/Desktop/烟包检测/格调娇子/img_model_背面', ModelID1)ModelIDs[0] := [ModelID0]
ModelIDs[1] := [ModelID1]for I := 0 to 1 by 1get_shape_model_contours (ModelContours, ModelIDs[I], 1)count_obj (ModelContours, NumModel)count_obj (Models, NumModels)concat_obj (Models, ModelContours, Models) IndexS := [IndexS,NumModels + 1]IndexE := [IndexE,NumModels + NumModel]endfor* Image Acquisition 01: Code generated by Image Acquisition 01
ImageFiles := []
ImageFiles[0] := 'C:/Users/56234/MVS/Data/Image_20190814150555121.jpg'
ImageFiles[1] := 'C:/Users/56234/MVS/Data/Image_20190814150606739.jpg'
for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])get_image_size (Image, Width, Height)dev_close_window ()dev_open_window (-1, -1, Width, Height, 'black
更多推荐
C#(上位机)—Halcon(图像处理)—ADS(PLC)—Python(机械手)联合编程
发布评论