Programme d’exemple 10 : MM_S10_Viz_Subtask

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.

Présentation du programme

Description

Ce programme d’exemple se compose de deux programmes : un programme principal et un sous-programme. Le sous-programme (programme d’arrière-plan) déclenche l’exécution du projet Mech-Viz pour obtenir le trajet planifié. Le programme principal (programme au premier plan) déplace le robot en fonction du trajet planifié. Ensuite, le programme principal déclenche le sous-programme lorsque le robot quitte la zone de prélèvement pour obtenir le prochain trajet planifié, ce qui réduit le temps de cycle.

Cet exemple est très similaire au programme d’exemple MM_S8_Viz_Subtask, à la différence que le moment où le programme principal déclenche le sous-programme est différent. Il est recommandé de comparer les deux exemples afin de mieux comprendre leurs nuances.

Chemin du fichier

Sous-programme : 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/sub_prog/MM_S10_Sub.

Programme principal : 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_S10_Viz_Subtask.

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

Projet

Projets Mech-Vision et Mech-Viz

Prérequis

  1. Vous avez configuré la communication via 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.

  • Le programme principal est un programme au premier plan. Le sous-programme est un programme d’arrière-plan qui doit être exécuté automatiquement après le démarrage du système robotique.

Description du programme

La partie suivante décrit le sous-programme.

