yam-duster-dp / README.md
Dimios45's picture
Mark deploy patches as applied; add RealSense camera setup and gripper-convention check
b9c7e28 verified
|
Raw
History Blame Contribute Delete
6.83 kB
---
license: mit
library_name: diffusion-policy
tags:
- robotics
- imitation-learning
- diffusion-policy
- manipulation
- yam
datasets:
- Dimios45/yam_duster_in_box
pipeline_tag: robotics
---
# YAM Duster-in-Box — Diffusion Policy (baseline)
A UNet [Diffusion Policy](https://diffusion-policy.cs.columbia.edu/) trained on
[`Dimios45/yam_duster_in_box`](https://huggingface.co/datasets/Dimios45/yam_duster_in_box)
for a single-arm I2RT **YAM** robot: *"pick up the duster and put the duster in the box."*
This is the **baseline** for the B-spline Policy comparison. It was trained on byte-identical
data with the same backbone, optimizer, schedule, and epoch count as
[`Dimios45/yam-duster-bspline-dp`](https://huggingface.co/Dimios45/yam-duster-bspline-dp) —
the only difference is the action representation. Use it to measure what the B-spline
parameterization actually buys in success rate and completion time.
## Action space
Joint-space targets, **not** end-effector poses:
```
[right_joint_1..6 (radians), right_gripper (0 = open, 1 = closed)]
```
No IK is involved at deploy. The policy predicts a plain `(16, 7)` trajectory of future joint
targets on a fixed 10 Hz grid and executes the first 8 (`n_action_steps: 8`) before replanning —
roughly 0.8 s per prediction, versus the ~1.1 s continuous, rescalable curve the B-spline
variant emits.
## Observations
| key | shape | notes |
| --- | --- | --- |
| `top_image` | `(3, 128, 128)` | RGB, resized from 640×480 (plain squash, no crop) |
| `wrist_image` | `(3, 128, 128)` | RGB, right wrist camera |
| `joint_pos` | `(7,)` | measured joints + gripper |
Two observation steps. Images normalized to [0,1], random crop to 116×116 in training.
> Two naming constraints in this codebase: the lowdim key must be named `joint_pos`
> (`get_normalizer` only accepts keys containing `pos`/`quat`/`qpos`), and the task config must
> set `abs_action: True`. At 7D→7D `abs_action` is a no-op for the *data*, but it also selects
> the action normalizer — `False` installs an identity normalizer, and joints 2/3 (up to 2.77 rad)
> then fall outside the sampler's `clip_sample` range of [-1, 1], silently breaking training.
## Files
| file | size | use |
| --- | --- | --- |
| `deploy_ema.ckpt` | 426 MB | **Inference.** EMA weights only. |
| `epoch0600_full.ckpt` | 1.5 GB | `model` + `ema_model` + `optimizer`, for resuming or fine-tuning. |
Both embed the Hydra config (pickled with `dill`); `diffusion_policy` must be importable on load.
## Training
| | |
| --- | --- |
| base | [B-spline-policy/bspline-policy](https://github.com/B-spline-policy/bspline-policy) UNet DP |
| data | 50 episodes, 37,986 frames @ 30 Hz → resampled to **10 Hz** (12,677 steps) |
| hardware | 1× RTX 4090, 2 h 00 m, ~16 it/s |
| epochs / batch | 601 / 64 |
| optimizer | AdamW, lr 1e-4, cosine, 500 warmup steps, EMA |
| params | 66.9M diffusion + 22.4M vision (ResNet18 ×2) |
| scheduler | DDIM, 100 train timesteps, 16 inference steps, epsilon prediction |
| horizon / obs / action steps | 16 / 2 / 8 |
| final train_loss | 0.001 |
## Measured behavior
Over 200 held-out samples, predicted chunks vs the recorded demos:
| metric | this model | B-spline variant |
| --- | --- | --- |
| open-loop arm error | median **0.48°**, p90 1.20° | median 0.81°, p90 1.68° |
| gripper predicted range | **[−0.012, 1.000]** | [−0.31, 1.31] |
| peak arm velocity | 46 °/s p95, 110 °/s max | 48 °/s p95, 112 °/s max |
| inference latency | 44 ms (RTX 4090) | 46 ms |
Velocity was sampled at this model's native 10 Hz action rate versus 100 Hz for the B-spline
curve, so those two rows are not strictly equivalent — the 10 Hz figure cannot see sub-100 ms
spikes.
Because DP predicts the trajectory directly rather than control points, its outputs stay inside
the demonstrated range, so it does **not** need the gripper clamp the B-spline variant requires.
## Deployment
Environment setup, camera configuration, arm bring-up, and the five repo patches for joint-space
actions are identical to the
[B-spline model card](https://huggingface.co/Dimios45/yam-duster-bspline-dp) — follow steps 1–4
there. Those patches are **applied and verified** in the working tree these models were trained
from, but are **not** in upstream `B-spline-policy/bspline-policy`; apply them yourself if you
start from upstream. The gripper clamp in `decode_action_vector` is unnecessary for this model
(see below) but harmless and worth keeping.
They are needed because the upstream rollout path decodes **end-effector** actions (its iPhone
teleop records EE poses), while this model predicts **joints** — a difference in what was
recorded, not in the LeRobot file format. Two things carry over unchanged: a missing `top_image`
does not raise (`policy_local_bspline.py:625-629` feeds a black frame, so a dead camera yields a
half-blind policy rather than an error), and image resolution needs no change because the rollout
resizes from the checkpoint's `shape_meta`. The top camera is an Intel RealSense; use
`TOP_CAMERA_TYPE = 'realsense'` so the RGB pipeline matches training.
The gripper-convention check in the B-spline card applies here too — verify it before the first
rollout, or the policy will open to grasp and close to release.
```bash
hf download Dimios45/yam-duster-dp deploy_ema.ckpt --local-dir ./ckpt
sudo ip link set can_follower_r up type can bitrate 1000000
python real_env/yam_teleop/yam_server.py --channel can_follower_r
python real_env/yam_teleop/rollout_local_policy.py \
--env yam --policy dp \
--ckpt-path ./ckpt/deploy_ema.ckpt \
--diffusion-policy-dir $PWD/diffusion_policy \
--control-freq 100 --data-freq 10 \
--save --output-dir data/local_policy_rollouts
```
Note `--policy dp` (not `bspline`), and that `--origin-time-scale` / `--predict-before-end` /
`--speed-up-times` do not apply — this model emits a fixed-rate action grid with no temporal
rescaling. That is precisely the capability the B-spline variant adds.
## Reproducing
```bash
python tools/lerobot_v3_to_robomimic.py \
--repo-id Dimios45/yam_duster_in_box \
--output diffusion_policy/data/yam_duster_in_box.hdf5 \
--target-fps 10 --image-size 128
cd diffusion_policy && python train.py \
--config-name=yam_duster_unet_dp \
hydra.run.dir=../outputs/yam_duster_dp_full \
training.resume=false logging.mode=offline \
checkpoint.topk.k=601 dataloader.persistent_workers=True
```
## Citation
```bibtex
@inproceedings{chi2023diffusionpolicy,
title={Diffusion Policy: Visuomotor Policy Learning via Action Diffusion},
author={Chi, Cheng and Feng, Siyuan and Du, Yilun and Xu, Zhenjia and
Cousineau, Eric and Burchfiel, Benjamin and Song, Shuran},
booktitle={Proceedings of Robotics: Science and Systems (RSS)},
year={2023}
}
```