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:

ModuleRole
KeyboardTeleopModulePublishes routed spatial EEF twist intent from the keyboard UI
ControlCoordinatorRuns a 100 Hz coordinator loop and EEFTwistTask
ManipulationModuleLoads 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.

FieldValue
Arm jointsjoint1 through joint6
Arm DOF6
Gripper jointsjoint7, joint8 in the URDF; exposed as arm/finger in coordinator hardware
Base linkbase_link
End-effector linkgripper_base
Home joints[0, 0, -90 deg, 0, 0, 0]
Drake modelPinned a750_rev1.urdf from https://github.com/adob/a750_description
FK/EEF twist task modelCached 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:

ParameterValue
Typea750
Open position0.06 m
Close position0.02 m
Collision exclusionsImported 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 familyStatus
Connect/disconnectUses a750_control.Robot(device_path)
Joint position readsReads pos_rad from joints 1-6
Joint velocity readsReads vel_rads from joints 1-6
Joint effort readsReads torque_nm from joints 1-6
Joint position commandsSends six joint positions plus a velocity ratio
Enable/disableStarts and stops the a750_control control loop
Gripper reads/commandsReads and commands gripper position in meters
Cartesian hardware commandsStubbed; Cartesian motion is handled through dimOS IK
Force/torque readsNot 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:

KeyAction
W/S+X/-X
A/D+Y/-Y
Q/E+Z/-Z
R/F+Roll/-Roll
T/G+Pitch/-Pitch
Y/H+Yaw/-Yaw
ESCQuit

Known Limitations

  • Joint limits are currently approximate: [-pi, pi] for each arm joint, with max velocity pi rad/s in 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_control package and a reachable serial device.