四轴抓取视觉旋转标定源代码,基于VS2015 C++ 实现,仿雅马哈四轴机械手抓取程序,实现把两个任意摆放的物料通过视觉算法和运动控制指令定位摆放到指定的位置并拼接起来。 使用研华控制卡搭配工业相机实现,图像算法使用halcon实现,包含界面控制,图像采集,手动控制,图像建模,路径规划,运动仿真动画。 对需要做低成本替代进口机器人的四轴运动视觉方案的朋友具有极高的参考价值。

这个四轴抓取系统的开发过程就像在搭积木——既要保证视觉定位的精准度,又要确保机械臂动作行云流水。项目启动时,我们拆了台二手雅马哈机械手做逆向测绘,发现核心难点在于视觉坐标系与机械坐标系的实时转换。

系统整体架构分为三个层次:顶层的MFC控制界面负责流程调度,中间层用研华PCI-1240运动控制卡驱动步进电机,底层通过千兆网口连接Basler工业相机。特别要提的是手眼标定模块,我们用Halcon实现了一套九点标定法,这个环节直接关系到抓取的成败。

// 手眼标定核心代码片段
HTuple hv_HomMat2D;
VectorToHomMat2d(hv_Rows, hv_Columns, hv_X, hv_Y, &hv_HomMat2D);
AffineTransPoint2d(hv_HomMat2D, hv_CurrentRow, hv_CurrentCol, 
                  &hv_TransRow, &hv_TransCol);

这段代码实现了从像素坐标到机械坐标的转换。其中VectorToHomMat2d生成仿射变换矩阵时,需要特别注意标定板的摆放角度。我们实测发现,当物料倾斜超过30度时,必须启动动态补偿算法,否则会出现毫米级偏差。

运动控制模块采用了轨迹预判机制,这里有个有意思的插值算法:

void InterpolatePath(POINT start, POINT end) {
    double delta = 0.5; // 插值步长
    int steps = (int)(sqrt(pow(end.x-start.x,2)+pow(end.y-start.y,2))/delta);
    for(int i=0; i<steps; ++i) {
        POINT temp;
        temp.x = start.x + (end.x - start.x)*i/steps;
        temp.y = start.y + (end.y - start.y)*sin(PI*i/(2*steps));
        SendMoveCommand(temp); // 发送运动指令
    }
}

用正弦函数做Y轴轨迹优化后,机械臂运行时的抖动减少了70%。调试时意外发现,当delta值设为0.48时(接近皮带轮齿距的1/2),电机噪音会明显降低。

在图像处理环节,Halcon的模板匹配遇到反光物料时会失效。我们改用边缘梯度匹配结合HSV颜色空间分析:

determine_shape_model_params (ImageReduced, 'auto', 0, rad(180), 
                             'auto', 'auto', 'use_polarity', 
                             'auto', 'auto', ModelID)

这个方案虽然增加了15ms的处理时间,但将识别成功率从82%提升到了97%。现场测试时,有个工程师的金属纽扣曾导致误识别,后来在图像预处理加了中值滤波才解决问题。

项目最抓狂的时刻出现在多轴联动调试阶段。当Z轴下降速度超过30mm/s时,X轴会出现2mm的位置漂移。最后发现是研华卡的运动缓冲区设置问题,调整了下面这个参数才解决:

SetMotionParam(AXIS_Z, ACCEL_TIME, 200); // 加速度时间设为200ms
SetMotionParam(AXIS_X, ANTI_BACKLASH, 5); // 反向间隙补偿5个脉冲

整套系统最终成本控制在3万元以内,比进口方案便宜了至少五倍。有个做汽配的朋友拿这套系统去组装火花塞,据说省了两个人工岗。不过要提醒的是,千万别在未隔离的车间用WiFi传输图像——我们吃过电磁干扰导致坐标跳变的亏。

Logo

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

更多推荐