Skip to content

시작하기

IndyEyeIndy 를 위한 저가형 비전 솔루션으로, 딥러닝 기반의 물체 감지(픽 앤 플레이스)와 분류(검사) 모듈을 포함하고 있습니다. 딥러닝 알고리즘을 쉽게 현장에 적용하기 위해, IndyEye 는 자동 데이터 수집과 원격 학습 서비스도 제공합니다.

구성 요소

IndyEyeIndyCB 의 옵션 요소로 제공됩니다. 보유한 IndyCBIndyEye 를 지원하는지 확인하고 싶다면, IndyEye 로고와 Eye-support USB 포트 를 확인해보십시오.

IndyEye 에는 카메라 액세서리도 포함됩니다.


IndyEye의 카메라 액세서리

액세서리
카메라(1) 렌즈(2) USB 케이블(3) 캘리브레이션 시트(4) 플랜지(5) 카메라 마운트(6) 시트 마운트(7)
볼트와 핀(8) - M4×8 볼트 8개 - M3×14 볼트 3개 - M3×8 핀 2개 - M4×6 핀 2개 - M4 와셔 3개

설치

  1. 카메라, 렌즈, 카메라 마운트를 조립하십시오. (M3×14 볼트 3개 사용)
  2. 전용 플랜지를 이용해 Indy 끝단에 부착하십시오. (M4×8 볼트 4개 사용)
  3. 카메라 마운트플랜지에 부착합니다. (M3×8 핀 2개M4×8 볼트 1개 사용)
  4. USB 케이블을 이용해 카메라Eye-support USB 포트에 연결하십시오.


Indy7에 설치된 카메라 액세서리

IndyEye 접속

  1. 카메라가 완전히 설치된 뒤, IndyCBEtherNet 포트를 로컬 네트워크에 연결하고, IndyCB의 전원을 켜십시오.
  2. IndyEye 설정에는 별도의 웹 UI가 사용됩니다. 웹 UI 사용을 위해서는 IndyEyeIndyCB의 IP 주소를 확인해야 합니다. IP scanner등 별도 소프트웨어를 사용해 IP를 확인하십시오. 일반적으로, IndyCB의 경우 이름이 "STEP-TP"로 표시되며, IndyEye는 제조사가 NVIDIA로 표시됩니다.
  3. IndyEyeIndyCB 켜진 상태에서, 웹브라우저를 열어 "<IndyEye IP 주소>:8088"를 주소창에 입력해 웹 UI로 접속합니다.

IndyEye 웹 UI

IndyEye 웹 UI의 왼쪽 편에는 카메라 패널이 있습니다. 카메라로부터 획득한 이미지가 이 창에 표시됩니다. 오른쪽 편에는 Robot, Calibration, Data, Detection 그리고 Pick의 5 가지 기능별 탭이 있습니다.


IndyEye 웹 UI

카메라 연결하기

카메라는 자동적으로 연결됩니다. 연결이 끊어졌거나 노출 설정을 자동 조절해야 할 경우에만 Connect 버튼을 클릭해 재연결 하십시오. Capture 버튼은 카메라 이미지를 화면에 표시합니다. 카메라로부터 실시간 동영상을 스트리밍하기 위해서는 vid 왼쪽의 박스를 체크하고 Capture를 클릭하십시오. 화면을 확인하면서, 렌즈를 회전해 초점을 조절하십시오.

로봇에 연결하기

  1. Robot 탭에서, 로봇의 이름과 IP주소를 입력하십시오.
  2. Connect 버튼을 클릭해 연결합니다.

로봇 제어하기

  • 로봇이 연결된 상태에서는 Robot 탭에 시점 조절을 위한 7 개의 에디트 상자가 표시됩니다.
변수 설명 단위
x 초점의 x축 좌표 mm
y 초점의 y축 좌표 mm
z 초점의 z축 좌표 mm
u 첫번째 오일러각 θz degree
v 두번째 오일러각 θx degree
w 세번째 오일러각 θz degree
d 초점으로부터 카메라까지의 거리 mm
  • Robot탭에는 아래의 6가지 버튼이 있습니다.
