Records teleoperation episodes using VR controller inputs and three ZED cameras. Saves to a LeRobot-format dataset. Loops untilDocumentation Index
Fetch the complete documentation index at: https://docs.almond.bot/llms.txt
Use this file to discover all available pages before exploring further.
Ctrl+C.
This command is configured via draccus. The robot and teleop subsystems are exposed as the nested robot_config / teleop_config configs (camera streams, per-joint gains, IK, VR server) — nest into them with dots or pass a whole-config file. See Command configuration.
| Flag | Description |
|---|---|
--repo_id <user>/<dataset> | HuggingFace dataset repo ID (required) |
--task TEXT | Natural language task description (required) |
--fps INT | Dataset recording frame rate — camera frames captured at this rate (default: 60) |
--teleop_hz INT | Motor command rate in Hz; decoupled from --fps for smooth control (default: 120) |
--root PATH | Local dataset root (default: $HF_LEROBOT_HOME) |
--push_to_hub true | Push to HuggingFace Hub when done |
--zed_iface IFACE | Network interface to configure for the ZED link (e.g. eth0); assigns 192.168.10.2/24, requires sudo |
--robot_config.zed_host IP | Shared IP of the ZED streamer for all three cameras (default 192.168.10.1; cameras use ports 30000/30002/30004). Override a single camera with --robot_config.cameras.<name>.host IP (<name> ∈ overhead/left_arm/right_arm). |
--robot_config.axol_config.<side>.gripper.torque_limit FLOAT | Max torque (Nm) for a gripper in POSITION_FORCE mode (default: 0.5); <side> is left/right |
--robot_config.axol_config.left_stiffness S | Compliance↔stiffness blend for the left arm in [0, 1]. Scalar or 7-element list (one per arm joint, in Joint enum order). 0 = fully compliant; 1 = pre-tuning industrial gains; 0.5 (default) is the geometric mean. Use right_stiffness for the right arm. See AxolConfig.left_stiffness. |
--rerun_ip IP | IP of a Rerun viewer on your local machine for live visualization |
--rerun_port INT | Rerun viewer port (default: 9876); only used when --rerun_ip is set |
--log_level {DEBUG,INFO,WARNING,ERROR} | Default: INFO |
--config_path PATH | Load a whole-config JSON/YAML file; CLI overrides layer on top. |
VR controller controls
Episodes are driven from the Quest controllers. For the full controller layout and step-by-step flow, see the Data Collection quickstart.| Button | Action |
|---|---|
| B | Toggle between Teleop and Data Collection mode (recording is only armed in Data Collection) |
| A | Start a take (3-second countdown), or stop and save the current take. The headset enters Saving until the write completes |
| X | During a recording, stop and discard the take (re-record); otherwise reset to the rest pose |
--root, collection resumes from where it left off; conversely, if no episodes were saved before exit the empty dataset directory is removed on shutdown so an aborted session does not leave a half-initialized dataset on disk.
Dataset frame capture runs on a dedicated thread decoupled from the teleop control loop. Teleop ticks at
--teleop_hz and only ever touches joint state; the capture thread ticks at --fps, blocks on ZedCamera.read_at_or_after(T_n) per camera so every recorded frame is sender-clock-aligned with the joint sample taken at T_n, and writes the dataset row. This keeps camera reads, image conversion, and dataset.add_frame() off the hot control loop, and produces datasets whose camera/joint pairing matches the sender’s exposure timeline rather than the receiver’s decode timeline. Both clocks must agree — make sure zed.sync-clocks is running on both machines.