Tube bin picking: sim2real progress

Updated 26 September 2026. Goal: a vision policy that empties a box of 7–10 red tubes on the real UR5 + RG2 using only the wrist Intel RealSense D415 image and the robot state. The privileged scripted expert collects demonstrations in simulation under domain randomization, an ACT policy is trained on wrist RGB + 16 robot-state values, evaluated in simulation against the expert on the same starts, and exported as a bundle for the robot.

Now: Robot and observation changes (user decisions, 26 Sep): EE = closed-fingertip midpoint, 17-value state with fingertip gap and lift, D415 optical centre on the front glass, robot rotated 180° with home shoulder pan 0. First expert episodes with the new setup are below.

1. Setup and domain randomization

done 2026-09-24 D415 on mount v4, 320×180 policy image, DR in four ablatable groups. Found and fixed: overlapping box spawns, pile towers that ejected tubes, idle-arm drift from gain DR. Stability numbers below are from the final configuration.

Wrist camera: D415 on mount v4

Sim D415 policy image (320×180), nominal, start pose
Sim D415 policy image (320×180), nominal, start pose
Same worlds during the expert's picks (240 control steps in)
Same worlds during the expert's picks (240 control steps in)
Rows: sim before calibration, sim after calibration, real D415 wrist footage of the rig (user's video, 26 Sep). Median colour real vs calibrated sim: tubes (130,56,63) vs (138,59,66), table (79,61,49) vs (83,64,51); boxes set by eye to black with a little gloss.
Rows: sim before calibration, sim after calibration, real D415 wrist footage of the rig (user's video, 26 Sep). Median colour real vs calibrated sim: tubes (130,56,63) vs (138,59,66), table (79,61,49) vs (83,64,51); boxes set by eye to black with a little gloss.
Real cameraIntel RealSense D415 on mount v4 (user-approved pose; hand-eye not measured)
Real stream1280×720 RGB at 30 fps (user's choice)
Intrinsics (factory)fx 913.9, fy 912.1, cx 644.2, cy 347.9 px; distortion coefficients all zero
Policy image320×180 RGB: the 1280×720 frame area-averaged 4×4 (no crop), then a JPEG q85 round trip, identical to the stored training frames
Sim render320×180 directly, D415 intrinsics scaled by 1/4; D455 removed; mount coloured blue
Real D415 frame comparisondone 26 Sep with the user's wrist video: colours and lighting calibrated (see image)

Domain randomization gallery

16 randomized worlds, step 0
16 randomized worlds, step 0
16 randomized worlds, step 120
16 randomized worlds, step 120
16 randomized worlds, step 240
16 randomized worlds, step 240

DR ranges (read from the gallery run)

Gains are multipliers; distances in metres, angles in degrees; ranges are the full range at DR scale 1 (10% of worlds are nominal). A disabled group keeps all random draws, so ablations use identical starts.

GroupFieldRange
layout (always on)tube_count[7, 10]
layout (always on)rows_fraction0.5
layout (always on)table_xy_m0.03
layout (always on)table_yaw_deg3.0
layout (always on)basket_xy_m0.01
layout (always on)basket_yaw_deg5.0
layout (always on)robot_xy_m0.01
layout (always on)robot_yaw_deg1.5
layout (always on)initial_joint_deg[6.0, 4.0, 5.0, 6.0, 5.0, 12.0]
layout (always on)initial_gripper_open_min0.85
cameracamera_xyz_m0.01
cameracamera_rotation_deg5.0
cameracamera_focal_fraction0.03
cameracamera_principal_px[12.0, 12.0]
cameralens_k10.03
cameramotion_blur_px3.0
cameramotion_blur_prob0.3
camerastale_frame_prob0.05
appearancelight_gain[0.6, 1.6]
appearancelight_tint[0.88, 1.12]
appearancelight_ambient_max0.12
appearancelight_pos_m0.8
appearancelight_dir_deg35.0
appearancelight_shadow_prob0.8
appearancespecular_gain[0.5, 1.5]
appearancematerial_gain[0.9, 1.1]
appearancebox_colour_gain[0.7, 1.5]
appearancetable_colour_gain[0.8, 1.25]
appearancetable_tint[0.92, 1.08]
appearancetable_saturation[0.5, 2.2]
appearancetube_colour_shade[0.85, 1.3]
appearancetube_saturation[0.6, 1.05]
appearancebackground_gain[0.7, 1.3]
appearancebackground_tint[0.95, 1.05]
appearanceexposure_gain[0.75, 1.25]
appearancewhite_balance[0.92, 1.08]
appearanceimage_noise_std_2553.0
physicstube_mass_scale[0.8, 1.25]
physicsbox_mass_scale[0.8, 1.25]
physicsfriction_scale[0.7, 1.3]
physicsfriction_per_objectTrue
physicsgripper_force_scale[0.8, 1.2]
physicsgripper_kp_scale[0.8, 1.2]
physicsarm_kp_scale[0.85, 1.15]
physicsjoint_damping_scale[0.8, 1.2]
controlaction_delay_steps[0, 0]
controlaction_noise_std0.05
controlstate_noise_joint_rad0.0005
controlstate_noise_width0.0005
controlstate_noise_tcp_m0.0005
controlstate_noise_rot0.002

Stability checks under the new DR

Pile settling, binpick-dr-712/32 settled in 5 s; 0 tubes left the box; 0 non-finite; peak penetration 0.09 mm
Pile settling, binpick-dr-89/32 settled in 5 s; 0 tubes left the box; 0 non-finite; peak penetration 0.49 mm
Pile settling, binpick-dr-95/32 settled in 5 s; 0 tubes left the box; 0 non-finite; peak penetration 0.43 mm
Pile settling, binpick-dr-102/32 settled in 5 s; 1 tubes left the box; 0 non-finite; peak penetration 0.37 mm
Pile settling, binpick-nominal-105/32 settled in 5 s; 1 tubes left the box; 0 non-finite; peak penetration 0.41 mm
Resting boxes, 10 tubes, 50 s, full DR0/192 boxes toppled; max box rise 0.17 mm
Expert running, [7, 10] tubes, 120 s, full DR0/64 worlds non-finite; 0 boxes toppled in 0 worlds
Sim 320×180 render vs 1280×720 render area-averaged 4×4 (the real pipeline)mean abs difference 4.9–5.7/255 over 24 frames at full DR (states match to 30 mm; edge energy within 1.5%)

2. Data collection

done 2026-09-25 2-box demonstrations: 413 accepted episodes (D 174, E 239; expert 91-92% picked, 51-53% cleared per run). DAgger round 0 (policy-driven states labelled by the expert) started and stopped with partial data.

Two boxes since 25 September: a policy trained on the 3-box data sent 29% of carries to the wrong box, because the expert alternated between the left and right boxes, which the wrist camera cannot show at grasp time. The source box (centre) and all DR are unchanged; the left box is removed and every tube goes to the right box. The expert baseline below is the 2-box one; the ablation table and the first dataset rows are from the 3-box task.

Expert baseline on 7–10 tubes

992/1120 tubes picked (88.6%, bootstrap 95% CI 85.9%–91.0%); fully cleared 56/128 (44%, Wilson 95% CI 35%–52%); valid 79/128 (reasons {'tube_penetration': 42, 'actuator_force': 5, 'box_penetration': 8, 'joint_speed': 3, 'box_toppled': 1}); non-finite 0; time cap 60 s + 45 s per tube.
TubesEpisodesPickedRateClearedValidMean time
722142/15492%13/2220/22123 s
834251/27292%18/3421/34157 s
926196/23484%10/2614/26202 s
1046403/46088%15/4624/46238 s

Expert summary JSON

episode 001 world0 7tubes
episode 001 world0 7tubes external

10 s expert clip with the calibrated look (26 September)

Tube, box and table colours and the lighting calibrated against the real D415 wrist video; pedestal turned 90°, smooth action noise, 2 mm near plane.

episode 001 world0 8tubes
episode 001 world0 8tubes external

10 s expert clip, current setup (26 September)

External and wrist views after the pedestal, action-noise and near-plane fixes.

episode 001 world0 8tubes
episode 001 world0 8tubes external

20 s expert clip after three fixes (26 September)

Stand (pedestal) turned 90° about z; action noise now smooth (gripper no longer jitters: direction reversals in slow motion 37% -> 10%); camera near plane 2 mm so the finger linkage close to the D415 is drawn instead of see-through. 8 tubes, 1 placed in 20 s.

episode 001 world0 8tubes
episode 001 world0 8tubes external

Scripted expert with the new robot setup (26 September)

8 tubes (messy pile): 7 picked and placed in the right box in 98 s, valid. EE = closed-fingertip midpoint, robot base rotated 180° with home shoulder pan 0, D415 optical centre on the front glass.

episode 001 world0 8tubes
episode 001 world0 8tubes external

Expert ablations (same starts, full time cap)

3-box task (paired with the 3-box baseline, 91.5% picked). One DR group switched off at a time; every random draw is kept, so the piles are identical to the full-DR run on those starts.

RunTubes pickedClearedFull DR on the same starts
No DR at all538/566 (95.1%)50/64524/566 (92.6%), cleared 31/64
Physics DR off512/566 (90.5%)35/64524/566 (92.6%), cleared 31/64
Control DR off (action and state noise)543/565 (96.1%)49/64524/566 (92.6%), cleared 31/64
Camera DR off516/566 (91.2%)33/64524/566 (92.6%), cleared 31/64
Appearance DR off514/565 (91.0%)31/64524/566 (92.6%), cleared 31/64
Full DR + action delay 0–2 steps335/566 (59.2%)21/64524/566 (92.6%), cleared 31/64

Demonstration dataset

Accepted = at least 80% of the tubes picked and valid (box contacts ≤ 2 mm). Rejections so far: {'invalid': 528, 'picked fraction below 0.8': 128}. Frames are 320×180 JPEG q85 wrist images with the 16-value state and the expert's 7-value action.

RunAccepted/finishedFramesJPEG size
3-box pilot (seed 2000, not used)40/64139,6231.6 GB
3-box A (seed 3000, not used)99/167300,6013.2 GB
3-box B (seed 4000, not used)185/300598,3846.6 GB
3-box C (seed 5000, not used)188/300625,8806.9 GB
2-box D (seed 6000, running)174/300599,6056.6 GB
2-box E (seed 7000, running)239/450804,5758.9 GB
Total925/15813,068,66833.7 GB

Pilot check, end to end

An ACT model trained for 6,000 steps on the 40 pilot episodes (validation action L1 0.076) was exported, verified and evaluated in the simulator on 32 paired starts. As expected at this data size it does not solve the task: it approaches and grasps but carries the tube away from the boxes. Measured: bundle delivered 0/283 tubes in 150 s episodes; 6 episodes toppled a box. Pipeline: dataset → training → export → verified bundle → simulator evaluation loading only the bundle.

Pilot policy, episode 006 world0 7tubes
Pilot policy, episode 006 world0 7tubes external

3. Training

in progress 2026-09-25 v2 = D+E, 100k steps, validation action L1 0.055 (preliminary D-only model: 0.061 at 40k).

4. Sim evaluation

in progress 2026-09-25 v2 on the first 32 expert-baseline starts: picked 50/283 (17.7%, CI 12.3–24.2) vs 37/283 for the D-only model and 88.6% for the expert on the same starts; delivered 27/283; 4 box topples; 1/32 cleared. Full stage-4 evaluation (ablations) not yet run.

ACT policy v2, 2-box task (413 episodes, 100k steps)

Picked 50/283 tubes (17.7%) on 32 paired starts; lifts 1.69 per episode. In this episode it delivers 4 of 7 tubes in about 3 minutes, then drifts up and out of the workspace with 3 tubes left.

act2box_v2 episode 003 world0 7tubes
act2box_v2 episode 003 world0 7tubes external

ACT policy, 2-box task, collection D only (174 episodes, 40k steps)

Picked 37/283 (13.1%). After the first placement it lines the pads up over a tube and freezes for minutes.

act2box_d episode 001 world0 7tubes
act2box_d episode 001 world0 7tubes external

Preliminary ACT policy, 3-box task (324 episodes, 30k steps)

Picked 31/283 tubes (11%). Slow grasps, carried tube drifts away (the 3-box destination ambiguity).

act3box episode 002 world0 7tubes
act3box episode 002 world0 7tubes external

5. Export

not started

Known problems