GR00T N1.7 fine-tuned on ARMAR-6 teleoperation (multi-task)
Isaac-GR00T N1.7 (3B) fine-tuned on 850 bimanual teleoperation episodes recorded on ARMAR-6 (KIT H2T) with the xr_teleoperate pipeline.
Read the evaluation before using this model. On held-out episodes it barely outperforms a zero-order-hold baseline ("command the pose you are already at") and it largely ignores the language instruction (contrast-pair divergence ratio 0.09 out of 1.0). It is a reproducible baseline and a diagnostic artifact, not a policy we would deploy. Details and figures: EVAL.md.
| Base model | nvidia/GR00T-N1.7-3B |
| Training data | 850 episodes / 160,233 frames @ 15 Hz, 3 datasets |
| Instructions | 431 distinct task strings (median 2 demonstrations each) |
| Steps | 20,000 (global batch 128, 8x RTX PRO 6000) |
| Final training loss | 0.0088 |
| Embodiment | armar6_wri2 — 20-D state/action, Wri2 wrist-link poses |
| Validation | 58 held-out episodes, split holdout_v2 |
Version history
v2-850ep(this revision) — multi-task model, 850 episodes across three collection batches, 431 instructions, 20k steps.v1-20ep— the first model: 20 episodes, two tasks, 10k steps. Reachable at that tag.
Kinematic contract — read before deploying
End-effector poses are the Wri2 wrist-link pose in the ARMAR-6 URDF base frame, not the ArmarX TCP in the ArmarX root frame. A deployment must apply the fixed Wri2→TCP and URDF-base→ArmarX-root transforms before commanding the controller, and the safety boxes need recalibration for this frame. Grip is a normalized closure 0..1 (1 = closed); state and action both carry the commanded closure, since the hand reports no feedback.
State and action are 20-D: left_eef (9-D, xyz + rot6d), left_hand (1-D),
right_eef (9-D), right_hand (1-D). Actions are absolute poses in the stored data;
GR00T's modality config converts end-effector actions to a relative representation
internally.
Usage
from gr00t.policy.gr00t_policy import Gr00tPolicy
policy = Gr00tPolicy(
embodiment_tag="new_embodiment",
model_path="cvhci/lerobot-teleop-armar-6-gr00t-n1.7",
device="cuda",
)
action = policy.get_action(observation) # observation from a LeRobot v2.1 loader
The modality config is generated from the embodiment spec in
armarx_groot; MANIFEST.yaml
records the spec's SHA-256 so a checkpoint can be verified against it.
Training data
Three datasets, all "one dataset per collection batch":
| dataset | episodes used | note |
|---|---|---|
cvhci/teleop-armar-6-00 | 402 | first batch |
cvhci/teleop-armar-6-01 | 31 | legacy salvaged depth |
cvhci/teleop-armar-6-02 | 433 | clean 16-bit depth |
Episodes marked val or excluded in each dataset's meta/split.jsonl were withheld:
58 held out for validation, 66 excluded as failed attempts or deletion markers. The split
is reproducible from eval/holdout_v2.json.
See TRAINING.md for what was trained and why, and EVAL.md for what it can and cannot do.