Pi-0.5 for Alohamini#

← 教程资料库 · AlohaMini 硬件与操作

适用型号请结合本页硬件配置确认。 旧版部署接口与缺失启动脚本的说明见 OpenPI 接入。


This tutorial is designed for the official OpenPI repository, not the built-in Pi-0.5 implementation provided in LeRobot.

It introduces modifications based on both the OpenPI project and the lerobot_alohamini project to enable fine-tuning training and real-world deployment.

Technical Principle — Running Pi-0.5 on AlohaMini (16/18-DoF):

  • Pi-0.5 uses an internal 18D action space.

  • If your robot is 16-DoF, add virtual joints to align 16 -> 18.

  • If your robot is 18-DoF, use direct passthrough (no virtual joints).

First, add alohamini_policy.py to the policies folder in the openpi project. The specific code is provided in this folder.

Then, add the following modifications to the /src/openpi/training/config.py file.

@dataclasses.dataclass(frozen=True)
class LeRobotAlohaMiniDataConfig(DataConfigFactory):
    default_prompt: str | None = None
    bgr_to_rgb: bool = False
    flip_images_hw: bool = False
    robot_dof: int = 16  # 16 or 18
    dataset_action_dim: int = 16
    use_delta_actions: bool = True

    delta_action_mask: tyro.conf.Suppress[Sequence[bool]] = dataclasses.field(
        default_factory=lambda: [True] * 18
    )

    repack_transforms: tyro.conf.Suppress[_transforms.Group] = dataclasses.field(
        default=_transforms.Group(
            inputs=[
                _transforms.RepackTransform(
                    {
                        "images": {
                            "cam_high": "observation.images.head_top",
                            "cam_left_wrist": "observation.images.wrist_left",
                            "cam_right_wrist": "observation.images.wrist_right",
                        },
                        "state": "observation.state",
                        "actions": "action",
                    }
                )
            ]
        )
    )

    action_sequence_keys: Sequence[str] = ("action",)

    @override
    def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> DataConfig:
        if self.robot_dof not in (16, 18):
            raise ValueError(f"robot_dof must be 16 or 18, got {self.robot_dof}")

        expanded_dim = 18  # Pi0.5 internal action space
        data_transforms = _transforms.Group(
            inputs=[
                alohamini_policy.AlohaMiniInputs(bgr_to_rgb=self.bgr_to_rgb),
                alohamini_policy.AlignToPi05ActionSpace(robot_dof=self.robot_dof),
            ],
            outputs=[
                alohamini_policy.AlohaMiniOutputs(internal_dim=18, robot_dof=self.robot_dof)
            ],
        )
        if self.flip_images_hw:
            data_transforms = _transforms.Group(
                inputs=[
                    alohamini_policy.AlohaMiniInputs(bgr_to_rgb=self.bgr_to_rgb),
                    _transforms.FlipImages(flip_h=True, flip_w=True),
                    alohamini_policy.AlignToPi05ActionSpace(robot_dof=self.robot_dof),
                ],
                outputs=data_transforms.outputs,
            )

        if self.use_delta_actions:
            mask = list(self.delta_action_mask)
            if len(mask) != 18:
                raise ValueError(
                    f"delta_action_mask length must be 18, got {len(mask)}")
            data_transforms = data_transforms.push(
                inputs=[_transforms.DeltaActions(mask)],
                outputs=[_transforms.AbsoluteActions(mask)],
            )

        model_transforms = ModelTransformFactory(
            default_prompt=self.default_prompt)(model_config)

        return dataclasses.replace(
            self.create_base_config(assets_dirs, model_config),
            repack_transforms=self.repack_transforms,
            data_transforms=data_transforms,
            model_transforms=model_transforms,
            action_sequence_keys=self.action_sequence_keys,
        )

TrainConfig(
        name="alohamini2pro",
        model=pi0_config.Pi0Config(pi05=True, action_horizon=10),
        data=LeRobotAlohaMiniDataConfig(
            repo_id="/path/to/your/dataset_root",
            base_config=DataConfig(prompt_from_task=True),
            default_prompt="your job description",
            robot_dof=18,
            dataset_action_dim=18,
            use_delta_actions=True,
            repack_transforms=_transforms.Group(
                inputs=[
                    _transforms.RepackTransform(
                        {
                            "images": {
                                "cam_high": "observation.images.chest",
                                "cam_left_wrist": "observation.images.wrist_left",
                                "cam_right_wrist": "observation.images.wrist_right",
                            },
                            "state": "observation.state",
                            "actions": "action",
                            "prompt": "prompt", # This parameter must be added, otherwise the model training will not include the task description
                        }
                    )
                ]
            ),
            # AlohaMini2Pro is native 18D: arm joints are trained as deltas,
            # grippers/base/lift stay absolute.
            delta_action_mask=[
                True, True, True, True, True, True, False,
                True, True, True, True, True, True, False,
                False, False, False, False,
            ],
            assets=AssetsConfig(
                assets_dir="/path/to/your/asset/path",
                asset_id="/dataset/file/name", # assets_dir and assed_id form your dataset path, the path is equivalent to repo_id
            ),
        ),
        weight_loader=weight_loaders.CheckpointWeightLoader(
            "gs://openpi-assets/checkpoints/pi05_base/params",
        ),
        num_train_steps=50000,
        batch_size=4,
        num_workers=2,
        wandb_enabled=False,
    ),

Note: Here, the pi0.5_base weights are used for fine-tuning training. Please modify the specific weight path accordingly. Before starting fine-tuning, make sure to compute the data normalization statistics according to the requirements of openpi by running scripts/compute_norm_stats.py.

We further provide the modified remote client http_policy_server.py and the local receiver evaluate_bi.py to enable remote server inference and local execution of actions on the AlohaMini robot.

python scripts/serve_policy_http.py \
        --port 8000 \
        --default_prompt "<prompt>" \
        policy:checkpoint \
        --policy.config=pi05_test2 \
        --policy.dir=<Weight path>
python -m lerobot.robots.alohamini.lekiwi_host \
  --arm_profile so-arm-5dof

python examples/pi0.5_openpi/evaluate_bi.py \
  --policy_mode remote_http \
  --server_url http://localhost:8000 \
  --task_description "<prompt>" \
  --remote_ip 10.100.74.7 \
  --robot_dof 16

For 18-DoF robots:

python examples/pi0.5_openpi/evaluate_bi.py \
  --policy_mode remote_http \
  --server_url http://localhost:8000 \
  --task_description "<prompt>" \
  --remote_ip 10.100.74.7 \
  --robot_dof 18