Merged Pour Coke Dataset (With Videos)
This dataset combines three pour coke datasets for disturbance recovery research:
pour_coke_static - Clean demonstrations (episodes 0-49)
pour_coke_perturbate_source - Source perturbations on black cup (episodes 50-69)
pour_coke_perturbate_target - Target perturbations on white cup (episodes 70-89)
Dataset Information
Total Episodes : 90
Total Frames : 53,644
Robot : SO-101 Follower (6-DOF arm)
FPS : 15
LeRobot Version : v3.0
Videos : Included (3 camera views, MP4 format)
Task Description
Pick up black cup and pour into white cup
Episode Breakdown
Bucket A: Clean Demonstrations (Episodes 0-49)
50 episodes of clean, unperturbed demonstrations
Static environment with no disturbances
Baseline behavior for comparison
Bucket B1: Source Perturbations (Episodes 50-69)
20 episodes with perturbations to the black cup (source object)
Grasp disturbances during approach phase
Tests recovery from source object displacement
Bucket B2: Target Perturbations (Episodes 70-89)
20 episodes with perturbations to the white cup (target object)
Target disturbances during alignment phase
Tests recovery from target object displacement
Robot Configuration
The SO-101 robot has 6 degrees of freedom:
shoulder_pan - Base rotation (yaw)
shoulder_lift - Shoulder pitch
elbow_flex - Elbow pitch
wrist_flex - Wrist pitch
wrist_roll - Wrist rotation (roll)
gripper - Gripper open/close (0 = closed, higher = open)
Camera Views
The dataset includes 3 synchronized camera views:
shoulder_base_wide_view - Wide angle view from shoulder base
workspace_variable_view - Adjustable workspace overview
wrist_roll_top_down - Top-down view from wrist
All videos are stored as MP4 files at 15 FPS, 640x480 resolution.
Data Format
Each sample contains:
1 {
2 'action' : [ float32 ] * 6 , # Target joint positions
3 'observation.state' : [ float32 ] * 6 , # Current joint positions
4 'timestamp' : float32 , # Time in seconds
5 'frame_index' : int64 , # Frame index within episode
6 'episode_index' : int64 , # Episode identifier (0-89)
7 'index' : int64 , # Global frame index
8 'task_index' : int64 # Task identifier (0)
9 }
Video Organization
Videos are organized by camera and episode chunk:
videos/
├── observation.images.shoulder_base_wide_view/
│ ├── chunk-000/ # Episodes 0-49
│ ├── chunk-050/ # Episodes 50-69
│ └── chunk-070/ # Episodes 70-89
├── observation.images.workspace_variable_view/
│ ├── chunk-000/
│ ├── chunk-050/
│ └── chunk-070/
└── observation.images.wrist_roll_top_down/
├── chunk-000/
├── chunk-050/
└── chunk-070/
Usage
Load the dataset
1 from datasets import load_dataset
2
3 # Load the full dataset
4 dataset = load_dataset ( "bencxr/merged_pour_coke_with_videos" )
5
6 # Access training split
7 train = dataset [ 'train' ]
8
9 # Get a sample
10 sample = train [ 0 ]
11 print ( f"Episode: { sample [ 'episode_index' ] } " )
12 print ( f"Action: { sample [ 'action' ] } " )
13 print ( f"State: { sample [ 'observation.state' ] } " )
Access videos
Videos are stored separately in the videos/ directory. To access them:
1 from pathlib import Path
2 from huggingface_hub import snapshot_download
3 import cv2
4
5 # Download the entire dataset including videos
6 dataset_path = snapshot_download (
7 repo_id = "bencxr/merged_pour_coke_with_videos" ,
8 repo_type = "dataset"
9 )
10
11 # Load a video
12 video_path = Path ( dataset_path ) / "videos/observation.images.shoulder_base_wide_view/chunk-000/file-000.mp4"
13 cap = cv2 . VideoCapture ( str ( video_path ) )
14
15 # Read frames
16 ret , frame = cap . read ( )
Using with LeRobot
This dataset follows LeRobot v3.0 format and can be used with the LeRobot library:
1 from lerobot . common . datasets . lerobot_dataset import LeRobotDataset
2
3 dataset = LeRobotDataset ( "bencxr/merged_pour_coke_with_videos" )
Use Cases
This dataset is designed for:
Disturbance Recovery Research : Study how policies handle unexpected object displacements
Robust Policy Learning : Train policies that generalize to perturbations
Stage-Aware Reward Modeling (SARM) : Learn task-stage-specific reward models
Behavior Cloning with Recovery : Train policies with both clean and disturbed demonstrations
Sim-to-Real Transfer : Evaluate robustness to real-world disturbances
Citation
If you use this dataset, please cite:
1 @dataset{merged_pour_coke_2026,
2 title={Merged Pour Coke Dataset with Disturbance Recovery},
3 author={Dhabaria, Anjali and others},
4 year={2026},
5 publisher={HuggingFace},
6 howpublished={\url{https://huggingface.co/datasets/bencxr/merged_pour_coke_with_videos}}
7 }
Source Datasets
This is a merged version of:
License
Apache 2.0
Acknowledgments
Original datasets collected by Anjali Dhabaria. This merged version was created for disturbance recovery research in robotic manipulation.
Created
Dataset merged and prepared on 2026-01-31.