샘플 프로그램 19: MM_S19_Vis_PlanAllVision

현재 최신 버전 (2.1.2)에 대한 매뉴얼을 보고 계십니다. 다른 버전에 액세스하려면 페이지 오른쪽 상단 모서리에 있는 '버전 전환' 버튼을 클릭하세요.

■ 현재 사용하고 있는 제품의 버전이 확실하지 않은 경우에는 언제든지 당사 기술 지원팀에 문의하시기 바랍니다.

프로그램 소개

기능 설명

로봇이 Mech-Vision 프로젝트 실행을 트리거한 후 루프를 통해 모든 계획된 경로를 획득하여 피킹 및 배치 작업을 수행합니다. 이 샘플에서는 카메라가 이미지를 한 번만 캡처하면 Mech-Vision가 모든 비전 결과에 대한 피킹 경로를 계획합니다. 일반적으로 멀티 피킹 시나리오에 적용합니다.

파일 경로

Mech-Vision 및 Mech-Viz의 설치 디렉토리로 이동하여 통신 구성 요소/Robot_Interface/ABB/sample/MM_S19_Vis_PlanAllVision 경로를 사용하여 파일을 찾을 수 있습니다.

RobotWare6 시스템에서는 파일의 접미사는 .mod입니다. RobotWare7 시스템에서는 사용자는 .mod.modx로 소정합니다.

필요한 프로젝트

Mech-Vision 프로젝트

이 프로젝트는 다음 구성을 미리 설정해야 함:경로 계획 도구작업 흐름 화면에서 전역 구성 스텝의 모든 비전 결과를 계획하기를 활성화해야 합니다.
sample19 1

사용 전제 조건

  1. 표준 인터페이스 통신 구성이 완료됩니다.

  2. 자동 캘리브레이션이 완료됩니다.

이 샘플 프로그램은 참고용으로 제공됩니다. 사용자는 실제 상황에 맞춰 이 내용을 바탕으로 수정해야 하며, 해당 프로그램을 그대로 사용하지 않도록 하십시오.

프로그램 설명

다음에는 MM_S19_Vis_PlanAllVision 샘플 프로그램의 코드와 관련 설명입니다.

MM_S3_Vis_Path 샘플과 비하면, 이 샘플은 루프를 통해 모든 계획된 경로를 획득하여 피킹 및 배치 작업을 수행하는 기능만 수정되었습니다.(이 부분의 코드는 굵게 표시됨) 따라서, MM_S19_Vis_PlanAllVision의 MM_S3_Vis_Path과 일치하는 부분은 다시 설명하지 않습니다. (일치하는 부분에 대한 정보는 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

위 샘플 프로그램 코드에 해당하는 워크플로는 아래 그림에 표시되어 있습니다.

sample19

아래 표는 새롭게 추가된 기능의 설명입니다. 명령어 이름의 링크를 클릭하면 해당 명령의 상세 설명을 확인할 수 있습니다.

워크플로 코드와 설명

루프를 통해 계획 경로를 저장하기

FOR i FROM 1 TO pose_num DO
    count:=i;
    MM_Get_JPS count,jps{count},label{count},toolid{count};
ENDFOR
  • 1번째 줄: FOR는 아래 코드가 반복 실행되는 루프 프로그램임을 나타냅니다. i는 반복 횟수를 제어하며, 1부터 시작하여 매 반복마다 1씩 증가하고, pose_num보다 커지면 루프가 종료됩니다. pose_num은 MM_Get_VisPath 명령어의 세 번째 파라미터로, 비전 시스템이 반환한 웨이포인트 개수를 나타냅니다.

  • 2번째 줄: i 값을 count에 할당하며, count는 전체 경로 계획에서 해당 웨이포인트의 번호를 나타냅니다.

  • 3번째 줄: MM_Get_Jps 명령어는 특정 웨이포인트의 관절 각도, 라벨 및 말단장치 번호를 각각 지정된 변수에 저장하는 것을 의미합니다. 따라서 이 명령어는 count 번째 웨이포인트의 관절 각도, 라벨 및 말단장치 번호를 jps{count}, label{count}, toolid{count} 변수에 차례대로 저장하는 것을 나타냅니다.

pick_cnt 및 residual를 계산하기

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

본 샘플에서는 매번 계획된 피킹 경로에 5개의 웨이포인트가 포함된다고 가정합니다. "pose_num DIV 5"는 pose_num을 5로 나눈 몫을 의미합니다. "pose_num MOD 5"는 pose_num을 5로 나눈 나머지를 의미합니다. pick_cnt는 계획된 총 피킹 횟수를 나타냅니다. residual 값이 0이 아닌 경우, 특정 계획된 피킹 웨이포인트 개수가 5개 미만임을 의미하며, 이는 경로 계획에 이상이 발생했음을 나타내므로 다시 계획을 수행해야 합니다.

경로 계획 오류가 발생했는지 확인하기

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

피킹 횟수 pick_cnt가 1보다 작은 경우 또는 residual 값이 0이 아닌 경우, 경로 계획 중 오류가 발생했음을 의미하며 사용자는 여기에서 코드 처리를 추가해야 합니다. 예를 들어 Mech-Vision 프로젝트를 다시 트리거하여 계획 경로를 획득하는 코드를 추가합니다.

루프를 통해 피킹 및 배치 작업을 실행하기

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

위의 코드는 FOR 루프 내에서 로봇이 매번 계획된 5개의 웨이포인트로 이동하여 피킹 작업을 수행한 후, 이어서 배치 작업을 실행하는 것을 나타냅니다. i는 순환 횟수를 제어하는 변수로, 1부터 시작하여 매 순환마다 1씩 증가하며, 피킹 횟수 pick_cnt보다 커지면 루프가 종료됩니다. i가 1 증가할 때마다 count가 5 증가하며, 이를 통해 {1+count}~{5+count}는 매번 계획된 5개의 웨이포인트가 전체 계획 경로에서 차지하는 번호를 나타냅니다.

이 페이지가 도움이 되었습니까?

다음 방법을 통해 피드백을 보내주실 수 있습니다:

저희는 귀하의 개인정보를 소중히 다룹니다.

당사 웹사이트는 최상의 사용자 경험을 제공하기 위해 쿠키를 사용하고 있습니다. "모두 수락"을 클릭하시면 쿠키 사용에 동의하시는 것이며, "모두 거부"를 클릭하시면 이 웹사이트 방문 시 귀하의 정보가 추적되거나 기억되지 않도록 단일 쿠키만 사용됩니다.