> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dimensionalos.com/llms.txt
> Use this file to discover all available pages before exploring further.

# A750

# A-750 Robotic Arm

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:

```bash theme={null}
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:

```bash theme={null}
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:

```bash theme={null}
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:

```bash theme={null}
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`](/dimos/robot/manipulators/a750/config.py).
The runnable keyboard teleop stack is composed in
[`dimos/robot/manipulators/a750/blueprints/teleop.py`](/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             | `a750_description/urdf/a750_rev1.urdf`                                          |
| FK/EEF twist task model | `a750_description/urdf/a750_rev1_no_gripper.urdf`                               |

The no-gripper model is used for Pinocchio FK/IK inside the coordinator's EEF twist task because Pinocchio does not consume the xacro path used by the full robot description. 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`](/dimos/hardware/manipulators/a750/adapter.py#L40).

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:

```toml theme={null}
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`](/dimos/robot/manipulators/a750/blueprints/teleop.py).

```text theme={null}
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 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.
