Command-line interface and Python SDK for the Almond Axol dual-arm robot. CLI invoked as axol <command> [flags].
The browser front-ends live under web/: a VR teleoperation interface (WebXR, hosted at axol.almond.bot) and a web control panel that drives the robot from a browser via axol serve. See web/README.md for the front-end details.
The full documentation is hosted at docs.almond.bot. The sources live under docs/, and the pages below link to them.
New here? See the Teleoperation quickstart to go from installation to a live teleoperation session, or the Web Control Panel guide to drive Axol from a browser.
- Linux
- Python 3.13+
- (Optional) NVIDIA Jetson — if ZED cameras are used.
One command installs uv, the axol CLI (from GitHub, with every extra except cuda/dev), and a root systemd service that keeps axol serve running at boot:
curl https://axol.almond.bot/install -fsS | bashThen open axol.almond.bot and connect to the machine. The install keeps itself in sync with main: when the control panel connects, the server upgrades in the background and restarts onto the new version once idle.
Install the package from a clone using uv. pyroki and lerobot are sourced from Git and are resolved automatically:
uv syncThen activate the virtual environment so the axol CLI is on your path (or prefix every command with uv run):
source .venv/bin/activateInstall optional dependency groups as needed:
| Extra | Contents | When to use |
|---|---|---|
lerobot |
LeRobot (from GitHub) | collect-data, run-policy |
sim |
viser | teleop --sim |
video |
aiortc | Streaming the ZED camera feeds to the headset over WebRTC (teleop --zed_host, collect-data) |
cuda |
JAX with CUDA 13 support | GPU-accelerated JAX (IK solver used by teleop); note that CPU is usually faster for the JAX IK solver |
dev |
OpenCV (headless) | Development / debugging |
uv sync --extra lerobot --extra sim --extra video # teleoperation + data collection
uv sync --extra lerobot --extra cuda # policy execution on GPU
uv sync --extra lerobot --extra sim --extra video --extra cuda # everythingThe ZED Python bindings (pyzed) are not on PyPI and must be installed separately after the ZED SDK is installed:
axol zed.installBefore using any motor or robot commands, initialize the CAN hardware:
axol can.setupTo drive Axol from a browser instead of the terminal, build the web UI once (it's served by axol serve):
cd web
npm install
npm run build --workspace=packages/axol-vr-client # client package first
npm run build --workspace=app # → web/app/distSee the installation guide for the full walkthrough.
- Teleoperation
- Data Collection — two-machine workflow (main host + ZED box)
- Policy Inference — two-machine workflow (main host + ZED box)
- Web Control Panel — drive the robot from a browser via
axol serve - VR Interface — the in-repo WebXR teleop app (
web/)
- Command configuration — draccus config model for
teleop,gravity-comp,collect-data,run-policy serve— web control panel + API servercan.setupcan.enablecan.drivermotor.infomotor.set-can-idmotor.set-zero-posteleopcollect-datarun-policyzed.streamzed.installzed.sync-clockstune.pidtune.frictiontune.repeatabilitygravity-comp
- Core Concepts
almond_axol.robot—Axol,Sim, configuration, gravity compensationalmond_axol.kinematicsalmond_axol.teleopalmond_axol.vralmond_axol.zedalmond_axol.motoralmond_axol.lerobot
