Mech-Vision 인터페이스
이 부분에서 아래와 같이 Mech-Vision과 관련된 인터페이스를 소개하겠습니다:
비전 목표점을 획득하기
아래와 같이 adapter.py 중의 find_vision_pose()함수를 통해 Mech-Vision비전 결과를 획득합니다.
def find_vision_pose(self, project_name=None, timeout=default_vision_timeout):
vision_result = self.call_vision("findPoses", project_name=project_name, timeout=timeout)
logging.info("Find vision result: {}".format(vision_result))
return vision_result
Mech-Vision 중의 비전 목표점은 보통 사원수 형식으로 출력된 물체 포즈(obj_pose)입니다. TCP 포즈 형식으로 출력될 수도 있지만 Mech-Vision 프로젝트에서 변환되어야 합니다.
예시
Adapter는 TCP 포즈(tcp_pose)로 변환할 수 있는 함수를 생성해야 하며 때로는 사원수를 오일러 각도로 변환하거나 라디안을 각도로 변환하고 로봇 측에 전송해야 합니다 (변환 여부는 로봇 측과 일치해야 함). 또는 Adapter는 Mech-Vision에서 출력한 비전 포즈를 체크할 수도 있습니다. 예를 들어:
def check_vision_result(self, vision_result):
if vision_result["noCloudInRoi"]: # Determine whether it is an empty bin
logging.info("Layer has no objects")
self.send(pack('>2B6i', CODE_NO_CLOUD, vision_num, *EMPTY_PLACEHOLDER))
return
poses = vision_result.get("poses", []) # Get pose
if len(poses) = 0: # Determine whether there is a vision point
logging.warning("No pose from vision")
self.send(pack('>2B6i', CODE_NO_POSE, vision_num, *EMPTY_PLACEHOLDER))
return
self.send(pack_pose(poses[0], vision_num)) # Send after format conversion
여기서 vision_result는 find_vision_pose()에서 가져온 것이며, 다음과 같이 호출됩니다.
self.check_vision_result(json.loads(self.find_vision_pose().decode()))
vision_result가 함수에 전송되면 ROI와 관련된 프로젝트에 대해 먼저 비어있는 빈인지 확인한 다음 비전 포즈를 얻습니다. 비전 포즈가 정상인 경우 비전 포즈를 변환 함수 (pack_pose ())로 전달하고 전송합니다.
스텝 파라미터를 설정하기
Mech-Vision의 스텝에 대한 동적 파라미터 를 설정할 때는 일반적으로 adapter.py의 set_step_property()를 호출하기만 하면됩니다.
def set_step_property(self, msg, project_name=None, timeout=None):
return self.call_vision("setStepProperties", msg, project_name, timeout)
여기서 msg는 구체적인 스텝의 이름과 구성해야 하는 파라미터 를 결정합니다.
예시
공작물 종류에 따라 동적으로 Mech-Vision 매칭 모델을 설정해야 하는 경우, 다음과 같은 함수를 생성하여 msg를 설정할 수 있습니다.
def _step_matching_model_cell(step_name, model_type):
msg = {"name": step_name,
"values":
{"modelFile": model_type["ply"],
"pickPointFilePath": model_type["json"]}}
return msg
여기서 step_name은 설정해야 하는 Mech-Vision 스텝의 이름이며 model_type은 해당 종류의 공작물과 대응하는 파일 경로입니다. “ply” 및 “json”을 통해 .ply 및 .json으로 끝나는 모델 파일의 경로를 획득하여 Mech-Vision에서 각각 해당 스텝의 파라미터에 입력할 수 있습니다.
step_name은 “Local Matching”인 경우 다음과 같이 호출하면 됩니다.
msg = _step_matching_model_cell("Local Matching", model_type)
self.set_step_property(msg)
스텝 파라미터를 읽어내기
특정한 Mech-Vision 스텝의 파라미터를 획득하려면 adapter.py의 read_step_property()을 호출할 수 있습니다.
def read_step_property(self, msg):
result = self.call_vision("readStepProperties", msg)
logging.info("Property result: {}".format(result))
return result
여기서 msg는 스텝의 이름과 획득할 파라미터의 값을 결정하며, 함수를 생성하여 msg를 다시 작성할 수 있습니다.
예시
카메라 IP를 획득하려면 다음과 같은 예제 코드를 사용할 수 있습니다.
def read_camera_property(self):
msg = {"type": "Camera",
"properties": ["MechEye"]}
property_results = json.loads(self.read_step_property(msg).decode())
camera_ip = property_results["MechEye"]["NetCamIp"]
Mech-Vision 프로젝트에 카메라가 하나만 있는 경우 유형(type)에 따라 스텝을 찾을 수 있습니다. 만약 Mech-Vision에 동일한 스텝이 여러 개 있지만 특정 스텝의 파라미터만 획득하거나 설정하려면 이름(name)으로 스텝을 찾을 수 있습니다. read_step_property() 함수를 호출하고 json 형식으로 변환하여 카메라의 모든 파라미터 값(json 형식)을 획득할 수 있습니다. 다음과 같습니다:
Property result:
{
"MechEye": {
"NetCamIp": "127.0.0.1",
"TimeOut": "10",
"configGroup": "",
}
}
이 예에서 구체적인 파라미터의 필드("MechEye" 및 "NetCamIp")에 따라 최종적으로 카메라의 IP 주소(127.0.0.1)를 획득합니다.
파라미터 레시피를 전환하기
Mech-Vision을 사용할 때 일부 프로젝트의 프로세스가 동일하지만 일부 파라미터가 다른 경우, 파라미터 레시피를 구성하면 다른 프로젝트에 대해 해당하는 파라미터를 전환할 수 있습니다. 즉, adapter.py의 select_parameter_group()을 호출합니다.
def select_parameter_group(self, project_name, group_index, timeout=None):
msg = {"parameter_group_idx": group_index}
result = self.call_vision("selectParameterGroup", msg, project_name, timeout)
logging.info("selectParameterGroup result: {}".format(result))
return result
여기서 project_name 파라미터는 Mech-Vision 프로젝트의 이름이며 group_index 파라미터는 레시피의 번호입니다.
예시
프로젝트에서 레시피를 전환해야 하는 경우 다음과 같은 예제 코드를 사용하여 select_parameter_group() 함수를 호출하고 예외 처리를 수행하십시오.
try:
result = self.select_parameter_group(self.vision_project_name, model_code-1)
if result:
result = result.decode()
if result.startswith("CV-E0401"):
return -1
elif result.startswith("CV-E0403"):
return -1
raise RuntimeError(result)
except Exception as e:
logging.exception('Exception when switch model: {}'.format(e))
return -1
return 0
여기서 self.vision_project_name은 Mech-Vision 프로젝트의 이름이고 model_code-1은 레시피의 번호입니다.