C#运动控制加视觉定位框架,程序用来取放料,控制卡用的是正运动ZMC408CE总线运动控制卡...
C#运动控制加视觉定位框架,程序用来取放料,控制卡用的是正运动ZMC408CE总线运动控制卡,控制六个电机,XY轴,两个Z轴,两个旋转轴,相机用的是海康,3个海康相机,视觉采取用海康SDK加Halcon动态库开发出来的,支持取料定位,纠偏和放料定位,视觉部分支持产品模板创建和保存,九点标定模板创建和保存,软件框架扩展性比较强,方便学者自己扩展
框架的XY轴负责平面定位,两个Z轴处理垂直升降,旋转轴调整物料角度。视觉系统用三个海康相机实现多工位协同,整套系统最骚的操作是动态补偿物料偏移——比如吸嘴抓歪了0.5mm,系统能自动算补偿值怼到机械手上。

先看运动控制部分。ZMC408CE这货的SDK用起来挺直男,初始化代码长这样:
Zmc408ceController _controller = new Zmc408ceController();
bool isConnected = _controller.Connect("192.168.1.100", 8000);
if (!isConnected) throw new Exception("控制卡连不上,检查网线!");
// 轴参数配置
_controller.SetAxisParam(Axis.X, 10000, 2000); // 脉冲当量1um,最大速度20mm/s
_controller.SetAxisParam(Axis.Y, 10000, 2000);
_controller.EnableAxis(new[]{Axis.X, Axis.Y, Axis.Z1, Axis.Z2}); // 使能四个直线轴
这里有个坑:正运动的API返回bool但不会抛异常,必须手动校验返回值。之前没加isConnected判断,有次网线松了直接让机械臂跳了段街舞。
视觉定位部分用了海康MVSCameraSDK和Halcon的杂交方案。相机初始化代码里藏着个骚操作:
// 海康相机驱动
HikCamera camera = new HikCamera();
camera.SetResolution(2592, 2048);
camera.SetExposure(8000); // 微秒单位
camera.SetGrabCallback((imgData) => {
// 回调里直接塞Halcon处理
HImage image = new HImage("byte", 2592, 2048, imgData);
_halconWindow.DispImage(image); // 显示到Halcon窗口
DoTemplateMatch(image); // 模板匹配
});
这回调写法容易让新手翻车——海康SDK的取图线程和UI线程打架,必须用Control.Invoke更新界面。后来封装了个带线程同步的HikVisionHelper类才解决问题。

九点标定模块是全场MVP。标定板移动九个位置后,算法把像素坐标和机械坐标做矩阵变换:
// 标定点数据结构
public class CalibrationPoint {
public Point PixelPos { get; set; }
public PointF MachinePos { get; set; }
}
// 计算转换矩阵
Matrix3x2 calibrationMatrix = Calibrator.CalculateMatrix(calibrationPoints);
这里用仿射变换而不是单应变换,因为Z轴固定高度下平面运动足够用。实际测试发现标定误差主要来自机械回程间隙,后来加了单向逼近的运动策略,误差从0.1mm干到0.02mm。
扩展性方面框架玩得挺溜。运动控制部分用策略模式封装:
public interface IMotionStrategy {
void MoveTo(Point3D target);
void SetSpeed(double mmPerSecond);
}
// 直线插补策略
public class LinearMotion : IMotionStrategy {
public void MoveTo(Point3D target) {
_controller.MoveLinear(target, SyncMode.SyncAll);
}
}
// 圆弧插补策略
public class ArcMotion : IMotionStrategy {
public void MoveTo(Point3D target) {
_controller.MoveArc(centerPoint, target, isClockwise);
}
}
视觉模块支持热插拔相机驱动,换掉HikCamera类就能接其他品牌。测试时用过一个杂牌USB相机,图像采集卡成PPT,最后还是换回海康真香。

整套系统最爽的是放料时的动态纠偏。视觉实时检测放料位置,运动控制边跑边修正:
while (!IsInPosition(target)) {
var offset = GetVisualOffset();
_controller.CorrectTrajectory(offset.X, offset.Y);
Thread.Sleep(10); // 10ms调整周期
}
这个循环里如果Sleep时间设太长,会导致修正滞后;设太短又会加重系统负载。最后用高精度定时器替代Sleep,配合控制卡的LookAhead功能才实现丝滑调整。
框架里还埋了个彩蛋:在代码注释里写满了前辈的血泪史,比如"// 千万别改这个系数!2022.3.5调参调到凌晨三点"、"// 旋转轴方向标记,装反了会打齿"。这些实战经验比框架本身更有价值。

更多推荐
所有评论(0)