A multimodal dataset of real-world teleoperated demonstrations for bimanual dexterous manipulation.
11
500 commits
updated Oct 19, 2026
A multimodal dataset of real-world teleoperated demonstrations for bimanual dexterous manipulation.
Overview Β· Get Started Β· Tasks Β· Examples Β· Features Β· Language Β· Citation
An animated overview of 56 tasks in a uniform 8 Γ 7 grid, with head-camera and wrist-camera observations distributed throughout the montage. It spans assembly, tool use, deformable-object manipulation, cleaning, material transfer, and long-horizon activities. Open MP4.
SharpaDex v1.0 is a real-world teleoperation dataset for bimanual dexterous manipulation. It contains 28,993 demonstration episodes across 59 manipulation tasks, comprising 32,396,172 frames (approximately 300.0 hours at 30 FPS).
Data were collected through human teleoperation of a real bimanual robotic system with two 7-DoF arms, two 22-DoF dexterous hands, four RGB cameras, and fingertip tactile sensors. Each episode provides synchronized joint state, joint torque, tool-center-point state, observed and commanded TCP poses, action, numeric tactile measurements, RGB video, tactile video, and temporally aligned language annotations.
The task set covers object rearrangement, articulated-object interaction, assembly, tool use, deformable-object manipulation, packaging, cleaning, and long-horizon sequential manipulation. The data are distributed in LeRobot v3.0 and v2.1 formats for research on imitation learning, visuomotor control, vision-language-action models, visual-tactile learning, and hierarchical policy learning.
| Tasks | Episodes | Duration | Frequency | Video streams | Language segments |
|---|---|---|---|---|---|
| 59 | 28,993 | 300.0 hours | 30 FPS | 6 | 217,642 |
| Modality | Content |
|---|---|
| Robot | 65D joint state, 65D action, 65D joint torque (58 dims carry data; the 7 torso dims are 0), 24D TCP state (pose; its force slots are 0), and separate 12D observed / commanded TCP poses |
| Vision | Two head cameras and two wrist cameras |
| Tactile | 60D force/torque signal, deformation video, and raw tactile video |
| Language | Structured task descriptions, frame-aligned subtasks, and 45 skill labels |
| Format | LeRobot v3.0 and v2.1 for every released season |
Version note: v3.0 and v2.1 are two exports of the same demonstrations. Dataset scale must be reported as 28,993 episodes and 32,396,172 frames, not the sum of both exports.
| Item | Value |
|---|---|
| Manipulation tasks | 59 |
| Collection seasons | 495 |
| Episodes (one export) | 28,993 |
| Frames (one export) | 32,396,172 |
| Approximate duration at 30 FPS | 300.0 hours |
| LeRobot v3.0 seasons / episodes | 495 / 28,993 |
| LeRobot v2.1 seasons / episodes | 495 / 28,993 |
| FPS | 30 |
| Synchronized video streams | 6 |
| State / action dimension | 65 |
| Joint-torque dimension | 65 (arms and hands 58; torso 7, always 0) |
| TCP-state dimension | 24 (pose 12; force/torque 12, always 0) |
| Observed / commanded TCP-pose dimension | 12 / 12 |
| Tactile-signal dimension | 60 |
| Episodes with global language annotations | 28,993 (100%) |
| Temporally grounded language segments | 217,642 |
| Frames covered by temporal language segments | 28,920,254 (89.3%) |
| Distinct skill labels | 45 |
For new projects, we recommend starting with lerobot_v3.0. The lerobot_v2.1 export is provided for compatibility with pipelines that depend on the older LeRobot layout.
The previews below show synchronized observations from a real-robot teleoperation episode of deal_playing_cards (season POC22007_2026_03_26_15_55_47_train, episode 12, source interval 5β25 seconds). Each clip is displayed at 2x playback speed. The MP4 links remain available when animated GIF playback is disabled by the Markdown viewer.
Task directories use lowercase snake_case names with an action-object-target structure. Counts refer to one format version (v3.0); v2.1 contains the corresponding demonstrations.
| Task | Seasons | Episodes | Frames |
|---|---|---|---|
insert_batteries_into_charger | 3 | 458 | 841,645 |
scrub_cup_interior | 2 | 481 | 314,401 |
insert_plug_into_socket | 6 | 416 | 183,726 |
assemble_gears_on_base | 11 | 1,488 | 983,123 |
clean_plate_with_eraser | 5 | 343 | 190,467 |
tighten_bottle_cap | 7 | 131 | 139,693 |
secure_coiled_cable_with_velcro_tie | 10 | 473 | 632,425 |
collect_waste_into_bin | 8 | 508 | 621,140 |
deal_playing_cards | 23 | 1,088 | 2,074,644 |
empty_dustpan_into_bin | 10 | 488 | 379,585 |
cover_ball_with_cup | 5 | 488 | 188,956 |
insert_knife_into_cutlery_bin | 4 | 495 | 232,113 |
place_ball_in_box | 3 | 115 | 40,672 |
place_ball_in_cup_then_cup_in_box | 4 | 456 | 252,933 |
place_cup_on_plate | 4 | 429 | 149,882 |
place_knife_and_fork_on_plate | 8 | 461 | 314,324 |
stack_two_plates | 4 | 491 | 185,481 |
remove_block_from_box | 5 | 388 | 142,321 |
reorient_cup_upright | 5 | 420 | 151,573 |
fit_trash_bag_into_bin | 47 | 656 | 852,443 |
turn_book_pages | 7 | 65 | 87,056 |
fold_and_close_box | 7 | 537 | 1,008,242 |
hang_garment_on_hanger | 15 | 521 | 979,299 |
form_kraft_paper_box | 5 | 455 | 775,252 |
close_kraft_paper_box | 5 | 645 | 693,683 |
fold_towel | 3 | 459 | 547,201 |
grind_medicine_with_mortar_and_pestle | 4 | 131 | 176,595 |
hammer_nails | 4 | 1,071 | 861,668 |
insert_batteries_into_device | 7 | 516 | 456,513 |
iron_garment | 33 | 517 | 2,277,751 |
clean_garment_with_lint_roller | 3 | 810 | 737,849 |
stack_napkins_in_holder | 5 | 497 | 545,816 |
nest_cups | 10 | 464 | 763,601 |
organize_objects_in_drawer | 5 | 95 | 115,637 |
pack_blueberries_in_bag | 17 | 485 | 1,533,417 |
pack_object_in_storage_bag | 9 | 311 | 644,006 |
staple_paper | 9 | 695 | 605,253 |
relocate_tennis_ball | 1 | 450 | 157,112 |
place_fruits_in_basket | 8 | 416 | 286,988 |
place_pens_in_holder | 11 | 399 | 427,274 |
place_coffee_filter_in_dripper | 21 | 784 | 1,786,030 |
insert_socket_module_into_board | 2 | 957 | 512,619 |
transfer_pills_between_cups | 9 | 479 | 239,561 |
pry_nails_from_board | 3 | 24 | 21,174 |
reorient_and_relocate_carton | 2 | 347 | 181,309 |
transfer_liquid_with_dropper | 12 | 360 | 655,829 |
transfer_salt_between_cups_with_spoon | 4 | 1,483 | 831,390 |
scoop_salt_from_jar_into_cup | 13 | 424 | 485,424 |
sort_utensils | 5 | 419 | 460,851 |
reposition_and_stack_blocks | 15 | 1,007 | 1,069,334 |
sweep_waste_into_dustpan | 10 | 609 | 516,260 |
seal_box_with_tape | 1 | 115 | 208,648 |
place_books_on_shelf | 9 | 151 | 133,230 |
collect_toys_into_basket | 5 | 84 | 86,296 |
rotate_bottle_cap | 17 | 583 | 497,695 |
unscrew_bottle_cap | 3 | 445 | 351,637 |
clean_knife_with_cloth | 2 | 292 | 246,287 |
play_tic_tac_toe | 16 | 521 | 1,317,513 |
tomato_boxed_lunch_packaging | 4 | 97 | 243,325 |
Install Git LFS before cloning from Hugging Face.
git lfs install
git clone https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
To clone metadata first and fetch large files later:
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
For a single task, use sparse checkout. This example downloads clean_plate_with_eraser:
git init SharpaDex-v1.0
cd SharpaDex-v1.0
git remote add origin https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
git sparse-checkout init
git sparse-checkout set clean_plate_with_eraser README.md
git pull origin main
Inspect meta/info.json to discover the exact schema and path templates for an export.
import json
from pathlib import Path
dataset_root = Path("SharpaDex-v1.0")
episode_root = (
dataset_root
/ "clean_plate_with_eraser"
/ "season_POC22027_2026_04_17_11_01_59_train"
/ "lerobot_v3.0"
)
with open(episode_root / "meta" / "info.json", "r") as f:
info = json.load(f)
print("episodes:", info["total_episodes"])
print("frames:", info["total_frames"])
print("fps:", info["fps"])
print("features:", list(info["features"]))
The repository uses a uniform task / season / format hierarchy. Every task is stored directly under the repository root.
SharpaDex-v1.0/
βββ README.md
βββ clean_plate_with_eraser/
β βββ season_POC22027_2026_04_17_11_01_59_train/
β β βββ lerobot_v3.0/
β β β βββ meta/
β β β β βββ info.json
β β β β βββ modality.json
β β β β βββ episodes/
β β β β βββ tasks.parquet
β β β β βββ subtasks.parquet
β β β βββ data/
β β β β βββ chunk-000/
β β β βββ videos/
β β β βββ observation.images.head_left/
β β β βββ observation.images.head_right/
β β β βββ observation.images.wrist_left/
β β β βββ observation.images.wrist_right/
β β β βββ observation.images.tactile_deform/
β β β βββ observation.images.tactile_raw/
β β βββ lerobot_v2.1/
β β βββ meta/
β β βββ data/
β β βββ videos/
β βββ season_.../
βββ cover_ball_with_cup/
βββ reposition_and_stack_blocks/
βββ play_tic_tac_toe/
βββ .../
| Part | Description |
|---|---|
meta/ | Dataset schema, episode metadata, statistics, tasks, subtasks, and annotations |
data/ | Frame-aligned robot data stored as Apache Parquet files |
videos/ | Per-camera MP4 video streams |
LeRobot v3.0 uses paths similar to:
data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet
videos/{video_key}/chunk-{chunk_index:03d}/file-{file_index:03d}.mp4
LeRobot v2.1 uses paths similar to:
data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet
videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4
All inspected seasons expose the same main feature set.
| Feature | Type | Shape | Description |
|---|---|---|---|
observation.state | float32 | 65 | Joint-space robot state |
action | float32 | 65 | Joint-space action target |
observation.state.joint_torque | float32 | 65 | Joint-torque signal. Arms and hands (dims 0β57) carry data; the torso dims 58β64 are always 0 |
observation.state.tcp | float32 | 24 | Left/right tool-center-point pose and force/torque; the force/torque slots are always 0 |
observation.state.tcp_pose | float32 | 12 | Left/right observed TCP poses, 6 components per arm |
action.tcp_pose | float32 | 12 | Left/right commanded TCP poses, 6 components per arm |
observation.tactile | float32 | 60 | 10 fingertips x 6-axis force/torque signal |
observation.images.* | video | varies | Six synchronized visual and tactile streams |
timestamp | float32 | 1 | Frame timestamp |
frame_index | int64 | 1 | Frame index within an episode |
episode_index | int64 | 1 | Episode index |
task_index | int64 | 1 | Task-description index |
subtask_index | int64 | 1 | Subtask-annotation index |
The 65D state, joint-torque, and action vectors use the following order:
| Range | Names | Meaning |
|---|---|---|
| 0-6 | left_arm_j0 to left_arm_j6 | Left arm joints |
| 7-28 | left_hand_j0 to left_hand_j21 | Left dexterous-hand joints |
| 29-35 | right_arm_j0 to right_arm_j6 | Right arm joints |
| 36-57 | right_hand_j0 to right_hand_j21 | Right dexterous-hand joints |
| 58-64 | motor_j0 to motor_j6 | Torso / motor-related joints |
observation.state.tcp_pose and action.tcp_pose are separate 12D float32 vectors. Components 0:6 contain the left-arm TCP pose and 6:12 contain the right-arm TCP pose.
The observation is read from the source state/left_arm/tcp_pose and state/right_arm/tcp_pose; the action is read from the corresponding action/.../tcp_pose streams. Each stream uses its own aligned_index. Source values and pose representation are preserved; commanded poses are not copied from observed poses or reconstructed using forward kinematics.
The existing 24D observation.state.tcp remains unchanged: left pose 0:6, left force/torque 6:12, right pose 12:18, right force/torque 18:24. Its two pose slices correspond to the new observed TCP-pose vector. The force/torque slices are 0 in every episode.
The export does not fully declare TCP units, reference frames or rotation convention (rotation_type is null). Use the acquisition/controller convention before geometric transformations; do not infer Euler angles or quaternions from the vector width alone.
| Feature key | Description | Shape |
|---|---|---|
observation.images.head_left | Left head camera | 480 x 480 x 3 |
observation.images.head_right | Right head camera | 480 x 480 x 3 |
observation.images.wrist_left | Left wrist camera | 480 x 480 x 3 |
observation.images.wrist_right | Right wrist camera | 480 x 480 x 3 |
observation.images.tactile_deform | Tactile deformation video | 480 x 1200 x 3 |
observation.images.tactile_raw | Raw tactile video | 480 x 1600 x 3 |
Video files are MP4 without audio. Codec may differ between exports; inspect the local files if your training stack has codec restrictions.
Every episode includes language annotations at two complementary levels: a global description of the complete task and temporally grounded descriptions of the subtasks performed during the trajectory. These annotations support language-conditioned policy learning, vision-language-action training, temporal grounding, skill discovery, hierarchical policy learning, and subtask-aware evaluation.
The episode-level global_task stores the available structured natural-language fields below:
| Component | Meaning | Example |
|---|---|---|
Task | Short task name | ClearPlate |
Instruction | Ordered description of the intended behavior | Pick up the plate and eraser, wipe the plate, then place both objects down |
Scene | Objects, layout, and manipulation context | A marked plate and a blackboard eraser are on the table |
Success | Completion criteria | The marks are removed and both objects are placed stably |
The same information is also exposed as separate fields under tags. All episodes have scene descriptions; 1,061 scene descriptions were supplemented from existing episode text and visual spot checks, with provenance recorded in the annotation metadata. Some of these episodes do not have separate instruction, success-criteria or SOP fields:
task_name
task_instruction
scene_description
success_criteria
score
SOP
Each episode is decomposed into language segments. A segment contains:
| Field | Description |
|---|---|
start_step, end_step | Frame-index interval for the subtask |
text | Natural-language description of the action phase |
task_skill | Compact semantic skill label such as pick, place, move, insert, fold, or wipe |
label | Annotation type: subtasks, or hand_actions for the per-hand action descriptions that play_tic_tac_toe carries under its step subtasks |
id | Episode-local subtask identifier |
Across the release, all 28,993 episodes contain language annotations. The dataset provides 217,642 temporal subtask segments spanning 28,920,254 frames, or approximately 89.3% of all frames. The segments use 45 nonempty skill labels; recovered descriptions may not have a separate skill label. Frames outside a fine-grained segment remain associated with the episode-level task description.
For example, a plate-cleaning trajectory is decomposed into phases such as:
Pick up the plate from the table with the left hand. | Skill: pick
Pick up the blackboard eraser with the right hand. | Skill: pick
Wipe away the dirty marks while the left hand holds the plate. | Skill: wipe
Place the plate and the eraser back on the table. | Skill: place
| Metadata | Purpose |
|---|---|
meta/annotations.jsonl | Per-episode global task, structured tags, temporal segments, frame ranges, and source identifiers |
meta/tasks.jsonl / tasks.parquet | Mapping from task_index to the global task text |
meta/subtasks.jsonl / subtasks.parquet | Mapping from subtask_index to subtask text and skill |
Frame feature task_index | Connects each frame to its global task description |
Frame feature subtask_index | Connects each frame to its subtask annotation |
The v2.1 export stores task and subtask lookup tables as JSONL; v3.0 stores the corresponding tables as Parquet. annotations.jsonl is included with both exports for direct episode-level inspection.
The following example reads the global description and temporally grounded language from the first annotated episode:
import json
from pathlib import Path
meta_root = Path(
"SharpaDex-v1.0/clean_plate_with_eraser/"
"season_POC22027_2026_04_17_11_01_59_train/"
"lerobot_v3.0/meta"
)
with open(meta_root / "annotations.jsonl", "r") as f:
annotation = json.loads(next(f))
print(annotation["global_task"])
for segment in annotation["language_segments"]:
print(
segment["start_step"],
segment["end_step"],
segment["task_skill"],
segment["text"],
)
When constructing training samples, use task_index for episode-level language conditioning and subtask_index or the explicit start_step / end_step intervals for phase-level conditioning.
The dataset provides tactile information in structured numeric and image-based forms:
observation.tactile contains 60 values: left/right thumb, index, middle, ring, and little fingertips, each with fx, fy, fz, tx, ty, and tz.observation.images.tactile_deform visualizes contact-induced deformation patterns.observation.images.tactile_raw preserves the raw tactile camera layout for custom preprocessing and representation learning.All tactile modalities are synchronized with visual observations, proprioception, and actions at 30 FPS. The 60D signal provides a compact tactile representation; the tactile video streams provide spatially resolved observations for models designed to process the additional input resolution.
For policy learning, a typical configuration is:
observation.images.* streamsobservation.stateobservation.state.joint_torque) and observation.tactileobservation.images.tactile_deform and/or observation.images.tactile_rawaction, or action.tcp_pose for a TCP-based action representationFor evaluation, split by collection season rather than randomly splitting frames. This reduces temporal leakage and avoids placing closely related demonstrations from the same collection session in both training and evaluation sets. For multi-task experiments, additionally report held-out tasks or task families when measuring cross-task generalization.
lerobot_v3.0 and lerobot_v2.1.This dataset is released under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). Commercial use is prohibited under this license. You may share and adapt the dataset for non-commercial purposes only, provided that you give appropriate attribution, include a link to the license, and indicate whether changes were made.
If this dataset contributes to your research, please cite or acknowledge the dataset:
@misc{sharpadex_v1_2026,
title = {SharpaDex v1.0: Large-Scale Bimanual Dexterous Manipulation Demonstrations},
author = {{Sharpa}},
howpublished = {\url{https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0}},
year = {2026}
}
A multimodal dataset of real-world teleoperated demonstrations for bimanual dexterous manipulation.
11
500 commits
updated Oct 19, 2026
A multimodal dataset of real-world teleoperated demonstrations for bimanual dexterous manipulation.
Overview Β· Get Started Β· Tasks Β· Examples Β· Features Β· Language Β· Citation
An animated overview of 56 tasks in a uniform 8 Γ 7 grid, with head-camera and wrist-camera observations distributed throughout the montage. It spans assembly, tool use, deformable-object manipulation, cleaning, material transfer, and long-horizon activities. Open MP4.
SharpaDex v1.0 is a real-world teleoperation dataset for bimanual dexterous manipulation. It contains 28,993 demonstration episodes across 59 manipulation tasks, comprising 32,396,172 frames (approximately 300.0 hours at 30 FPS).
Data were collected through human teleoperation of a real bimanual robotic system with two 7-DoF arms, two 22-DoF dexterous hands, four RGB cameras, and fingertip tactile sensors. Each episode provides synchronized joint state, joint torque, tool-center-point state, observed and commanded TCP poses, action, numeric tactile measurements, RGB video, tactile video, and temporally aligned language annotations.
The task set covers object rearrangement, articulated-object interaction, assembly, tool use, deformable-object manipulation, packaging, cleaning, and long-horizon sequential manipulation. The data are distributed in LeRobot v3.0 and v2.1 formats for research on imitation learning, visuomotor control, vision-language-action models, visual-tactile learning, and hierarchical policy learning.
| Tasks | Episodes | Duration | Frequency | Video streams | Language segments |
|---|---|---|---|---|---|
| 59 | 28,993 | 300.0 hours | 30 FPS | 6 | 217,642 |
| Modality | Content |
|---|---|
| Robot | 65D joint state, 65D action, 65D joint torque (58 dims carry data; the 7 torso dims are 0), 24D TCP state (pose; its force slots are 0), and separate 12D observed / commanded TCP poses |
| Vision | Two head cameras and two wrist cameras |
| Tactile | 60D force/torque signal, deformation video, and raw tactile video |
| Language | Structured task descriptions, frame-aligned subtasks, and 45 skill labels |
| Format | LeRobot v3.0 and v2.1 for every released season |
Version note: v3.0 and v2.1 are two exports of the same demonstrations. Dataset scale must be reported as 28,993 episodes and 32,396,172 frames, not the sum of both exports.
| Item | Value |
|---|---|
| Manipulation tasks | 59 |
| Collection seasons | 495 |
| Episodes (one export) | 28,993 |
| Frames (one export) | 32,396,172 |
| Approximate duration at 30 FPS | 300.0 hours |
| LeRobot v3.0 seasons / episodes | 495 / 28,993 |
| LeRobot v2.1 seasons / episodes | 495 / 28,993 |
| FPS | 30 |
| Synchronized video streams | 6 |
| State / action dimension | 65 |
| Joint-torque dimension | 65 (arms and hands 58; torso 7, always 0) |
| TCP-state dimension | 24 (pose 12; force/torque 12, always 0) |
| Observed / commanded TCP-pose dimension | 12 / 12 |
| Tactile-signal dimension | 60 |
| Episodes with global language annotations | 28,993 (100%) |
| Temporally grounded language segments | 217,642 |
| Frames covered by temporal language segments | 28,920,254 (89.3%) |
| Distinct skill labels | 45 |
For new projects, we recommend starting with lerobot_v3.0. The lerobot_v2.1 export is provided for compatibility with pipelines that depend on the older LeRobot layout.
The previews below show synchronized observations from a real-robot teleoperation episode of deal_playing_cards (season POC22007_2026_03_26_15_55_47_train, episode 12, source interval 5β25 seconds). Each clip is displayed at 2x playback speed. The MP4 links remain available when animated GIF playback is disabled by the Markdown viewer.
Task directories use lowercase snake_case names with an action-object-target structure. Counts refer to one format version (v3.0); v2.1 contains the corresponding demonstrations.
| Task | Seasons | Episodes | Frames |
|---|---|---|---|
insert_batteries_into_charger | 3 | 458 | 841,645 |
scrub_cup_interior | 2 | 481 | 314,401 |
insert_plug_into_socket | 6 | 416 | 183,726 |
assemble_gears_on_base | 11 | 1,488 | 983,123 |
clean_plate_with_eraser | 5 | 343 | 190,467 |
tighten_bottle_cap | 7 | 131 | 139,693 |
secure_coiled_cable_with_velcro_tie | 10 | 473 | 632,425 |
collect_waste_into_bin | 8 | 508 | 621,140 |
deal_playing_cards | 23 | 1,088 | 2,074,644 |
empty_dustpan_into_bin | 10 | 488 | 379,585 |
cover_ball_with_cup | 5 | 488 | 188,956 |
insert_knife_into_cutlery_bin | 4 | 495 | 232,113 |
place_ball_in_box | 3 | 115 | 40,672 |
place_ball_in_cup_then_cup_in_box | 4 | 456 | 252,933 |
place_cup_on_plate | 4 | 429 | 149,882 |
place_knife_and_fork_on_plate | 8 | 461 | 314,324 |
stack_two_plates | 4 | 491 | 185,481 |
remove_block_from_box | 5 | 388 | 142,321 |
reorient_cup_upright | 5 | 420 | 151,573 |
fit_trash_bag_into_bin | 47 | 656 | 852,443 |
turn_book_pages | 7 | 65 | 87,056 |
fold_and_close_box | 7 | 537 | 1,008,242 |
hang_garment_on_hanger | 15 | 521 | 979,299 |
form_kraft_paper_box | 5 | 455 | 775,252 |
close_kraft_paper_box | 5 | 645 | 693,683 |
fold_towel | 3 | 459 | 547,201 |
grind_medicine_with_mortar_and_pestle | 4 | 131 | 176,595 |
hammer_nails | 4 | 1,071 | 861,668 |
insert_batteries_into_device | 7 | 516 | 456,513 |
iron_garment | 33 | 517 | 2,277,751 |
clean_garment_with_lint_roller | 3 | 810 | 737,849 |
stack_napkins_in_holder | 5 | 497 | 545,816 |
nest_cups | 10 | 464 | 763,601 |
organize_objects_in_drawer | 5 | 95 | 115,637 |
pack_blueberries_in_bag | 17 | 485 | 1,533,417 |
pack_object_in_storage_bag | 9 | 311 | 644,006 |
staple_paper | 9 | 695 | 605,253 |
relocate_tennis_ball | 1 | 450 | 157,112 |
place_fruits_in_basket | 8 | 416 | 286,988 |
place_pens_in_holder | 11 | 399 | 427,274 |
place_coffee_filter_in_dripper | 21 | 784 | 1,786,030 |
insert_socket_module_into_board | 2 | 957 | 512,619 |
transfer_pills_between_cups | 9 | 479 | 239,561 |
pry_nails_from_board | 3 | 24 | 21,174 |
reorient_and_relocate_carton | 2 | 347 | 181,309 |
transfer_liquid_with_dropper | 12 | 360 | 655,829 |
transfer_salt_between_cups_with_spoon | 4 | 1,483 | 831,390 |
scoop_salt_from_jar_into_cup | 13 | 424 | 485,424 |
sort_utensils | 5 | 419 | 460,851 |
reposition_and_stack_blocks | 15 | 1,007 | 1,069,334 |
sweep_waste_into_dustpan | 10 | 609 | 516,260 |
seal_box_with_tape | 1 | 115 | 208,648 |
place_books_on_shelf | 9 | 151 | 133,230 |
collect_toys_into_basket | 5 | 84 | 86,296 |
rotate_bottle_cap | 17 | 583 | 497,695 |
unscrew_bottle_cap | 3 | 445 | 351,637 |
clean_knife_with_cloth | 2 | 292 | 246,287 |
play_tic_tac_toe | 16 | 521 | 1,317,513 |
tomato_boxed_lunch_packaging | 4 | 97 | 243,325 |
Install Git LFS before cloning from Hugging Face.
git lfs install
git clone https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
To clone metadata first and fetch large files later:
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
For a single task, use sparse checkout. This example downloads clean_plate_with_eraser:
git init SharpaDex-v1.0
cd SharpaDex-v1.0
git remote add origin https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0
git sparse-checkout init
git sparse-checkout set clean_plate_with_eraser README.md
git pull origin main
Inspect meta/info.json to discover the exact schema and path templates for an export.
import json
from pathlib import Path
dataset_root = Path("SharpaDex-v1.0")
episode_root = (
dataset_root
/ "clean_plate_with_eraser"
/ "season_POC22027_2026_04_17_11_01_59_train"
/ "lerobot_v3.0"
)
with open(episode_root / "meta" / "info.json", "r") as f:
info = json.load(f)
print("episodes:", info["total_episodes"])
print("frames:", info["total_frames"])
print("fps:", info["fps"])
print("features:", list(info["features"]))
The repository uses a uniform task / season / format hierarchy. Every task is stored directly under the repository root.
SharpaDex-v1.0/
βββ README.md
βββ clean_plate_with_eraser/
β βββ season_POC22027_2026_04_17_11_01_59_train/
β β βββ lerobot_v3.0/
β β β βββ meta/
β β β β βββ info.json
β β β β βββ modality.json
β β β β βββ episodes/
β β β β βββ tasks.parquet
β β β β βββ subtasks.parquet
β β β βββ data/
β β β β βββ chunk-000/
β β β βββ videos/
β β β βββ observation.images.head_left/
β β β βββ observation.images.head_right/
β β β βββ observation.images.wrist_left/
β β β βββ observation.images.wrist_right/
β β β βββ observation.images.tactile_deform/
β β β βββ observation.images.tactile_raw/
β β βββ lerobot_v2.1/
β β βββ meta/
β β βββ data/
β β βββ videos/
β βββ season_.../
βββ cover_ball_with_cup/
βββ reposition_and_stack_blocks/
βββ play_tic_tac_toe/
βββ .../
| Part | Description |
|---|---|
meta/ | Dataset schema, episode metadata, statistics, tasks, subtasks, and annotations |
data/ | Frame-aligned robot data stored as Apache Parquet files |
videos/ | Per-camera MP4 video streams |
LeRobot v3.0 uses paths similar to:
data/chunk-{chunk_index:03d}/file-{file_index:03d}.parquet
videos/{video_key}/chunk-{chunk_index:03d}/file-{file_index:03d}.mp4
LeRobot v2.1 uses paths similar to:
data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet
videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4
All inspected seasons expose the same main feature set.
| Feature | Type | Shape | Description |
|---|---|---|---|
observation.state | float32 | 65 | Joint-space robot state |
action | float32 | 65 | Joint-space action target |
observation.state.joint_torque | float32 | 65 | Joint-torque signal. Arms and hands (dims 0β57) carry data; the torso dims 58β64 are always 0 |
observation.state.tcp | float32 | 24 | Left/right tool-center-point pose and force/torque; the force/torque slots are always 0 |
observation.state.tcp_pose | float32 | 12 | Left/right observed TCP poses, 6 components per arm |
action.tcp_pose | float32 | 12 | Left/right commanded TCP poses, 6 components per arm |
observation.tactile | float32 | 60 | 10 fingertips x 6-axis force/torque signal |
observation.images.* | video | varies | Six synchronized visual and tactile streams |
timestamp | float32 | 1 | Frame timestamp |
frame_index | int64 | 1 | Frame index within an episode |
episode_index | int64 | 1 | Episode index |
task_index | int64 | 1 | Task-description index |
subtask_index | int64 | 1 | Subtask-annotation index |
The 65D state, joint-torque, and action vectors use the following order:
| Range | Names | Meaning |
|---|---|---|
| 0-6 | left_arm_j0 to left_arm_j6 | Left arm joints |
| 7-28 | left_hand_j0 to left_hand_j21 | Left dexterous-hand joints |
| 29-35 | right_arm_j0 to right_arm_j6 | Right arm joints |
| 36-57 | right_hand_j0 to right_hand_j21 | Right dexterous-hand joints |
| 58-64 | motor_j0 to motor_j6 | Torso / motor-related joints |
observation.state.tcp_pose and action.tcp_pose are separate 12D float32 vectors. Components 0:6 contain the left-arm TCP pose and 6:12 contain the right-arm TCP pose.
The observation is read from the source state/left_arm/tcp_pose and state/right_arm/tcp_pose; the action is read from the corresponding action/.../tcp_pose streams. Each stream uses its own aligned_index. Source values and pose representation are preserved; commanded poses are not copied from observed poses or reconstructed using forward kinematics.
The existing 24D observation.state.tcp remains unchanged: left pose 0:6, left force/torque 6:12, right pose 12:18, right force/torque 18:24. Its two pose slices correspond to the new observed TCP-pose vector. The force/torque slices are 0 in every episode.
The export does not fully declare TCP units, reference frames or rotation convention (rotation_type is null). Use the acquisition/controller convention before geometric transformations; do not infer Euler angles or quaternions from the vector width alone.
| Feature key | Description | Shape |
|---|---|---|
observation.images.head_left | Left head camera | 480 x 480 x 3 |
observation.images.head_right | Right head camera | 480 x 480 x 3 |
observation.images.wrist_left | Left wrist camera | 480 x 480 x 3 |
observation.images.wrist_right | Right wrist camera | 480 x 480 x 3 |
observation.images.tactile_deform | Tactile deformation video | 480 x 1200 x 3 |
observation.images.tactile_raw | Raw tactile video | 480 x 1600 x 3 |
Video files are MP4 without audio. Codec may differ between exports; inspect the local files if your training stack has codec restrictions.
Every episode includes language annotations at two complementary levels: a global description of the complete task and temporally grounded descriptions of the subtasks performed during the trajectory. These annotations support language-conditioned policy learning, vision-language-action training, temporal grounding, skill discovery, hierarchical policy learning, and subtask-aware evaluation.
The episode-level global_task stores the available structured natural-language fields below:
| Component | Meaning | Example |
|---|---|---|
Task | Short task name | ClearPlate |
Instruction | Ordered description of the intended behavior | Pick up the plate and eraser, wipe the plate, then place both objects down |
Scene | Objects, layout, and manipulation context | A marked plate and a blackboard eraser are on the table |
Success | Completion criteria | The marks are removed and both objects are placed stably |
The same information is also exposed as separate fields under tags. All episodes have scene descriptions; 1,061 scene descriptions were supplemented from existing episode text and visual spot checks, with provenance recorded in the annotation metadata. Some of these episodes do not have separate instruction, success-criteria or SOP fields:
task_name
task_instruction
scene_description
success_criteria
score
SOP
Each episode is decomposed into language segments. A segment contains:
| Field | Description |
|---|---|
start_step, end_step | Frame-index interval for the subtask |
text | Natural-language description of the action phase |
task_skill | Compact semantic skill label such as pick, place, move, insert, fold, or wipe |
label | Annotation type: subtasks, or hand_actions for the per-hand action descriptions that play_tic_tac_toe carries under its step subtasks |
id | Episode-local subtask identifier |
Across the release, all 28,993 episodes contain language annotations. The dataset provides 217,642 temporal subtask segments spanning 28,920,254 frames, or approximately 89.3% of all frames. The segments use 45 nonempty skill labels; recovered descriptions may not have a separate skill label. Frames outside a fine-grained segment remain associated with the episode-level task description.
For example, a plate-cleaning trajectory is decomposed into phases such as:
Pick up the plate from the table with the left hand. | Skill: pick
Pick up the blackboard eraser with the right hand. | Skill: pick
Wipe away the dirty marks while the left hand holds the plate. | Skill: wipe
Place the plate and the eraser back on the table. | Skill: place
| Metadata | Purpose |
|---|---|
meta/annotations.jsonl | Per-episode global task, structured tags, temporal segments, frame ranges, and source identifiers |
meta/tasks.jsonl / tasks.parquet | Mapping from task_index to the global task text |
meta/subtasks.jsonl / subtasks.parquet | Mapping from subtask_index to subtask text and skill |
Frame feature task_index | Connects each frame to its global task description |
Frame feature subtask_index | Connects each frame to its subtask annotation |
The v2.1 export stores task and subtask lookup tables as JSONL; v3.0 stores the corresponding tables as Parquet. annotations.jsonl is included with both exports for direct episode-level inspection.
The following example reads the global description and temporally grounded language from the first annotated episode:
import json
from pathlib import Path
meta_root = Path(
"SharpaDex-v1.0/clean_plate_with_eraser/"
"season_POC22027_2026_04_17_11_01_59_train/"
"lerobot_v3.0/meta"
)
with open(meta_root / "annotations.jsonl", "r") as f:
annotation = json.loads(next(f))
print(annotation["global_task"])
for segment in annotation["language_segments"]:
print(
segment["start_step"],
segment["end_step"],
segment["task_skill"],
segment["text"],
)
When constructing training samples, use task_index for episode-level language conditioning and subtask_index or the explicit start_step / end_step intervals for phase-level conditioning.
The dataset provides tactile information in structured numeric and image-based forms:
observation.tactile contains 60 values: left/right thumb, index, middle, ring, and little fingertips, each with fx, fy, fz, tx, ty, and tz.observation.images.tactile_deform visualizes contact-induced deformation patterns.observation.images.tactile_raw preserves the raw tactile camera layout for custom preprocessing and representation learning.All tactile modalities are synchronized with visual observations, proprioception, and actions at 30 FPS. The 60D signal provides a compact tactile representation; the tactile video streams provide spatially resolved observations for models designed to process the additional input resolution.
For policy learning, a typical configuration is:
observation.images.* streamsobservation.stateobservation.state.joint_torque) and observation.tactileobservation.images.tactile_deform and/or observation.images.tactile_rawaction, or action.tcp_pose for a TCP-based action representationFor evaluation, split by collection season rather than randomly splitting frames. This reduces temporal leakage and avoids placing closely related demonstrations from the same collection session in both training and evaluation sets. For multi-task experiments, additionally report held-out tasks or task families when measuring cross-task generalization.
lerobot_v3.0 and lerobot_v2.1.This dataset is released under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). Commercial use is prohibited under this license. You may share and adapt the dataset for non-commercial purposes only, provided that you give appropriate attribution, include a link to the license, and indicate whether changes were made.
If this dataset contributes to your research, please cite or acknowledge the dataset:
@misc{sharpadex_v1_2026,
title = {SharpaDex v1.0: Large-Scale Bimanual Dexterous Manipulation Demonstrations},
author = {{Sharpa}},
howpublished = {\url{https://huggingface.co/datasets/Sharpa-Robotics/SharpaDex-v1.0}},
year = {2026}
}