# unitreerobotics/uniarml1 architecture

> Architecture diagram of the GitHub repository unitreerobotics/uniarml1, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/unitreerobotics/uniarml1
- Repository: https://github.com/unitreerobotics/uniarml1

## Overview

UniArmL1 is an open-source 6-DOF arm teleoperation and data-collection framework. Its primary runtime flow is selecting keyboard, VR, or leader-arm input; converting that input into arm targets; controlling the follower arm while optionally reading camera frames; and recording timestamped episodes for downstream imitation-learning workflows. Calibration data and the URDF support arm setup and kinematics. The README documents the broader hardware-to-training workflow, but training and deployment are external. Some runtime wiring and optional integrations are represented only where supported by the README or sampled code.

Main entry points: [`teleop/teleop.py`](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/teleop.py) (Teleop entry), [`teleop/robot_control/arm/uniarm_l1.py`](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1.py) (Follower arm), [`teleop/robot_control/teleop_runner.py`](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/teleop_runner.py) (Teleop runner), [`teleop/robot_control/input/input_leader.py`](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_leader.py) (Leader input)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Teleoperation"]
  node_teleop["Teleop entry<br/>[teleop.py]"]
  node_runner["Teleop runner<br/>[teleop_runner.py]"]
end

subgraph group_control["Inputs and control"]
  node_keyboard["Keyboard input<br/>[input_keyboard.py]"]
  node_vr["VR input<br/>[input_vr.py]"]
  node_leader_input["Leader input<br/>[input_leader.py]"]
  node_leader_arm["Leader arm<br/>[uniarm_l1.py]"]
  node_follower["Follower arm<br/>[uniarm_l1.py]"]
  node_bus["Motor bus<br/>[uniarm_l1_bus.py]"]
  node_kinematics["Arm kinematics<br/>[kinematics.py]"]
  node_calibration["Calibration data"]
  node_urdf["Arm model<br/>[UniArmL1.urdf]"]
end

subgraph group_sensing["Cameras"]
  node_camera_api["Camera interface<br/>[camera.py]"]
  node_opencv["OpenCV camera<br/>[camera_opencv.py]"]
end

subgraph group_data["Data workflow"]
  node_recorder["Episode recorder<br/>[recorder.py]"]
  node_writer["Episode writer<br/>[episode_writer.py]"]
  node_episode_store[("Episode files")]
  node_visualizer["Episode visualizer"]
end

node_operator(("Operator"))
node_camera_devices(("Camera devices"))
node_learner(("Training system"))
node_xr_service(("XR service"))

node_operator -->|"selects mode"| node_teleop
node_teleop -->|"starts"| node_runner
node_teleop -->|"selects input"| node_keyboard
node_teleop -->|"selects input"| node_vr
node_teleop -->|"selects input"| node_leader_input
node_teleop -->|"configures arm"| node_follower
node_teleop -.->|"configures leader"| node_leader_arm
node_teleop -->|"configures recorder"| node_recorder
node_runner -->|"reads input"| node_keyboard
node_runner -->|"reads input"| node_vr
node_runner -->|"reads input"| node_leader_input
node_leader_input -->|"reads joint state"| node_leader_arm
node_runner -->|"sets targets"| node_follower
node_follower -->|"commands motors"| node_bus
node_bus -->|"returns feedback"| node_follower
node_follower -->|"computes motion"| node_kinematics
node_follower -->|"loads offsets"| node_calibration
node_follower -->|"loads model"| node_urdf
node_xr_service -.->|"provides poses"| node_vr
node_camera_api -->|"implemented by"| node_opencv
node_camera_devices -->|"provides frames"| node_opencv
node_runner -->|"records samples"| node_recorder
node_recorder -->|"writes episodes"| node_writer
node_writer -->|"saves images and data"| node_episode_store
node_episode_store -->|"loads episodes"| node_visualizer
node_episode_store -.->|"supplies dataset"| node_learner

