pi05_droid_jointpos (lerobot PyTorch port)

OpenPI's pi05_droid_jointpos (ฯ€0.5 fine-tuned on DROID with a joint-position action space), converted to the lerobot PI05Policy (PyTorch) format.

  • Source: gs://openpi-assets-simeval/pi05_droid_jointpos (JAX/orbax), the official OpenPI release.
  • Conversion: openpi/examples/convert_jax_model_to_pytorch.py (JAX โ†’ PyTorch), then assembled with the lerobot config and processors.
  • Verified: RoboLab (Isaac Lab) BananaInBowlTask, 8-env server-client evaluation โ†’ 7/8 (on par with the openpi JAX baseline with the same weights, 6/8).

Files

file contents
config.json PI05Config โ€” max_state_dim=8, chunk_size=15, dtype=bfloat16, STATE/ACTION QUANTILES
model.safetensors 812 keys (Gemma embed_tokens is tied to lm_head)
policy_preprocessor.json (+ *_normalizer_processor.safetensors) rename โ†’ batch โ†’ DROID quantile normalize โ†’ state discretize + tokenize โ†’ device
policy_postprocessor.json (+ *_unnormalizer_processor.safetensors) DROID quantile unnormalize

Usage

from lerobot.policies.pi05.modeling_pi05 import PI05Policy
from lerobot.policies.factory import make_pre_post_processors

repo = "DAVIAN-Robotics/pi05_droid_jointpos"
policy = PI05Policy.from_pretrained(repo).eval()
preprocessor, postprocessor = make_pre_post_processors(policy.config, pretrained_path=repo)

DROID I/O adapter (required)

This checkpoint is self-contained only for the lerobot-native stages (normalize / tokenize / model / unnormalize). The DROID-specific input/output conversion is OpenPI's droid_policy logic, which lerobot does not include, so an external adapter is required:

  • Input: observation.state = concat(joint_position[7], gripper_position[1]) (raw; the processor normalizes it). Provide only two images, observation.images.base_0_rgb (exterior) and observation.images.left_wrist_0_rgb (wrist); the model pads the third camera with -1 automatically. ([0, 1] float, CHW.)
  • Output: the model predicts joint deltas (dims 0โ€“6), so add the current joint positions to make them absolute (AbsoluteActions, mask = 7 ร— True + 1 ร— False), then use only action[:, :8] (7 joints + 1 gripper).
  • Reference implementation: sft/scripts/pi05_lerobot_server/ (droid_glue.py, policy.py) in the DiscoDemo code repository.

Notes

  • max_state_dim=8: pi05 discretizes the normalized state into 256 bins and puts it into the prompt. DROID's actual state is 8-dimensional (7 joints + 1 gripper), so only 8 values must be included to match openpi. With the default pi05 value (32), the 24 extra tokens contaminate the conditioning and degrade performance (in particular, early gripper closing). This repo sets max_state_dim=8 explicitly in both config.json and policy_preprocessor.json (prepare-state step), so standard loading works correctly. (lerobot's default save does not serialize this value for the prepare step, so it was added manually; set it the same way if you build your own.)
  • Do not confuse with RLinf/RLinf-Pi05-Polaris-droid_jointpos: the parameter key structure and norm_stats are the same, but those are different, RL-fine-tuned weights. This repo is a conversion of the official OpenPI pi05_droid_jointpos.

License / attribution

The weights are derived from OpenPI's (Physical Intelligence) pi05_droid_jointpos. Use is subject to the license of the upstream openpi project.

Downloads last month
939
Safetensors
Model size
4B params
Tensor type
BF16
ยท
Video Preview
loading

Model tree for DAVIAN-Robotics/pi05_droid_jointpos

Finetunes
13 models