Halcon联和C#做的运动控制加视觉定位小案例,板卡用的是正运动的ECI1408,,支持建模和标定的保存和加载,此案例非常适合想学运动控制视觉定位的人学习 赠送超级详细讲解教程

做工业自动化的小伙伴应该都遇到过这种场景——机械手需要精准抓取流水线上的零件。这时候就得靠视觉定位+运动控制的组合拳了。最近用正运动ECI1408板卡搭了个demo,支持标定数据持久化和三维建模,实测定位精度能稳定在±0.1mm,这就把核心代码和实现思路拆开来说说。

先看视觉定位部分。Halcon的模板匹配是重头戏,建议先在标定阶段生成基准模板:

* 创建形状模板
create_shape_model (ImageReduced, 5, rad(0), rad(360), 'auto', 'use_polarity', 
                   'auto', 'auto', ModelID)
* 保存模板数据
write_shape_model (ModelID, 'D:/calibration_data/template.shm')

这里注意要提前做图像降噪和ROI区域裁剪,实测模板角度范围设到360度时匹配成功率最高。标定文件建议用相对路径存储,方便后续项目迁移。

运动控制这边用C#对接ECI1408的SDK,初始化板卡连接时容易踩坑:

// 板卡连接
int ret = ZMC_Connect("192.168.1.140", out g_handle);
if(ret != 0){
    MessageBox.Show($"连接失败,错误码:{ret}");
    return;
}
// 开启轴使能
ZMC_AxisEnable(g_handle, 0, 1);  //轴号0,使能状态1

重点来了——坐标转换!当相机和机械手不是垂直安装时,必须做仿射变换。这里用标定板获取的转换矩阵:

// 转换视觉坐标到机械坐标
double machineX = calibData[0] * imgX + calibData[1] * imgY + calibData[2];
double machineY = calibData[3] * imgX + calibData[4] * imgY + calibData[5];

标定数据建议用JSON序列化存储,实测二进制序列化在跨平台时容易出问题。每次启动程序自动加载最近一次的标定文件,能省去重复标定的麻烦。

运动轨迹规划建议采用S曲线加减速,ECI1408的API直接支持:

// 设置S曲线参数
ZMC_SetScurve(g_handle, 0, 0.2);  //平滑系数0.2
// 点位运动
ZMC_MoveAbsolute(g_handle, 0, targetX, 100.0);  //轴号0,目标位置,速度100mm/s

调试时最容易忽略的是机械臂运动方向和视觉坐标方向的映射关系,建议先用调试模式单步走坐标,确认方向正确再全速运行。

项目里还藏了个小彩蛋——支持三维空间坐标保存。用List存储路径点,配合ECI1408的直线插补指令,轻松实现复杂轨迹:

// 三维路径规划
List<Vector3> pathPoints = LoadPath("config/path001.json");
foreach(var point in pathPoints){
    ZMC_LineXYZ(g_handle, point.X, point.Y, point.Z, 80);
}

最后提醒下,标定环节的准确性直接决定最终精度。建议用高精度标定板,至少采集9个标定点。遇到坐标偏移时,先检查相机曝光参数是否稳定,再排查机械结构的反向间隙。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