Diffusion Policy — blue-cylinder-handover-aug (wrist cameras, hardware-limit normalization)
LeRobot Diffusion Policy trained on blue-cylinder-handover-aug for the ROBOTIS FFW SG2 Rev1, using
shared-norm statistics pooled across its composition group.
Cameras
cam_left_wrist, cam_right_wrist — native resolution; normalization bounds come from the robot's URDF joint limits, not from data -- see below.
Diffusion Policy requires every camera to share one resolution, and this robot's do not (head 376x672, wrist 424x240). The wrist-only variant is uniform as recorded; the 3-camera variant required re-encoding all views to a common size.
Composition group B
Bounds are hardware-derived, not data-derived: each joint uses its URDF
<limit lower/upper>, with a 75% pad on the grippers, head and lift joints
(whose URDF limits do not cover the observed driven range) and fixed +/-1.0 on
the 3 odometry state dims (no URDF joint covers base velocity; the engine
zero-pads them at inference and they carry no loss).
This transform never changes when data is added, so adding demonstrations
to any group member does not invalidate the others or require a retrain.
min=q01 and max=q99, mean=(lo+hi)/2, std=(hi-lo)/2, so MIN_MAX,
QUANTILES and MEAN_STD all yield the same mapping -- these policies are
composable across architectures as well (GR00T reads q01/q99, Diffusion
Policy reads min/max, SmolVLA reads mean/std).
Members: pick-blue-cylinder-left-arm, pick-blue-cylinder-right-arm, blue-cylinder-handover.
sha256(observation.state + action, normalization fields)[:12] = 1184068d20ae
Only compose models reporting this same hash.
Note on cross-architecture composition: the GR00T policies for these same tasks share
the same pooled statistics file but consume different fields — GR00T uses q01/q99
min-max (use_percentiles=True), Diffusion Policy uses min/max (STATE/ACTION
default to MIN_MAX). So diffusion composes with diffusion and GR00T with GR00T, but
not across the two.
Training — LeRobot defaults
| Policy | diffusion (LeRobot 0.6.1, ROBOTIS lerobot-cyclo fork) |
| Steps | 100 000 |
| Batch size | 8 |
| Optimizer | lr 1e-4, betas (0.95, 0.999), weight decay 1e-6 |
| Noise scheduler | DDPM |
| Params | 274472400 |
| Data rate | 15 fps |
| Final train loss | 0.001 |
Dataset in LeRobot v3.0 format (converted from v2.1, with pooled statistics restored after conversion — the v2.1→v3.0 converter regenerates stats and would otherwise have replaced the group-pooled values with per-task ones).