예제 프로그램
픽 앤 플레이스
물체 파지법 교시
먼저, 엔드툴 위치를(TCP) 교시합니다.
- 캘리브레이션 시트를 작업 영역에 놓습니다.
- Calibration 탭에서, Detect WS 버튼을 클릭해 작업 영역을 다시 설정합니다. 화면에 작업 영역과 그 원점 좌표계가 표시됩니다.
- Pick 탭으로 이동합니다.
- 엔드툴을 작업 영역의 원점 좌표계로 이동시킵니다.
- Tools 패널에서, Teach 버튼을 클릭해 TCP를 교시합니다.
- 여러 툴이 입력될 수 있습니다. 물체를 감지할 때, 알고리즘이 가장 적합한 방향을 갖고 있는 툴을 선택하게 됩니다.
- 교시 후 생기는 숫자 리스트에서, 첫번째와 두번째는 툴의 식별 번호, 세번째는 툴의 대칭성을 나타내는 숫자입니다. 즉, 2는 180° 뒤집어 잡기를 허용하는 툴이고, 4는 90°씩 돌려 잡기를 허용하는 툴 입니다. 숫자를 변경한 후 Edit를 눌러 변경 사항을 적용하십시오.
- 4~9번째 숫자는 이후 숫자는 6자유도 TCP 좌표계를 나타냅니다. (x,y,z,θx, θy, θz)
-
'Save' 버튼을 클릭해 TCP 목록을 저장합니다.
다음으로, 각 물체에서 파지 가능한 지점을 교시합니다.
- 목표 물체를 작업 영역에 놓습니다.
- 카메라 패널에서, 해당 물체를 선택하고 Detect 버튼을 클릭해 물체를 감지합니다. 감지 결과가 패널에 표시됩니다.
- Grips 패널에서, 해당 물체를 선택하고 Select버튼을 클릭합니다.
- Tools 패널에서, 교시에 사용하려는 TCP를 선택합니다.
- 해당 TCP를 물체의 파지 가능한 지점으로 이동시킵니다.
- Grips 패널에서, Teach 버튼을 클릭해 파지점을 교시합니다.
- 여러 파지점이 입력될 수 있습니다. 물체를 감지할 때, 알고리즘이 가장 적합한 방향을 갖고 있는 파지점을 선택하게 됩니다.
- 파지점의 1~4번째 숫자는 적합한 툴 구분을 위한 숫자입니다. 툴을 선택하고 티칭할 때 자동으로 입력됩니다.
- 파지점의 5~10번째 숫자는 파지점의 6자유도 좌표계입니다. (x,y,z,θx, θy, θz)
-
Save 버튼을 클릭해 현재의 파지점 목록을 저장합니다.
파지점 교시가 완료된 후에는 파지 테스트가 가능합니다.
-
TCP를 화면에 그려 확인합니다.
- Tools 패널에서 하나의 TCP를 선택합니다.
- Tools 패널에서 draw 버튼을 클릭합니다.
- 화면에 TCP가 그려집니다. 일반적으로, 카메라에서 TCP가 완전히 보이지는 않는 것이 정상입니다.
-
파지점을 화면에 그려 확인합니다.
- 확인할 물체를 작업 공간에 놓습니다.
- 카메라 패널에서 해당 물체를 선택하고 Detect 버튼을 클릭해 감지합니다. 화면에 감지 결과가 표시됩니다.
- Grips 패널에서 해당 물체를 선택, Select 버튼을 클릭하고 목록에서 원하는 파지점를 선택합니다.
- Grips 패널에서 draw 버튼을 클릭합니다.
- 화면에 해당 파지점이 표시됩니다.
-
파지 테스트
- 확인할 물체를 작업 공간에 놓습니다.
- 카메라 패널에서 해당 물체를 선택하고 Detect 버튼을 클릭해 감지합니다. 화면에 감지 결과가 표시됩니다.
- Pick Test 버튼을 클릭합니다.
- 물체를 파지할 수 있는 자세로 로봇이 이동합니다.
Python 픽 앤 플레이스 예제
아래는 Python에서 구현된, 물체를 파지해 5 cm 떨어진 곳에 놓는 예제 프로그램입니다. 실행을 위해서는 IndyDCPClient가 필요합니다. (NRMK Framework에 indydcp_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; } } |