Button Description
Get 현재 시점 획득
Move 에디트 박스에 표시된대로 카메라를 움직여 시점 이동
Start DT 직접 교시 모드 시작
Stop DT 직접 교시 모드 종료
Home 홈 포지션으로 이동
Disconnect 로봇 연결 종료

캘리브레이션

로봇에 설치된 카메라의 캘리브레이션

주어진 캘리브레이션 시트를 여러 방향에서 촬영함으로써, 카메라 파라미터들과(초점거리, 오프셋, 왜곡) 로봇 끝단과 카메라 사이의 오프셋을 캘리브레이션 할 수 있습니다.


*Calibration* 탭

  1. 로봇을 홈 포지션으로 이동하고, Calibration탭을 선택합니다. "Calibrate with" 란에서 "Mounted camera" 를 선택합니다.
  2. 캘리브레이션 시트를 작업 공간 상에, 카메라에서 관측되는 위치에 놓습니다.


    캘리브레이션 시트의 위치와 카메라 화면

  3. 캘리브레이션을 수행하는 동안 동작의 범위를 지정하기 위해, 기준 시점 목록을 생성합니다.
    • Clear 버틀을 클릭해 시점 목록을 정리.
    • 직접교시 혹은 조그 등의 교시 방법 활용해 카메라를 기준 시점들로 이동하고 Add 버튼을 클릭해 시점을 추가. (주의: 마지막 관절을 지나치게 많이 돌리지 않도록 주의하십시오.)


      4 개 기준 시점의 예시

    • 시점 목록은 saveload 버튼으로 저장 및 불러오기가 가능.
    • Blend to 버튼을 눌러 기준 시점들을 혼합해 그 안쪽의 영역에서 새로운 시점들을 생성. 생성되는 시점의 수는 Blend to 버튼 오른편 박스에 입력.


      4 개 기준 시점 목록과 혼합된 시점 목록 예시

  4. Calibrate 버튼을 클릭해 캘리브레이션을 시작합니다. 로봇이 자동으로 움직이며 캘리브레이션 시트의 사진을 촬영합니다. 촬영이 끝난 후, 캘리브레이션을 위한 연산이 시작되며 이는 1분 내외의 시간이 소요됩니다. "Calibration is done"이라는 메시지를 기다려 주십시오.
  5. Save Params 버튼을 클릭해 캘리브레이션 결과를 저장합니다. 파일 브라우저 창에서, 새 파일 이름을 입력한 뒤 OK 버튼을 클릭하면 저장됩니다. 프로그램이 시작될 때 자동으로 로드되는 기본 파일명은 "default_cam.yml"입니다.


    캘리브레이션 파일명 입력

  6. 캘리브레이션이 완료된 뒤에는 카메라의 왜곡을 보정할 수 있습니다. 카메라 패널에서, "Uncorrected"라고 표시된 버튼을 클릭합니다. 버튼의 글씨가 "Undistorted"로 바뀌고, 다음 캡쳐부터는 카메라에 왜곡 보정이 적용됩니다.

작업 공간

캘리브레이션이 완료된 후에는 작업 공간을 설정해야 합니다.

  1. 캘리브레이션 시트를 작업 공간에 놓고 카메라를 작업 공간을 향해 위치시킵니다.
    • 주의: 작업 동작 시 Indy 끝단의 x축(콘티에서 확인, 붉은 축)과 워크스페이스의 x축(붉은 선)이 서로 반대 방향을 향하도록 워크 스페이스를 설정합니다.(아래 그림 참조) 작업시 이 방향과 가장 가까운 방향을 선택하게 됩니다.
  2. Detect WS 버튼을 클릭하면 인식된 작업 공간이 카메라에 표시됩니다.


    감지된 작업 공간(왼쪽)과 Indy와 작업공간 사이의 관계(오른쪽)

  3. 작업 공간을 편집합니다. Workspace 패널에는 9개의 에디트 박스가 있으며, 각 줄은 위치, 방향, 크기를 결정합니다. Set WS 버튼을 눌러 변경 사항을 적용합니다.
  4. Save Params 버튼을 눌러 작업 공간을 저장합니다.

