Halcon联和C#做的运动控制加视觉定位小案例,板卡用的是正运动的ECI1408,,支持建模...
Halcon联和C#做的运动控制加视觉定位小案例板卡用的是正运动的ECI1408支持建模和标定的保存和加载此案例非常适合想学运动控制视觉定位的人学习这个周末在实验室里倒腾了一个有意思的小项目用Halcon的视觉定位搭配C#写的运动控制程序驱动正运动ECI1408板卡完成物料抓取。整个过程踩坑不少但实现效果还挺酷的特别适合刚接触机器视觉的小伙伴练手。先搞懂硬件怎么玩ECI1408板卡通过EtherCAT总线连接伺服电机支持八轴联动控制。在C#里调用ZMC_API.dll里的函数就能直接发指令比如初始化用这个int ret ZMC_API.OpenController(0, ECI1408, out int handle); if (ret 0) { Console.WriteLine($板卡连接成功句柄:{handle}); // 设置脉冲当量根据实际机械结构计算 ZMC_API.SetAxisUnit(handle, 1, 0.001); // 1号轴1mm对应1000脉冲 }这里有个坑要注意脉冲当量换算错误会导致实际移动距离和指令差十倍。建议在调试阶段先用手轮模式验证电机方向避免撞机风险。视觉定位是重头戏Halcon部分主要负责标定和坐标转换。用九点标定法建立像素坐标到机械坐标的映射关系* 采集标定板图像后 find_calib_data_caltab (Image, CalibDataID, caltab_30mm.descr, 0.03, 0, 0) get_calib_data_observ_points (CalibDataID, 0, 0, all, RCoord, CCoord, Index, Pose)标定完成后把参数序列化到本地文件下次开机直接加载省时间。这里用了BinaryFormatter序列化虽然现在不推荐但胜在方便// 保存标定矩阵 FileStream fs new FileStream(calibration.bin, FileMode.Create); BinaryFormatter bf new BinaryFormatter(); bf.Serialize(fs, homMat2D); fs.Close();运动控制怎么和视觉联动当Halcon检测到物料位置后需要将像素坐标转换为机械坐标。转换后的坐标通过共享内存传给运动控制线程// 坐标转换核心代码 HTuple worldX, worldY; AffineTransPoint2d(homMat2D, targetRow, targetCol, out worldX, out worldY); // 生成运动指令 string cmd $MOVABS(1,{worldX.D},2,{worldY.D}); ZMC_API.ExecuteCommand(handle, cmd);这里有个实用技巧在运动指令前加个延时指令WAIT(IDLE)可以避免多轴不同步的问题。调试时用GetAxisState函数实时读取轴状态比看日志直观得多。标定数据要动态加载项目里最骚的操作是标定参数热更新。当更换镜头或调整相机位置后不需要重启程序就能重新加载标定文件// 监控标定文件变化 FileSystemWatcher watcher new FileSystemWatcher(); watcher.Filter *.bin; watcher.Changed (s, e) { // 加锁防止读写冲突 lock(_lockObj){ homMat2D LoadHomMat2D(e.FullPath); } };实测这个功能在产线调试时能省下大量重启时间。注意加载时要做好异常处理避免加载到损坏文件导致坐标计算崩掉。Halcon联和C#做的运动控制加视觉定位小案例板卡用的是正运动的ECI1408支持建模和标定的保存和加载此案例非常适合想学运动控制视觉定位的人学习整个项目跑下来发现几个关键点标定精度要控制在3个像素以内运动控制指令建议提前做轨迹规划还有线程间通信最好用内存映射文件而不是事件。源码里留了个彩蛋——用WPF的动画功能做了个虚拟轴位置显示这对调试帮助巨大。建议新手先把机械结构简化用乐高积木搭个测试平台再实操比直接上工业设备安全得多。