その他のインターフェース

本節では、Adapterの他のインターフェースについて説明します。具体的には以下のインターフェースが含まれます。

通知サービス

Mech-Vizプロジェクトが特定の分岐または特定のステップに実行されたときに、Adapterプログラムの対応する関数を呼び出したい場合は、Mech-Vizに通知ステップを追加できます。

サンプル

たとえば、Adapterに把持された対象物の数を1ずつ増やす関数を記述した場合、デパレタイジングプロセスの最後のステップの後に通知ステップを追加できます。ここで到達すると、Adapterをトリガーして、対応する関数を呼び出すことができます。この機能の実装例を以下に示します。

  1. 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()関数を呼び出します。

  2. 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
  3. 必要に応じて、Mech-Vizプロジェクトに対応する通知ステップを追加します。

    通知ステップで Adapter名 および メッセージ を入力する必要があります。これら2つの値は、上記のNotifyServiceクラスのservice_nameおよびmsgの値と一致する必要があります。

    プログラムが実行されると、service_typeとservice_nameがMech-Centerに表示されれば、通知サービスが正常に登録されました。

VisionWatcherサービス

Mech-Visionの実行が終了すると、いくつかの結果が出力されます。例えば:vision result:{‘noCloudInRoi’: False, ‘function’: ‘posesFound’, ‘vision_name’: ‘TJTvision-3’}。一部の異常な状況では、AdapterはVisionWatcherサービスを介してエラー情報を送信することができます。

サンプル

  1. 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 パラメータに渡されます。

  2. 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に表示されれば、VisionWatcherサービスがAdapterによって正常に登録されました。