고정된 카메라의 캘리브레이션

  1. 카메라를 사용될 위치에 고정합니다.
  2. "Calibrate with"란을 "Fixed Camera"로 설정합니다.
  3. 캘리브레이션 시트Indy 끝단에 시트 마운트플랜지를 이용해 부착합니다.(M4×8 볼트 8개, M4×6 핀 2개, M3×8 핀 2개, M4 와셔 3개 사용)


    고정된 카메라의 캘리브레이션

  4. 기준 시점 목록을 작성하고 혼합해 여러 뷰를 생성합니다. 고정 카메라의 경우에는, 캘리브레이션 시트가 이동하고 카메라는 고정되어 있다는 점을 주의하십시오. 캘리브레이션 시트가 항상 카메라에서 관측 가능하도록 해 주십시오.
  5. Calibrate 버튼을 클릭해 캘래브레이션을 수행합니다. "Calibration is done"가 출력될 때 까지 기다려 주십시오.
  6. Save Params 버튼을 클릭해 캘리브레이션 결과를 저장합니다.
  7. 캘리브레이션 시트Indy로부터 분리하고, 작업 공간 섹션으로 가서 작업 공간을 설정하십시오.

데이터 수집

물체 감지를(픽 앤 플레이스) 위한 데이터 수집

딥러닝 알고리즘을 학습하기 위해서는 데이터 수집이 필수적입니다. 물체 감지 데이터의 경우에는, CAD(.stl) 파일이 필요합니다. 3D scanner 혹은 별도의 CAD 소프트웨어를 사용해 stl 파일을 준비하십시오.


데이터 수집 화면

  1. 로봇을 홈 포지션으로 이동하고, Data 탭을 선택하십시오. "Collect type"란을 "Object Detection"으로 설정합니다.
  2. 캐드 목록을 생성합니다.
    • Clear 버튼을 클릭해 목록을 정리합니다.
    • 준비된 CAD 파일을 USB memory에 저장해 Eye-support USB port에 장착합니다.(카메라는 잠시 분리합니다.)
    • Add cad 버튼을 클릭합니다. 파일 브라우저 창을 통해 USB 메모리의 위치로 이동합니다. 일반적으로 "/meida/nvidia/<USB메모리이름>/"와 같은 경로에서 확인할 수 있습니다.
    • CAD 파일을 선택하고 OK 버튼을 클릭하면 파일이 추가됩니다.
    • 추가하려는 모든 CAD 파일에 대해 이 과정을 반복하십시오.
  3. Save list 버튼을 클릭해 CAD 목록을 저장합니다. 새 이름을 입력하거나 목록에서 기존의 파일을 선택하고 OK 버튼을 클릭합니다.
  4. CAD 모델을 목록에서 선택하고 On Floor 버튼을 클릭합니다. 선택된 CAD 모델이 작업 영역의 가운데에 그려집니다.
  5. 실제 물체를 작업 영역에 위치시킵니다. 화면상에 그려진 물체 모델과 실제 물체가 완전히 겹쳐지도록 주의하면서 위치시켜 주십시오.
    • On-screen location 패널에서 그려진 물체의 위치를 조절할 수 있습니다.
    • 왼쪽 열은 위치를, 오른쪽 열은 방향을 나타냅니다.
    • Set Object 버튼을 클릭하면 변경 사항이 적용됩니다.
    • Save Orientation 버튼을 클릭하면 변경된 물체의 방향을 영구적으로 파일에 저장합니다.
    • Clear Object 버튼을 클릭하면 화면의 물체를 지웁니다.


      On-screen location 패널

  6. 시점 리스트를 생성합니다. 캘리브레이션 섹션에서와 동일한 방식으로 진행하되, 혼합 시점의 수는 100개 이상으로 합니다.
  7. 데이터셋의 이름과 폴더를 설정합니다.
    • Set dataset 버튼을 클릭해 데이터셋의 기본 경로를 생성합니다. 새로운 이름을 입력하거나 기존의 폴더를 선택할 수 있습니다. 기본 경로에는 "train"과 "val" 두 가지 폴더가 자동 생성됩니다.
    • Set folder 버튼을 클릭해 데이터가 저장될 폴더를 지정합니다. "train" 폴더를 열고, 새로운 폴더이름을 입력하거나 기존의 폴더를 클릭하고 OK 버튼을 클릭합니다. 이 폴더에는 시점 목록 1회분의 데이터 묶음이 저장됩니다.
  8. Auto collecting 버튼을 클릭해 데이터 수집을 시작합니다.
    • 로봇이 자동으로 움직이며 작업물의 사진을 촬영하고 데이터를 저장합니다.
  9. 데이터를 추가하기 위해서는 Set folder 버튼을 클릭해 다음 번 데이터가 저장 될 폴더를 지정하고 Auto collecting 버튼을 클릭해 데이터 수집을 다시 시작합니다. 실제 작업에서 물체가 관측될 수 있는 모든 시점에서 데이터를 수집해주는 것이 좋습니다. 추가적으로, "val" 폴더 안에도 폴더를 추가해 데이터를 수집해주는 것이 validation 과정을 위해 바람직합니다.

