CoolFace
Modelpublic

RyanL22/pi05-openarm-rh56f1-teleopv4-baseline-20k

sourceHugging Faceapache-2.0updated 8d agoView on Hugging Face
0likes21downloads
Model Card

pi0.5 baseline — OpenArm + RH56F1, real teleop only (teleop v4, 20 Hz), step 20k

LeRobot-native pi05 (v0.6.1) fine-tuned only on real teleoperation data: OpenArm teleop v4, the 261 episodes recorded at 20 Hz (ball 70 / bottle 48 / box 88 / doll 55, 87,905 frames). No synthetic / human-video data. This is the teleop-only baseline for the anyh2r experiments.

Checkpoint: step 20,000 (final) of a 20,000-step run (lab-gpu26, 2x H100, batch 32 x 2 = 64).

Training settings

value
vision encoder (SigLIP, 412.4M)fine-tuned (not frozen)
image augmentationphotometric + affine, one draw replayed across the stereo pair
cell shares∝ sqrt(frames), 4 cells
mirror augmentationoff
batch32 per GPU x 2 GPUs = 64 (same global batch as the 16 x 4 runs)
optimizerAdamW, peak lr 2.5e-5, cosine decay to 2.5e-6, warmup 1000
precisionbfloat16, gradient checkpointing
chunk50 actions @ 20 fps (2.5 s), n_obs_steps=1
normalization statsconstant dims (head pitch/yaw) widened to mean ± 0.1 rad

Unlike the ...-0916-* checkpoints, the neck quantiles are widened here, so a sub-degree encoder offset on the (fixed) head no longer normalizes to a huge value. Overwriting the state neck with 0.889 / 0.001 is still harmless.

Inputs

  • —observation.images.base_0_rgb <- left ZED view, 288x512
  • —observation.images.left_wrist_0_rgb <- right ZED view, 288x512
  • —observation.state — 28 dims: neck(2) | left_arm(7) | right_arm(7) | left_hand(6) | right_hand(6)
  • —action — same 28-dim layout, absolute joint targets

Tasks: pick up the {ball | bottle | small box | doll} from table and put it in the white box.

Load

python
from lerobot.policies.pi05.modeling_pi05 import PI05Policy
policy = PI05Policy.from_pretrained("RyanL22/pi05-openarm-rh56f1-teleopv4-baseline-20k")