Programme d’exemple 20 : MM_S20_Viz_PlanAllVision
Présentation du programme
Description |
Le robot déclenche l’exécution du projet Mech-Viz. Ensuite, le robot utilise des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la dépose. Dans cet exemple, une fois que la caméra a capturé une image, Mech-Viz planifie des trajectoires de prise pour tous les résultats de vision. Ce programme est applicable aux scénarios où une seule image est utilisée pour effectuer des opérations de prise à plusieurs reprises. |
||
Chemin du fichier |
Vous pouvez accéder au répertoire d’installation de Mech-Vision et Mech-Viz et trouver le fichier en suivant le chemin
|
||
Projet |
projets Mech-Vision et Mech-Viz
|
||
Prérequis |
|
| Ce programme d’exemple est fourni uniquement à titre de référence. Avant d’utiliser le programme, veuillez le modifier selon le scénario réel. |
Description du programme
Cette partie décrit le programme d’exemple MM_S20_Viz_PlanAllVision.
| La seule différence entre le programme d’exemple MM_S20_Viz_PlanAllVision et le programme d’exemple MM_S2_Viz_Basic est que MM_S20_Viz_PlanAllVision peut utiliser des boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la dépose (le code de cette fonctionnalité est en gras). Par conséquent, seule la fonctionnalité d’utilisation de boucles for pour obtenir toutes les trajectoires planifiées et effectuer la prise et la dépose est décrite dans la section suivante. Pour plus d’informations sur les parties de MM_S20_Viz_PlanAllVision qui sont cohérentes avec celles de MM_S2_Viz_Basic, voir Programme d’exemple : MM_S2_Viz_Basic. |
MODULE MM_S20_Viz_PlanAllVision
!----------------------------------------------------------
! FUNCTION: trigger Mech-Viz project, plan all vision
! results and get all planned results 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 pick_cnt:=0;
LOCAL VAR num residual:=0;
LOCAL VAR num movetype{20}:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
LOCAL VAR num toolnum{20}:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
LOCAL VAR num speed{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 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 pick_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 VAR 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 VAR 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}:=
[
[[-4.5438,26.6029,0.467,-0.1719,62.9165,-5.0819],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-4.5664,32.0439,7.6047,-0.1988,50.3379,-5.0558],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-4.5363,25.4009,-2.7016,-0.1659,67.2872,-5.0885],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-20.7719,15.0701,16.7232,0.1053,57.9831,-111.82],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-20.7567,21.7711,23.8763,0.1281,44.1289,-111.841],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-20.777,13.5249,13.6202,0.1005,62.6312,-111.816],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[0.3363,10.0698,23.0021,0.0017,56.8211,89.2201],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[0.3365,17.2854,30.3891,0.0022,42.2185,89.2197],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[0.3362,8.4182,19.8363,0.0017,61.6386,89.2202],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-2.6715,8.5325,24.7355,0.0089,56.6276,265.9],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-2.6701,15.8879,32.2202,0.0112,41.7875,265.897],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[-2.672,6.8572,21.5409,0.0085,61.4976,265.9],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[21.387,12.8326,19.5238,-0.0095,57.6221,110.349],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[21.3856,19.7174,26.8272,-0.0117,43.434,110.351],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[21.3874,11.2544,16.3788,-0.0091,62.3455,110.349],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[10.5881,41.5724,-23.6476,-0.3127,72.1244,189.431],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[10.5502,45.3582,-15.4893,-0.3431,60.1803,189.468],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]],
[[10.6008,40.9927,-27.4632,-0.306,76.5197,189.419],[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_20()
!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 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
!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_PlanJps count,3,JPS{count},movetype{count},toolnum{count},speed{count};
ENDFOR
!parse pick cycle count, here suppose 3 points per planned path
pick_cnt:= pose_num DIV 3;
residual:= pose_num MOD 3;
!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)*3;
!move to intermediate waypoint of picking
MoveJ pick_waypoint,v1000,z50,gripper1;
!follow the planned path to pick
MoveAbsJ jps{1+count},v1000,fine,gripper1;
MoveAbsJ jps{2+count},v1000,fine,gripper1;
!add object grasping logic here, such as "setdo DO_1, 1;";
Stop;
MoveAbsJ jps{3+count},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 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 flux de travail correspondant au code du programme d’exemple ci-dessus est illustré dans la figure ci-dessous.
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 dépose. Vous pouvez cliquer sur l’hyperlien du nom de commande pour afficher sa description détaillée.
| Fonctionnalité | Code et description |
|---|---|
Obtenir la trajectoire planifiée |
|
Stocker la trajectoire planifiée par boucle |
|
Calculer pick_cnt et residual |
Ce programme d’exemple suppose que chaque trajectoire de prise planifiée contient 3 points de passage. pose_num DIV 3 représente le quotient de la valeur pose_num divisée par 3, et pose_num MOD 3 représente le reste de la valeur pose_num divisée par 3. pick_cnt est le nombre total d’opérations de prise planifiées. Si residual n’est pas égal à 0, le nombre planifié de points de passage de prise est inférieur à 3 (c’est-à-dire qu’une erreur s’est produite pendant la planification de trajectoire et une opération de replanification est nécessaire). |
Déterminer s’il y a eu une erreur pendant la planification de trajectoire |
Si le nombre d’opérations de prise (pick_cnt) est inférieur à 1 ou si la valeur de residual n’est pas 0, une erreur s’est produite pendant la planification de trajectoire. Vous devez ajouter ici du code de traitement, par exemple le code pour redémarrer le projet Mech-Viz puis obtenir la trajectoire planifiée. |
Effectuer la prise et la dépose par boucle |
Le code ci-dessus indique que, dans la boucle for, le robot se déplace vers les 3 points de passage planifiés à chaque fois pour effectuer l’opération de prise, puis réalise l’opération de dépose. i est utilisé pour contrôler le nombre d’itérations de la boucle (c’est-à-dire que i commence à 1 et s’incrémente de 1 après chaque itération jusqu’à dépasser la valeur de pick_cnt, moment où la boucle se termine). Lorsque i s’incrémente de 1, count s’incrémente de 3. {1+count} à {3+count} indiquent l’ID des 3 points de passage planifiés à chaque fois dans la trajectoire planifiée totale. |