분류를(검사) 위한 데이터 수집

  1. 로봇을 홈 포지션으로 이동하고 Data 탭을 선택합니다. "Collect type"란을 "Inspection"으로 설정합니다.
  2. Inspection Name 란에 물체의 이름 (검사점의 이름)을 입력합니다.
  3. 시점 목록을 생성합니다.(캘리브레이션에서와 동일)
    • 카메라가 검사 지점을 향하게 하고 조금씩 회전시키며 기준 시점을 생성.
    • 혼합 시점의 수는 100개 이상.
  4. 데이터셋의 이름과 폴더를 설정합니다.
    • Set dataset 버튼을 클릭해 데이터셋의 기본 경로를 생성합니다. 새로운 이름을 입력하거나 기존의 폴더를 선택할 수 있습니다. 기본 경로에는 "train"과 "val" 두 가지 폴더가 자동 생성됩니다.
    • Set folder 버튼을 클릭해 데이터가 저장될 폴더를 지정합니다. "train" 폴더를 열고, 새로운 폴더이름을 입력하거나 기존의 폴더를 클릭하고 OK 버튼을 클릭합니다. 이 폴더에는 시점 목록 1회분의 데이터 묶음이 저장됩니다.
  5. Auto collecting 버튼을 클릭해 데이터 수집을 시작합니다.
    • 로봇이 자동으로 움직이며 작업물의 사진을 촬영하고 데이터를 저장합니다.
  6. 다른 물체 (검사 지점)의 데이터를 추가하기 위해서는, Inspection Name 란에 새로운 이름을 넣고 Set folder 버튼을 클릭해 새 폴더를 지정한 뒤, Auto collecting 버튼을 클릭해 데이터 수집을 다시 시작합니다. 충분한 데이터가 모일 때 까지 이를 반복합니다. 추가적으로, "val" 폴더 안에도 폴더를 추가해 데이터를 수집해주는 것이 validation 과정을 위해 바람직합니다.

딥러닝 알고리즘 사용

학습

  1. Data 탭의 하단에서, 학습할 네트워크를 선택합니다.
    • MaskRCNN: MaskRCNN 네트워크로, 이미지에서 물체를 감지하고 픽셀 단위로 영역을 분리합니다.
    • ResNet: 검사를 위한 분류 알고리즘입니다.
  2. Train 버튼을 클릭해 학습을 시작합니다.
    • 열려진 파일 브라우저에서 학습하고자 하는 데이터셋을 선택하고 OK 버튼을 클릭합니다.
  3. Data 탭의 아래쪽에 학습 진행 상황이 표시됩니다. State 버튼을 클릭하면 현재 학습 서버의 상태가 메시지로 표시됩니다. 학습이 완료된 경우에는 'Done'이라는 메시지를 받을 수 있습니다.
    • 학습을 도중에 멈추기 위해서는 Stop 버튼을 클릭하십시오.

학습된 모델의 다운로드

  1. Data 탭의 하단에서, 다운로드할 네트워크의 종류를 선택하고 GET 버튼을 클릭하십시오.
  2. 'Select Trained Config'라는 파일 브라우저 창이 표시됩니다. 학습한 데이터셋을 여십시오.
  3. 데이터셋 경로 안에서, 'Models' 폴더를 여십시오.
  4. 설정 파일을 선택하고 OK 버튼을 클릭합니다. (일반적으로 config.yml)
  5. 다음으로는 'Download Config To'라는 파일 브라우저 창이 표시됩니다. 모델 파일을 저장하기 위한 새 이름을 입력하거나 덮어쓸 기존의 파일을 선택하고 OK 버튼을 클릭합니다.
    • 프로그램 시작 시 자동 로드되는 파일명은 'config.yml'입니다.
  6. 설정 파일과 함께 딥러닝 모델, CAD 파일이 자동으로 다운로드 됩니다.
    • 덮어쓰기 되는 파일의 경우 기존 파일은 <old_name_bak> 형식의 이름으로 보존됩니다.
    • 다운로드가 완료되고 로딩 아이콘이 사라지기를 기다려 주십시오.

