Example Program 7: MM_S7_Viz_SwitchTCP

Program Introduction

Description

The robot starts the Mech-Viz project, obtains the path planning result, and then changes the tool according to the tool ID of the picking waypoint to perform picking and placing.

File path

You can navigate to the installation directory of Mech-Vision and Mech-Viz and find the file by using the Communication Component/Robot_Interface/ABB/sample/MM_S7_Viz_SwitchTCP path.

For RobotWare6, the file extension is .mod. For RobotWare7, please modify the file extension from .mod to .modx.

Project

Mech-Vision and Mech-Viz projects

Prerequisites

  1. You have set up the standard interface communication.

  2. Automatic calibration is completed.

This example program is provided for reference only. Before using the program, please modify the program according to the actual scenario.

Program Description

This part describes the MM_S7_Viz_SwitchTCP example program.

The only difference between the MM_S7_Viz_SwitchTCP example program and the MM_S2_Viz_Basic example program is that MM_S7_Viz_SwitchTCP can change the tool according to the tool ID(this code of this feature is bolded). As such, only the feature of changing the tool according to the tool ID is described in the following section. For information about the parts of MM_S7_Viz_SwitchTCP that are consistent with those of MM_S2_Viz_Basic, see Example Program 2: MM_S2_Viz_Basic.
MODULE MM_S7_Viz_SwitchTCP
!----------------------------------------------------------
! FUNCTION: trigger Mech-Viz project and get planned path,
! switch TCP according to the label
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
LOCAL VAR num pose_num:=0;
LOCAL VAR num status:=0;
LOCAL VAR num toolid{5}:=[0,0,0,0,0];
LOCAL VAR num vis_pose_num:=0;
LOCAL VAR num count:=0;
LOCAL VAR num label{5}:=[0,0,0,0,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:=[[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_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]];
LOCAL PERS robtarget pos{5}:=
[
    [[502.502,99.5586,399.968],[0.00226227,-0.99991,-0.00439596,0.0124994],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[500,100,300],[0.00226227,-0.99991,-0.00439596,0.0124994],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[500,100,300],[0.00226227,-0.99991,-0.00439596,0.0124994],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[500,100,300],[0.00226227,-0.99991,-0.00439596,0.0124994],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[502.502,99.5586,399.968],[0.00226227,-0.99991,-0.00439596,0.0124994],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]
];
!define LOCAL tooldata variables
LOCAL PERS tooldata cur_gripper:=[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
LOCAL PERS tooldata gripper{5}:=,[0.001,[0,0,0.001],[1,0,0,0],0,0,0]],
[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]],
[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]],
[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]],
[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]]];

PROC Sample_7()
    !set the acceleration parameters
    AccSet 50, 50;
    !set the velocity parameters
    VelSet 50, 1000;
    !move to robot home position
    MoveAbsJ home\NoEOffs,v3000,fine,cur_gripper;
    !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,cur_gripper;
    !open socket connection
    MM_Open_Socket;
    !trigger Mech-Viz project
    MM_Start_Viz 2,snap_jps;
    !get planned path, 1st argument (2) means getting pose in TCP
    MM_Get_VizData 2, pose_num, vis_pose_num, status;
    !check whether planned path has been got from Mech-Viz successfully
    IF status <> 2100 THEN
        !add error handling logic here according to different error codes
        !e.g.: status=2038 means no point cloud in ROI
        Stop;
    ENDIF
    !close socket connection
    MM_Close_Socket;
    !save waypoints of the planned path to local variables one by one
    MM_Get_Pose 1,pos{1},label{1},toolid{1};
    MM_Get_Pose 2,pos{2},label{2},toolid{2};
    MM_Get_Pose 3,pos{3},label{3},toolid{3};
    !reset tool signals according to received toolId
    IF toolid{vis_pose_num}=1 Then
        cur_gripper:=gripper{toolid{vis_pose_num}};
        !reset tool signal;
    ELSEIF toolid{vis_pose_num}=2 Then
        cur_gripper:=gripper{toolid{vis_pose_num}};
        !reset tool signal;
    ELSE
        Stop;
        !reset tool signal;
    ENDIF
    !follow the planned path to pick
    !move to approach waypoint of picking
    MoveL pos{1},v1000,fine,cur_gripper;
    !move to picking waypoint
    MoveL pos{2},v300,fine,cur_gripper;
    !add object grasping logic here
    IF toolid{vis_pose_num}=1 Then
        Stop;
        !open tool signal;
    ELSEIF toolid{vis_pose_num}=2 Then
        Stop;
        !open tool signal;
    ELSE
        Stop;
        !open tool signal;
    ENDIF
    !move to departure waypoint of picking
    MoveL pos{3},v1000,fine,cur_gripper;
    !move to intermediate waypoint of placing
    MoveJ drop_waypoint,v1000,z50,cur_gripper;
    !move to approach waypoint of placing
    MoveL RelTool(drop,0,0,-100),v1000,fine,cur_gripper;
    !move to placing waypoint
    MoveL drop,v300,fine,cur_gripper;
    !add object releasing logic here
    IF toolid{vis_pose_num}=1 Then
        Stop;
        !reset tool signal;
    ELSEIF toolid{vis_pose_num}=2 Then
        Stop;
        !reset tool signal;
    ELSE
        Stop;
        !reset tool signal;
    ENDIF
    !move to departure waypoint of placing
    MoveL RelTool(drop,0,0,-100),v1000,fine,cur_gripper;
    !move back to robot home position
    MoveAbsJ home\NoEOffs,v3000,fine,cur_gripper;
