# Common Control Interface and MG400 Implementation Contract The common control interface is defined by this family of projects and is shared conceptually across COBOTTA, Universal Robots (UR), and DOBOT. **It is not a COBOTTA-specific interface adopted by DOBOT.** Each robot has different physical capabilities: the presence of a method does not guarantee equivalent motion on every robot. `DobotCtrl` exposes the public interface and delegates to `DobotTcp`. `DobotTcp` implements MG400-specific commands, feedback, and coordinate conversions. `dobot_api.py` contains the vendor API, while `dobot_api_ext.py` adds integration behavior. `ese774_frame` transparently publishes the public interface over the network; it does not define the robot interface itself. ## Operation semantics and limitations | Common operation | MG400 implementation | |---|---| | `take_arm()` / `give_arm()` | No corresponding independent ownership command: return `True` without sending a robot command. Not equivalent to enabling the motors. | | `turn_on_motor()` / `turn_off_motor()` | Map to `EnableRobot()` / `DisableRobot()`. | | `servo_on` | Uses feedback `EnableStatus`. | | `halt()` / `stop()` / `task_stop()` | Raise `NotImplementedError` because equivalent semantics have not been established. **Do not use as emergency-stop functions.** | | `hand_stop()` | Not implemented until the attached hand is specified. | | `set_decel()` | Returns `False`; no independent deceleration setting is implemented. `get_decel()` is unsupported. | | `set_speed()` | Maps to `SpeedL`; `set_extspeed()` maps to `SpeedFactor`. These are distinct settings. | | `get_speed()` | Returns the most recently configured value held by this library, not a measured velocity. | ## Cartesian and joint representations The common Cartesian vector is `[x, y, z, rx, ry, rz]`, while the MG400 uses `[x, y, z, r]`. `_p_to_mg400()` rejects nonzero `rx` or `ry` with `ValueError` and maps `rz` to `r`. Readback fills `rx=ry=0`. The common joint vector is `[j1, j2, j3, j4, j5, j6]`, while MG400 uses four joints. Input `j5` and `j6` must be zero; readback pads them with zeros. **A six-element interface does not imply six physical degrees of freedom.** ## Remote invocation The server uses `FastApiServer(device_cls=DobotCtrl, router_cls=None, api_spec=None, object_name="dobot", ...)`. Both synchronous and asynchronous clients invoke the same server-side control layer. Completion of an HTTP request is distinct from completion of robot motion. Source: supplied `dobot_ctrl.py`, `dobot_tcp.py`, `server_fastapi/server.py`, and `ese774_frame` implementation files.