Dense bin picking with scanned household objects in MuJoCo

Updated 2026-09-18. Objects are Google Scanned Objects (1030 scans, V-HACD convex parts from kevinzakka/mujoco_scanned_objects). A tote is filled to the brim by pouring random objects in one at a time, the heap is audited for stability with nothing actuated, and then a scripted gripper picks from it. Picks are allowed to fail; what is judged is whether the physics stays correct while the pile is disturbed. Every number here is read from the run files.

D415 scripted expert update · 20 September 2026

Development results, not a solved expert. The offset-grasp isolated-bottle benchmark cleared 4/4 bins, with retries. The latest mixed-pile benchmark delivered 4/11 objects and cleared 0/4 bins. Four isolated episodes do not establish near-100% reliability. New video rollouts below are separately scored.

UR5 + OnRobot RG2 + D415 with the existing mount-v4 assembly. The test bin is 400 × 140 × 60 mm internally; the historical bin was 400 × 128 × 150 mm. Shallower walls improve access but also reduce the number of objects poured. The arm position controller and gripper actuator effort limits are unchanged. The expert uses privileged collision meshes, multiple grasp directions and depths, tilted and offset grasp candidates, collision checks, slip detection and retries.

Only supported, slow-moving objects deposited outside the bin near the destination count as successes. Merely reaching the drop pose does not count. Empty lifts, motion timeouts and slips remain. A conservative convex hull represents mount collisions; geometric pad overlap does not prove a stable grasp.

Recorded episodes

Full rollouts at real-time playback, sampled at 4 fps. Both views now use a 3D Gaussian background. External bin walls are opaque; the old textured-room external recordings have been replaced. Rendering changes do not change collision geometry or control. The original recordings did not save frame poses, so these replacements are fresh rollouts with updated scores. Wrist video is 320 × 180; external video is 640 × 480. These are fresh runs, not replays of the physics-only benchmark. GPU pile dynamics can differ between runs.

Isolated bottle, world 0

1/1 verified deposits; 2 attempts; fully cleared; 37.7 simulated seconds. Failure log.

External — 3DGS background + simulated foreground

D415 wrist — Gaussian/native composite

Mixed pile, world 0

1/2 verified deposits; 6 attempts; not fully cleared; 80.0 simulated seconds. Failure log.

External — 3DGS background + simulated foreground

D415 wrist — Gaussian/native composite

Mixed pile, world 1

2/4 verified deposits; 6 attempts; not fully cleared; 80.0 simulated seconds. Failure log.

External — 3DGS background + simulated foreground

D415 wrist — Gaussian/native composite

Measured results

Run / raw resultsMode PouredAttemptsVerified depositsFully cleared bins
shallow_single_60mmPhysics only4433/4
shallow_single_offsetPhysics only4944/4
shallow_pile_60mmPhysics only111140/4
shallow_offset_60mmPhysics only113040/4
shallow_exact_60mmPhysics only113140/4
site_d415_gs_singleVideo rollout1211/1
site_d415_gs_mixedVideo rollout61230/2

These are development versions, not controlled ablations. Attempts can include unfinished actions at the horizon. The legacy JSON field ejected means outside the bin without verified delivery, including objects still being carried; finished also includes exhausted candidates. Use bin_cleared for complete task success.

Development report · Simulator and expert contract. 16 regression tests passed, including external background compositing and pose preservation. No RL policy has been trained for this update.


Historical work below uses earlier geometry and policies. The old integrated pick counter did not verify successful deposits and can count objects that slipped before release; do not compare its “picks out” directly with the verified D415 results above.

1. Standalone MuJoCo study: filling and settling

Pouring 22 objects and settling

Settled means: with nothing actuated for 8 s, in the last second no object leaves the footprint, none moves faster than 20 mm/s or 0.5 rad/s, none drifts more than 3 mm, no object contact penetrates more than 5 mm, all state finite. 24 random fills per row, about 21 objects each in a 40×28×20 cm tote.

