# r16_deploy (H) — deploy candidate: smoothest walker in the r16 series Trained locally (RTX 5090), report-16. First arm designed for the ROBOT rather than a hypothesis. | | | |---|---| | Task | `ETHRC-humanoidv1-walk-r16-deploy-psu-v0` | | Branch | `test/SjohnU_remodel_actuators` @ `b0ceaa8` | | Checkpoint | `model_9999.pt` (10,000 iters, completed) | | Envs / seed | 4096 / 42 | | Actions | 26 @ 50 Hz, action_scale 0.25 | | Base | `u4_walk_crouch_real` + r16 shared (25% standing, track 1.5→2.2) | | Changes | ~65 ms latency + HEJ90 legs **200/10** + upright price (−10) + spawn-tilt DR + `action_rate` −0.3 + `feet_clearance` removed | ## It is the least jittery policy in the series — by design Measured with `scripts/rsl_rl/measure_gait.py` (1000 steps × 64 envs, spawning upright). Jitter — not velocity — is what predicts real-robot chattering; velocity and cadence cannot see it. | @ 0.5 cmd | fwd vel | steps/s | **leg vel RMS** | action rate | sign-flips/s | lean | |---|---|---|---|---|---|---| | r16_upright (C) — fastest, DO NOT DEPLOY | 0.406 | 3.37 | 1.697 | 0.126 | 12.5 | 0.7° | | r16_latency_g200 — prev. smoothest | 0.342 | 3.48 | 1.170 | 0.093 | 10.6 | 10.8° | | **r16_deploy (H)** | 0.369 | 3.48 | **1.023** | **0.074** | **10.4** | 3.0° | At the **0.8 command** H does **0.588 m/s with ~16.5 cm strides**, still smoother (RMS 1.206) than C was at 0.5. Stride comes from commanding velocity, not reward shaping (the gait clock pins cadence ~3.5 steps/s, so step_len = v/cadence). ## Why this and not the faster r16_upright (C) C wins every sim metric (0.406 m/s, 0.7° lean) but is the **jitteriest** arm (leg vel RMS 1.697, +40% vs H) because it trained at **zero latency** — it learned 50 Hz twitch-correction. On hardware those corrections arrive ~67 ms late and become oscillation, so C's sim smoothness UNDERSTATES its real jitter. H trains with the measured ~65 ms delay, which is why it is smooth AND deploy-faithful. Latency is load-bearing, not a tax. `action_rate −0.3` did NOT strangle H (episode length 973/1000). The `final_phys` sibling that suicided was killed by an over-large PHYSICAL-smoothing block (joint_acc ×10, soft_landing ×100), not by the action_rate weight. ## Known gaps (fold in before final deploy) 1. **Placeholder ankle 2.0/0.15**, not the real-measured 8/1.5. The `r16_h_ankle` Sky arm tests whether the real ankle can walk at all — the last deploy-critical unknown. 2. **Velocity-curriculum bug caps forward command at 0.5** (`lin_vel_cmd_levels` clamps to limit_ranges (-1.0, 0.5)). The `r16_h_cmd` arm fixes it to (-0.2, 1.2). H's 0.588 at a 0.8 command is extrapolation past its training ceiling. 3. **No foot-height reward** — `feet_clearance` was removed (documented bug) and not replaced, so `feet_air_time` is the only swing incentive. The `final-*` arms add `feet_swing_height_dense`. ## Files - `policy.pt`, `policy.onnx` — exported via `scripts/rsl_rl/play_export.py` - `deploy.yaml` — gains (legs motor-space ~189.6/9.64 = 200/10 sim), obs/action layout, 50 Hz - `model_9999.pt` — raw rsl-rl checkpoint