A-750 Robotic Arm
August 24, 2026 ยท View on GitHub
Support for the A-750 robotic arm includes visualization, an adapter to talk to real hardware, and keyboard teleop blueprint.
Quick Start
Run the A-750 teleop stack in mock mode:
dimos run keyboard-teleop-a750
This launches:
| Module | Role |
|---|---|
KeyboardTeleopModule | Publishes routed spatial EEF twist intent from the keyboard UI |
ControlCoordinator | Runs a 100 Hz coordinator loop and EEFTwistTask |
ManipulationModule | Loads the A-750 robot model in Drake and serves Meshcat visualization |
Open the Meshcat URL printed in the terminal, usually http://localhost:7000, to view the robot.
Real Hardware
The A-750 blueprint uses the mock adapter by default. Start by connecting the arm to your computer with a USB cable. On Linux, the device will likely appear as /dev/ttyACM0. You can also check /dev/serial/ for stable symlinks to connected serial devices.
Pro tip: run this in a separate terminal while plugging in the arm to verify that the OS detects it normally:
dmesg -w
If the device appears but dimOS gets a permission error when opening it, you may need to add yourself to the dialout group:
sudo usermod -aG dialout "$USER"
After changing groups, log out and back in again, or start a new login shell, before retrying.
To connect to a physical arm, set DEVICE_PATH when launching the blueprint:
DEVICE_PATH=/dev/ttyACM0 dimos run keyboard-teleop-a750
# setting --device-path is not currently supported
# dimos --device-path /dev/ttyACM0 run keyboard-teleop-a750
Robot Model
The robot model and hardware config are defined in
dimos/robot/manipulators/a750/config.py.
The runnable keyboard teleop stack is composed in
dimos/robot/manipulators/a750/blueprints/teleop.py.
| Field | Value |
|---|---|
| Arm joints | joint1 through joint6 |
| Arm DOF | 6 |
| Gripper joints | joint7, joint8 in the URDF; exposed as arm/finger in coordinator hardware |
| Base link | base_link |
| End-effector link | gripper_base |
| Home joints | [0, 0, -90 deg, 0, 0, 0] |
| Drake model | Pinned a750_rev1.urdf from https://github.com/adob/a750_description |
| FK/EEF twist task model | Cached arm-only URDF derived from the same pinned upstream model |
The runtime model and a750_description package root are resolved lazily through
a Git-backed robot description source handle pinned to an immutable commit. For
Pinocchio FK/IK, dimOS removes the two finger joint subtrees from the upstream
URDF and caches the resulting six-DOF arm model. Keyboard teleop does not load
the model directly.
Gripper
The blueprint configures a parallel-jaw gripper:
| Parameter | Value |
|---|---|
| Type | a750 |
| Open position | 0.06 m |
| Close position | 0.02 m |
| Collision exclusions | Imported from the A-750 MoveIt/SRDF collision pairs |
The adapter reads and commands gripper position in meters using the a750_control Python binding.
Hardware Adapter
The adapter is registered as a750 in dimos/hardware/manipulators/a750/adapter.py.
It supports:
| Method family | Status |
|---|---|
| Connect/disconnect | Uses a750_control.Robot(device_path) |
| Joint position reads | Reads pos_rad from joints 1-6 |
| Joint velocity reads | Reads vel_rads from joints 1-6 |
| Joint effort reads | Reads torque_nm from joints 1-6 |
| Joint position commands | Sends six joint positions plus a velocity ratio |
| Enable/disable | Starts and stops the a750_control control loop |
| Gripper reads/commands | Reads and commands gripper position in meters |
| Cartesian hardware commands | Stubbed; Cartesian motion is handled through dimOS IK |
| Force/torque reads | Not currently implemented |
The a750_control package starts a separate thread with real-time priority for its hardware control loop. That loop sends commands and reads back joint state at 1 kHz. The dimOS read_joint_positions, read_joint_velocities, and read_joint_efforts calls return the most recent data cached by that loop rather than synchronously querying the robot, so returned joint data may be up to 1 ms stale. The USB connection also adds roughly 1 ms of latency.
The adapter requires the optional manipulation dependency:
a750-control @ git+https://github.com/adob/a750_control.git@7153e271317e22b4aa55ac1186c0f0e4903e8f39
If a750_control is not installed, connect() records an error and returns False.
Control Path
The keyboard-teleop-a750 blueprint is defined in
dimos/robot/manipulators/a750/blueprints/teleop.py.
KeyboardTeleopModule
-> /coordinator_ee_twist_command TwistStamped
-> ControlCoordinator EEFTwistTask
-> A750Adapter or mock adapter
-> /coordinator_joint_state JointState
-> ManipulationModule Drake/Meshcat visualization
The coordinator runs at 100 Hz. The lower-level a750_control binding runs its hardware control loop at 1 kHz once the adapter is enabled.
Keyboard Controls
The A-750 teleop command uses the same keyboard controls as the other manipulator teleop blueprints:
| Key | Action |
|---|---|
| W/S | +X/-X |
| A/D | +Y/-Y |
| Q/E | +Z/-Z |
| R/F | +Roll/-Roll |
| T/G | +Pitch/-Pitch |
| Y/H | +Yaw/-Yaw |
| ESC | Quit |
Known Limitations
- Joint limits are currently approximate:
[-pi, pi]for each arm joint, with max velocitypi rad/sin the dimOS adapter. - EEF twist commands are integrated and solved by the dimOS coordinator task, not by a native Cartesian mode in the hardware adapter.
- Force/torque data is not exposed yet.
- Real hardware mode depends on the external
a750_controlpackage and a reachable serial device.