physicssettledobjectsejectedtail speed maxtail penetration maxpeak penetration
default: dt 1 ms, implicitfast, Newton, solref 0.01 s, margin 023/2420.50135 mm/s1.0 mm3.3 mm
solref 0.005 s21/2421.01111 mm/s1.7 mm2.4 mm
timestep 2 ms20/2420.42224 mm/s4.2 mm9.2 mm
solref 0.02 s (MuJoCo default)20/2420.2145 mm/s9.2 mm23.7 mm
noslip 5 iterations20/2421.5414 mm/s2.1 mm2.8 mm
Euler integrator21/2420.6142 mm/s1.1 mm4.9 mm

What mattered: mass from hull volume (the default density on overlapping parts made objects 3 to 6× too heavy), dropping degenerate V-HACD slivers (7.5% of parts; a 0.5 mm wedge sank 9 mm into the floor), zero collision margin, no free-joint damping or armature, and pouring with clearance under the object's true bounding radius (the scanned meshes have their origin at the base, not the centre). Full report: standalone README.

2. Standalone study: picking from the heap

Ten scripted picks (compliant floating gripper)

The gripper is welded softly to its target (20 ms time constant), so the pile can push it back, and squeezes with 40 N. Across 16 bins and 96 picks: 27 successes (28%), object-object penetration at most 13.6 mm, 2 samples where a neighbour moved faster than falling from its recent height could explain, 1 object ejected, no non-finite state.

picktargetlifted outpeak neighbour speedobject-object penetrationgripper squeeze penetrationanomalous samplesejected
1Twinlab_Premium_Creatine_Fuel_Powderyes0.35 m/s12.3 mm18.7 mm00
2Perricone_MD_AcylGlutathione_Deep_Creayes1.18 m/s13.6 mm4.4 mm00
3Cole_Hardware_Bowl_Scirocco_YellowBlueno0.24 m/s1.9 mm2.8 mm00
4Cole_Hardware_Bowl_Scirocco_YellowBlueno0.37 m/s1.7 mm2.0 mm00
5RESCUE_CREWno0.08 m/s0.6 mm0.9 mm00
6RESCUE_CREWno0.09 m/s1.0 mm1.1 mm00
7Nintendo_Yoshi_Action_Figureno2.12 m/s7.1 mm4.7 mm70
8Saccharomyces_Boulardii_MOS_Value_Sizeno0.30 m/s5.6 mm11.8 mm00
9Saccharomyces_Boulardii_MOS_Value_Sizeno0.33 m/s5.4 mm5.4 mm00
10Beetle_Adventure_Racing_Nintendo_64no0.00 m/s0.3 mm5.3 mm00

3. Ported to the real2sim scene: UR5 + RG2 on the table

Same objects and physics in the Gaussian-splat MuJoCo Warp scene used for the tube task. The on-table tote is 40×12.8×15 cm (the reachable band of the table is only 14 cm deep), objects are limited to 12 cm. The arm parks aside, the bin is poured full, the heap settles, then the scripted picker takes the highest object whose narrow width fits the RG2 jaws, closes with the measured pad calibration, lifts, and releases beside the bin. No object is ever pinned or teleported.

World 0: external view

World 0: wrist camera

World 1: external view

World 1: wrist camera

worldpouredpicks out / attemptsleft in binejectedobject-object penetrationrobot-object penetrationpeak neighbour speedanomalous samplesfiniteepisode
0100/151006.2 mm1.3 mm0.67 m/s0yes200 s
1103/14705.2 mm1.1 mm0.34 m/s0yes200 s

Failed grasps are expected with a 12.8 cm wide bin and a parallel gripper; the columns to read are the penetration, ejection, anomalous-speed and finite ones.

Files

Standalone README · fill audit (default physics) · pick audit · mjlab episode results · tube-sorting page