shailes-h/yam_bimanual_manipulation
YAM Bimanual Manipulation Real-robot demonstrations for three bimanual manipulation tasks, collected on a YAM dual-arm platform and stored in LeRobot v3.0 format. Each task is a self-contained LeRobot dataset in its own top-level directory: Directory Task Episodes Frames Size blocks_filtered/ Put all blocks into the box. 97 136,489 2.3 GB dustpan_filtered/ Clean the table using the dust pan. 100 58,018 773 MB transfer_filtered/ Transfer the egg from the pan into… See the full description on the dataset page: https://huggingface.co/datasets/shailes-h/yam_bimanual_manipulation.
YAM Bimanual Manipulation
Real-robot demonstrations for three bimanual manipulation tasks, collected on a YAM dual-arm platform and stored in LeRobot v3.0 format.
Each task is a self-contained LeRobot dataset in its own top-level directory:
_filtered denotes that failed and truncated demonstrations were removed from the raw collection; every episode here runs to task completion.
Common format
All three share one recording setup:
Features
Both an end-effector and a joint-space view of the same trajectories are stored, so the data can drive either control convention without reprocessing.
16-D end-effector layout
Left arm at offset 0, right arm at offset 8. Each arm is:
[ x, y, z, qw, qx, qy, qz, gripper ]
0 1 2 3 4 5 6 7Quaternions are `w`-first (qw, qx, qy, qz), not the xyzw ordering used by SciPy and ROS — convert before feeding these into either.
14-D joint layout
Left arm at offset 0, right arm at offset 7; each arm is [joint_0 … joint_5, gripper].
Loading
Because the three datasets live in subdirectories, LeRobotDataset cannot load this repo by id alone — it expects meta/, data/ and videos/ at the root. Download the one you want, then point root at it:
from huggingface_hub import snapshot_download
from lerobot.datasets.lerobot_dataset import LeRobotDataset
task = "blocks_filtered" # or dustpan_filtered / transfer_filtered
local = snapshot_download(
repo_id="chinchinati/yam_bimanual_manipulation",
repo_type="dataset",
allow_patterns=f"{task}/*",
)
ds = LeRobotDataset(repo_id=task, root=f"{local}/{task}")
print(ds[0]["observation.state_eef_absolute"].shape) # (16,)Videos are AV1-encoded; decoding needs a build of torchcodec/ffmpeg with AV1 support.