À l’instar du programme d’exemple MM_S2_Viz_Basic, le sous-programme déclenche l’exécution du projet Mech-Viz et obtient le code du trajet planifié. Par conséquent, les fonctionnalités du sous-programme qui sont similaires à celles de MM_S2_Viz_Basic ne sont pas décrites dans cette partie. Pour plus d’informations sur ces fonctionnalités, voir Programme d’exemple 2 : MM_S2_Viz_Basic.
MODULE MM_S10_Sub
!----------------------------------------------------------
! FUNCTION: run Mech-Viz project and get planned path
! in subtask(run together with MM_S10_Viz_Subtask)
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define variables
PERS num pose_num_b:=5;
PERS num vis_pose_num_b:=3;
PERS num toolid_b{5}:=[0,0,0,0,0];
PERS num label_b{5}:=[0,0,0,0,0];
PERS num status_b:=2100;
PERS bool flag_vis_b:=FALSE;
CONST jointtarget snap_jps_b:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
PERS jointtarget jps_b{5}:=
[
    [[0,0,0,0,90,0],[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]],
    [[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[11.1329,49.0771,-36.9666,0.5343,79.2476,-169.477],[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]]
];

PROC main()
    flag_vis_b:=FALSE;
    !initialize communication parameters (initialization is required only once)
    MM_Init_Socket "127.0.0.1",50000,300;
    WHILE TRUE DO
        IF flag_vis_b=TRUE THEN
            MM_Open_Socket;
            !trigger Mech-Viz project
            MM_Start_Viz 2,snap_jps_b;
            !get planned path, 1st argument (1) means getting pose in JPs
            MM_Get_VizData 1, pose_num_b, vis_pose_num_b, status_b;
            !check whether planned path has been got from Mech-Viz successfully
            IF status_b=2100 THEN
                !save waypoints of the planned path to local variables one by one
                MM_Get_Jps 1,jps_b{1},label_b{1},toolid_b{1};
                MM_Get_JPS 2,jps_b{2},label_b{2},toolid_b{2};
                MM_Get_JPS 3,jps_b{3},label_b{3},toolid_b{3};
            ENDIF
            MM_Close_Socket;
            flag_vis_b:=FALSE;
        ENDIF
    ENDWHILE
ENDPROC
ENDMODULE

Le code ci-dessus montre que le sous-programme définit flag_vis_b sur FALSE, initialise les paramètres de communication, puis écoute en continu la valeur de flag_vis_b via la boucle WHITE.

  • Lorsque flag_vis_b est défini sur TRUE, le sous-programme déclenche l’exécution du projet Mech-Viz, obtient le trajet planifié, puis définit flag_vis_b sur FALSE.

  • Lorsque flag_vis_b est défini sur FALSE, le sous-programme écoute en continu la valeur de flag_vis_b.

La partie suivante décrit le programme principal.

À l’instar du programme d’exemple MM_S2_Viz_Basic, le programme principal effectue la prise et la dépose sur la base du code du trajet planifié. Par conséquent, les fonctionnalités du programme principal qui sont similaires à celles de MM_S2_Viz_Basic ne sont pas décrites dans cette partie. Pour plus d’informations sur ces fonctionnalités, voir Programme d’exemple 2 : MM_S2_Viz_Basic.
MODULE MM_S10_Viz_Subtask
!----------------------------------------------------------
! FUNCTION: run Mech-Viz project and get planned path
! in subtask (run together with MM_S10_Sub)
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
PERS bool flag_vis_b:=FALSE;
PERS num status_b:=2100;
PERS num pose_num_b:=5;
PERS num toolid_b{5}:=[0,0,0,0,0];
PERS num label_b{5}:=[0,0,0,0,0];
PERS num vis_pose_num_b:=3;
LOCAL VAR num count:=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 PERS robtarget pick_wait_point:=[[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]];
PERS jointtarget jps_b{5}:=
[
    [[0,0,0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[0,0,0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[0,0,0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[0,0,0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[0,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]];

PROC Sample_10()
    !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;
    !trigger Mech-Viz project and get planned path
    trigger_vis_b;
LOOP:
    !move to wait position for picking
    MoveL pick_wait_point,v1000,fine,gripper1;
    !wait until subtask program finished
    WaitUntil(flag_vis_b=FALSE);
    !check whether planned path has been got from Mech-Viz successfully
    IF status_b <> 2100 THEN
        !add error handling logic here according to different error codes
        !e.g.: status=2038 means no point cloud in ROI
        Stop;
    ENDIF
    !follow the planned path to pick
    !move to approach waypoint of picking
    MoveAbsJ jps_b{1},v1000,fine,gripper1;
    !move to picking waypoint
    MoveAbsJ jps_b{2},v300,fine,gripper1;
    !add object grasping logic here, such as "setdo DO_1, 1;"
    Stop;
    !move to departure waypoint of picking
    MoveAbsJ jps_b{3},v1000,fine,gripper1;
    !move to intermediate waypoint of placing, and trigger Mech-Viz project and get planned path in advance
    MoveJSync drop_waypoint,v1000,z50,gripper1,"trigger_vis_b";
    !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;
    GOTO LOOP;
ENDPROC
PROC trigger_vis_b()
    flag_vis_b:=TRUE;
ENDPROC
ENDMODULE

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

sample10

Le tableau ci-dessous illustre le code central du programme principal.

Fonctionnalité Code et description

Déclencher l’exécution du projet Mech-Viz et obtenir le trajet planifié

!trigger Mech-Viz project and get planned path
trigger_vis_a;

Dans l’exemple ci-dessus, le programme principal appelle la fonction trigger_vis_b(). Le code de cette fonction est présenté ci-dessous.

PROC trigger_vis_b()
    flag_vis_b:=TRUE;

Dans l’exemple ci-dessus, lorsque flag_vis_b est défini sur TRUE dans la fonction trigger_vis_b(), le sous-programme détecte la valeur TRUE, déclenche l’exécution du projet Mech-Viz, puis obtient le trajet planifié.

Planifier le trajet suivant à l’avance par bouclage (préhension→déclenchement du prochain cycle de planification de trajectoire→dépose)

LOOP:
    …​
    GOTO LOOP;

Le code ci-dessus indique que le programme principal boucle à travers le code entre LOOP et GOTO LOOP.

!move to wait position for picking
MoveL pick_wait_point,v1000,fine,gripper1;
!wait until subtask program finished
WaitUntil(flag_vis_b=FALSE);

Dans l’exemple ci-dessus, le robot se déplace vers un point d’attente avant la prise et attend que le sous-programme obtienne et stocke le trajet planifié (c.-à-d. que flag_vis_b passe de TRUE à FALSE).

!move to approach waypoint of picking
MoveAbsJ jps_b{1},v1000,fine,gripper1;
!move to picking waypoint
MoveAbsJ jps_b{2},v300,fine,gripper1;
!add object grasping logic here, such as "setdo DO_1, 1;"
Stop;
!move to departure waypoint of picking
MoveAbsJ jps_b{3},v1000,fine,gripper1;

Dans l’exemple ci-dessus, le robot se déplace le long du trajet planifié jusqu’au point d’approche de la prise (jps_b{1}), puis jusqu’au point de prise (jps_b{2}), effectue la prise (par exemple, setdo DO_1, 1;), puis se déplace jusqu’au point de départ de la prise (jps_b{3}).

!move to intermediate waypoint of placing, and trigger Mech-Viz project and get planned path in advance
MoveJSync drop_waypoint,v1000,z50,gripper1,"trigger_vis_b";

Dans le code ci-dessus, le robot se déplace vers la position cible (drop_waypoint, c’est-à-dire le point intermédiaire pendant la dépose) et appelle la fonction trigger_vis_b() à la position cible. Le programme principal appelle à nouveau la fonction trigger_vis_b() pour déclencher l’exécution du projet Mech-Viz et obtenir le trajet planifié. Maintenant que le robot se trouve en dehors de la zone de dépose, il peut planifier à l’avance le prochain trajet de prise sans attendre la fin de la dépose, puis planifier le prochain trajet de prise.

Veuillez noter la différence entre ce programme d’exemple et le programme d’exemple MM_S8_Viz_Subtask. Le programme d’exemple MM_S8_Viz_Subtask appelle la fonction avant que le robot ne se déplace vers le point de dépose, tandis que ce programme d’exemple appelle la fonction après que le robot a quitté la zone de prise.
!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;

L’exemple ci-dessus indique que le robot se déplace vers le point d’approche de la dépose (RelTool(drop,0,0,-100)), puis vers le point de dépose (drop), effectue la dépose (par exemple, setdo DO_1, 0;), puis se déplace vers le point de départ de la dépose (RelTool(drop,0,0,-100)) et ensuite vers la position d’origine.

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.