# 共通 I/F を使った制御フロー ## ローカルで状態を確認する ```python from dobot.dobot_ctrl import DobotCtrl robot = DobotCtrl(dobot_ip="192.168.1.6", auto_connect=True) try: print(robot.state()) print(robot.get_current_position()) print(robot.get_current_angle()) finally: robot.disconnect() ``` 実機に動作を指示しない状態確認例である。`auto_connect=True` で初期化時に接続する。`state()` 等の返り値の詳細は Sphinx 自動 API と実装を参照する。 ## モータと制御権 ```python robot.take_arm() robot.turn_on_motor() # 安全を確認したうえで、必要な操作を実行する robot.turn_off_motor() robot.give_arm() ``` 共通 I/F の `take_arm()` / `give_arm()` は MG400 では同等の制御権 API が確認できず、現実装では no-op である。`turn_on_motor()` / `turn_off_motor()` は MG400 の有効化・無効化操作に対応する。上のコードは**呼び出し関係の説明**であり、安全確認を省いた運転手順ではない。 ## FastAPI サーバーで同じ I/F を公開する ```bash python -m dobot.server_fastapi.server ``` `server_fastapi/server.py` は `FastApiServer(device_cls=DobotCtrl, router_cls=None, api_spec=None, object_name="dobot", ...)` を使用する。公開対象は `ese774_frame` の自動 dispatch 規則に従う。機器固有の API 定義を別途複製する方式ではない。 ```python from dobot.config import Config from dobot.server_fastapi.client_sync import SyncDobotClient client = SyncDobotClient(config=Config()) print(client.state()) print(client.get_current_position()) ``` サーバーは既定では `127.0.0.1:8000`、MG400 は `192.168.1.6` を参照する。`Config.load_yaml()` はクラス設定を更新し、`Config(yaml_path=...)` はインスタンス設定を更新する。サーバーの設定参照方法を確認して使い分ける。 非同期クライアントは `dobot.server_fastapi.client_async.AsyncDobotClient`。HTTP の非同期処理と、ロボットの移動完了待機は別概念である。移動を行う場合は `move()` のパラメータと `wait_for_complete()` の動作を確認し、作業空間の安全を確保する。