ENDPROC
ENDMODULE

The workflow corresponding to the above example program code is shown in the figure below.

sample7

The table below describes the bolded code.

Feature Code and description

Obtain the planned path

!get planned path, 1st argument (2) means getting pose in TCP
MM_Get_VizData 2, pose_num, vis_pose_num, status;
  • MM_Get_VizData: The command to obtain the path planned by Mech-Viz.

  • 2: The pose type of the obtained waypoint is set to TCP.

  • pose_num: The variable that stores the number of waypoints returned by the vision system.

  • vis_pose_num: The variable that stores the position of the Vision Move waypoint (picking waypoint) in the path.

  • status: The variable that stores the command execution status code.

The entire statement indicates that the robot obtains the planned path from the Mech-Viz project.

The returned planned path is saved to the robot memory and cannot be directly obtained. To access the planned path, you must store the planned path in a subsequent step.

Store the planned path

!save waypoints of the planned path to local variables one by one
MM_Get_Pose 1,pos{1},label{1},toolid{1};
MM_Get_Pose 2,pos{2},label{2},toolid{2};
MM_Get_Pose 3,pos{3},label{3},toolid{3};
  • MM_Get_Pose: The command to store the planned path.

  • 1: Store the first waypoint.

  • pos{1}: The variable that stores the TCP of the first waypoint.

  • label{1}: The variable that stores the label of the first waypoint.

  • toolid{1}: The variable that stores the tool ID corresponding to the first waypoint.

The entire command “MM_Get_Pose 1,pos{1},label{1},toolid{1}” stores the TCP, label, and tool ID of the first waypoint in the specified variables.

  • Please store the planned path based on the actual Mech-Viz project. In this example, the path planned by Mech-Viz consists of three waypoints: the first waypoint is the approach waypoint of picking (pos{1}), the second is the picking waypoint (pos{2}), and the third is the departure waypoint of picking (pos{3}). In addition, vis_pose_num indicates the position ID of the picking waypoint in the path. As such, toolid{vis_pose_num} is equivalent to toolid{2}. Either one of the two parameters can specify the tool ID used by the robot when the robot moves to the picking waypoint (pos{2}).

  • This sample will change the tool ID based on the toolid{vis_pose_num} value. As such, the Mech-Viz project used must include a Change Tool Step and the parameters of the Change Tool Step must be properly set.

    • The Change Tool Step must be connected to the Has results output port of the Check Vision Result Step.

    • The Operation Mode parameter of the Change Tool Step must be set to Auto-switch to appropriate tool.

Change the tool based on the tool ID

!reset tool signals according to received toolId
IF toolid{vis_pose_num}=1 Then
    cur_gripper:=gripper{toolid{vis_pose_num}};
    !reset tool signal;
ELSEIF toolid{vis_pose_num}=2 Then
    cur_gripper:=gripper{toolid{vis_pose_num}};
    !reset tool signal;
ELSE
    Stop;
    !reset tool signal;
ENDIF

toolid{vis_pose_num} indicates the tool ID of the picking waypoint. You can determine the tool to be used when the robot moves to the target pose (picking waypoint) based on the value of the toolid {vis_pose_num} variable, i.e., change the tool according to the tool ID. The description of the above code is shown below.

  • When the tool ID of the picking waypoint is 1, the robot will use the gripper1 tool to perform picking.

  • When the tool ID of the picking waypoint is 2, the robot will use the gripper2 tool to perform picking.

  • When the tool ID of the picking waypoint is set to another value, the robot will stop running. You can add other code according to the actual situation.

When the robot moves to the picking waypoint, you can enable the DO signals corresponding to the tool ID, as shown in the following code.

!add object grasping logic here
IF toolid{vis_pose_num}=1 Then
    Stop;
    !open tool signal;
ELSEIF toolid{vis_pose_num}=2 Then
    Stop;
    !open tool signal;
ELSE
    Stop;
    !open tool signal;
ENDIF

When the robot moves to the placing waypoint, you can disable and reset the DO signals corresponding to the tool ID, as shown in the following code.

!add object releasing logic here
IF toolid{vis_pose_num}=1 Then
    Stop;
    !reset tool signal;
ELSEIF toolid{vis_pose_num}=2 Then
    Stop;
    !reset tool signal;
ELSE
    Stop;
    !reset tool signal;
ENDIF

We Value Your Privacy

We use cookies to provide you with the best possible experience on our website. By continuing to use the site, you acknowledge that you agree to the use of cookies. If you decline, a single cookie will be used to ensure you're not tracked or remembered when you visit this website.