click node_teleop "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/teleop.py"
click node_runner "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/teleop_runner.py"
click node_keyboard "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_keyboard.py"
click node_vr "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_vr.py"
click node_leader_input "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_leader.py"
click node_leader_arm "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1.py"
click node_follower "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1.py"
click node_bus "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1_bus.py"
click node_kinematics "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/kinematics.py"
click node_calibration "https://github.com/unitreerobotics/uniarml1/tree/main/teleop/robot_control/calibration"
click node_urdf "https://github.com/unitreerobotics/uniarml1/blob/main/assets/uniarml1/urdf/UniArmL1.urdf"
click node_camera_api "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/image_server/camera.py"
click node_opencv "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/image_server/opencv/camera_opencv.py"
click node_recorder "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/recorder.py"
click node_writer "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/utils/episode_writer.py"
click node_visualizer "https://github.com/unitreerobotics/uniarml1/blob/main/teleop/utils/rerun_visualizer.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_teleop,node_runner toneBlue
class node_keyboard,node_vr,node_leader_input,node_leader_arm,node_follower,node_bus,node_kinematics,node_calibration,node_urdf toneAmber
class node_camera_api,node_opencv toneMint
class node_recorder,node_writer,node_episode_store,node_visualizer toneRose
class node_operator,node_camera_devices,node_learner,node_xr_service toneIndigo
```

## Components

### Teleoperation

- [Teleop entry](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/teleop.py): `teleop/teleop.py`
- [Teleop runner](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/teleop_runner.py): `teleop/robot_control/teleop_runner.py`

### Inputs and control

- [Keyboard input](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_keyboard.py): `teleop/robot_control/input/input_keyboard.py`
- [VR input](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_vr.py): `teleop/robot_control/input/input_vr.py`
- [Leader input](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/input/input_leader.py): `teleop/robot_control/input/input_leader.py`
- [Leader arm](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1.py): `teleop/robot_control/arm/uniarm_l1.py`
- [Follower arm](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1.py): `teleop/robot_control/arm/uniarm_l1.py`
- [Motor bus](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/uniarm_l1_bus.py): `teleop/robot_control/arm/uniarm_l1_bus.py`
- [Arm kinematics](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/arm/kinematics.py): `teleop/robot_control/arm/kinematics.py`
- [Calibration data](https://github.com/unitreerobotics/uniarml1/tree/main/teleop/robot_control/calibration): `teleop/robot_control/calibration`
- [Arm model](https://github.com/unitreerobotics/uniarml1/blob/main/assets/uniarml1/urdf/UniArmL1.urdf): `assets/uniarml1/urdf/UniArmL1.urdf`

### Cameras

- [Camera interface](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/image_server/camera.py): `teleop/image_server/camera.py`
- [OpenCV camera](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/image_server/opencv/camera_opencv.py): `teleop/image_server/opencv/camera_opencv.py`

### Data workflow

- [Episode recorder](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/robot_control/recorder.py): `teleop/robot_control/recorder.py`
- [Episode writer](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/utils/episode_writer.py): `teleop/utils/episode_writer.py`
- **Episode files**
- [Episode visualizer](https://github.com/unitreerobotics/uniarml1/blob/main/teleop/utils/rerun_visualizer.py): `teleop/utils/rerun_visualizer.py`

### Other components

- **Operator**
- **Camera devices**
- **Training system**
- **XR service**

## Connections

- Operator → Teleop entry: selects mode
- Teleop entry → Teleop runner: starts
- Teleop entry → Keyboard input: selects input
- Teleop entry → VR input: selects input
- Teleop entry → Leader input: selects input
- Teleop entry → Follower arm: configures arm
- Teleop entry → Leader arm: configures leader
- Teleop entry → Episode recorder: configures recorder
- Teleop runner → Keyboard input: reads input
- Teleop runner → VR input: reads input
- Teleop runner → Leader input: reads input
- Leader input → Leader arm: reads joint state
- Teleop runner → Follower arm: sets targets
- Follower arm → Motor bus: commands motors
- Motor bus → Follower arm: returns feedback
- Follower arm → Arm kinematics: computes motion
- Follower arm → Calibration data: loads offsets
- Follower arm → Arm model: loads model
- XR service → VR input: provides poses
- Camera interface → OpenCV camera: implemented by
- Camera devices → OpenCV camera: provides frames
- Teleop runner → Episode recorder: records samples
- Episode recorder → Episode writer: writes episodes
- Episode writer → Episode files: saves images and data
- Episode files → Episode visualizer: loads episodes
- Episode files → Training system: supplies dataset
