$npx -y skills add graph-robots/open-robot-skills --skill pi05-liberoRun the openpi π0.5 LIBERO checkpoint (pi05_libero) as a
| 1 | # pi05-libero |
| 2 | |
| 3 | Closed-loop VLA-policy skill backed by **one model checkpoint**: openpi's |
| 4 | π0.5 LIBERO checkpoint (`pi05_libero`). The skill *is* the model — it owns |
| 5 | its serving preset (`pi05-libero`), so a policy node names this skill, not a |
| 6 | free-floating `policy_id`. The closed-loop replan/execute/terminate body and |
| 7 | the load-bearing LIBERO observation encoding live in |
| 8 | `gap.runtime.policy.run_policy_loop`; the websocket client is resolved (and |
| 9 | cached per preset) through the executor's `PolicyExecutor`. |
| 10 | |
| 11 | ## Capability |
| 12 | |
| 13 | - **Embodiment:** Franka Panda (LIBERO/robosuite), OSC_POSE delta action |
| 14 | space `[Δx, Δy, Δz, Δrx, Δry, Δrz, gripper]`. No embodiment translation |
| 15 | happens in the loop — the checkpoint's native action space is forwarded to |
| 16 | `sim.apply_policy_action`. |
| 17 | - **Tasks:** the LIBERO pick-and-place distribution — pick a tabletop rigid |
| 18 | object, optionally place/drop it in a container. Works best *steered*: |
| 19 | perceive the target and hover the end-effector above it (preserving the |
| 20 | current rotation) before handing over, so the policy starts in-distribution. |
| 21 | - **Not for:** deformables / cloth folding, articulated objects, non-LIBERO |
| 22 | embodiments, or tasks the checkpoint never saw. If the task is outside this |
| 23 | envelope, pick a different skill or report a missing capability — do not |
| 24 | delegate it here and hope. |
| 25 | |
| 26 | ## Serving |
| 27 | |
| 28 | The bundle ships its own `server.py` (vendored from openpi `scripts/serve_policy.py`) |
| 29 | and declares `openpi` as a git dep in its own `pyproject.toml` — so this |
| 30 | bundle is **self-contained**: no `$GAP_OPENPI_DIR` clone, no shared venv. |
| 31 | First-run setup is `gap skills install pi05-libero`, which `uv sync`s the |
| 32 | bundle's `.venv/` with all model deps. The launcher then spawns the server |
| 33 | via `uv run --project policies/pi05-libero -- python server.py ...` (so the |
| 34 | bundle's own venv activates automatically) and downloads the checkpoint from |
| 35 | `s3://openpi-assets/checkpoints/pi05_libero` on first run. |
| 36 | |
| 37 | Run it yourself with `gap policy serve pi05-libero`. A `policies:` config |
| 38 | entry named `pi05-libero` overrides the recipe (e.g. an external `url:`). |
| 39 | |
| 40 | ## Termination & exits |
| 41 | |
| 42 | The loop exits on whichever fires first — a commanded gripper |
| 43 | open→close→open cycle (`gripper_cycle`, the per-item terminator for |
| 44 | clean-all loops; set `gripper_cycle_termination: true`), a non-empty |
| 45 | `termination_prompt` answered yes by the VLM (`completed_by_vlm`), or the |
| 46 | `max_windows` backstop. These are the subgraph's success exits; the failure |
| 47 | exit is `failed` (the loop raised). **Whether the task actually succeeded is |
| 48 | a checkpoint, not an exit** — attach a postcondition that checks the world |
| 49 | (e.g. the object is in the container), never an exit value like "folded". |