Programme d’exemple 19 : MM_S19_Vis_PlanAllVision

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

Le robot déclenche l’exécution du projet Mech-Vision. Ensuite, le robot utilise des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la pose. Dans cet exemple, une fois que la caméra a capturé une image, Mech-Vision planifie des trajectoires de prise pour tous les résultats de vision. Ce programme s’applique aux scénarios où une seule image est utilisée pour effectuer plusieurs opérations de prise.

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_S19_Vis_PlanAllVision.

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

Project

projet Mech-Vision

Dans ce projet, le paramètre Planifier tous les résultats de vision de l’étape Configuration globale dans l’onglet Workflow de l’outil de planification de trajectoire est activé. Vous pouvez cliquer sur Ouvrir l’éditeur dans l’étape Planification de trajectoire pour ouvrir l’outil de planification de trajectoire.
sample19 1

Prérequis

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

  2. L’étalonnage automatique est terminé.

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

Description du programme

Cette section décrit le programme d’exemple MM_S19_Vis_PlanAllVision.

La seule différence entre le programme d’exemple MM_S19_Vis_PlanAllVision et le programme d’exemple MM_S3_Vis_Path est que MM_S19_Vis_PlanAllVision peut utiliser des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la pose (le code de cette fonctionnalité est en gras). Ainsi, seule la fonctionnalité consistant à utiliser des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la pose est décrite dans la section suivante. Pour des informations sur les parties de MM_S19_Vis_PlanAllVision identiques à celles de MM_S3_Vis_Path, voir Programme d’exemple : MM_S3_Vis_Path.
MODULE MM_S19_Vis_PlanAllVision
!----------------------------------------------------------
! FUNCTION: trigger Mech-Vision project, plan all vision
! results and get all planned paths
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
LOCAL VAR num pose_num:=0;
LOCAL VAR num status:=0;
LOCAL VAR num toolid{20}:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
LOCAL VAR num vis_pose_num:=0;
LOCAL VAR num count:=0;
LOCAL VAR num pick_cnt:=0;
LOCAL VAR num residual:=0;
LOCAL VAR num label{20}:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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{20}:=
[
    [[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[65.8654,94.6966,32.2878,-3.7036,-39.7668,-111.261],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[66.3351,103.661,20.3594,-3.9153,-36.8271,-110.505],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[65.8654,94.6966,32.2878,-3.7036,-39.7668,-111.261],[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]],
    [[-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.7932,85.483,6.0459,-20.5518,-3.0126,-169.245],[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]],
    [[28.8422,90.4027,-13.4878,13.7086,10.2751,-164.54],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[29.122,100.975,-26.3271,11.2142,12.4744,-161.72],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[28.8422,90.4027,-13.4878,13.7086,10.2751,-164.54],[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]],
    [[28.7848,90.399,-13.628,14.5039,10.6719,-165.371],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[29.0915,100.961,-26.4037,12.003,12.8098,-162.514],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
    [[28.7848,90.399,-13.628,14.5039,10.6719,-165.371],[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_19()
    !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;
RECAP:
    !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 result
        Stop;
    ENDIF
    !close socket connection
    MM_Close_Socket;
    !save all waypoint data to local variables using for-loop, a maximum of 50 points are supported
    FOR i FROM 1 TO pose_num DO
        count:=i;
        MM_Get_Jps count,jps{count},label{count},toolid{count};
    ENDFOR
    !parse pick cycle count, here suppose 5 points per planned path
    pick_cnt:= pose_num DIV 5;
    residual:= pose_num MOD 5;
    !check if parsed data is valid; if not, retry to get planned path or add some error handling logic
    IF (pick_cnt<1) OR (residual<>0) THEN
        Stop;
        GOTO RECAP;
    ENDIF
    !repeatedly run pick-and-place cycle using for-loop
    FOR i FROM 1 TO pick_cnt DO
        count:=(i-1)*5;
        !follow the planned path to pick
        MoveAbsJ jps{1+count},v1000,z50,gripper1;
        MoveAbsJ jps{2+count},v1000,fine,gripper1;
        MoveAbsJ jps{3+count},v1000,fine,gripper1;
        !add object grasping logic here, such as "setdo DO_1, 1;"
        Stop;
        MoveAbsJ jps{4+count},v1000,fine,gripper1;
        MoveAbsJ jps{5+count},v1000,z50,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 to intermediate waypoint of placing
        MoveJ drop_waypoint,v1000,z50,gripper1;
    ENDFOR
    !finish pick and-place cycle, and jump back to camera capturing
    GOTO RECAP;
ENDPROC
ENDMODULE

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

sample19

Le tableau ci-dessous décrit la fonctionnalité consistant à utiliser des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la pose. Vous pouvez cliquer sur l’hyperlien du nom de la commande pour en afficher la description détaillée.

Fonctionnalité Code et description

Stocker la trajectoire planifiée en boucle

FOR i FROM 1 TO pose_num DO
    count:=i;
    MM_Get_JPS count,jps{count},label{count},toolid{count};
ENDFOR
  • Ligne 1 : FOR indique une boucle for. i est utilisé pour contrôler le nombre d’itérations de la boucle (c’est-à-dire i commence à 1 et s’incrémente de 1 après chaque itération jusqu’à dépasser la valeur de pose_num, moment auquel la boucle se termine). pose_num est le troisième paramètre de la commande MM_Get_VisPath, qui représente le nombre de points de passage retournés par le système de vision.

  • Ligne 2 : Affectez la valeur de i à count, où count représente l’ID du point de passage en cours dans la trajectoire planifiée totale.

  • Ligne 3 : La commande MM_Get_Jps stocke les positions articulaires, l’étiquette et l’ID de l’outil d’un point de passage spécifique dans des variables spécifiques. L’ensemble de la commande stocke les positions articulaires, l’étiquette et l’ID de l’outil du point de passage dont l’ID est count dans les variables jps{count}, label{count} et toolid{count} respectivement.

Calculer pick_cnt et residual

!parse pick cycle count, here suppose 5 points per planned path
pick_cnt:= pose_num DIV 5;
residual:= pose_num MOD 5;

Ce programme d’exemple suppose que chaque trajectoire de prise planifiée contient 5 points de passage. pose_num DIV 5 désigne le quotient de la valeur pose_num divisée par 5, et pose_num MOD 5 désigne le reste de la valeur pose_num divisée par 5. pick_cnt est le nombre total de prises planifiées. Si residual n’est pas égal à 0, le nombre prévu de points de passage de prise est inférieur à 5 (c’est-à-dire qu’une erreur s’est produite lors de la planification de trajectoire et qu’une opération de replanification est nécessaire).

Déterminer si une erreur s’est produite lors de la planification de trajectoire

IF (pick_cnt<1) OR (residual<>0) THEN
    Stop;
    GOTO RECAP;
ENDIF

Si le nombre de prises (pick_cnt) est inférieur à 1 ou si la valeur de residual n’est pas 0, une erreur s’est produite lors de la planification de trajectoire. Vous devez ajouter ici un code de traitement, tel que le code pour redémarrer le projet Mech-Vision puis obtenir la trajectoire planifiée.

Effectuer la prise et la pose en boucle

FOR i FROM 1 TO pick_cnt DO
    count:=(i-1)*5;
    !follow the planned path to pick
    MoveAbsJ jps{1+count},v1000,z50,gripper1;
    MoveAbsJ jps{2+count},v1000,fine,gripper1;
    MoveAbsJ jps{3+count},v1000,fine,gripper1;
    !add object grasping logic here, such as "setdo DO_1, 1;"
    Stop;
    MoveAbsJ jps{4+count},v1000,fine,gripper1;
    MoveAbsJ jps{5+count},v1000,z50,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 to intermediate waypoint of placing
    MoveJ drop_waypoint,v1000,z50,gripper1;
ENDFOR

Le code ci-dessus indique que, dans la boucle for, le robot se déplace vers les 5 points de passage planifiés à chaque fois pour réaliser l’opération de prise, puis effectue l’opération de pose. i est utilisé pour contrôler le nombre d’itérations de la boucle (c’est-à-dire i commence à 1 et s’incrémente de 1 après chaque itération jusqu’à dépasser la valeur de pick_cnt, moment auquel la boucle se termine). Lorsque i s’incrémente de 1, count s’incrémente de 5. {1+count} à {5+count} indiquent l’ID des 5 points de passage planifiés à chaque fois dans la trajectoire planifiée totale.

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.