물체 감지

감지 설정을 변경하기 위해서는, Detection 탭으로 이동합니다.

  1. Option 패널의 Load 버튼을 클릭합니다. 파일 브라우저에서 다운로드한 설정 파일을 선택하고 OK버튼을 클릭합니다. 딥러닝 모델의 초기화에는 시간이 소요됩니다. 초기화가 완료되고 로딩 아이콘이 사라지기를 기다려 주십시오.
  2. Detect 버튼을 눌러 감지를 테스트해보십시오. 기본 MaskRCNN 알고리즘의 경우 첫번째 감지에서 초기화에 시간이 소요됩니다. 감지 알고리즘의 수정을 위해서는, 아래의 Detect tab 섹션을 참고하십시오.
  3. MaskRCNN 알고리즘의 경우 SoyNet 솔루션을 이용해 3 배 가량 가속될 수 있습니다. Deep learning 옵션을 MaskRCNNSoyNet으로 변경하고 Save 버튼을 클릭하십시오. 새로운 이름을 입력하거나 덮어쓸 기존 파일을 선택하고 OK 버튼을 클릭하십시오.
    • 모델 변환에는 시간이 소요됩니다. 변환이 완료되고 로딩 아이콘이 사라지기를 기다려 주십시오.
  4. SoyNet 가속기가 적용되었습니다. Detect 버튼을 눌러 감지를 테스트해보십시오.

Detection 탭


Detection 탭 구성 요소

  • Object list : 감지 가능한 물체 목록. Data 탭의 CAD 목록과 동일.
  • Algorithms : 사용가능한 알고리즘의 목록.
    • Deep learning : 딥러닝 알고리즘들.
      • MaskRCNN: MaskRCNN 물체 감지.
      • MaskRCNNSoyNet: MaskRCNN에 SoyNet가속기를 적용. SoyNet 라이센스가 필요.
      • ResNet: 검사를 위한 ResNet 분류 알고리즘.
    • Pose refinement : 물체 자세 보정을 위한 선택 가능한 알고리즘들.
      • SilhouetteSimple: 분리된 물체를 회전시키며 실루엣을 비교, 가장 일치하는 자세를 선택.
      • Workspace: 물체 위치를 작업 공간 원점에 위치시킴. 테스트 목적.
    • Post process : 선택 가능한 후처리 알고리즘들.
      • Crosscheck: 물체 종류 간의 교차 검사. 실루엣이 가장 일치하는 물체로 변경함.
    • Detect button: Object list에서 선택된 물체를 감지.
  • Options : 감지 설정을 확인하고 변경.
    • Get: 선택된 변수를 조회.
    • Set: 선택된 변수를 위 박스의 값으로 수정.
    • Add: 위 박스에 입력된 이름의 새로운 변수를 추가.
    • Delete: 선택된 변수를 삭제.
    • Save: 감지 설정 저장.
    • Load: 감지 설정 불러오기.
    • 예시: 물체 감지의 영역 제한하기
      • 'check_workspace'를 입력, Add를 클릭해 변수 추가
      • 1을 입력, Set을 클릭해 변수 설정
      • Save 클릭해 설정 저장.
      • 이후 감지부터는 작업 영역 안쪽의 물체만 감지.
