기타 인터페이스¶
이 부분에서는 Adapter의 기타 인터페이스 사용에 대해 소개합니다. 구체적으로 다음 인터페이스를 포함합니다.
알림 서비스¶
Mech-Viz 프로젝트가 특정 분기 또는 특정 스텝으로 실행될 때 Adapter 프로그램의 해당 함수를 호출하려는 경우 Mech-Viz에 알림 태스크를 추가할 수 있습니다.
예시
예를 들어, Adapter에 철거 횟수를 1씩 늘리는 기능이 작성되어 있으면 디팔레타이징 프로세스의 마지막 태스크 후에 알림 태스크를 추가할 수 있습니다. 이 지점에 도달하면 Adapter가 트리거될 수 있고 해당 함수를 호출할 수 있습니다. 이 기능을 구현하는 예시는 아래와 같습니다.
NotifyService를 상속하는 클래스를 작성하십시오.
from interface.services import NotifyService, register_service class NotifyService(NotifyService): service_type = "notify" service_name = "FANUC_M410IC_185_COMPACT" def __init__(self, update_success_num, update_fail_num): self.update_success_num = update_success_num self.update_fail_num = update_fail_num def handle_message(self, msg): if msg == "Success": self.update_success_num() elif msg == "Fail": self.update_fail_num()
이 알림은 다음 기능을 수행할 수 있습니다. Mech-Viz가 "Success"을 보내는 알림 태스크까지 실행되면 Adapter는 update_success_num() 함수를 호출할 수 있고 "Fail" 에 도달하면 Adapter는 update_fail_num() 함수를 호출합니다.
Mech-Viz 메인 프로그램을 제어하는 클래스에서 NotifyService 클래스를 인스턴스화하고 이 서비스를 등록합니다.
class MyClient(TcpClientAdapter): def __init__(self, host_address): super().__init__(host_address) self._register_service() def _register_service(self): self.robot_service = NotifyService(self.update_success_num, self.update_fail_num) self.server, port = register_service(self.hub_caller, self.robot_service) def update_success_num(self): # the num of unstack successfully plus 1 self.success_num += 1 def update_fail_num(self): # the num of unstack fiplus 1 self.fail_num += 1
Mech-Viz에서 필요한 곳에 해당 알림 태스크를 추가합니다.
알림 태스크에서 가장 중요한 것은 Adapter 명칭 과 메시지 를 채우는 것입니다. 이 두 곳의 값은 위의 NotifyService 클래스의 service_name 및 msg 값과 일치해야 합니다.
프로그램이 실행되면 Mech-Center 인터페이스에 service_type 및 service_name이 나타납니다. 이는 알림 서비스 등록이 성공했음을 나타냅니다.
VisionWatcher 서비스¶
Mech-Vision이 실행을 마치면 일부 결과가 출력됩니다(예: vision result:{'noCloudInRoi': False, 'function': 'posesFound', 'vision_name': 'TJTvision-3'}). 일부 비정상적인 상황의 경우 Adapter는 VisionWatcher 서비스를 통해 상기시키기 위해 오류 정보를 보낼 수 있습니다.
예시
VisionResultSelectedAtService를 상속하는 클래스를 작성하십시오.
from interface.services import VisionResultSelectedAtService, register_service class VisionWatcher(VisionResultSelectedAtService): def __init__(self, send_err_no_cloud): super().__init__() self.send_err_no_cloud = send_err_no_cloud def poses_found(self,result): has_cloud_in_roi = not result.get("noCloudInRoi", False) if not has_cloud_in_roi: time.sleep(2) self.send_err_no_cloud()
하위 클래스 VisionWatcher는 상위 클래스의 poses_found() 함수를 다시 작성해야 하므로 Adapter에서 send_err_no_cloud()(오류 정보를 전송하는 함수)호출하는 논리가 poses_found() 에서 변할 것입니다. 실행 과정 동안 Mech-Vision이 반환한 포즈의 값은 poses_found()의 result 파라미터로 전송됩니다.
Mech-Viz 메인 프로그램을 제어하는 클래스에서 VisionWatcher를 인스턴스화합니다.
class MyClient(TcpClientAdapter): def __init__(self, host_address): super().__init__(host_address) self._register_service() def _register_service(self): self.robot_service = VisionWatcher(self.send_err_no_cloud) self.server, port = register_service(self.hub_caller, self.robot_service) def send_err_no_cloud(self): # send no cloud error message self.send("12,NoCloudErr,done".encode())
VisionWatcher 클래스를 인스턴스화하는 과정에 send_err_no_cloud() 함수를 파라미터로 VisionWatcher()에 전송합니다. 포인트 클라우드가 표시되지 않으면 poses_found()의 논리에 따라 오류 메시지를 보내는 함수가 호출됩니다.
프로그램이 실행되면 등록된 서비스가 Mech-Center 인터페이스에 나타납니다. 그러면 Adapter가 VisionWatcher 서비스를 성공적으로 등록했음을 나타냅니다.