Paper · 2024-03-19 · cs.RO
DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset
DROID is a robot manipulation dataset of 76k successful Franka demonstrations (350 h) across 564 scenes, collected by 50 people over 12 months. Co-training a diffusion policy on a 50/50 mix with it beats no co-training and Open X-Embodiment co-training; the author-reported gains are 22% absolute in-distribution and 17% out-of-distribution.
Imitation learningDiffusion modelsDataset curationCalibrationrobot-learningdatasetimitation-learningdiffusion-policy
arXivPDFCodeMarkdown11 min read
AI-compiled by claude-haiku-5-5 on 2026-10-24, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Robots that learn to manipulate objects usually learn by copying recorded demonstrations. Most such recordings come from a few rooms with the same table and the same camera positions, so a policy trained on them often fails when the lighting, the objects or the scene change.
DROID is a large set of demonstrations recorded in many different places. Many people used the same robot arm and the same recording setup, so the data stayed consistent while the scenes and tasks varied a lot. The authors also released camera calibration for much of the data, which tells you where each camera sits relative to the robot.
The authors tested whether the data helps. They mixed it with a small set of task-specific demonstrations while training a policy, and that policy did better than one trained on the small set alone, and better than one mixed with a different large robot dataset. The gains held both when the test setting matched the training tasks and when the scene or objects changed.
TL;DR
- DROID: 76k successful teleoperated demonstrations, 350 hours, 564 scenes, collected on one shared Franka hardware stack across 13 institutions §1 §3.
- Each episode has three stereo camera streams, robot state and crowdsourced language instructions §3.1 §3.2 app. B.
- Co-training a diffusion policy 50/50 with DROID beats no co-training and co-training with Open X-Embodiment on six lab, office and kitchen tasks §5.2.
- Author-reported margins: 22% absolute in-distribution and 17% out-of-distribution over the next-best method, averaged over tasks §5.2.
- Released under CC BY 4.0. Code is MIT-licensed (robomimic fork). Calibration is post-hoc and partly automatic, so treat it as an estimate app. G.
Problem
Policies generalize poorly when the training data covers few scenes, tasks and viewpoints. Earlier large robot datasets were collected mostly in controlled, lab-like settings with fixed cameras. Collecting diverse data at scale is hard because of logistics, safety and the cost of hardware and supervision §1.
The paper measures diversity along five axes: tasks (verbs), objects, scenes, camera viewpoints and interaction locations §4. It also argues that a dataset is only useful if the same hardware and protocol can be reproduced across labs §3.
Method
Data collection. Each collector moves a Franka Panda arm with a Robotiq gripper onto a height-adjustable desk, sets up two exterior Zed 2 stereo cameras and a wrist-mounted Zed Mini, and teleoperates with a Meta Quest 2 headset §3.1. Actions are recorded in joint space and end-effector space at 15 Hz §3.1 app. B. The collector calibrates the exterior cameras with a checkerboard and OpenCV, then enters the tasks feasible in the current scene. A GUI samples tasks at random so that easy tasks are not over-represented §3.2 app. A. The GUI also prompts random scene changes such as moving the base or the cameras §3.2. A collector stays in one scene for up to about 100 trajectories or 20 minutes before moving on §3.2.
Dataset content. Each trajectory holds three 1280×720 stereo RGB streams, joint and end-effector state, gripper state, extrinsic calibration for both exterior cameras, building name, collector ID, a GPT-4V scene type and 1–3 crowdsourced instructions app. B §3.2. Unsuccessful trajectories (about 16k) are released but not counted in the 76k §3.2.
Analysis. Verbs are extracted from instructions with a semantic parser and de-duplicated with GPT-4 §4. Scene types are labelled automatically with GPT-4V, using the prompt in app. C. A unique scene is defined as a substantial change to the robot's workspace, not a change of objects or external camera pose; duplicate scene IDs are merged within each robot-lab-building group app. D.
Policy learning. The policy is a diffusion policy, following the cited prior work §5.1. Two external views are downsampled to 128×128 and passed through an ImageNet-pretrained ResNet-50. A frozen DistilBERT embedding of the instruction and the robot state are concatenated with the visual features and passed through an MLP, then a U-Net diffusion head produces 16 action steps. Eight of them run open loop before the policy is queried again §5.1 [app. F.1]. The training batch is 50% in-domain demonstrations and 50% DROID trajectories, excluding those marked unsuccessful §5.1.
# Co-training batch [§5.1] [app. F.2]
# Input: in_domain (this task's demos), droid (successful DROID episodes)
# Output: one batch of 128 samples, half from each source
def sample_batch(in_domain, droid, batch_size=128):
# split the batch evenly between the two datasets [§5.1]
half = batch_size // 2
# in-domain half comes from this task's demonstrations [§5.1]
own = random_samples(in_domain, half)
# other half comes from successful DROID episodes [§5.1] [app. F.2]
shared = random_samples(droid, batch_size - half)
return concat(own, shared)# Policy forward pass [§5.1] [app. F.1]
# Input: two external RGB views, instruction, robot state
# Output: 16 action steps, of which the first 8 run open loop
def predict_actions(views, instruction, robot_state):
# downsample each view to 128 x 128 [§5.1]
small = [resize(view, 128) for view in views]
# colour jitter, then random 116 x 116 crop in training [app. F.1]
small = [random_crop(jitter(img), 116) for img in small]
# ImageNet-pretrained ResNet-50 encoder per view [§5.1]
visual = [resnet50(img) for img in small]
# frozen DistilBERT embedding of the instruction [§5.1]
language = distilbert(instruction)
# concatenate features and run the observation MLP [app. F.1]
features = mlp(concat(visual, language, robot_state))
# U-Net head denoises the action sequence with DDIM [app. F.1]
actions = ddim_denoise(unet, features, horizon=16)
return actionsCamera calibration (post-hoc). The released calibration has three sets §3.2 app. G.5:
- Camera-to-base for about 36k scenes, combining two methods. The first projects forward-kinematics keypoints with the existing extrinsics, runs SAM seeded by them, and compares the mask with a rendered robot silhouette (PyTorch3D). It keeps SAM masks with confidence above 0.65 and an IoU of at least 0.7 app. G.1. This gave about 30k scenes. The second runs a tuned CtRNet-X on all data with confidence thresholds 0.08 / 0.1 / 0.05, rejects outliers with a median-absolute-deviation rule at 2.5 MAD, and keeps scenes with mean reprojection error at most 20 app. G.2. This gave about 12k scenes.
- Camera-to-camera for all scenes, from a modified DUSt3R. Depth and intrinsics are fixed, and camera poses are refined to minimise 3D alignment error. Quality is the count of reciprocal nearest-neighbour 3D matches app. G.3.
- A superset of about 24k scenes where both cameras are calibrated to the base, using an IoU threshold of 0.6, reprojection error of 20 and the top 30% of match counts app. G.5.
Hyperparameters
Values for the policy and training come from the appendix table and the
text. "Code" entries are read from the official repository at code_commit
and are not stated in the paper.
| Name | Value | Where | Notes |
|---|---|---|---|
| optimizer | Adam | app. F.1 | L2 weight decay 0 diffusion_policy_config.py |
| learning rate | 1e-4 | app. F.1 diffusion_policy_config.py | |
| LR schedule | "Linear" (stated) | app. F.1 | code uses constant LR by default, see Paper vs code |
| batch size | 128 | app. F.1 | droid_runs_language_conditioned.py |
| training steps | 25,000; 50,000 for Cook Lentils OOD | app. F.1 | code sets epochs, not steps |
| EMA power | 0.75 | app. F.1 diffusion_policy_config.py | |
| input resolution | 128 × 128 | §5.1 app. F.1 | |
| random crop | 116 × 116 | app. F.1 droid_runs_language_conditioned.py | eval-time crop not stated |
| colour jitter | not stated | app. F.1 | applied, strength not stated |
| visual encoder | ResNet-50, ImageNet-pretrained | §5.1 app. F.1 | |
| visual feature dim | 512 | code only droid_runs_language_conditioned.py | not in the paper |
| language encoder | DistilBERT, frozen | §5.1 | code uses precomputed embedding droid_runs_language_conditioned.py |
| observation MLP | [1024, 512, 512] | app. F.1 | |
| U-Net hidden sizes | [256, 512, 1024] | app. F.1 diffusion_policy_config.py | |
| observation horizon | 2 | app. F.1 diffusion_policy_config.py | |
| prediction horizon | 16 | §5.1 app. F.1 | |
| action horizon (open loop) | 8 | §5.1 app. F.1 | |
| diffusion sampler | DDIM | app. F.1 | default config is DDPM, see Paper vs code |
| DDIM inference steps | not stated | code default 10 diffusion_policy_config.py | |
| noise samples | not stated | code DROID generator 8 droid_runs_language_conditioned.py; base default 1 diffusion_policy_config.py | |
| co-training mix | 50% in-domain, 50% DROID | §5.1 | |
| DROID episodes used | first 40K successful with language at training time | app. F.2 | not all 76k |
| scene-diversity subset | 7,362 trajectories | §5.3 app. F.2 | |
| demos per task | 50 to 150 | §5.1 app. E | per task, see table below |
Evaluation tasks, with in-domain demonstrations and the out-of-distribution (OOD) variant §5.1 app. E:
| Task | Setting | Demos | OOD variant |
|---|---|---|---|
| Close waffle maker | lab, short horizon | 70 | distractor objects |
| Place chips on plate | lab, short horizon | 50 | different chips, distractors |
| Put apple in pot | lab, medium horizon | 60 | extra plate as distractor |
| Toasting | lab, medium horizon | 150 | novel objects to toast |
| Clean up desk | office, long horizon | 50 | distractors on desk and in drawer |
| Cook lentils | kitchen, long horizon | 50 | distractors and camera shift |
Results
Author-reported. Setup: six tasks at four locations (lab, office, household), diffusion policy, 10 A/B rollouts per task and method, in-distribution (ID) and OOD evaluation §5.1 §5.2. The comparison baselines are no co-training and co-training with a curated subset of Open X-Embodiment (OXE) §5.2.
| Setting | Metric | Baseline | DROID co-training | Source |
|---|---|---|---|---|
| All tasks, in-distribution | success rate, averaged over tasks | next-best method | +22% absolute | §5.2 (co-training figure caption) |
| All tasks, out-of-distribution | success rate, averaged over tasks | next-best method | +17% absolute | §5.2 (co-training figure caption) |
| Introduction summary | average gain | OXE co-training | ~+20% | §1 |
| Scene diversity | OOD success | 20-scene subset (7,362 trajectories) | diverse-scene subset (7,362 trajectories) higher; numbers only in the figure | §5.3 |
Per-task numbers are only in the co-training figure, not in the text. The full DROID co-training matches or outperforms the subsampled one on all three tasks compared in §5.3 §5.3.
Paper vs code
Official code, at code_commit: the policy-learning repository
(github.com/droid-dataset/droid_policy_learning, linked from the project
page), a robomimic fork that imports a DROID helper package. The hardware
repository (github.com/droid-dataset/droid, also linked) was not checked.
The calibration pipeline is not in the policy repository: a search of it found
only a commented-out success check in convert_droid.py.
- Diffusion sampler. Paper: DDIM app. F.1. Default config: DDPM on, DDIM off diffusion_policy_config.py. The DROID generator turns DDIM on droid_runs_language_conditioned.py. The paper matches the generator, not the default config.
- Learning-rate schedule. Paper: "Linear" app. F.1. Code: no decay unless an epoch schedule is set, and the default schedule is empty diffusion_policy_config.py torch_utils.py. The DROID generator does not set one. Paper and code disagree; the code is what was run.
- Training length. Paper: 25,000 steps, 50,000 for Cook Lentils OOD
app. F.1. Code: epochs,
train.num_epochs= 100000 in the generator droid_runs_language_conditioned.py, and 600 in the helper default helper.py. Which one applies depends on call order (not traced). The step count cannot be checked from the code. - Camera views. Paper: RGB from "the two external cameras" §5.1. Code uses only the left image of each external camera; the right stereo images are commented out droid_runs_language_conditioned.py droid_runs_language_conditioned.py.
- Action space. Paper: absolute end-effector translation, rotation and gripper §5.1. Code: absolute position, a 6D rotation representation and gripper position droid_runs_language_conditioned.py. The paper does not name the rotation representation.
- Noise samples. Not stated in paper. Code: 8 in the DROID generator, 1 in the base config (see table).
- Success filter. Paper excludes unsuccessful trajectories from the
co-training data §5.1. The HDF5 converter's success filter is commented
out convert_droid.py; the HDF5
loader does not filter by success. The RLDS path does:
filter_successin rlds_utils.py, used in train.py. - Co-training mix. Paper: 50/50 §5.1. Code: a sample is weighted by its dataset weight divided by dataset length dataset.py, and dataset weights default to 1.0 train_utils.py. The DROID generator loads only one dataset; the two-dataset weights are commented out droid_runs_language_conditioned.py. A 50/50 mix must be set by the user.
- Segmentation. Not in paper. The DROID dataset class treats each HDF5 file as one demo and splits it at the first gripper close and open dataset.py dataset.py. If the gripper signal is absent, it uses the one-third and two-thirds points.
- Calibration. The paper's exact thresholds for the three calibration sets are in app. G, but the code is not in this repository, so they are unverified here.
Pitfalls
- Dataset size is inconsistent. The abstract says 84 tasks; the text macro used in the body gives 86 §1 [abstract]. The paper uses 76k trajectories for the dataset and 40K for the policy experiments app. F.2. Report whichever you use.
- Scene-type count is inconsistent. §4 says 10 scene types. The caption in app. C says 9. The prompt in app. C lists 11 labels plus "Unknown". Use the prompt labels if you reproduce the annotation.
- Scene count depends on dedup. The paper reports 2,080 raw scene IDs before merging app. D. The 564 figure comes after its heuristic merge, which is conservative and does not catch the same scene recorded by two robots app. D.
- "Clean up desk" eraser position differs. §5.1 says fixed; app. E says varied on a fixed schedule of positions and orientations.
- Failed trajectories count separately. About 16k unsuccessful episodes are included in the release but not counted in 76k §3.2. Filter explicitly when you train.
- Co-training uses a time-dependent subset. The 40K-episode subset is the "first 40K successful trajectories" for which language annotations were available at training time app. F.2. Rebuilding it later gives a different set.
- Joint policy for two tasks. Toasting and Close Waffle Maker share one in-domain policy, and their no-co-training baseline is trained on both app. F.2.
- Calibration numbers differ. The superset uses IoU 0.6 app. G.5, while the first camera-to-base filter uses IoU 0.7 app. G.1. Reprojection-error units are not stated. The CtRNet-X "tuned" hyperparameters are described as tuned for DROID, but the paper does not say how they were tuned app. G.2.
- Calibration generalises only partly. CtRNet-X was trained on Franka robots and its transfer to other robots is untested. DUSt3R fails on cluttered scenes with low overlap app. G.4.
- Evaluation is small. Ten A/B rollouts per task and method §5.2. The paper reports standard error only in the figure caption. Treat the per-task differences as noisy.
- Figure numbers are unreliable. The title block adjusts the figure counter after the teaser, so the source may number more than one figure "1". Cite by section here, not by figure number.
- Cost. The camera-to-base filter took about 1 day, and the CtRNet-X pass about 5 days, on 8 A100 GPUs app. G.1 app. G.2. Training cost is not stated.
Lineage
- Builds on: Open X-Embodiment (OXE) as a comparison dataset and the curated split used by Octo §5.2 app. F.2; Diffusion Policy for the policy §5.1; robomimic for the training code app. F.1; Polymetis for control §3.1; SAM, PyTorch3D, CtRNet-X and DUSt3R for calibration app. G.
- Compared against: no co-training (in-domain only) and OXE co-training §5.2.
- Superseded by: not stated.
Source and license
Adapted from “DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset” by Alexander Khazatsky, Karl Pertsch, Suraj Nair, Ashwin Balakrishna, Sudeep Dasari, Siddharth Karamcheti, Soroush Nasiriany, Mohan Kumar Srirama, Lawrence Yunliang Chen, Kirsty Ellis, Peter David Fagan, Joey Hejna, Masha Itkina, Marion Lepert, Yecheng Jason Ma, Patrick Tree Miller, Jimmy Wu, Suneel Belkhale, Shivin Dass, Huy Ha, Arhan Jain, Abraham Lee, Youngwoon Lee, Marius Memmel, Sungjae Park, Ilija Radosavovic, Kaiyuan Wang, Albert Zhan, Kevin Black, Cheng Chi, Kyle Beltran Hatch, Shan Lin, Jingpei Lu, Jean Mercat, Abdul Rehman, Pannag R Sanketi, Archit Sharma, Cody Simpson, Quan Vuong, Homer Rich Walke, Blake Wulfe, Ted Xiao, Jonathan Heewon Yang, Arefeh Yavary, Tony Z. Zhao, Christopher Agia, Rohan Baijal, Mateo Guaman Castro, Daphne Chen, Qiuyu Chen, Trinity Chung, Jaimyn Drake, Ethan Paul Foster, Jensen Gao, Vitor Guizilini, David Antonio Herrera, Minho Heo, Kyle Hsu, Jiaheng Hu, Muhammad Zubair Irshad, Donovon Jackson, Charlotte Le, Yunshuang Li, Kevin Lin, Roy Lin, Zehan Ma, Abhiram Maddukuri, Suvir Mirchandani, Daniel Morton, Tony Nguyen, Abigail O'Neill, Rosario Scalise, Derick Seale, Victor Son, Stephen Tian, Emi Tran, Andrew E. Wang, Yilin Wu, Annie Xie, Jingyun Yang, Patrick Yin, Yunchu Zhang, Osbert Bastani, Glen Berseth, Jeannette Bohg, Ken Goldberg, Abhinav Gupta, Abhishek Gupta, Dinesh Jayaraman, Joseph J Lim, Jitendra Malik, Roberto Martín-Martín, Subramanian Ramamoorthy, Dorsa Sadigh, Shuran Song, Jiajun Wu, Michael C. Yip, Yuke Zhu, Thomas Kollar, Sergey Levine, Chelsea Finn (arXiv:2403.12945), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/droid-dataset/droid_policy_learning at commit 9a29c832b4c8 (MIT). Any quoted code is shown under that license.