Skip to content

예제 프로그램

픽 앤 플레이스

물체 파지법 교시

먼저, 엔드툴 위치를(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 버튼을 클릭합니다.
    • 물체를 파지할 수 있는 자세로 로봇이 이동합니다.

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;
    }

}