옵션 사용 알고리즘 설명
'mrcnn_conf_cut' MaskRCNN 0~1 MaskRCNN의 감지 민감도
'rot_range' SilhouetteSimple 0~360 회전 검사할 각도의 범위
'track_iter' SilhouetteSimple int 회전 검사시 각도의 분해 횟수 (예: 8일 경우 8개로 나누어 검사)
'track_scales' SilhouetteSimple int 회전 검사를 반복 수행할 횟수 (범위를 좁혀가며 반복 수행)
'iou_cut' SilhouetteSimple,Crosscheck 0~1 감지로 처리할 실루엣 일치율의 하한선
'class_group' Crosscheck int array 물체 개수만큼의 int 어레이로, 같은 숫자로 설정된 물체끼리만 교차 검사를 시행함. (예: [0, 0, 1, 1]일 경우 첫번째와 두번째 끼리, 세번재와 네번째 끼리 교차 검사)

파지 설정

물체 파지법 교시

먼저, 엔드툴 위치를(TCP) 교시합니다.

  1. 캘리브레이션 시트를 작업 영역에 놓습니다.
  2. Calibration 탭에서, Detect WS 버튼을 클릭해 작업 영역을 다시 설정합니다. 화면에 작업 영역과 그 원점 좌표계가 표시됩니다.
  3. Pick 탭으로 이동합니다.
  4. 엔드툴을 작업 영역의 원점 좌표계로 이동시킵니다.
  5. Tools 패널에서, Teach 버튼을 클릭해 TCP를 교시합니다.
  6. 여러 툴이 입력될 수 있습니다. 물체를 감지할 때, 알고리즘이 가장 적합한 방향을 갖고 있는 툴을 선택하게 됩니다.
  7. 교시 후 생기는 숫자 리스트에서, 첫번째와 두번째는 툴의 식별 번호, 세번째는 툴의 대칭성을 나타내는 숫자입니다. 즉, 2는 180° 뒤집어 잡기를 허용하는 툴이고, 4는 90°씩 돌려 잡기를 허용하는 툴 입니다. 숫자를 변경한 후 Edit를 눌러 변경 사항을 적용하십시오.
  8. 4~9번째 숫자는 이후 숫자는 6자유도 TCP 좌표계를 나타냅니다. (x,y,z,θx, θy, θz)
  9. 'Save' 버튼을 클릭해 TCP 목록을 저장합니다.


    TCP 교시: 엔드툴을 작업 영역 원점에 위치.

다음으로, 각 물체에서 파지 가능한 지점을 교시합니다.

  1. 목표 물체를 작업 영역에 놓습니다.
  2. 카메라 패널에서, 해당 물체를 선택하고 Detect 버튼을 클릭해 물체를 감지합니다. 감지 결과가 패널에 표시됩니다.
  3. Grips 패널에서, 해당 물체를 선택하고 Select버튼을 클릭합니다.
  4. Tools 패널에서, 교시에 사용하려는 TCP를 선택합니다.
  5. 해당 TCP를 물체의 파지 가능한 지점으로 이동시킵니다.
  6. Grips 패널에서, Teach 버튼을 클릭해 파지점을 교시합니다.
  7. 여러 파지점이 입력될 수 있습니다. 물체를 감지할 때, 알고리즘이 가장 적합한 방향을 갖고 있는 파지점을 선택하게 됩니다.
  8. 파지점의 1~4번째 숫자는 적합한 툴 구분을 위한 숫자입니다. 툴을 선택하고 티칭할 때 자동으로 입력됩니다.
  9. 파지점의 5~10번째 숫자는 파지점의 6자유도 좌표계입니다. (x,y,z,θx, θy, θz)
  10. Save 버튼을 클릭해 현재의 파지점 목록을 저장합니다.


    파지점 교시: 물체를 인식하고 TCP를 파지 가능한 지점에 위치.

파지점 교시가 완료된 후에는 파지 테스트가 가능합니다.

  1. TCP를 화면에 그려 확인합니다.

    • Tools 패널에서 하나의 TCP를 선택합니다.
    • Tools 패널에서 draw 버튼을 클릭합니다.
    • 화면에 TCP가 그려집니다. 일반적으로, 카메라에서 TCP가 완전히 보이지는 않는 것이 정상입니다.
  2. 파지점을 화면에 그려 확인합니다.

    • 확인할 물체를 작업 공간에 놓습니다.
    • 카메라 패널에서 해당 물체를 선택하고 Detect 버튼을 클릭해 감지합니다. 화면에 감지 결과가 표시됩니다.
    • Grips 패널에서 해당 물체를 선택, Select 버튼을 클릭하고 목록에서 원하는 파지점를 선택합니다.
    • Grips 패널에서 draw 버튼을 클릭합니다.
    • 화면에 해당 파지점이 표시됩니다.
  3. 파지 테스트

    • 확인할 물체를 작업 공간에 놓습니다.
    • 카메라 패널에서 해당 물체를 선택하고 Detect 버튼을 클릭해 감지합니다. 화면에 감지 결과가 표시됩니다.
    • Pick Test 버튼을 클릭합니다.
    • 물체를 파지할 수 있는 자세로 로봇이 이동합니다.

