# 移動指令の同期・非同期処理の実装照合 本書は提供された `DobotCtrl` / `DobotTcp` のソースコードに対する静的照合です。MG400実機試験ではありません。 ## 公開インターフェース `DobotCtrl.move(target, *, motion_mode=None, coord_type=None, path_blend=None, offset=None, pose=None, speed=None, accel=None, decel=None, is_async=True)` は、同名・同引数で `DobotTcp.move()` に委譲します。公開I/Fの `is_async` は、Pythonの `async def` やHTTP非同期実行を意味しません。**移動コマンドの受付後に戻るか、`Sync()`でキュー完了を待つか**を選ぶ引数です。 ## コマンドの選択 | 条件 | 送信コマンド | 備考 | | --- | --- | --- | | `coord_type="J"`, `motion_mode="PTP"` | `JointMovJ` | 6要素公開J座標をMG400の4軸に変換 | | `coord_type="P"`, `motion_mode="PTP"` | `MovJ` | 6要素公開P座標をMG400の4要素に変換 | | `coord_type="P"`, `motion_mode="LINE"` | `MovL` | 直線移動 | | `motion_mode="CIRCLE"` | 未対応 (`False`) | 単一目標だけでは円弧軌道を表現できない | | `motion_mode="SPLINE"` | 未対応 (`False`) | 未実装 | | `coord_type="J"` かつPTP以外 | 未対応 (`False`) | J座標の意味を保持できない | `pose` 指定は未実装で `False`。`offset` はP座標だけに適用可能です。`path_blend` の非`None`指定は未対応の設定処理に依存します。速度はPTP/Jで `set_jspeed()`、LINEで `set_speed()` を呼びます。加速度・減速度は移動指令より前に設定されます。設定が途中で失敗した場合、移動コマンドは送信されませんが、それ以前の設定変更が巻き戻される保証はありません。 ## 完了の意味とエラー 1. コマンドの応答を `_handle_command_reply()` で判定します。応答コード0は受付成功であり、物理的な移動完了ではありません。 2. `is_async=True` は `_wait_motion_start_or_error()` に進みます。既定の監視時間は0.25秒、間隔は0.01秒です。**この戻り値がTrueでも、移動全期間の成功を保証しません。** 3. `is_async=False` は `wait_for_complete()` に進み、`Sync()` 応答を検査した後、`_motion_error_active(query_error_id=True)` を実行します。ただし通信失敗を正常状態と区別できない経路があるため、**戻り値Trueを安全上の完了保証に使用できません。** 4. `get_motion_complete()` は `busy_status` が取得できなければFalse、取得できれば `not bool(busy_status)` を返します。指令ごとの成功・失敗を追跡するものではありません。 ## `drive()` と制約 `drive()` は軸番号と値の組を受け取り、現在の関節角から目標J座標を組み立てて `move(..., motion_mode="PTP", coord_type="J")` に委譲します。軸番号は1始まりで1~6を受け付けますが、MG400に存在しないJ5/J6への非ゼロ指定は失敗します。`relative=True` は現在角度への加算です。現在角度の取得に失敗した場合も `False` です。`rotate()` は未実装です。 ## 検証範囲 この照合は静的な分岐と委譲先の確認です。TCP応答の実時間挙動、複数指令の競合、タイムアウト、非常停止、安全インターロックは検証していません。