Skip to main content
Launches a VR teleoperation session. When started, the hostname (.local) and local IP address are printed — enter either of these in the VR app at axol.almond.bot to connect. Runs on the real robot by default; pass --sim for the browser visualizer. The full robot config is exposed via draccus, so every gain, stiffness, and gripper limit is reachable from the CLI or a config file — see Command configuration.
For a guided, step-by-step walkthrough including the VR controller layout, see the Teleoperation quickstart.
Before opening the VR app, accept the self-signed HTTPS certificate in the VR browser by navigating to https://<hostname>.local:8000 or https://<local-ip>:8000 and proceeding past the security warning.
Network tip: If VR tracking feels jittery or packets arrive in bursts, configure the following on your router/access point:
  • DTIM interval1
  • Beacon interval100 ms
  • WMM APSD (U-APSD) → disabled
These settings prevent the AP from buffering packets between beacon intervals, which causes intermittent delivery delays that are especially noticeable for latency-sensitive VR traffic.
FlagDescription
--simUse the software visualizer instead of the real robot. Bare --sim works (or --sim true). Omit to run on real hardware (the default).
--left_channel <ch|null>CAN channel for the left arm; null disables it. Default: CAN_LEFT.
--right_channel <ch|null>CAN channel for the right arm; null disables it. Default: CAN_RIGHT.
--axol.left_stiffness SCompliance↔stiffness blend for the left arm in [0, 1]. Scalar (0.8) or a 7-element list ([0.8,0.8,0.5,0.5,0.2,0.2,0.0], one per arm joint in Joint enum order). 0 = fully compliant; 1 = pre-tuning industrial gains; 0.5 (default) is the geometric mean. See AxolConfig.left_stiffness.
--axol.right_stiffness SSame, for the right arm.
--axol.left.gripper.torque_limit FLOATMax torque (Nm) for the left gripper in POSITION_FORCE mode (default: 0.5). Use right for the right gripper.
--axol.<side>.<joint>.<gain> VALUEOverride any per-joint gain, e.g. --axol.left.elbow.kp 60. <side> is left/right; <joint> is shoulder_1…wrist_3; <gain> is kp/kd/etc.
--teleop.position_multiplier FLOATScale factor on hand position (not orientation): the end-effector target moves this many times as far as your hand. 1.0 (default) is 1:1; 2.0 moves the arm twice as far, helping cover the robot’s full reach when the arm is longer than the operator’s.
--teleop.rotation_multiplier FLOATScale factor on hand orientation (not position): the end-effector rotates this many times as far as your wrist. 1.0 (default) is 1:1; 2.0 rotates the arm twice as far.
--zed_host IPZED box address. When set, teleop also relays its camera streams to the headset over WebRTC (overhead + wrist views, switched with the right thumbstick). The cameras must already be streaming (zed.stream or a connected ZED box in the control panel) and the video extra installed locally. Default: null (no headset video).
--zed_cameras [a,b,c]Which camera slots to receive from the ZED box: any of overhead, left_arm, right_arm (default: all three). Slots that aren’t streaming are skipped.
--overhead_stereoThe overhead is a stereo ZED X: both eyes are relayed as overhead_left / overhead_right and rendered per-lens in the headset for true stereo. Match the --overhead-stereo flag passed to zed.stream.
--log_level {DEBUG,INFO,WARNING,ERROR}Default: INFO
--config_path PATHLoad a whole-config JSON/YAML file; CLI overrides layer on top. See Command configuration.
axol teleop                                       # real robot
axol teleop --sim                                 # browser visualizer
axol teleop --axol.left_stiffness 0.8
axol teleop --axol.left.elbow.kp 60 --axol.right.gripper.torque_limit 0.7
axol teleop --teleop.position_multiplier 2.0      # scale hand motion 2x
axol teleop --teleop.rotation_multiplier 2.0      # scale hand rotation 2x
axol teleop --left_channel null                   # disable the left arm
axol teleop --zed_host 192.168.1.42               # stream the ZED cameras to the headset
axol teleop --zed_host 192.168.1.42 --overhead_stereo   # stereo overhead, per-lens
axol teleop --config_path my_teleop.json          # whole-config file

Camera streaming to the headset

With --zed_host set, teleop connects to the ZED box’s camera streams and relays them to the headset over WebRTC, so the operator sees the robot’s cameras instead of (or alongside) passthrough. The right thumbstick switches views — see the VR Interface guide for the view system and controls. Requires the video extra (uv sync --extra video) on the teleop host.
This command takes its config via draccus, not fixed argparse flags. Field names use underscores, nested fields are dot-separated, None is null, and lists use [a,b,c] — see Command configuration for the full model.