Programme d’exemple 16 : MM_S16_Viz_GetDirection

Vous consultez actuellement la documentation pour la dernière version (2.1.2). Pour accéder à une autre version, cliquez sur le bouton "Changer de version" situé dans le coin supérieur droit de la page.

■ Si vous n’êtes pas sûr de la version du produit que vous utilisez, veuillez contacter le support technique Mech-Mind pour obtenir de l’aide.

Introduction du programme

Description

Après que le robot a obtenu la trajectoire planifiée et terminé la saisie, il adopte différentes stratégies de pose en fonction de l’orientation du groupe d’objets de travail.

File path

Vous pouvez accéder au répertoire d’installation de Mech-Vision et Mech-Viz et trouver le fichier en utilisant le chemin Communication Component/Robot_Interface/ABB/sample/MM_S16_Viz_GetDirection.

Pour RobotWare6, l’extension de fichier est .mod. Pour RobotWare7, veuillez modifier l’extension de fichier de .mod en .modx.

Project

Projet Mech-Vision et projet Mech-Viz (l’outil est un préenseur à vide de dépalettisation)

Prerequisites

  1. Vous avez configuré la communication de l’interface standard.

  2. L’étalonnage automatique est terminé.

Ce programme d’exemple est fourni uniquement à titre de référence. Avant d’utiliser le programme, veuillez le modifier en fonction du scénario réel.

Description du programme

Cette partie décrit le programme d’exemple MM_S16_Viz_GetDirection.