TCP/IP 통신

통신 규칙

웹 UI에서 설정이 완료되면, TCP/IP 통신을 통해 감지를 요청하고 결과를 받아볼 수 있습니다. IndyEye는 TCP/IP 통신을 위해 json string 형식을 이용합니다. 명령어 체계는 아래와 같습니다.

설명
'command' 0 딥러닝 알고리즘 실행
1 자세 보정과 후처리 실행
2 감지 알고리즘 리셋
3 감지 가능한 물체의 이름 목록 요청
'class_tar' int 감지할 물체 종류의 번호. 모두 감지를 위해서는 0 입력
'pose_cmd' float x 6 array 현재 로봇의 작업 공간 위치. (IndyEye가 'no robot' 모드인 경우에 한해 입력)

명령에 대한 IndyEye의 응답 체계는 아래와 같습니다.

설명
'STATE' int 오류 상태. 0 는 감지 성공을 의미.
'class_detect' int 감지된 물체의 종류 번호. 1부터 시작.
'tool_idx' int IndyEye가 선택한 툴 번호.
'Tbe' float x 6 array 물체 파지를 위한 로봇의 6D 작업 공간 위치.
'Tbt' float x 6 array 물체 파지를 위한 TCP의 6D 작업 공간 위치.
'Tbo' float x 6 array 물체의 6D 작업 공간 위치.
'class_list' string array 감지 가능한 물체의 이름 목록. ('command'가 3 인 경우에만 회신)

C++ 클라이언트

IndyEyeClientIndyEye와 함께 제공되는 C++ 통신용 클래스입니다. NRMK Framework에 포함되어 제공되며, 구성은 아래와 같습니다.

파일/폴더 내용
IndyEyeClient.h IndyEyeClient의 헤더 파일.
IndyEyeClient.cpp IndyEyeClient의 소스 파일.
jsoncpp.cpp JsonCpp library의 소스 파일.
json/ JsonCpp library의 헤더 파일들.

IndyEyeClientIndyEye와의 간편한 통신을 위해 아래의 함수들을 제공합니다.

함수 변수 설명
SetIP char* ipaddress IndyEye의 IP 주소 설정
GetClassList - 감지 가능한 물체 리스트를 요청
Detect int cls, double *pose 물체 감지와 보정, 후처리 수행. cls: 목표 물체 종류 번호, 모두 감지를 위해서는 0 입력, pose: 현재 로봇 자세 (선택 입력, double × 6 어레이)

GetClassList나 Detect 함수의 호출 후에, 그 결과는 아래와 같이 IndyEyeClient의 멤버 변수에 저장됩니다.

멤버 변수 형식 설명
class_detect int 감지된 물체의 종류 번호
Tbe float x 6 array 물체 파지를 위한 로봇의 6D 작업 공간 위치.
Tbt float x 6 array 물체 파지를 위한 TCP의 6D 작업 공간 위치.
Tbo float x 6 array 물체의 6D 작업 공간 위치.
class_list vector 감지 가능한 물체의 이름 목록.

물체 감지 예제 프로그램

***Python 에서의 픽 앤 플레이스 ***

아래는 Python에서 구현된, 물체를 파지해 5 cm 떨어진 곳에 놓는 예제 프로그램입니다. 실행을 위해서는 IndyDCPClient가 필요합니다. (NRMK Frameworkindydcp_client.py 파일로 포함, IndyInterfaces 항목 참조)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
from indydcp_client import IndyDCPClient
import numpy as np
import json

import time
import socket
import sys
taskserverport = 2002
bindIP = '192.168.3.107' ## ip of device that this program is running

# define IndyEye
eyeIP = '192.168.3.107'
taskserverport = 2002

