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.