Downloads · 30 days
34
27% of all-time downloads
ChinLR/towel-folding-pi05
towel-folding-pi05 is a robotics model from ChinLR. Use it for the robotics task on the model card, and read the license before you ship it in a product. It is set up for lerobot. The card lists the license as other.
A pi0.5 vision-language-action policy fine-tuned to fold a towel with the SO-101 follower arm and a single wrist-mounted camera. Trained on 97 teleop demonstrations (~26 k frames after trimming) recorded with the LeRo…
Downloads · 30 days
34
27% of all-time downloads
All-time downloads
124
Public
Parameters
4.1B
9.4 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors9.4 GB · 100%
How the weights are stored.
BF163.6B · 87%
From the Hugging Face model README
A pi0.5 vision-language-action policy fine-tuned to fold a towel with the SO-101 follower arm and a single wrist-mounted camera. Trained on 97 teleop demonstrations (~26 k frames after trimming) recorded with the LeRobot framework.
observation.images.wrist, captured at 1280 × 720, 30 fps, MJPG. Other resolutions/keys will work but will need preprocessing tweaks."Fold towel" (the only string the policy was trained on).The policy uses a patched fork of transformers that LeRobot bundles. Install LeRobot from main with the [pi] extra — do not use pip install lerobot, the PyPI release is months behind and is v2-only.
python -m venv .venv && source .venv/bin/activate && pip install --upgrade pip && pip install "lerobot[pi]@git+https://github.com/huggingface/lerobot.git"
You also need access to the PaliGemma backbone:
hf auth login --token "hf_yourtoken" (or huggingface-cli login on older versions).from lerobot.policies.pi05.modeling_pi05 import PI05Policy
policy = PI05Policy.from_pretrained("ChinLR/towel-folding-pi05")
policy.eval()
policy.to("cuda") # or "mps" / "cpu"
This pulls all 7 files in the repo:
model.safetensors — fine-tuned weights (9.35 GB).config.json, train_config.json — architecture and training config.policy_preprocessor.json + *_normalizer_processor.safetensors — input pipeline (image resize/normalize, state/action normalization with q01/q99 stats from the training dataset).policy_postprocessor.json + *_unnormalizer_processor.safetensors — output pipeline (un-normalize predicted actions back to SO-101 joint-space units).Loading any of the above outside from_pretrained is not recommended — the pre/post-processors are baked into how the model was trained, and skipping them produces garbage actions.
A minimal control loop — adapt as needed for your stack. Run at 30 Hz to match the training distribution.
import torch
from lerobot.policies.pi05.modeling_pi05 import PI05Policy
from lerobot.robots.so101_follower import SO101Follower, SO101FollowerConfig
from lerobot.cameras.opencv import OpenCVCameraConfig
policy = PI05Policy.from_pretrained("ChinLR/towel-folding-pi05").eval().to("cuda")
robot = SO101Follower(SO101FollowerConfig(
port="/dev/tty.usbmodemXXXX", # your follower port
id="followerbot",
cameras={
"wrist": OpenCVCameraConfig(
index_or_path=0,
width=1280, height=720, fps=30, fourcc="MJPG",
),
},
))
robot.connect()
task = "Fold towel"
try:
while True:
obs = robot.get_observation()
# obs is a dict of torch tensors keyed by what the dataset used:
# observation.state -> shape (6,) joint positions
# observation.images.wrist -> shape (3, H, W) uint8 RGB
with torch.inference_mode():
action = policy.select_action({**obs, "task": task}) # shape (6,)
robot.send_action(action.cpu().numpy())
finally:
robot.disconnect()
policy.select_action predicts a chunk of future actions internally and returns one per call. Reset the action queue between episodes:
policy.reset()
lerobot/pi05_base (Physical Intelligence pi0.5, ~4 B params, PaliGemma vision-language tower + action expert).fold_score ≥ 3 quality grade, then trimmed to remove idle lead-in / tail (~26 k useful frames).train_config.json."Fold towel".