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)와 사원수 형식으로 출력됩니다(도구 포즈로도 출력될 수 있으며 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
이 중 find_vision_pose()에서 vision_result를 가져오며, 호출문은 다음과 같습니다.
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": "",
}
}
이 예시에서 카메라의 IP 주소(127.0.0.1)는 특정 파라미터 필드("MechEye"및"NetCamIp")에 따라 최종적으로 획득됩니다.
파라미터 레시피를 전환하기¶
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은 보내 온 레시피 번호입니다.