その他のインターフェイス¶
本節では、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名 および メッセージ を入力する必要があります。これら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サービスを介してエラー情報を送信することができます。
例
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インターフェイスに表示されれば、VisionWatcherサービスがAdapterによって正常に登録されました。