样例程序21:MM_S21_Vis_As_Uframe

您正在查看最新版本(V2.2.1)的文档。如果您想查阅其他版本的文档,可以点击页面右上角“切换版本”按钮进行切换。

■ 如果您不确定当前使用的产品是哪个版本,请随时联系梅卡曼德技术支持

程序简介

功能说明

机器人触发Mech-Vision工程运行以获取视觉结果,将视觉结果作为工件坐标系,执行抓取和放置动作流程。

文件路径

Mech-Vision和Mech-Viz软件安装目录下Communication Component/Robot_Interface/ABB/sample/MM_S21_Vis_As_Uframe

对于RobotWare6系统,文件后缀为.mod。对于RobotWare7系统,用户需将.mod修改为.modx

所需工程

Mech-Vision工程

使用前提

  1. 已完成标准接口通信配置。

  2. 已完成自动标定。

此样例程序仅是示例程序。用户需根据实际情况在此基础上进行修改,请勿直接使用该程序。

程序解读

以下为MM_S21_Vis_As_Uframe样例程序的代码及相关解释说明。

与MM_S1_Vis_Basic样例相比,本样例将视觉结果作为用户坐标系(例如工件坐标系)进行抓取。因此,下文不再重复解释与MM_S1_Vis_Basic样例相同部分的代码(详情请参考MM_S1_Vis_Basic样例说明)。
MODULE MM_S21_Vis_As_Uframe
    !----------------------------------------------------------
    ! FUNCTION: trigger Mech-Vision project and get vision result
    ! Mech-Mind, 2026-1-28
    !----------------------------------------------------------
    !define local num variables
    LOCAL VAR num pose_num:=0;
    LOCAL VAR num status:=0;
    LOCAL VAR num label:=0;
    LOCAL VAR num toolid:=0;
    !define local joint&pose variables
    LOCAL CONST jointtarget home:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    LOCAL CONST jointtarget snap_jps:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    LOCAL PERS robtarget camera_capture:=[[380.58,24.66,583.22],[0.00392748,-0.815898,0.578164,-0.00464691],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    LOCAL PERS robtarget pick_waypoint:=[[502.38,26.91,592.51],[0.00179326,-0.458155,0.888868,-0.0019068],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    LOCAL PERS robtarget pickpoint:=[[0,0,0],[1,0,0,0],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    LOCAL PERS robtarget Wobjpoint:=[[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    LOCAL PERS robtarget drop_waypoint:=[[302.00,0.00,558.00],[0,0,-1,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    LOCAL PERS robtarget drop:=[[302.00,0.00,558.00],[0,0,-1,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
    !define LOCAL tooldata variables
    LOCAL PERS tooldata gripper1:=[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
    !define LOCAL wobjdata variables
    TASK PERS wobjdata MM_Wobj:=[FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[639.64,-59.7632,41.2964],[0.0326084,-0.429607,0.901024,0.0503118]]];

    PROC Sample_21()
        !set the acceleration parameters
        AccSet 50,50;
        !set the velocity parameters
        VelSet 50,1000;
        !move to robot home position
        MoveAbsJ home\NoEOffs,v3000,fine,gripper1\WObj:=MM_Wobj;
        !initialize communication parameters (initialization is required only once)
        MM_Init_Socket "127.0.0.1", 50000, 300;
        !move to image-capturing position
        MoveL camera_capture,v1000,fine,gripper1;
        !open socket connection
        MM_Open_Socket status;
        IF status=3099 THEN
            TPWrite "MM: Communication Error";
            STOP;
        ENDIF
        !trigger NO.1 Mech-Vision project
        MM_Start_Vis 1,0,2,snap_jps,status;
        IF status<>1102 THEN
            !add error handling logic here according to different error codes
            TPWrite "MM: Status Error";
            STOP;
        ENDIF
        !get vision result from NO.1 Mech-Vision project
        stop;
        MM_Get_VisData 1,pose_num,status;
        !check whether vision result has been got from Mech-Vision successfully
        IF status<>1100 THEN
            !add error handling logic here according to different error codes
            !e.g.: status=1003 means no point cloud in ROI
            !e.g.: status=1002 means no vision result
            Stop;
        ENDIF
        !close socket connection
        MM_Close_Socket;
        !save first vision point data to local variables
        MM_Get_Pose 1,Wobjpoint,label,toolid;
        !Convert the visual points to the workpiece coordinates
        MM_Wobj.oframe.trans:=Wobjpoint.trans;
        MM_Wobj.oframe.rot:=Wobjpoint.rot;
        !move to intermediate waypoint of picking
        MoveJ pick_waypoint,v1000,z50,gripper1;
        !move to approach waypoint of picking
        MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;
        !move to picking waypoint
        MoveL pickpoint, v300, fine, gripper1\WObj:=MM_Wobj;
        !add object grasping logic here, such as "setdo DO_1, 1;"
        Stop;
        !move to departure waypoint of picking
        MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;
        !move to intermediate waypoint of placing
        MoveJ drop_waypoint,v1000,z50,gripper1;
        !move to approach waypoint of placing
        MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
        !move to placing waypoint
        MoveL drop,v300,fine,gripper1;
        !add object releasing logic here, such as "setdo DO_1, 0;"
        Stop;
        !move to departure waypoint of placing
        MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
        !move back to robot home position
        MoveAbsJ home\NoEOffs,v3000,fine,gripper1;
    ENDPROC
ENDMODULE

上述样例程序代码对应的流程如下图所示。

sample21

下表为新增功能的逻辑解读。用户单击指令名称的超链接便可查看该指令的详细说明。

流程 代码及说明

定义变量

    LOCAL PERS robtarget pickpoint:=[[0,0,0],[1,0,0,0],[0,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    LOCAL PERS robtarget Wobjpoint:=[[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

Wobjpoint用于存放从Mech-Vision获取的视觉点。pickpoint变量用于存放工件坐标系下的抓取位姿。

转存视觉点的工具位姿,并赋值给工件坐标系下MM_Wobj

        !save first vision point data to local variables
        MM_Get_Pose 1,Wobjpoint,label,toolid;
        !Convert the visual points to the workpiece coordinates
        MM_Wobj.oframe.trans:=Wobjpoint.trans;
        MM_Wobj.oframe.rot:=Wobjpoint.rot;

首先通过MM_Get_Pose指令将视觉结果存入变量Wobjpoint,然后将Wobjpoint的位置量和旋转量分别赋值给工件坐标系MM_Wobj的原点位置和原点姿态。这两条指令用于动态更新工件坐标系。

进行抓取和放置

        !move to intermediate waypoint of picking
        MoveJ pick_waypoint,v1000,z50,gripper1;
        !move to approach waypoint of picking
        MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;
        !move to picking waypoint
        MoveL pickpoint, v300, fine, gripper1\WObj:=MM_Wobj;
        !add object grasping logic here, such as "setdo DO_1, 1;"
        Stop;
        !move to departure waypoint of picking
        MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;
        !move to intermediate waypoint of placing
        MoveJ drop_waypoint,v1000,z50,gripper1;
        !move to approach waypoint of placing
        MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
        !move to placing waypoint
        MoveL drop,v300,fine,gripper1;
        !add object releasing logic here, such as "setdo DO_1, 0;"
        Stop;
        !move to departure waypoint of placing
        MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
        !move back to robot home position
        MoveAbsJ home\NoEOffs,v3000,fine,gripper1;
第一次运行程序到“移动机器人到抓取接近点”前,需要在工件坐标系下示教抓取点。
  • MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;:以工件坐标系MM_Wobj为基准,移动机器人到抓取接近点。

  • MoveL pickpoint, v300, fine, gripper1\WObj:=MM_Wobj;:以工件坐标系MM_Wobj为基准,移动机器人到抓取点。

  • MoveL RelTool(pickpoint,0,0,-100), v1000, fine, gripper1\WObj:=MM_Wobj;:以工件坐标系MM_Wobj为基准,移动机器人到抓取离开点。

该页面是否有帮助?

可以通过以下方式反馈意见:

我们重视您的隐私

我们使用 cookie 为您在我们的网站上提供最佳体验。继续使用该网站即表示您同意使用 cookie。如果您拒绝,将使用一个单独的 cookie 来确保您在访问本网站时不会被跟踪或记住。