OpenArm β place cube in flask
Three from-scratch policies for a single-arm (right follower) OpenArm. Task: pick a grey cylinder from an L-bracket and place it at a flask.
Trained on an NVIDIA Jetson AGX Thor. Code: https://github.com/OALcementys/OpenArmDev
| folder | policy | episodes | params | run / epoch |
|---|---|---|---|---|
act_202/ |
ACT | 202 | 85.95 M | s345 epoch 10 |
dp_202/ |
Diffusion Policy | 202 | 101.9 M | dp02 epoch 20 |
act_149/ |
ACT | 149 | 85.95 M | s34 epoch 7 |
Shared setup
3 cameras (cam_high, cam_right_wrist, cam_side) at 480Γ640, ResNet-18
trunks (one per camera, not shared). State 24-d, action 8-d, chunk size 50,
50 Hz control. bf16 autocast, no validation split β every episode was trained on.
act_202 and dp_202 use all 202 episodes (sessions 3+4+5, 214,181 samples);
act_149 uses sessions 3+4 only (167,466 samples).
Per-model
- ACT β hidden 512, FF 2048, KL weight 10.0, batch 24, lr 1e-4 (backbone 1e-5), 500-step warmup, augmentation on.
- Diffusion Policy β spatial-softmax pooling (32 keypoints), FiLM-residual conditioning, UNet dims 256/512/1024, 100 train steps, DDIM Γ10 at inference, EMA (power 0.75, max 0.9999), batch 32, lr 1e-4.
Usage
Each model.pt is self-contained β it carries its own norm_stats and
architecture config, so roll.py needs nothing else. config.json,
norm_stats.json, and log.jsonl are included as provenance.
./rollout.sh runs/s345/epoch_0010 t_act202
./rollout.sh runs/dp02/epoch_0020 t_dp202
./rollout.sh runs/s34/epoch_0007 t_act149
Known behaviour
Measured over 9 rollouts of act_202: approach from the start pose to first
grasp matches the demonstrations closely (6.4 s median, against 6.4 s in the
data). The deficit is post-grasp β carry-to-release runs ~1.75Γ the demo mean,
and the policy does not reliably return to the start pose.
act_149 is the checkpoint observed to complete the full task end-to-end.