Example Program 3: MM_S3_Vis_Path

You are currently viewing the documentation for the latest version (2.1.0). To access a different version, click the "Switch version" button located in the upper-right corner of the page.

■ If you are not sure which version of the product you are currently using, please feel free to contact Mech-Mind Technical Support.

Program Introduction

Description

The robot triggers the Mech-Vision project to run, and then obtains the planned path for 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_S3_Vis_Path path.

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

Project

Mech-Vision project

The Mech-Vision project should contain a Path Planning Step, and the Port Type parameter of the Output Step should be set to Predefined (robot path).

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_S3_Vis_Path example program.

MODULE MM_S3_Vis_Path
!----------------------------------------------------------
! FUNCTION: trigger Mech-Vision project and get planned path
! 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 jointtarget jps{5}:=
[
    [[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[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]];

PROC Sample_3()
    !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;
    !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;
    !trigger NO.1 Mech-Vision project
    MM_Start_Vis 1,0,2,snap_jps;
    !get planned path from NO.1 Mech-Vision project; 2nd argument (1) means getting pose in JPs
    MM_Get_VisPath 1,1,pose_num,vis_pose_num,status;
    !check whether planned path has been got from Mech-Vision successfully
    IF status<>1103 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 results
        Stop;
    ENDIF
    !close socket connection
    MM_Close_Socket;
    !save waypoints of the planned path to local variables one by one
    MM_Get_Jps 1,jps{1},label{1},toolid{1};
    MM_Get_JPS 2,jps{2},label{2},toolid{2};
    MM_Get_JPS 3,jps{3},label{3},toolid{3};
    !follow the planned path to pick
    !move to approach waypoint of picking
    MoveAbsJ jps{1},v1000,fine,gripper1;
    !move to picking waypoint
    MoveAbsJ jps{2},v1000,fine,gripper1;
    !add object grasping logic here, such as "setdo DO_1, 1;"
    Stop;
    !move to departure waypoint of picking
    MoveAbsJ jps{3},v1000,fine,gripper1;
    !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

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

sample3

The table below explains the above program. You can click the hyperlink to the command name to view its detailed description.

Feature Code and description

Define variables

!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 jointtarget jps{5}:=
[
    [[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.653,95.4782,-4.3661,-23.6568,-2.6275,-165.996],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[-9.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[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 variables. The above local variables are valid only in this program.

Teach the home position (home variable), the pose of the input Mech-Vision project (snap_jps variable), the image-capturing position (camera_capture variable), the intermediate waypoint of placing (drop_waypoint variable), and the placing waypoint (drop variable), and set the tool data (gripper1 variable) in advance.

For information about how to teach a waypoint, see the Teach Calibration Start Point section in the calibration document.

Set the acceleration and velocity

!set the acceleration parameters
AccSet 50, 50;
!set the velocity parameters
VelSet 50, 1000;

AccSet 50, 50: Limit the acceleration to 50% of the normal value and the acceleration rate to 50% of the normal value.

VelSet 50, 1000: Set the velocity to 50% of the programmed rate and the maximum TCP rate to 1000 mm/s.

Move to the home position

!move to robot home position
MoveAbsJ home\NoEOffs,v3000,fine,gripper1;
  • MoveAbsJ: The absolute position motion command of the ABB robot, indicating that each joint axis of the robot moves to a specified position independently.

  • home: Specify the target position to which the robot moves, i.e., the home position that is taught. The home position is usually a safe one where the robot is away from objects and the surrounding equipment.

  • \NoEOffs: Specify that the motion is not affected by external axes.

  • v3000: Specify that the robot velocity is 3000 mm/s.

  • fine: Move the robot to the specified position.

  • gripper1: Specify the ID of the tool used by the robot when it moves.

The entire command indicates that the robot moves to the taught home position without the impact of external axes at a velocity of 3000 mm/s.

Initialize communication parameters

!initialize communication parameters (initialization is required only once)
MM_Init_Socket "127.0.0.1",50000,300;

The robot sends the MM_Init_Socket command to set the IP address, port number, and timeout period of the communication object (the IPC) to 127.0.0.1, 50000, and 300 seconds.

Please modify the IP address and port number of the IPC according to the actual situation. The IP address and port number must be consistent with those set in the vision system.

Move to the image-capturing position

!move to image-capturing position
MoveL camera_capture,v1000,fine,gripper1;
  • MoveL: The linear motion command of the ABB robot. This command specifies to move the robot along a linear path to a specified position.

  • camera_capture: Specify the target position to which the robot moves, i.e., the image-capturing position that is taught. The image-capturing position refers to the position of the robot where the camera on the robot captures images. At this position, the robot arm should not block the camera’s FOV.

The entire command indicates that the robot moves to the image-capturing position accurately in linear motion, with a velocity of 1000 mm/s.

Establish the communication

!open socket connection
MM_Open_Socket;

The TCP communication between the robot and the vision system is established by using the MM_Open_Socket command.

Trigger the Mech-Vision project to run

!trigger NO.1 Mech-Vision project
MM_Start_Vis 1,0,2,snap_jps;
  • MM_Start_Vis: The command to trigger the Mech-Vision project to run.

  • 1: The Mech-Vision project ID.

  • 0: The Mech-Vision project is expected to return all waypoints.

  • 2: Specify that the robot flange pose must be input to the Mech-Vision project.

  • snap_jps: Custom joint positions. The joint positions in this example program are of no practical use but must be set.

The entire statement indicates that the robot triggers the vision system to run the Mech-Vision project with an ID of 1 and expects the Mech-Vision project to return all waypoints.

Obtain the planned path

!get planned path from NO.1 Mech-Vision project; 2nd argument (1) means getting pose in JPs
MM_Get_VisPath 1,1,pose_num,vis_pose_num,status;
  • MM_Get_VisPath: The command to obtain the planned path from Mech-Vision.

  • First 1: Specify the Mech-Vision project ID.

  • Second 1: Specify the pose type of obtained waypoints as joint positions.

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

  • vis_pose_num: The variable that stores the sequence number 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-Vision project that has an ID of 1.

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.
!check whether planned path has been got from Mech-Vision successfully
IF status<>1103 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 results
    Stop;
ENDIF

When the status code is 1103, the robot has successfully obtained the planned path. Otherwise, an error has occurred in the vision system. You can perform the corresponding operation based on the specific error code.

Close the communication

!close socket connection
MM_Close_Socket;

The TCP communication between the robot and the vision system is closed by using the MM_Close_Socket command.

Store the planned path

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

  • 1: Store the first waypoint.

  • jps{1}: The variable that stores the joint positions 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_JPS 1,jps{1},label{1},toolid{1};” stores the joint positions, label, and tool ID of the first waypoint in the specified variables.

In this example, the path planned by Mech-Vision consists of three waypoints: the first waypoint is the approach waypoint of picking, the second waypoint is the picking waypoint, and the third waypoint is the departure waypoint of picking. Please store the planned path based on the actual Mech-Vision project.

Move to the approach waypoint of picking

!move to approach waypoint of picking
MoveAbsJ jps{1},v1000,fine,gripper1;

The robot moves to the approach waypoint of picking (the position represented by jps{1}).

Move to the picking waypoint

!move to picking waypoint
MoveAbsJ jps{2},v300,fine,gripper1;

The robot moves to the picking waypoint (the position represented by JPs {2}).

Set DOs to perform picking

!add object grasping logic here, such as "setdo DO_1, 1;"
Stop;

After the robot moves to the picking waypoint, you can set a DO (such as setdo DO_1, 1;) to control the robot to use the tool to perform picking. Please set DOs based on the actual situation.

Stop indicates that program execution is paused. If you have added a statement to set a DO, you can delete the Stop statement here.

Move to the departure waypoint of picking

!move to departure waypoint of picking
MoveAbsJ jps{3},v1000,fine,gripper1;

The robot moves to the departure waypoint of picking (the position represented by jps{3}).

Move to the intermediate waypoint

!move to intermediate waypoint of placing
MoveJ drop_waypoint,v1000,z50,gripper1;
  • MoveJ: The joint position motion command of the ABB robot, indicating that the robot moves along the arc to a specified position.

  • drop_waypoint: Specify the target position to which the robot moves, i.e., the intermediate waypoint.

  • z50: The blend radius is 50 mm.

The entire command moves the robot in joint positions to a certain intermediate waypoint between the departure waypoint of picking and the approach waypoint of placing, with a velocity of 1000 mm/s and a blend radius of 50 mm.

Adding intermediate waypoints can ensure smooth robot motion and avoid unnecessary collisions. You can add multiple intermediate waypoints according to the actual situation.

Move the robot to the approach waypoint of placing

!move to approach waypoint of placing
MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;
  • RelTool(pickpoint,0,0,-100): Specify the target position to which the robot moves. In this example, RelTool stands for the movement relative to the tool reference frame, drop (the placing waypoint) is the base point in the tool reference frame, and 0,0,-100 stands for 100 mm in the negative Z-direction relative to drop.

The entire command moves the robot to 100 mm above the placing waypoint to reach the approach waypoint of placing.

Adding approach waypoints of placing can prevent the robot from colliding with objects (such as bins) in the scene when moving. You can modify the Z-axis negative offset based on the actual scenario to ensure that no collision occurs during the approaching process.

Move to the placing waypoint

!move to placing waypoint
MoveL drop,v300,fine,gripper1;

The robot moves from the approach waypoint of placing to the placing waypoint.

Set DOs to perform placing

!add object releasing logic here, such as "setdo DO_1, 0;"
Stop;

After the robot moves to the placing waypoint, you can set a DO (such as setdo DO_1, 0;) to control the robot to use the tool to perform placing. Please set DOs based on the actual situation.

Stop indicates that program execution is paused. If you have added a statement to set a DO, you can delete the Stop statement here.

Move the robot to the departure waypoint of placing

!move to departure waypoint of placing
MoveL RelTool(drop,0,0,-100),v1000,fine,gripper1;

The robot moves to 100 mm above the placing waypoint and reaches the departure waypoint of placing.

Adding departure waypoints of placing can prevent the robot from colliding with objects (such as bins) in the scene when moving. You can modify the Z-axis negative offset based on the actual scenario to ensure that no collision occurs during the departing process.

Move to the home position

!move back to robot home position
MoveAbsJ home\NoEOffs,v3000,fine,gripper1;

The robot moves from the departure waypoint of placing to the home waypoint again.

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.