Robotics
LeRobot
English
OpenRAL
rskill
smolvla
vision-language-action
franka_panda
vla
maniskill
maniskill3
manipulation
Instructions to use OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LeRobot
How to use OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16 with LeRobot:
# See https://github.com/huggingface/lerobot?tab=readme-ov-file#installation for more details git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .[smolvla]
# Launch finetuning on your dataset python lerobot/scripts/train.py \ --policy.path=OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16 \ --dataset.repo_id=lerobot/svla_so101_pickplace \ --batch_size=64 \ --steps=20000 \ --output_dir=outputs/train/my_smolvla \ --job_name=my_smolvla_training \ --policy.device=cuda \ --wandb.enable=true
# Run the policy using the record function python -m lerobot.record \ --robot.type=so101_follower \ --robot.port=/dev/ttyACM0 \ # <- Use your port --robot.id=my_blue_follower_arm \ # <- Use your robot id --robot.cameras="{ front: {type: opencv, index_or_path: 8, width: 640, height: 480, fps: 30}}" \ # <- Use your cameras --dataset.single_task="Grasp a lego block and put it in the bin." \ # <- Use the same task description you used in your dataset recording --dataset.repo_id=HF_USER/dataset_name \ # <- This will be the dataset name on HF Hub --dataset.episode_time_s=50 \ --dataset.num_episodes=10 \ --policy.path=OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16 - Notebooks
- Google Colab
- Kaggle
| # rSkill manifest β OpenRAL packaging format V1 (CLAUDE.md Β§6.4) | |
| # Wraps: Calvert0921/smolvla_franka_liftcube_1000 | |
| # Base: lerobot/smolvla_base (arxiv:2506.01844) | |
| # | |
| # Community SmolVLA finetune on a ManiSkill-style Franka LiftCube task, | |
| # trained on the paired dataset Calvert0921/SmolVLA_LiftCube_Franka_1000 | |
| # (1000 demos). The upstream model card is empty so this rSkill is | |
| # wired strictly from the checkpoint's `config.json`: | |
| # | |
| # type: smolvla β routed via the in-tree `smolvla` adapter. | |
| # input_features: | |
| # observation.state shape (9,) β Franka qpos | |
| # (7 arm + 2 fingers) | |
| # observation.images.up shape (3,256,256) β top / overhead view | |
| # observation.images.wrist shape (3,256,256) β eye-in-hand view | |
| # output_features: | |
| # action shape (8,) β 7 joint pos + 1 gripper | |
| # chunk_size: 50 n_action_steps: 50 flow-matching steps: 10 | |
| # | |
| # Camera-name mapping | |
| # ------------------- | |
| # The ManiSkill3 backend surfaces cameras under `camera1` / `camera2` | |
| # (matching the franka_panda RobotDescription's `sensors` block); the | |
| # `image_preprocessing.aliases` map below renames those to the model's | |
| # `up` / `wrist` keys so the SmolVLA preprocessor finds them. | |
| # | |
| # End-to-end wiring | |
| # ----------------- | |
| # The companion ManiSkill3 backend changes (this PR) surface every | |
| # entry in `sensor_data` as `camera1` / `camera2` / ... in declaration | |
| # order, plumb `backend_options.robot_uids` through to `gym.make` so | |
| # the YAML's `panda_wristcam` brings in the wrist camera, and forward | |
| # `task.max_steps` to MS3's `max_episode_steps` so the rollout isn't | |
| # silently truncated at MS3's default 50 steps. | |
| # | |
| # The upstream model repo (Calvert0921/smolvla_franka_liftcube_1000) | |
| # ships only config.json + model.safetensors + train_config.json β no | |
| # `policy_*processor.json`. Rather than rely on the SmolVLA adapter's | |
| # dataset-stats fallback at every load (a 404 + recompute against | |
| # `dataset_uri`'s `meta/episodes_stats.jsonl`), the processor pair was | |
| # rebuilt once via `make_pre_post_processors(policy.config, | |
| # dataset_stats=...)` and uploaded to THIS rSkill's own HF repo | |
| # (OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16). The rebuilt normalizer | |
| # stats match the checkpoint's baked `normalize_inputs` / | |
| # `normalize_targets` buffers exactly, so the processors are faithful to | |
| # how the model was trained. The fallback path still exists for any | |
| # other community finetune uploaded without processors. | |
| # ββ Identity βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| schema_version: "0.1" | |
| name: "OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16" | |
| version: "0.1.0" | |
| license: "apache-2.0" | |
| role: "s1" | |
| kind: "vla" # rSkill kind discriminator. "vla" = learnable Vision-Language-Action policy. | |
| # ββ Policy identity ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| model_family: "smolvla" | |
| # ββ Compatibility contract βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # ManiSkill3 PickCube / LiftCube run on the Franka Panda agent β same | |
| # embodiment as the LIBERO / RoboCasa Panda rSkills. | |
| embodiment_tags: | |
| - "franka_panda" | |
| # Two RGB camera streams matching the checkpoint's input_features. The | |
| # franka_panda RobotDescription declares matching `camera1` (agentview / | |
| # base_camera) and `camera2` (eye_in_hand / hand_camera) sensors so the | |
| # compatibility check resolves cleanly. | |
| sensors_required: | |
| - modality: "rgb" | |
| vla_feature_key: "observation.images.camera1" | |
| min_width: 256 | |
| min_height: 256 | |
| - modality: "rgb" | |
| vla_feature_key: "observation.images.camera2" | |
| min_width: 256 | |
| min_height: 256 | |
| # Output side. 7 arm joints + 1 gripper command. For | |
| # franka_panda the loader auto-fills n_dof + vla_action_key from | |
| # robots/franka_panda/robot.yaml. | |
| actuators_required: | |
| - kind: "joint_position" | |
| control_mode_semantics: | |
| mode: "absolute" | |
| # ββ Runtime / weights ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| runtime: "pytorch" | |
| quantization: | |
| dtype: "bf16" | |
| backend: "pytorch" | |
| weights_uri: "hf://Calvert0921/smolvla_franka_liftcube_1000" | |
| # ββ Preprocessing (all knobs needed to interpret IO) βββββββββββββββββββββββ | |
| # Per-file URIs for the lerobot PolicyProcessorPipeline. The upstream | |
| # weights repo ships no `policy_*processor.json`, so the pair (plus the | |
| # normalizer/unnormalizer `*.safetensors` state files referenced by the | |
| # JSON `steps`) was rebuilt from the checkpoint config + training-dataset | |
| # stats and uploaded to this rSkill's own HF repo. `materialize_processor_dir` | |
| # downloads exactly these files (and their `state_file` siblings) β no 404, | |
| # no dataset-stats recompute at load time. | |
| processors: | |
| preprocessor_uri: "hf://OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16/policy_preprocessor.json" | |
| postprocessor_uri: "hf://OpenRAL/rskill-smolvla-franka_panda-maniskill3-bf16/policy_postprocessor.json" | |
| # Per-checkpoint knobs the processor JSONs don't encode. The model was | |
| # trained on raw SAPIEN renders (no 180Β° flip); cameras need an alias | |
| # remap from the in-tree scene-side keys (camera1 / camera2) to the | |
| # checkpoint's `up` / `wrist`. | |
| image_preprocessing: | |
| flip_180: false | |
| aliases: | |
| top: "up" | |
| wrist: "wrist" | |
| state_contract: | |
| dim: 9 | |
| # ββ Execution semantics ββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Matches the checkpoint's config.json (chunk_size=50, n_action_steps=50). | |
| chunk_size: 50 | |
| n_action_steps: 50 | |
| latency_budget: | |
| per_chunk_ms: 200.0 # SmolVLA bf16 on a desktop GPU β 80β150 ms; SAPIEN | |
| # step adds another ~10β20 ms β generous headroom | |
| # ββ Provenance βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # No benchmarks shipped yet β see eval/.gitkeep. The headline LiftCube | |
| # success rate will be populated by `openral benchmark run` once the MS3 | |
| # backend supports the wrist-camera surface (see header comment). | |
| paper_url: "https://arxiv.org/abs/2506.01844" | |
| dataset_uri: "hf://Calvert0921/SmolVLA_LiftCube_Franka_1000" | |
| source_repo: "hf://Calvert0921/smolvla_franka_liftcube_1000" | |
| # Task-data gate: this checkpoint was trained on the *LiftCube* | |
| # dataset (a ManiSkill2-style "lift the cube to a height" task) which has NO | |
| # equivalent env in ManiSkill3 3.0.1 β MS3 ships PickCube-v1 (grasp + place at | |
| # a goal + stay static), a different task. Declaring the (MS3-absent) true task | |
| # makes the benchmark runner refuse every real MS3 scene with | |
| # ROSCapabilityMismatch. Verified empirically 2026-06-19: retargeted to | |
| # PickCube-v1 it runs (50 steps, ~15 ms/step real inference) and attempts the | |
| # cube but cannot satisfy PickCube's goal-placement success (success=False) β | |
| # exactly the plausible-but-unsolvable rollout the gate exists to block. This | |
| # rSkill therefore has no valid MS3 benchmark; replace with a PickCube-trained | |
| # policy (e.g. the author's PegInsertion checkpoint -> PegInsertionSide-v1, or | |
| # an MS3 OpenVLA-OFT policy) before pairing it with a maniskill scene. | |
| evaluated_tasks: ["maniskill3/LiftCube"] | |
| description: > | |
| SmolVLA (0.45 B, lerobot/smolvla_base) finetuned on | |
| Calvert0921/SmolVLA_LiftCube_Franka_1000 (1000 demos of a Franka | |
| Panda lifting a cube in ManiSkill3 SAPIEN). Action chunks of length | |
| 50 across overhead + wrist RGB views and a 9-D Franka qpos state. | |
| Runs end-to-end on ManiSkill3 PickCube-v1 with a live SAPIEN viewer | |
| via `openral sim run --view`. | |
| # Action vocabulary surfaced to the reasoner LLM tool palette. | |
| # "lift" is not in the RSkillAction enum; the lift motion is expressed | |
| # as a pick (the post-grasp upward motion is implicit in the policy's | |
| # closed-loop control). | |
| actions: | |
| - "pick" | |
| - "grasp" | |
| objects: | |
| - "cube" | |
| scenes: | |
| - "tabletop" | |
| # Per-checkpoint action contract (consumed by the dataset bridge | |
| # to bind the LeRobot v3 `action` feature shape). | |
| action_contract: | |
| dim: 8 | |
| benchmarks: | |
| # PickCube-v1 via the curated franka_panda suite `maniskill3_panda` | |
| # (auto-filters to this rSkill's task). 0.0 = the shipped LiftCube | |
| # checkpoint cannot satisfy PickCube's goal-placement success (task | |
| # mismatch β see the MS3 LiftCube-gap note above); replace with a | |
| # PickCube-trained policy to lift this. | |
| maniskill3_panda: 0.0 | |