Par rapport au programme d’exemple MM_S15_Viz_GetDoList, ce programme d’exemple ne contient que la modification suivante (le code de cette modification est en gras). En conséquence, seule la modification est décrite dans la section suivante. Pour les parties de MM_S16_Viz_GetDirection identiques à celles de MM_S15_Viz_GetDoList, voir Programme d’exemple 15 : MM_S15_Viz_GetDoList.
MODULE MM_S16_Viz_GetDirection
!----------------------------------------------------------
! FUNCTION: trigger Mech-Viz project, then get planned path
! and get box direction using command 210
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
LOCAL VAR num pose_num:=0;
LOCAL VAR num status:=0;
LOCAL VAR num vis_pose_num:=0;
LOCAL VAR num count:=0;
LOCAL VAR num box_direction:=0;
LOCAL VAR num movetype{5}:=[0,0,0,0,0];
LOCAL VAR num toolnum{5}:=[0,0,0,0,0];
LOCAL VAR num speed{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 VAR robtarget pickpoint:=[[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 VAR robtarget drop_waypoint_1:=[[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 VAR robtarget drop_1:=[[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 VAR robtarget drop_waypoint_2:=[[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 VAR robtarget drop_2:=[[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}:=
[
    [[1.1835,39.2938,-17.0883,0.1382,67.7901,176.701],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[1.2008,45.8522,-13.6729,0.1512,57.8163,176.689],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[1.1835,39.2938,-17.0883,0.1382,67.7901,176.701],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[36.2634,-36.6956,48.5019,-1.0197,78.1304,356.473],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[0,0,0,0,90,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]];

PROC Sample_16()
    !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 Mech-Viz project
    MM_Start_Viz 2,snap_jps;
    !get planned path
    MM_Get_PlanData 0, 3, 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
    !get gripper control signal list
    MM_Get_Dolist 0,0;
    !close socket connection
    MM_Close_Socket;
    !save waypoints of the planned path to local variables one by one
    FOR i FROM 1 TO pose_num DO
        count:=i;
        MM_Get_PlanJps count,3,JPS{count},movetype{count},toolnum{count},speed{count};
    ENDFOR
    !follow the planned path to pick
    FOR j FROM 1 TO pose_num DO
        count:=j;
        MoveAbsJ jps{count},v1000,fine,gripper1;
        !set gripper control signal when current waypoint is picking waypoint
        IF count=vis_pose_num THEN
            !add object grasping logic here
            Stop;
            !set gripper control signal
            !MM_Set_DoList 0, 1, go16_1;
            !MM_Set_DoList 0, 2, go16_2;
            !MM_Set_DoList 0, 3, go16_3;
            !MM_Set_DoList 0, 4, go16_4;
        ENDIF
    ENDFOR
    !get box direction status from planned results
    box_direction:=MM_Plan_Results{17};
    !place the box according to its direction
    IF box_direction=0 THEN
        !move to intermediate waypoint of placing
        MoveJ drop_waypoint_1,v1000,z50,gripper1;
        !move to approach waypoint of placing
        MoveL RelTool(drop_1,0,0,-100),v1000,fine,gripper1;
        !move to placing waypoint
        MoveL drop_1,v300,fine,gripper1;
        !add object releasing logic here, such as "setdo DO_1, 0;"
        Stop;
        !move to departure waypoint of placing
        MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
    ELSE
        !move to intermediate waypoint of placing
        MoveJ drop_waypoint_2,v1000,z50,gripper1;
        !move to approach waypoint of placing
        MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
        !move to placing waypoint
        MoveL drop_2,v300,fine,gripper1;
        !add object releasing logic here, such as "setdo DO_1, 0;"
        Stop;
        !move to departure waypoint of placing
        MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
    ENDIF
    !move back to robot home position
    MoveAbsJ home\NoEOffs,v3000,fine,gripper1;
ENDPROC
ENDMODULE

Le flux de travail correspondant au code du programme d’exemple ci-dessus est illustré dans la figure ci-dessous.

sample16

Le tableau ci-dessous décrit le code en gras. Vous pouvez cliquer sur l’hyperlien du nom de la commande pour en afficher la description détaillée.

Feature Code and description

Obtenir l’orientation du groupe d’objets de travail

!get box direction status from planned results
box_direction:=MM_Plan_Results{17};
Dans le projet Mech-Viz, les données Vision Move désignent les données sorties par l’Étape Vision Move, comprenant les étiquettes des objets de travail saisis, le nombre d’objets de travail saisis, le nombre d’objets de travail à saisir cette fois, l’ID de bord ou de coin du préenseur à vide, le décalage du TCP, l’orientation du groupe d’objets de travail, l’orientation de l’objet de travail et les dimensions du groupe d’objets de travail.

Le robot obtient les données Vision Move des points de passage en exécutant la commande MM_Get_PlanData, puis enregistre les données Vision Move des points de passage qui sont stockées dans la mémoire du robot dans le tableau global MM_Plan_Results en exécutant la commande MM_Get_PlanJps.

Dans le tableau global MM_Plan_Results, MM_Plan_Results{17} spécifie la relation d’orientation entre le groupe d’objets de travail et le côté long du préenseur à vide. 0 indique parallèle, tandis que 1 indique vertical.

Le code ci-dessus indique que si MM_Plan_Results{17} est affecté à la variable box_direction, la variable box_direction indiquera l’orientation du groupe d’objets de travail.

Adopter une stratégie de pose en fonction de l’orientation du groupe d’objets de travail

IF box_direction=0 THEN
    !move to intermediate waypoint of placing
    MoveJ drop_waypoint_1,v1000,z50,gripper1;
    !move to approach waypoint of placing
    MoveL RelTool(drop_1,0,0,-100),v1000,fine,gripper1;
    !move to placing waypoint
    MoveL drop_1,v300,fine,gripper1;
    !add object releasing logic here, such as "setdo DO_1, 0;"
    Stop;
    !move to departure waypoint of placing
    MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
ELSE
    !move to intermediate waypoint of placing
    MoveJ drop_waypoint_2,v1000,z50,gripper1;
    !move to approach waypoint of placing
    MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
    !move to placing waypoint
    MoveL drop_2,v300,fine,gripper1;
    !add object releasing logic here, such as "setdo DO_1, 0;"
    Stop;
    !move to departure waypoint of placing
    MoveL RelTool(drop_2,0,0,-100),v1000,fine,gripper1;
ENDIF

Le code ci-dessus indique que si le groupe d’objets de travail est parallèle au côté long du préenseur à vide (c.-à-d. box_direction est défini sur 0), le groupe d’objets de travail sera posé à drop_1 ; sinon, le groupe d’objets de travail sera posé à drop_2.

Cette page est-elle utile ?

Veuillez nous indiquer comment améliorer :

Nous accordons de l’importance à votre vie privée

Nous utilisons des cookies pour vous offrir la meilleure expérience possible sur notre site web. En continuant à utiliser le site, vous reconnaissez accepter l’utilisation des cookies. Si vous refusez, un cookie unique sera utilisé pour garantir que vous ne soyez pas suivi ou reconnu lors de votre visite sur ce site.