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调参调到凌晨三点"、"// 旋转轴方向标记,装反了会打齿"。这些实战经验比框架本身更有价值。

Logo

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

更多推荐