## define Indy
name = 'NRMK-Indy7'
robot_ip = '192.168.3.106'

# define IndyDCPClient
IndyClient = IndyDCPClient(bindIP, robot_ip, name)
IndyClient.connect()


class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

# define function to wait for robot motion
def wait_moving(IndyClient):
    time.sleep(0.5)
    while not IndyClient.is_move_finished():
        time.sleep(0.5)
        print('robot is moving')

# define eye command function
def run_command(cmd,cls,pose_cmd = None):
    sock = socket.socket(socket.AF_INET,
                         socket.SOCK_STREAM) # SOCK_STREAM is TCP socket
    sock.bind((bindIP,0))

    try:
        sock.connect((eyeIP,taskserverport))
        sdict = {'command': int(cmd), 'class_tar': int(cls), }
        if pose_cmd is not None:
            sdict['pose_cmd']= pose_cmd
        sjson = json.dumps(sdict, cls=NumpyEncoder)
        sbuff = sjson.encode()
        sock.send(sbuff)
        print('sent: ',sjson)

        rbuff = sock.recv(1024)
        rjson = "".join(map(chr, rbuff))
        rdict = json.loads(rjson)
        print('received: ', rdict)

    finally:
        sock.close()
    return rdict

# go home
IndyClient.go_home()
wait_moving(IndyClient)

# get current task pose
pose_cur = IndyClient.get_task_pos()

# Do detection
rdict = run_command(cmd=0, cls=0, pose_cmd = pose_cur)

# Get task postion for pick
Tbe = np.array(rdict['Tbe'])
Tbe_above = Tbe.copy()
Tbe_above[2] += 0.05

# Go above object
IndyClient.task_move_to(Tbe_above)
wait_moving(IndyClient)

# Get down to object
IndyClient.task_move_to(Tbe)
wait_moving(IndyClient)

# Pick - in this case, tool is connected to DO8
IndyClient.set_smart_do(8, True)
time.sleep(1)

# Go above object
IndyClient.task_move_to(Tbe_above)
wait_moving(IndyClient)

# Make put position, 5 cm away from pick point.
Tput = Tbe.copy()
Tput[1] += 0.05
Tput_above = Tput.copy()
Tput_above[2] += 0.05

# Go above put point
IndyClient.task_move_to(Tput_above)
wait_moving(IndyClient)

# Get down to put point
IndyClient.task_move_to(Tput)
wait_moving(IndyClient)


# put
IndyClient.set_smart_do(8, False)
time.sleep(1)

IndyClient.disconnect()

C++에서의 물체 감지

아래의 C++에서 구현된 물체 종류 리스트 획득 및 감지 예제입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include "IndyEyeClient.h"

int main()
{
    IndyEyeClient eye;

    eye.SetIP("192.168.0.23"); // set IP of IndyEye

    eye.GetClassList(); // Get class list
    cout << "class list:";
    for (auto cls_str : eye.class_list) {
        cout << cls_str;
    }

    // cls_tar=0 for all
    int cls_tar = 0;

    eye.Detect(cls_tar); // Do detection & refinement

    if (eye.STATE == 0) { // no-error check
        // print task position to pick object
        cout << "Tbe: [" << eye.Tbe[0] << "," << eye.Tbe[1] << "," << eye.Tbe[2] << "," \
            << eye.Tbe[3] << "," << eye.Tbe[4] << "," << eye.Tbe[5] << "]" << endl;
    }

}

프로그램 관리 (고급)

앱 실행

  • IndyEye 프로그램 실행을 위해 아래의 둘 중 한가지를 입력하십시오. 전자는 터미널 상에서 프로그램을 실행하고, 후자는 백그라운드 서비스로 실행합니다. (기본적으로 부팅 시 후자의 방법으로 프로그램이 실행됩니다.)
1
2
cd ~/Projects/indyeye/src
sudo python3 IndyEye_main.py

or

1
sudo systemctl start IndyEyeAuto

백그라운드 서비스 관리

  • 프로그램의 상태를 확인하기 위해서는 아래의 명령을 입력하십시오.
1
sudo systemctl status IndyEyeAuto
  • 프로그램을 종료하기 위해서는 아래의 명령을 입력하십시오.
1
sudo systemctl kill IndyEyeAuto