Skip to content

IndyDCP3: IndyEye Python API

neuromeka 패키지의 IndyEye 클래스를 사용하면 IndyEye의 인식 기능을 IndyEye 앱 또는 Conty 바깥에서 호출할 수 있습니다. 클라이언트 객체를 생성하기 위해서는 neuromeka 패키지에서 IndyEye 클래스를 임포트해야 합니다.

from neuromeka import IndyEye

IndyEye 클래스 객체를 생성한 후, IndyEye 서버와의 통신을 위해 다음과 같이 IP 주소를 지정해야 합니다.

eye = IndyEye(eye_ip='192.168.0.100')

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:

from neuromeka import IndyEye
eye = IndyEye(eye_ip="192.168.0.100")

# 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:

>>> eye.get_object_dict()
{1: "sheet", 2: "orange"}

인식 실행 함수

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:

object_result = eye.detect(1, task_pos=None, robot_ip="192.168.0.50")

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:

object_result = eye.detect_by_object_name("sheet", task_pos=None, robot_ip="192.168.0.10")

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:

>>> eye.get_version()
"0.6.0"

image()

IndyEye에 현재 연결된 카메라 이미지를 반환합니다.

  • Returns:
    • PIL.Image: 카메라 이미지

Example:

current_image = eye.image()
current_image.show()

class EyeCommand

run_command() 함수를 실행할때 사용하는 명령 종류입니다. from neuromeka.eye import *를 사용하여 import 할 수 있습니다.

  • DETECT = 0 # detect 명령
  • RETRIEVE = 1 # 미리 촬영된 결과에서 물체들을 1개씩 가져오는 명령
    • 그래프 내 Select 모듈 ON RETRIEVE 옵션이 On으로 되어있어야합니다.
  • 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'