IndyDCP3: IndyEye Python API
See also
neuromeka
패키지의 IndyEye
클래스를 사용하면 IndyEye의 인식 기능을 IndyEye 앱 또는 Conty 바깥에서 호출할 수 있습니다.
클라이언트 객체를 생성하기 위해서는 neuromeka
패키지에서 IndyEye
클래스를 임포트해야 합니다.
IndyEye
클래스 객체를 생성한 후, IndyEye 서버와의 통신을 위해 다음과 같이 IP 주소를 지정해야 합니다.
Usage Example:
from neuromeka import IndyDCP3
from neuromeka import IndyEye
from neuromeka.eye import *
robot_ip = "192.168.0.10"
eye_ip = "192.168.0.100"
indy = IndyDCP3(robot_ip=robot_ip)
eye = IndyEye(eye_ip=eye_ip)
task_pos = indy.get_control_data()['p']
pose_obj = eye.detect(cls=1, task_pos=task_pos, mode=DetectKey.REF_TO_OBJECT, robot_ip=robot_ip)
print(pose_obj) # [335.287, 53.583, 442.725, -5.815, 17.223, 86.578] # [mm, mm, mm, deg, deg, deg]
Warning
neuromeka
3.2.0.6 버전까지의 IndyEye 클라이언트는 입력&출력 위치값 단위로 m(미터) 단위를 사용합니다.
3.2.0.6 이하 버전을 사용하다가 3.2.0.7 이상의 버전으로 업그레이드 하는 경우, 위치값과 관련된 코드를 수정해주셔야합니다.
# ~3.2.0.6 버전 사용시
eye = IndyEye(eye_ip=eye_ip)
task_pos = indy.get_control_data()['p'] # 작업공간 포즈 위치 (mm 단위)
for i in range(len(task_pos)):
task_pos[i] = task_pos[i]/1000 # mm단위 -> m단위 변환
pose_obj = eye.detect(cls=1, task_pos=task_pos, mode=DetectKey.REF_TO_OBJECT, robot_ip=robot_ip)
print(pose_obj) # [0.335, 0.0535, 0.442, -5.815, 17.223, 86.578] # [m, m, m, deg, deg, deg]
# 3.2.0.7+ 버전 사용시
eye = IndyEye(eye_ip=eye_ip)
task_pos = indy.get_control_data()['p'] # 작업공간 포즈 위치 (mm 단위)
pose_obj = eye.detect(cls=1, task_pos=task_pos, mode=DetectKey.REF_TO_OBJECT, robot_ip=robot_ip)
print(pose_obj) # [335.287, 53.583, 442.725, -5.815, 17.223, 86.578] # [mm, mm, mm, deg, deg, deg]
class IndyEye
IndyEye 서버에 연결할 수 있는 클라이언트 객체를 만듭니다.
-
Parameters:
eye_ip
(str): IndyEye 서버의 IP 주소pose_unit
(str, optional): 위치값 수동 입력시 사용할 단위,"mm"
,"m"
중 선택, 기본값은"mm"
-
3.2.0.7 버전부터 추가됨
-
-
Returns:
IndyEye
클라이언트 객체
Example:
# 3.2.0.7+ 버전 사용시 (입력하는 task_pos를 m 단위로 입력하고 싶은 경우)
eye = IndyEye(eye_ip="192.168.0.100", pose_unit="m")
task_pos = indy.get_control_data()['p'] # 작업공간 포즈 위치 (mm 단위)
for i in range(len(task_pos)):
task_pos[i] = task_pos[i]/1000 # mm단위 -> m단위 변환
pose_obj = eye.detect(cls=1, task_pos=task_pos, mode=DetectKey.REF_TO_OBJECT, robot_ip=robot_ip)
print(pose_obj) # [335.287, 53.583, 442.725, -5.815, 17.223, 86.578] # [mm, mm, mm, deg, deg, deg]
함수 목록
Method | Description |
---|---|
run_command() |
명령 실행 |
get_object_dict() |
클래스 정보 받아오기 |
detect() |
Detect 명령 실행 |
detect_by_object_name() |
클래스 명으로 Detect 명령 실행 |
retrieve() |
Retrieve 명령 실행 |
get_version() |
IndyEye 버전 받아오기 |
image() |
카메라 이미지 가져오기 |
run_command(cmd, cls=0, pose_cmd=None, robot_ip=None
)
IndyEye 명령을 실행하는 함수입니다.
명령은 EyeCommand
클래스에 정의된 EyeCommand.DETECT
, EyeCommand.RETRIEVE
, EyeCommand.GETLIST
중에서 선택할 수 있습니다.
-
Parameters:
cmd
(EyeCommand): 인식 명령 종류cls
(int): 인식할 물체의 클래스 인덱스, 기본값0
- 0을 넣으면 가장 먼저 인식된 물체를 결과로 반환하게 됩니다.
pose_cmd
(float[6], optional): 현재 로봇의 엔드 이펙터 위치 좌표, [x, y, z, u, v, w], 기본값None
- None을 넣으면 현재 연결된 로봇에서 좌표를 받아옵니다.
robot_ip
(str, optional): 로봇 컨트롤러의 IP 주소, 기본값은None
-
Returns:
dict
: 인식된 결과의 dictionary 입니다.
-
Raises:
ValueError
: pose_cmd 값의 x, y, z 축 중 하나라도 10m 이상의 값이 들어온 경우
Example:
>>> from neuromeka.eye import *
>>> eye.run_command(cmd=EyeCommand.DETECT, cls=0, task_pos=None, robot_ip="192.168.0.10")
{'detected': True, 'passed': True, 'cls': 1,
'tar_ee_pose': [0.400, 0.0, 0.400, 180.0, 0.007, 180.0],
'tar_tool_pose': [0.383, -0.002, -0.0948, 0.575, 2.228, -18.348],
'tar_obj_pose': [0.383, -0.002, -0.0948, 0.575, 2.228, -18.348],
'tool_idx': 0, 'error_state': False, 'error_module': ''}
get_object_dict()
현재 IndyEye에서 로딩된 그래프 기준으로 나올 수 있는 오브젝트 클래스 dict값을 반환합니다. 클래스 인덱스는 1부터 시작합니다.
- Returns:
dict
: {클래스 인덱스: "클래스 이름", ...}
Example:
인식 실행 함수
detect(cls, task_pos, mode=DetectKey.REF_TO_END_TOOL, robot_ip=None
)
현재 카메라 이미지를 촬영하고 인식결과를 보내는 함수입니다.
그래프에 추가된 Select 모듈의 "On retrieve" 값이 On 이라면 retrieve()
함수와 함께 사용해야합니다.
-
Parameters:
cls
(int): 인식할 물체의 클래스 인덱스, 기본값0
- 0을 넣으면 가장 먼저 인식된 물체를 결과로 반환하게 됩니다.
task_pos
(float[6], optional): 현재 로봇의 엔드 이펙터 위치 좌표, [x, y, z, u, v, w], 기본값None
- None을 넣으면 현재 연결된 로봇에서 좌표를 받아옵니다.
mode
(DetectKey, optional): 어떤 값을 결과로 받을지에 대한 키, 기본값은DetectKey.REF_TO_END_TOOL
robot_ip
(str, optional): 로봇 컨트롤러의 IP 주소, 기본값은None
-
Returns:
- 인식된 경우
float[6]
: 인식된 물체의 참조좌표계 기준 위치, [x, y, z, u, v, w], 단위는 mm, deg. - 인식되지 않은 경우
None
- 인식된 경우
-
Raises:
ValueError
: task_pos 값의 x, y, z 축 중 하나라도 10m 이상의 값이 들어온 경우
Example:
detect_by_object_name(target_name, task_pos, mode=DetectKey.REF_TO_END_TOOL, robot_ip=None
)
클래스 인덱스 대신 클래스 이름을 사용해서 detect를 실행합니다.
-
Parameters:
target_name
(str): 인식할 물체의 클래스 이름task_pos
(float[6], optional): 현재 로봇의 엔드 이펙터 위치 좌표, [x, y, z, u, v, w], 기본값None
- None을 넣으면 현재 연결된 로봇에서 좌표를 받아옵니다.
mode
(DetectKey, optional): 어떤 값을 결과로 받을지에 대한 키, 기본값은DetectKey.REF_TO_END_TOOL
robot_ip
(str, optional): 로봇 컨트롤러의 IP 주소, 기본값은None
-
Returns:
- 인식된 경우
float[6]
: 인식된 물체의 참조좌표계 기준 위치, [x, y, z, u, v, w], 단위는 mm, deg. - 인식되지 않은 경우
None
- 인식된 경우
-
Raises:
ValueError
: task_pos 값의 x, y, z 축 중 하나라도 10m 이상의 값이 들어온 경우
Example:
retrieve(cls, task_pos, mode=DetectKey.REF_TO_END_TOOL
)
한번 Detect를 해서 나온 인식 결과들의 리스트에서 한개씩 물체를 Select 하여 가져오는 방식입니다. 그래프에 추가된 Select 모듈의 "On retrieve" 값이 On 일때만 사용 가능합니다.
-
Parameters:
cls
(int): 인식할 물체의 클래스 인덱스, 기본값0
- 0을 넣으면 가장 먼저 인식된 물체를 결과로 반환하게 됩니다.
task_pos
(float[6], optional): 현재 로봇의 엔드 이펙터 위치 좌표, [x, y, z, u, v, w], 기본값None
- None을 넣으면 현재 연결된 로봇에서 좌표를 받아옵니다.
mode
(DetectKey, optional): 어떤 값을 결과로 받을지에 대한 키, 기본값은DetectKey.REF_TO_END_TOOL
-
Returns:
- 인식된 경우
float[6]
: 인식된 물체의 참조좌표계 기준 위치, [x, y, z, u, v, w], 단위는 mm, deg. - 더이상 물체가 없는 경우
None
- 인식된 경우
-
Raises:
ValueError
: task_pos 값의 x, y, z 축 중 하나라도 10m 이상의 값이 들어온 경우
Example:
robot_ip = "192.168.0.10"
eye.detect(1, task_pos=None, robot_ip=robot_ip)
object_results = []
while True:
object_result = eye.retrieve(1)
if object_result is None:
break
object_results.append(object_result)
print(object_results)
유틸리티 함수
get_version()
현재 IndyEye 서버의 버전을 반환합니다.
- Returns:
str
: 버전 정보
Example:
image()
IndyEye에 현재 연결된 카메라 이미지를 반환합니다.
- Returns:
PIL.Image
: 카메라 이미지
Example:
class EyeCommand
run_command()
함수를 실행할때 사용하는 명령 종류입니다.
from neuromeka.eye import *
를 사용하여 import 할 수 있습니다.
DETECT
= 0 # detect 명령RETRIEVE
= 1 # 미리 촬영된 결과에서 물체들을 1개씩 가져오는 명령- 그래프 내 Select 모듈
ON RETRIEVE
옵션이On
으로 되어있어야합니다.
- 그래프 내 Select 모듈
GETLIST
= 3 # 클래스 목록 가져오기 명령
class DetectKey
detect()
, detect_by_object_name()
, retrieve()
함수의 결과값 중 특정 값을 받을때 사용하는 키워드입니다.
from neuromeka.eye import *
를 사용하여 import 할 수 있습니다.
DETECTED
= 'detected' # 물체가 인식되었는지의 여부PASSED
= 'passed' # 물체가 Inspection까지 모두 통과했는지의 여부CLASS
= 'cls' # 인식된 물체의 클래스 인덱스REF_TO_END_TOOL
= 'tar_ee_pose' # 로봇의 6D 태스크 좌표값REF_TO_PICK_POINT
= 'tar_tool_pose' # 인식된 물체를 잡기 위한 6D Tool Center Position값REF_TO_OBJECT
= 'tar_obj_pose' # 인식된 물체의 6D 위치 좌표값TOOL_INDEX
= 'tool_idx'ERROR_STATE
= 'error_state' # IndyEye에서 오류가 발생했는지의 여부ERROR_MODULE
= 'error_module' # IndyEye에서 오류가 발생한 경우, 오류가 발생한 모듈의 이름CLASS_NAMES
= 'class_names'