AdrianLlopart commited on
Commit
5aba78b
Β·
verified Β·
1 Parent(s): 5d70625

chore: publish rSkill OpenRAL/rskill-smolvla-robotwin v0.1.0

Browse files
Files changed (4) hide show
  1. README.md +123 -0
  2. SKILL.md +74 -0
  3. eval/.gitkeep +0 -0
  4. rskill.yaml +146 -0
README.md ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ tags:
3
+ - OpenRAL
4
+ - rskill
5
+ - smolvla
6
+ - lerobot
7
+ - vla
8
+ - aloha_agilex
9
+ - robotwin
10
+ - bimanual
11
+ - manipulation
12
+ license: apache-2.0
13
+ language:
14
+ - en
15
+ ---
16
+
17
+ # rskill-smolvla-robotwin
18
+
19
+ > **OpenRAL rSkill** β€” SmolVLA (0.45 B) finetuned on the **RoboTwin 2.0** unified
20
+ > dual-arm dataset (50 bimanual SAPIEN tasks, aloha-agilex embodiment), packaged for
21
+ > use with the [OpenRAL](https://github.com/OpenRAL/openral) robot agent framework.
22
+
23
+ This package wraps
24
+ [`lerobot/smolvla_robotwin`](https://huggingface.co/lerobot/smolvla_robotwin) with a
25
+ `rskill.yaml` manifest that adds capability checking, license surfacing, latency
26
+ budgets, and local registry integration. It does **not** copy model weights.
27
+
28
+ ## What this skill does
29
+
30
+ A multi-task dual-arm policy for the RoboTwin 2.0 benchmark
31
+ ([Chen et al., arXiv 2506.18088](https://arxiv.org/abs/2506.18088)). Action chunks of
32
+ length 50 across three RGB views (head + per-wrist) driving a 14-DoF dual-arm joint
33
+ command on the AgileX "aloha-agilex" embodiment.
34
+
35
+ | Field | Value |
36
+ | --- | --- |
37
+ | Actions | `generalist`, `pick`, `place`, `transfer` |
38
+ | Objects | `block`, `pot`, `cup`, `hammer` |
39
+ | Scenes | `tabletop` |
40
+ | Embodiment | `aloha_agilex` |
41
+ | Action space | 14-D joint position |
42
+ | Cameras | `camera1` (head), `camera2` (left wrist), `camera3` (right wrist), 256Γ—256 |
43
+
44
+ ## How it works
45
+
46
+ OpenRAL loads the upstream LeRobot SmolVLA policy from `hf://lerobot/smolvla_robotwin`
47
+ and uses the in-tree `smolvla` adapter to run chunked inference. RoboTwin itself runs in a
48
+ separate SAPIEN/CuRobo sidecar; the sidecar returns three RGB views plus the 14-D
49
+ aloha-agilex joint state, and the adapter replays 50-action chunks as absolute 14-D joint
50
+ position commands.
51
+
52
+ ## Sensors / observation contract
53
+
54
+ | Direction | Key | Shape | Notes |
55
+ | --- | --- | --- | --- |
56
+ | in | `observation.images.camera1` | `(3, 256, 256)` RGB | Head / overhead view, re-keyed from RoboTwin `head_camera`. |
57
+ | in | `observation.images.camera2` | `(3, 256, 256)` RGB | Left wrist view, re-keyed from RoboTwin `left_camera`. |
58
+ | in | `observation.images.camera3` | `(3, 256, 256)` RGB | Right wrist view, re-keyed from RoboTwin `right_camera`. |
59
+ | in | `observation.state` | `(14,) float32` | aloha-agilex dual-arm joint state. |
60
+ | out | action chunk | `(50, 14) float32` | Absolute dual-arm joint position commands. |
61
+
62
+ ## Manifest summary
63
+
64
+ | Field | Value |
65
+ | --- | --- |
66
+ | `name` | `OpenRAL/rskill-smolvla-robotwin` |
67
+ | `version` | `0.1.0` |
68
+ | `license` | `apache-2.0` |
69
+ | `role` | `s1` |
70
+ | `model_family` | `smolvla` |
71
+ | `embodiment_tags` | `aloha_agilex` |
72
+ | `runtime` / `quantization.dtype` | `pytorch` / `bf16` |
73
+ | `weights_uri` | `hf://lerobot/smolvla_robotwin` |
74
+ | `state_contract.dim` / `action_contract.dim` | `14` / `14` |
75
+ | `chunk_size` / `n_action_steps` | `50` / `50` |
76
+ | `latency_budget.per_chunk_ms` | `250.0` |
77
+ | `evaluated_tasks` | `robotwin` |
78
+
79
+ ## How to run it
80
+
81
+ RoboTwin runs on **SAPIEN** out-of-process via a Python 3.10 sidecar
82
+ ([ADR-0061](../../docs/adr/0061-robotwin-dual-arm-benchmark-backend.md)) β€” its stack is
83
+ incompatible with the openral 3.12 venv. Provision the sidecar venv, then:
84
+
85
+ ```bash
86
+ # openral-side wire (pyzmq + msgpack)
87
+ just sync --all-packages --group robotwin --inexact
88
+
89
+ # single task
90
+ openral benchmark scene \
91
+ --config scenes/benchmark/robotwin_lift_pot.yaml \
92
+ --rskill rskills/smolvla-robotwin
93
+
94
+ # the 5-task suite
95
+ openral benchmark run --suite robotwin --vla smolvla:rskills/smolvla-robotwin
96
+ ```
97
+
98
+ See ADR-0061 for the SAPIEN+RoboTwin sidecar provisioning recipe
99
+ (`OPENRAL_ROBOTWIN_AUTO_PROVISION=1` or the manual conda recipe).
100
+
101
+ ## Provenance
102
+
103
+ - **Weights:** [`lerobot/smolvla_robotwin`](https://huggingface.co/lerobot/smolvla_robotwin)
104
+ (Apache-2.0), base [`lerobot/smolvla_base`](https://huggingface.co/lerobot/smolvla_base).
105
+ - **Dataset:** [`lerobot/robotwin_unified`](https://huggingface.co/datasets/lerobot/robotwin_unified)
106
+ (Apache-2.0; `pepijn223/robotwin_unified_v3` renamed).
107
+ - **Eval protocol:** RoboTwin official β€” 100 episodes/task, sim built-in success,
108
+ `episode_length=300`. No locally-reproduced official numbers shipped yet (`eval/` is empty).
109
+ The current website artifact is a 150-step GPU `openral benchmark scene` smoke clip
110
+ (`robotwin_smolvla-robotwin_fail.mp4`, `success=False`) for visual validation only;
111
+ populate `eval/` with `openral benchmark run --suite robotwin` on the eval host.
112
+
113
+ > **STATE NOTE:** the live RoboTwin sidecar returns a 14-D aloha-agilex state, and the
114
+ > official `policy_preprocessor.json` normalization stats expect `observation.state`
115
+ > shape `(14,)`; `rskill.yaml` pins `state_contract.dim: 14` accordingly
116
+ > (ADR-0061 Β§Live verification).
117
+
118
+ ## License
119
+
120
+ This rSkill wrapper, the upstream `lerobot/smolvla_robotwin` checkpoint, and the
121
+ `lerobot/robotwin_unified` dataset are Apache-2.0. The package does not copy weights into
122
+ this repository; runtime loading still emits OpenRAL's unverified-provenance warning until
123
+ the planned signing control exists.
SKILL.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: smolvla-robotwin
3
+ description: >-
4
+ S1 Vision-Language-Action policy. Capabilities: generalist, pick, place, transfer on block, pot, cup, hammer. SmolVLA (0.45 B, lerobot/smolvla_base) finetuned on the RoboTwin 2.0 unified dataset (50 dual-arm tasks, aloha-agilex embodiment, SAPIEN). Multi-task: action chunks of length 50 across three RGB views (head + per-wrist) driving a 14-DoF dual-arm joint command. Runs on the RoboTwin scene backend through the out-of-process py3.10 SAPIEN sidecar (ADR-0061). Discovery view of an OpenRAL rSkill β€” NOT directly runnable by an agent harness; it runs via rSkill.from_pretrained + the robot HAL.
5
+ metadata:
6
+ openral_rskill: true # generated discovery view of an rSkill
7
+ schema_version: 0.1
8
+ rskill_id: OpenRAL/rskill-smolvla-robotwin
9
+ manifest: ./rskill.yaml
10
+ role: s1
11
+ kind: vla
12
+ model_family: smolvla
13
+ embodiment_tags: [aloha_agilex]
14
+ actions: [generalist, pick, place, transfer]
15
+ objects: [block, pot, cup, hammer]
16
+ scenes: [tabletop]
17
+ sensors_required: ['rgb:observation.images.camera1', 'rgb:observation.images.camera2', 'rgb:observation.images.camera3']
18
+ state_dim: 6
19
+ action_dim: 14
20
+ runtime: pytorch
21
+ quantization: bf16/pytorch
22
+ chunk_size: 50
23
+ n_action_steps: 50
24
+ latency_budget: {per_chunk_ms: 250.0}
25
+ license_code: Apache-2.0
26
+ license_weights: apache-2.0
27
+ weights_uri: hf://lerobot/smolvla_robotwin
28
+ source_repo: hf://lerobot/smolvla_robotwin
29
+ paper_url: https://arxiv.org/abs/2506.18088
30
+ ---
31
+
32
+ # smolvla-robotwin β€” rSkill discovery view
33
+
34
+ > **Generated view, not a hand-written skill.** This `SKILL.md` is a discovery-only
35
+ > mirror of [`rskill.yaml`](./rskill.yaml), produced by `tools/generate_rskill_skillmd.py`.
36
+ > It lets tools that read the standard agent-skill format find and reason about this
37
+ > OpenRAL rSkill. The `rskill.yaml` manifest is the single source of truth
38
+ > (CLAUDE.md Β§1.3). Do not edit by hand β€” edit the manifest and regenerate.
39
+
40
+ ## What it is
41
+
42
+ An OpenRAL **Vision-Language-Action policy** (`role: s1`, `kind: vla`). SmolVLA (0.45 B, lerobot/smolvla_base) finetuned on the RoboTwin 2.0 unified dataset (50 dual-arm tasks, aloha-agilex embodiment, SAPIEN). Multi-task: action chunks of length 50 across three RGB views (head + per-wrist) driving a 14-DoF dual-arm joint command. Runs on the RoboTwin scene backend through the out-of-process py3.10 SAPIEN sidecar (ADR-0061).
43
+
44
+ ## Capabilities
45
+
46
+ - **Verbs:** generalist Β· pick Β· place Β· transfer
47
+ - **Objects:** block Β· pot Β· cup Β· hammer
48
+ - **Scenes:** tabletop
49
+ - **Embodiments:** aloha_agilex
50
+
51
+ ## Why this is discovery-only
52
+
53
+ An agent skill is natural-language instructions loaded into an LLM's context. An rSkill
54
+ is an executable artifact: it carries a typed capability/embodiment contract, model weights,
55
+ a runtime, and a license/provenance gate β€” none of which fit in freeform markdown. So an
56
+ agent can use this view to *select* the right skill, but cannot *execute* it by loading
57
+ this file. Execution always goes through the OpenRAL loader and the robot HAL.
58
+
59
+ ## License
60
+
61
+ - **Code:** Apache-2.0.
62
+ - **Weights:** `apache-2.0` β€” permissive / commercial-use OK
63
+
64
+ ## How to actually run it (not via an agent harness)
65
+
66
+ ```python
67
+ from openral_rskill import rSkill
68
+
69
+ skill = rSkill.from_pretrained("OpenRAL/rskill-smolvla-robotwin")
70
+ # the loader validates embodiment / sensors / runtime / quantization against the target
71
+ # RobotDescription and enforces the weight-license gate before any weights load.
72
+ ```
73
+
74
+ See [`rskill.yaml`](./rskill.yaml) for the authoritative, validated manifest.
eval/.gitkeep ADDED
File without changes
rskill.yaml ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # rSkill manifest β€” OpenRAL packaging format V1 (CLAUDE.md Β§6.4)
2
+ # Wraps: lerobot/smolvla_robotwin (Apache-2.0)
3
+ # Base: lerobot/smolvla_base (arxiv:2506.01844)
4
+ # Dataset: lerobot/robotwin_unified (== pepijn223/robotwin_unified_v3, renamed)
5
+ #
6
+ # Official LeRobot SmolVLA finetune on the RoboTwin 2.0 unified dataset
7
+ # (Chen et al., arXiv 2506.18088). Multi-task across the 50 dual-arm
8
+ # tasks on the aloha-agilex embodiment. Routed via the in-tree `smolvla`
9
+ # adapter (model_family: smolvla).
10
+ #
11
+ # Wired from the checkpoint's config.json (the inference authority):
12
+ # type: smolvla
13
+ # input_features:
14
+ # observation.state shape (6,) β€” see STATE NOTE below
15
+ # observation.images.camera1 shape (3,256,256) β€” head / overhead
16
+ # observation.images.camera2 shape (3,256,256) β€” left wrist
17
+ # observation.images.camera3 shape (3,256,256) β€” right wrist
18
+ # output_features:
19
+ # action shape (14,) β€” 14-DoF dual-arm joints
20
+ # chunk_size: 50 n_action_steps: 50 flow-matching steps: 10
21
+ # normalization: STATE/ACTION MEAN_STD, VISUAL IDENTITY
22
+ #
23
+ # Camera-name mapping
24
+ # -------------------
25
+ # RoboTwin's native LeRobot env cameras are head_camera / left_camera /
26
+ # right_camera; the RoboTwin sidecar (tools/robotwin_sidecar.py) re-keys
27
+ # them to camera1 / camera2 / camera3 (head→left→right) so they match
28
+ # this checkpoint's input_features and the robots/aloha_agilex sensors β€”
29
+ # no per-skill alias remap needed.
30
+ #
31
+ # STATE NOTE: the RoboTwin sidecar reset returns a 14-D aloha-agilex state
32
+ # vector, and the official policy_preprocessor.json normalization stats also
33
+ # expect observation.state shape (14,). `state_contract.dim` therefore follows
34
+ # the live env + processor contract.
35
+
36
+ # ── Identity ───────────────────────────────────────────────────────────────
37
+ schema_version: "0.1"
38
+ name: "OpenRAL/rskill-smolvla-robotwin"
39
+ version: "0.1.0"
40
+ license: "apache-2.0"
41
+ role: "s1"
42
+ kind: "vla" # learnable Vision-Language-Action policy
43
+
44
+ # ── Policy identity ────────────────────────────────────────────────────────
45
+ model_family: "smolvla"
46
+
47
+ # ── Compatibility contract ─────────────────────────────────────────────────
48
+ # RoboTwin 2.0 default embodiment: AgileX dual-arm (robots/aloha_agilex).
49
+ embodiment_tags:
50
+ - "aloha_agilex"
51
+
52
+ # Three RGB streams matching the checkpoint's input_features. The
53
+ # aloha_agilex RobotDescription declares matching camera1 / camera2 /
54
+ # camera3 sensors so the compatibility check resolves cleanly.
55
+ sensors_required:
56
+ - modality: "rgb"
57
+ vla_feature_key: "observation.images.camera1"
58
+ min_width: 256
59
+ min_height: 256
60
+ - modality: "rgb"
61
+ vla_feature_key: "observation.images.camera2"
62
+ min_width: 256
63
+ min_height: 256
64
+ - modality: "rgb"
65
+ vla_feature_key: "observation.images.camera3"
66
+ min_width: 256
67
+ min_height: 256
68
+
69
+ # Output side (ADR-0013). 14-DoF dual-arm joint command. For aloha_agilex
70
+ # the loader auto-fills n_dof (14) + vla_action_key from
71
+ # robots/aloha_agilex/robot.yaml.
72
+ actuators_required:
73
+ - kind: "joint_position"
74
+ control_mode_semantics:
75
+ mode: "absolute"
76
+
77
+ # ── Runtime / weights ──────────────────────────────────────────────────────
78
+ runtime: "pytorch"
79
+ quantization:
80
+ dtype: "bf16"
81
+ backend: "pytorch"
82
+ weights_uri: "hf://lerobot/smolvla_robotwin@967623a0f38c7e1236c66b3893c830398d793ff7"
83
+
84
+ # ── Preprocessing (all knobs needed to interpret IO) ───────────────────────
85
+ # The official checkpoint ships the lerobot PolicyProcessorPipeline JSONs
86
+ # (policy_preprocessor.json + policy_postprocessor.json) plus their
87
+ # `*_normalizer_processor.safetensors` siblings, so we point at them directly β€”
88
+ # `materialize_processor_dir` auto-pulls the sibling safetensors. No
89
+ # dataset-stats rebuild fallback needed. Trained on raw SAPIEN renders (no flip).
90
+ processors:
91
+ preprocessor_uri: "hf://lerobot/smolvla_robotwin/policy_preprocessor.json"
92
+ postprocessor_uri: "hf://lerobot/smolvla_robotwin/policy_postprocessor.json"
93
+ image_preprocessing:
94
+ flip_180: false
95
+ state_contract:
96
+ dim: 14
97
+
98
+ # ── Execution semantics ────────────────────────────────────────────────────
99
+ # Matches the checkpoint's config.json (chunk_size=50, n_action_steps=50).
100
+ chunk_size: 50
101
+ n_action_steps: 50
102
+ latency_budget:
103
+ per_chunk_ms: 250.0 # SmolVLA bf16 β‰ˆ 80–150 ms/chunk + SAPIEN step headroom
104
+
105
+ # ── Provenance ─────────────────────────────────────────────────────────────
106
+ # No benchmarks shipped yet β€” see eval/.gitkeep. Populated by
107
+ # `openral benchmark run --suite robotwin` once the SAPIEN sidecar venv is
108
+ # provisioned (ADR-0061). RoboTwin leaderboard SmolVLA-class baselines for
109
+ # reference (Pi0 46.4/16.3 Easy/Hard) are paper-cited, not reproduced here.
110
+ paper_url: "https://arxiv.org/abs/2506.18088"
111
+ dataset_uri: "hf://lerobot/robotwin_unified"
112
+ source_repo: "hf://lerobot/smolvla_robotwin"
113
+
114
+ description: >
115
+ SmolVLA (0.45 B, lerobot/smolvla_base) finetuned on the RoboTwin 2.0
116
+ unified dataset (50 dual-arm tasks, aloha-agilex embodiment, SAPIEN).
117
+ Multi-task: action chunks of length 50 across three RGB views
118
+ (head + per-wrist) driving a 14-DoF dual-arm joint command. Runs on the
119
+ RoboTwin scene backend through the out-of-process SAPIEN sidecar (ADR-0061).
120
+
121
+ # ── Task-data gate (ADR-0060) ──────────────────────────────────────────────
122
+ # Multi-task checkpoint trained on the full robotwin_unified set, so it is
123
+ # valid on every RoboTwin scene. Declaring the scene id `robotwin` makes the
124
+ # benchmark runner accept all `robotwin/<task>` scenes (family match) and
125
+ # refuse non-RoboTwin scenes.
126
+ evaluated_tasks: ["robotwin"]
127
+
128
+ # ── Action vocabulary (ADR-0022) ───────────────────────────────────────────
129
+ # GENERALIST marks the multi-task foundation checkpoint; the specific verbs
130
+ # cover the bimanual-coordination / pick-place / stacking task families.
131
+ actions:
132
+ - "generalist"
133
+ - "pick"
134
+ - "place"
135
+ - "transfer"
136
+ objects:
137
+ - "block"
138
+ - "pot"
139
+ - "cup"
140
+ - "hammer"
141
+ scenes:
142
+ - "tabletop"
143
+
144
+ # ── Per-checkpoint action contract (ADR-0019) ──────────────────────────────
145
+ action_contract:
146
+ dim: 14