From 6803439f22a4560becc1a3815509b8d917bee3e7 Mon Sep 17 00:00:00 2001 From: groot-validation Date: Fri, 5 Jun 2026 00:56:11 +0000 Subject: [PATCH] groot: auto-enable LIBERO gripper action transform for libero_sim GR00T N1.7 emits gripper in [0,1] but LIBERO expects [-1,1]. The decode transform existed but was never auto-enabled for embodiment_tag=libero_sim, so the policy scored 0% on LIBERO eval. Auto-set it in __post_init__ (still overridable). LIBERO Spatial eval: 0% -> 98%. --- src/lerobot/policies/groot/configuration_groot.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lerobot/policies/groot/configuration_groot.py b/src/lerobot/policies/groot/configuration_groot.py index 02f912a45..4ab899468 100644 --- a/src/lerobot/policies/groot/configuration_groot.py +++ b/src/lerobot/policies/groot/configuration_groot.py @@ -410,6 +410,15 @@ class GrootConfig(PreTrainedConfig): if self.base_model_path is None: self.base_model_path = GROOT_N1_7_BASE_MODEL + # The N1.7 LIBERO checkpoints emit a [0, 1] gripper action, but the LIBERO + # simulator expects the OpenVLA/[-1, 1] sign convention. NVIDIA's rollout + # wrapper applies this conversion; mirror it here so eval on the + # 'libero_sim' embodiment grasps correctly instead of scoring 0% success. + # This matches the embodiment-specific handling already done for the + # action execution horizon (see infer_groot_n1_7_action_execution_horizon). + if self.action_decode_transform is None and self.embodiment_tag == "libero_sim": + self.action_decode_transform = GROOT_ACTION_DECODE_TRANSFORM_LIBERO + if self.max_state_dim == 64: self.max_state_dim = 132 if self.max_action_dim == 32: