SjohnU's picture
Add r16_latency_g200 (report-16 one-change-at-a-time, measured gait in physical units)
54ff45f verified
|
Raw History Blame Contribute Delete
4.11 kB

r16_latency_g200 — Report 16 one-change-at-a-time walker

Measured: the gains are free.:0.342 m/s — ✅ walks (= arm A)

A.2 — control + ~65 ms latency + leg gains 180/5→200/10. Paired with arm A, it isolates the gain change from the latency

Task ETHRC-humanoidv1-walk-r16-latency-g200-psu-v0
Branch test/SjohnU_remodel_actuators @ 8f9f058
Checkpoint model_9999.pt (10,000 iters, completed)
Envs / seed 4096 / 42
rsl-rl 5.0.1 (native actor/critic state_dict)
Actions 26 @ 50 Hz
wandb k28tg52k
Hardware AWS us-east-2, 1x L40S (g6e.xlarge)

Report 16: one-change-at-a-time, measured in physical units

All arms = u4_walk_crouch_real + the r16 shared layer (25% standing envs, track_lin_vel_xy 1.5 -> 2.2) + exactly one further change. 10k iters, 4096 envs, seed 42, branch test/SjohnU_remodel_actuators @ 8f9f058.

Measured with scripts/rsl_rl/measure_gait.py (1000 steps x 64 envs, forward command forced). Physical units only. Reward-term values are NOT comparable across configs with different weight/std, and they actively mislead here: r16_footlift posts the best curves of the entire set (tvel 1.194, mean_reward 11.79) while moving 0.001 m/s.

policy change cmd fwd m/s cadence lean walks?
r16_upright @0.8 upright price + spawn-tilt DR 0.8 0.634 3.30/s 1.5° ✅ best
crouch_nogait (ref) 0.5 0.572 8.14/s 5.3° ✅
r16_upright @0.5 upright price + spawn-tilt DR 0.5 0.406 3.37/s 0.7° ✅
u4_walk_crouch_real (ref, 22k) 0.5 0.397 3.48/s 9.9° ✅
r16_latency +~65 ms delay 0.5 0.347 3.39/s 13.3° ✅
r16_latency_g200 +~65 ms + legs 200/10 0.5 0.342 3.47/s 10.7° ✅
r16_control — (baseline) 0.5 0.026 0.24/s 9.2° ❌
u4_walk_bigstep_v1 (ref, 4 changes, 25k) 0.5 0.009 1.71/s 20.9° ❌
r16_footlift clearance 1.0@0.15 -> 2.4@0.17 0.5 0.001 0.28/s 11.9° ❌ worst

The rule: standing must be made untenable

The policy's default attractor is a stand-and-micro-correct local optimum — that is what r16_control is stuck in at 10k (0.026 m/s, 0.24 steps/env/s). Every result follows from whether a change makes standing tenable or not:

  • Makes standing untenable -> a real gait emerges: latency (cannot twitch-correct at 50 Hz -> 0.347), spawn-tilt DR (must recover every reset -> 0.406), or simply training to 22k (crouch_real -> 0.397; it only learns to translate between 15k and 22k).
  • Enriches standing -> it never walks: footlift (0.001, worse than its own control) and a slower gait clock (0.004).

Latency is load-bearing, not a deploy tax. control + latency walks at 0.347 m/s where the identical control marches at 0.026 -- same code, same 10k iters, one knob, 14x the stepping. Not a confound: the crouch-envelope chain already swaps legs_waist to IdealPDActuatorCfg and moves torque-speed into the PhysX spawn func; _apply_latency_only turns that into a DelayedPD with identical effort/velocity limits, gains and armature, and never touches spawn.func.

Leg gains 180/5 -> 200/10 are free (0.342 vs 0.347).

Foot-lift is what broke bigstep -- bigstep carried exactly this layer. It perversely reached lower clearance than control (0.1003 vs 0.1567 m) while paying 2.4x for height: it did not lift higher, it stopped stepping.

Lean is not causal. r16_latency walks at 13.3° BACK, r16_upright at 0.7°, bigstep fails at 20.9°. Lean predicts nothing -- though pricing it still helps, via the spawn-tilt/untenable -standing mechanism rather than via the lean itself.

Files

  • policy.pt, policy.onnx — exported via scripts/rsl_rl/play_export.py
  • deploy.yaml — deploy config (obs/action layout, gains, 50 Hz)
  • model_9999.pt — raw rsl-rl checkpoint (re-export / resume)