Skip to main content
From a fresh clone to a live teleoperation session. Pick your path — drive the real Axol robot, or the software simulator with no hardware required. Both are driven from the VR headset; the simulator just swaps the motors for a browser visualizer.
1

Install

The fastest path is the quick install, which installs the axol CLI and starts the web control panel as a service:
curl https://axol.almond.bot/install -fsS | bash
Or, from a clone, install with uv and activate the virtual environment so the axol CLI is on your path:
uv sync
source .venv/bin/activate
With the clone path you will need to activate in every new shell session. Alternatively, prefix every command with uv run (e.g. uv run axol can.setup) to skip activation.
2

Set up CAN (one-time)

Plug in the Axol Hub, then run the one-time CAN setup. This writes udev rules, assigns fixed interface names, and registers a startup script so the interfaces come up automatically on every reboot.
axol can.setup
sudo is invoked automatically. You will not need to run this again unless you reinstall the OS or swap the Axol Hub.
After any subsequent replug mid-session (without a reboot), bring the interfaces back up with:
axol can.enable
3

Verify motors

With the robot powered on and CAN up, read a status snapshot from one motor to confirm communication is working:
axol motor.info --l --id 0x01   # left shoulder_1
axol motor.info --r --id 0x01   # right shoulder_1
You should see position, velocity, torque, temperature, and voltage. Any DISABLED or error status means power or CAN isn’t reaching that motor.
4

Authorize the TLS certificate

The VR app connects over a self-signed HTTPS/WSS connection, so its certificate needs a one-time approval in the headset browser — otherwise the WebSocket handshake is silently rejected.The easiest way is from the app itself: when you press Connect (next step) and the certificate hasn’t been approved yet, the connection fails and an Authorize certificate button appears. Tap it, proceed past the warning in the popup, and the app reconnects automatically.You only need to do this once per headset (the cert is cached in ~/.almond/vr/certs/ on the host). To approve it manually instead, open https://<hostname>.local:8000 or https://<local-ip>:8000 in the headset browser and proceed past the warning.
5

Teleop

axol teleop
The terminal will print the hostname and IP address. Open the VR app at axol.almond.bot on the headset and enter either address to connect. (You can also self-host the app — see the VR Interface guide.)
See the teleop CLI reference for the full flag list (stiffness, gripper limits, per-joint gains, config files).
Prefer not to use the terminal? The web control panel (axol serve) connects the robot and starts teleop from a browser.

Controller layout

Quest controller diagram
#ButtonAction
1Left gripPress both 1 + 2 to enable arm movement; press either alone to disable
2Right gripSame as above
3Left triggerActuate left gripper
4Right triggerActuate right gripper
5XReset — returns both arms to the rest pose
7YExit AR — closes the VR session
Grip is a toggle, not a hold. Press both grips together to start moving the arms; press either grip on its own to freeze them.
Have ZED cameras streaming from a ZED box? Pass --zed_host <zed-box-ip> to axol teleop (with the video extra installed) to see the overhead and wrist camera feeds in the headset — switch views with the right thumbstick. See Camera views.

Network tip

If VR tracking feels jittery or arrives in bursts, configure the following on your router or access point:
SettingValue
DTIM interval1
Beacon interval100 ms
WMM APSD (U-APSD)disabled
These prevent the AP from batching packets between beacon intervals, which causes intermittent latency spikes that are especially noticeable in VR.

Next steps

Data Collection

Record teleoperation episodes to a LeRobot dataset.

Policy Inference

Run a trained policy autonomously.