Programme d’exemple 8 : MM_S8_Viz_Subtask
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 en arrière-plan) déclenche l’exécution du projet Mech-Viz afin d’obtenir la trajectoire planifiée. Le programme principal (programme au premier plan) déplace le robot sur la base de la trajectoire planifiée. Ensuite, le programme principal déclenche l’exécution du sous-programme lorsque le robot effectue la dépose afin d’obtenir la trajectoire planifiée suivante, ce qui réduit le temps de cycle.
|
||
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 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
|
||
Projet |
Projets Mech-Vision et Mech-Viz |
||
Prérequis |
|
|
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 de trajectoire planifiée. En conséquence, les fonctionnalités du sous-programme 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_S8_Sub
!----------------------------------------------------------
! FUNCTION: run Mech-Viz project and get planned path
! in subtask (run together with MM_S8_Viz_Subtask)
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define variables
PERS num pose_num_a:=5;
PERS num vis_pose_num_a:=3;
PERS num toolid_a{5}:=[0,0,0,0,0];
PERS num label_a{5}:=[0,0,0,0,0];
PERS num status_a:=2100;
PERS bool flag_vis_a:=FALSE;
CONST jointtarget snap_jps_a:=[[0,0,0,0,90,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
PERS jointtarget jps_a{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_a:=FALSE;
!initialize communication parameters (initialization is required only once)
MM_Init_Socket "127.0.0.1",50000,300;
WHILE TRUE DO
IF flag_vis_a=TRUE THEN
MM_Open_Socket;
!trigger Mech-Viz project
MM_Start_Viz 2,snap_jps_a;
!get planned path, 1st argument (1) means getting pose in JPs
MM_Get_VizData 1, pose_num_a, vis_pose_num_a, status_a;
!check whether planned path has been got from Mech-Viz successfully
IF status_a=2100 THEN
!save waypoints of the planned path to local variables one by one
MM_Get_Jps 1,jps_a{1},label_a{1},toolid_a{1};
MM_Get_JPS 2,jps_a{2},label_a{2},toolid_a{2};
MM_Get_JPS 3,jps_a{3},label_a{3},toolid_a{3};
ENDIF
MM_Close_Socket;
flag_vis_a:=FALSE;
ENDIF
ENDWHILE
ENDPROC
ENDMODULE
Le code ci-dessus montre que le sous-programme définit flag_vis_a sur FALSE, initialise les paramètres de communication, puis écoute en continu la valeur de flag_vis_a via la boucle WHITE.
-
Lorsque flag_vis_a est défini sur TRUE, le sous-programme déclenche l’exécution du projet Mech-Viz, obtient la trajectoire planifiée, puis définit flag_vis_a sur FALSE.
-
Lorsque flag_vis_a est défini sur FALSE, le sous-programme écoute en continu la valeur de flag_vis_a.
La partie suivante décrit le programme principal.
| À l’instar du programme d’exemple MM_S2_Viz_Basic, le programme principal effectue des opérations de prise et de dépose sur la base du code de trajectoire planifiée. Par conséquent, les fonctionnalités du programme principal 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_S8_Viz_Subtask
!----------------------------------------------------------
! FUNCTION: run Mech-Viz project and get planned path
! in subtask (run together with MM_S8_Sub)
! Mech-Mind, 2023-12-25
!----------------------------------------------------------
!define local num variables
PERS bool flag_vis_a:=FALSE;
PERS num status_a:=2100;
PERS num pose_num_a:=5;
PERS num toolid_a{5}:=[0,0,0,0,0];
PERS num label_a{5}:=[0,0,0,0,0];
PERS num vis_pose_num_a:=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_a{5}:=
[
[[0,0,0,0,89,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[0,0,0,0,89,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[0,0,0,0,89,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]]
];
!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_8()
!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_a;
LOOP:
!move to wait position for picking
MoveL pick_wait_point,v1000,fine,gripper1;
!wait until subtask program finished
WaitUntil(flag_vis_a=FALSE);
!check whether planned path has been got from Mech-Viz successfully
IF status_a <> 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_a{1},v1000,fine,gripper1;
!move to picking waypoint
MoveAbsJ jps_a{2},v300,fine,gripper1;
!add object grasping logic here, such as "setdo DO_1, 1;"
Stop;
!move to departure waypoint of picking
MoveAbsJ jps_a{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;
!trigger Mech-Viz project and get planned path in advance
trigger_vis_a;
!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_a()
flag_vis_a:=TRUE;
ENDPROC
ENDMODULE
La séquence de travail correspondant au code du programme d’exemple ci-dessus est illustrée dans la figure ci-dessous.
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 la trajectoire planifiée |
Dans l’exemple ci-dessus, le programme principal appelle la fonction trigger_vis_a(). Le code de cette fonction est présenté ci-dessous.
Dans l’exemple ci-dessus, lorsque flag_vis_a est défini sur TRUE dans la fonction trigger_vis_a(), le sous-programme détecte la valeur TRUE, déclenche l’exécution du projet Mech-Viz, puis obtient la trajectoire planifiée. |
Planifier à l’avance la trajectoire suivante par bouclage (prise → déclenchement du cycle suivant de planification de trajectoire → dépose) |
Le code ci-dessus indique que le programme principal parcourt en boucle le code entre LOOP et GOTO LOOP.
Dans l’exemple ci-dessus, le robot se déplace vers un point de passage d’attente avant la prise et attend que le sous-programme obtienne et stocke la trajectoire planifiée (c’est-à-dire que flag_vis_a passe de TRUE à FALSE).
Dans l’exemple ci-dessus, le robot suit la trajectoire planifiée jusqu’au point de passage d’approche de la prise (jps_a{1}), puis jusqu’au point de passage de prise (jps_a{2}), effectue la prise (par exemple, setdo DO_1, 1;), puis se déplace vers le point de passage de départ de la prise (jps_a{3}), le point de passage intermédiaire de la dépose (drop_waypoint), puis le point de passage d’approche de la dépose (RelTool(drop,0,0,-100)).
Dans l’exemple ci-dessus, le programme principal appelle à nouveau la fonction trigger_vis_a() pour déclencher l’exécution du projet Mech-Viz et obtenir la trajectoire planifiée. Étant donné que le robot se trouve alors dans la zone de dépose, il peut planifier à l’avance la trajectoire de prise suivante sans attendre la fin de la dépose avant de planifier la trajectoire de prise suivante.
Dans l’exemple ci-dessus, le robot se déplace vers le point de passage de dépose (drop), effectue la dépose (par exemple, setdo DO_1, 0;), puis se déplace vers le point de passage de départ de la dépose (RelTool(drop,0,0,-100)) et enfin vers la position de référence (home). |