Learning across terrains
Winnable stairs and privileged critics come first
The default way to train a quadruped for stairs, slopes, rough ground, gaps and obstacles is one policy trained with on-policy RL, usually PPO, on a tiled procedural field — legged_gym's 10 × 20 grid of 8 m tiles with pyramid stairs of 5–21 cm is the template — under a per-robot curriculum that promotes a robot after it walks half a tile and demotes it when it covers less than half its commanded distance. Privileged terrain and state information reaches blind policies through a teacher that is later distilled or, in most blind work since 2022, through an asymmetric critic and estimator heads trained on proprioceptive history; depth policies still distill a privileged teacher because rendering depth inside RL is expensive. Perception changes outcomes mainly where a foot must be placed before it touches anything: in same-paper comparisons blind baselines score 0–40% on gaps and 0% on stepping stones and parkour climbs, and on 17 cm stairs an A1's blind policy failed every time where its depth policy succeeded every time, while the best blind A1 and Go2 policies still climb continuous 16 cm stairs. Specialists, distillation, mixture-of-experts and skill selectors pay off for skills that need their own rewards, terminations or inputs rather than for walking-class terrain mixtures, and the largest gains measured outside the network come from how constraints and tasks are posed. For Shappy, whose blind 1024-512-512-512 MLP crosses 3 cm in 96–99 and 4 cm in 77–86 of 100 simulated trials, those rises are 0.17–0.23 of its 0.1725 m leg against about 0.40 for blind A1 policies; the blind A1 level scales to about 6.9 cm by leg length or 10.7 cm by standing height (computed), and its 80 mm treads are shorter relative to its body than in any published quadruped stair test found. A privileged critic, difficulty sampling that tracks pass rates and keeps flat ground and passable rises in the mix, terrain-gated constraints, estimator heads, multi-critic value heads and lane-referenced commands all fit its Brax PPO pipeline with modest changes, while teacher-student distillation, depth or RGB perception and skill hierarchies need a second training stage, a new sensor, or both. Three of the project's own runs lost climbing ability after training on harder fields, two of them by learning to stop at the first riser, which makes difficulty sampling the first thing to test; a privileged-height actor trained in the same pipeline is the cheapest way to learn whether blindness or actuation sets the next ceiling.
Tiled pyramids and a half-tile promotion rule set the default recipe
The template that most later multi-terrain pipelines copy is legged_gym (Rudin, Hoeller, Reist and Hutter, CoRL 2021, arXiv:2109.11978). Its default world is a 10 × 20 grid of 8 m × 8 m tiles whose rows are difficulty levels d = 0.0 to 0.9 and whose columns are terrain types in proportions of 10/10/35/25/20% for smooth slopes, rough slopes, stairs up, stairs down and discrete obstacles, with slopes and stairs built as pyramids so that every heading leads uphill or downhill (legged_gym config). Stairs rise 0.05 + 0.18·d m on 0.31 m treads, a nominal 5.0 to 21.2 cm across the rows (computed from terrain.py); the generator can also build stepping stones, gaps and pits, but the default proportion list never samples them. Each robot carries its own level. It moves up when it ends an episode more than 4 m, half a tile, from the tile centre, moves down when it covered less than half of |v_cmd|·T, and goes to a random row after passing the top one, "to increase the diversity and avoid catastrophic forgetting" (legged_robot.py; arXiv:2109.11978). With 4,096 robots, 1,500 PPO updates took under 20 minutes on one RTX A6000, and the ANYmal C policy reached nearly 100% simulated success on 0.2 m stairs, "close to the kinematic limits of our robot". The paper and the released code disagree on details that matter to anyone copying it: 108 terrain-height samples in the paper against 187 in code, pushes every 10 s against every 15 s, commands held for the whole episode against resampled every 10 s, and different reward weights.
The rule optimizes something specific. With 20 s episodes the demotion distance, 10·|v_cmd| m, exceeds the 4 m promotion distance for every command of 0.4 m/s or more, so those robots are promoted or demoted at every reset (computed from the code), and a level that rises on success and falls on failure drifts toward the level where the two are about equally likely, a pass rate near 50% (inference). Isaac Lab keeps the grid and the rule, rebalances the mix to 20% ascending and 20% descending stairs, 20% boxes, 20% random rough ground and 10% + 10% slopes, and jitters difficulty inside each row, so that a level becomes a 1.8 cm band of rises reaching 0.23 m (computed from rough.py and terrain_generator.py). Its random-rough column ignores difficulty, and its Go2 and A1 configurations halve the boxes and noise but keep the ANYmal-scale 5–23 cm stairs (go2 rough_env_cfg.py). The earlier design aimed at a band on purpose. Lee et al. ran a particle filter over terrain parameters, stair rise and tread jointly, that kept sampled terrain where the fraction of steps moving faster than 0.2 m/s in the commanded direction lay between 0.5 and 0.9 (Lee, Hwangbo, Wellhausen, Koltun and Hutter, Science Robotics 2020, arXiv:2010.11251). On stairs the filter first rejected short, steep steps and concentrated on wide, shallow ones before broadening, and a teacher trained on uniformly sampled terrain plateaued lower "because uniform sampling is more likely to draw terrains that cannot be successfully traversed ... the policy fails early and receives less training signal" (plotted, not tabulated). Kim et al. reduced the filter to stages: each terrain type samples uniformly from stage 0 up to a maximum that rises once traversability at the top stage passes a threshold, which keeps every easier stage in the mix and, "in our experience", prevented forgetting with less tuning (Kim et al., T-RO 2024, arXiv:2308.12517).
Later curricula bet on the same principle with other machinery, and none measures its advantage over legged_gym's rows on one robot. A grid-adaptive command curriculum that opens neighbouring (v_x, ω_z) cells only after both tracking rewards pass a threshold let a Mini Cheetah reach 3.9 m/s where uniform sampling of the full range learned nothing (Margolis, Yang, Paigwar, Chen and Agrawal, RSS 2022, arXiv:2205.02824). Learning-progress sampling over 600 speed-and-terrain tasks reached 80% success within 1,500 iterations on ANYmal D where most baselines had not after 3,000 (Li, Li and Hutter, 2026 preprint, arXiv:2601.17428), and a transformer that schedules commands, terrain and randomization together cut Go1 sim-to-real transfer loss from 27% to 18% (Mishra, Raj, Xiao and Manocha, 2026 preprint, arXiv:2603.14156). Generated terrain beat hand-designed terrain at far higher cost and mostly on other tasks: GPT-4o-written programs gained about two goals on a 20-task Go1 parkour benchmark at about 24 h on eight A6000 GPUs per run (Liang et al., Eurekaverse, CoRL 2024, arXiv:2411.01775), and diffusion-synthesized terrain raised simulated success from 43% to 87%, mainly on a wheeled Jackal (Yu, Xu and Liu, ADTG, CoRL 2024, arXiv:2410.10766). For skills that random exploration never finds, Robot Parkour first made obstacles penetrable, because its privileged oracles trained directly with solid obstacles "cannot make any learning progress on climbing and leaping" (Zhuang et al., CoRL 2023, arXiv:2309.05665). Zhang et al. moved the other way on stepping stones, demoting a robot only when it does worse than random actions, and found that change mattered less than symmetry augmentation (Zhang, Rudin, Hoeller and Hutter, IROS 2024, arXiv:2311.10484). No regret-based environment design (PAIRED, PLR, ACCEL) applied directly to quadruped terrain with hardware results was found.
MuJoCo-based tooling supports this recipe only in part. Brax's AutoResetWrapper returns each environment to its cached first state, so a robot's spawn point and terrain tile stay fixed for the run unless the environment moves them itself, and MuJoCo Playground's wrapper adds a full_reset option that calls env.reset on termination and "can be used for curriculum learning" (Brax training.py; Playground wrapper.py). Playground's own Go1 recipe fine-tunes a flat-ground policy for 100 M steps on a 5 cm Perlin heightfield with no height scan in the actor and no stairs task registered (Zakka et al., arXiv:2502.08844, venue not in arXiv metadata; go1 joystick.py), whereas mjlab, the Isaac Lab API on MuJoCo Warp, ships box-geom stairs, the distance-based level curriculum and GPU ray-cast height scans (mjlab, arXiv:2601.22074). Heightfields carry their own costs: MJX collides each geom with two prisms per grid cell beneath it, 3 × 3 cells for a Pupper foot sphere on a 2 cm grid and 5 × 5 on a 1 cm grid (computed from MJX's subgrid bound); MuJoCo Warp keeps at most four contacts per pair; and a heightfield cannot form a vertical riser (MJX collision_driver.py; MuJoCo Warp collision_driver.py). The project measured each effect: Warp runs its 2 cm stair heightfield at 4.09 M physics steps/s, 7.8× MJX-JAX, with about half of MJX-JAX's knee-collision penalty, and an earlier policy crossed a heightfield copy of the box-riser course about as often as the course itself (terrain_training README; warp_training README). Besides the project's own runs, no published quadruped stair result trained in MJX or MuJoCo Warp was found.
Privileged information moved from separate teachers into the critic
Blind multi-terrain locomotion began as two-stage distillation. Lee et al. trained an MLP teacher with TRPO on privileged state — terrain heights at nine points on a 10 cm circle around each foot, contact states and forces, friction and external forces — and then a temporal-convolution student on 2 s of proprioceptive history that imitated the teacher's action and latent on its own rollouts; the same student network trained directly with RL "is incapable of locomoting on a slope or traversing a step" (Lee et al. 2020, arXiv:2010.11251). RMA kept two stages but made the second a regression: a base policy learns with an 8-dimensional encoding of 17 privileged factors (payload, motor strength, friction, local terrain height), and an adaptation module regresses that encoding from 0.5 s of states and actions (Kumar, Fu, Pathak and Malik, RSS 2021, arXiv:2107.04034). Phase one took 1.2 B steps and about 24 h, phase two 80 M steps and about 3 h, and the A1, which never saw a step in training, stepped up 6 cm in 5 of 5 trials and 8 cm in 3 of 5, and down 15 cm in 5 of 5 by the figure's table (4 of 5 by its caption).
Since 2022 most blind work has merged the stages, moving the privileged information into the critic, which never runs on the robot, and into targets for auxiliary estimators. Ji et al. trained an estimator of base velocity, foot height and contact probability concurrently with the policy against simulator truth and fed its outputs to the actor, raising simulated time-to-fall on rough terrain from 25.0 s to 85.7 s (Ji, Mun, Kim and Hwangbo, RA-L 2022, arXiv:2202.05481). DreamWaQ gave the critic body velocity, a disturbance force and a height map, and the actor 5 steps of proprioception with a velocity estimate and a β-VAE context; 30-minute simulated survival rose from 20.51% for the legged_gym baseline to 95.23% (Nahrendra, Yu and Myung, ICRA 2023, arXiv:2301.10602). HIMLoco replaced regression with a contrastive latent and climbed 16 × 27 cm stairs with an A1 in 20 of 20 trials, where RMA managed 60% and Walk These Ways and the vendor controller 0% (Long et al., ICLR 2024 per the authors' repository, arXiv:2312.11460). Its ablation says what matters: the same encoder trained by PPO alone reached 10% on those stairs, a regression-trained embedding 85% and the contrastive one 100%, so having an estimator matters far more than which kind. CTS splits one PPO run into teacher and student agents that share actor and critic, and beat a sequential teacher-student pipeline on every terrain, by 7.9% in stair velocity-tracking error (Wang, Luo, Zhang and Chen, RA-L 2024, arXiv:2405.10830).
| Method (robot) | Privileged information and where it enters | Deployed actor input | Stair or step evidence |
|---|---|---|---|
| Lee 2020 (ANYmal) | Foot-ring heights, contacts, contact forces, friction, disturbances; teacher, then imitation | 2 s TCN history | 16.8 cm step, real |
| RMA 2021 (A1) | 17 factors; base-policy encoder, then regression | 0.5 s history | 8 cm up 3/5, 15 cm down 5/5, real |
| Ji 2022 (Mini Cheetah) | Velocity, foot height, contacts as concurrent estimator targets | Estimates plus short history | 19.1° slope, real |
| DreamWaQ 2023 (A1) | Velocity, disturbance, height map; critic | 5 steps, velocity, β-VAE context | Campus stairs, size not given |
| HIMLoco 2024 (A1, Aliengo) | External force, terrain heights; critic; velocity regressed | 5 steps, contrastive latent | 16 × 27 cm, 20/20, real |
| CTS 2024 (A1, Aliengo) | Velocity, heights, contact forces, torques; teacher agents in the same run | 5 steps | Real stairs, size not given |
| SLR 2024 (Go2) | None; critic sees the actor's inputs | 10 steps, latent | 16 × 29 cm, 136.4 ± 24.5 stairs, real |
| TAR 2025 (Go2) | Velocity, 187 heights, force, contacts, friction, payload; critic and teacher encoder | Recurrent | 30 cm step up, real |
The two newest entries disagree about whether the privileged information is needed at all. SLR uses none: its critic sees the actor's inputs, its encoder learns through the value loss and a triplet loss on a learned transition model, and, run against each competitor in that competitor's own repository on a Go2, it climbed 136.4 ± 24.5 indoor 16 × 29 cm stairs before failing against 107.4 ± 19.1 for HIMLoco; adding privileged latents for friction, restitution, foot height and contacts made it worse (Chen et al., CoRL 2024, arXiv:2406.04835). TAR credits privileged information with the largest single share of its gain, +28.2% on a combined in- and out-of-distribution metric, and finds that variants without it, SLR included, degrade most out of distribution (Mousa, Karavis, Caprio, Pan and Allmendinger, IROS 2025, arXiv:2503.20839). The two measured different things. SLR scored in-distribution traversal on hardware and ablated a privileged set that excludes base velocity and terrain heights; TAR scored simulated velocity errors and falls under a 15 kg payload and 2.0 m/s commands, re-implemented its competitors in its own environment — the practice SLR's authors call unfair — and gave its critic base velocity and a 187-point height scan. Read together, privileged information is not needed to match a strong blind policy on its training terrain, and its case rests on robustness beyond that terrain, which is where Shappy's own numbers drop: 3 cm 94 and 4 cm 73 of 100 under random pushes, against 96–99 and 77–86 without.
Memory matters most when the hind legs reach a step. Lee's student failed most often "when the hind legs encounter the step" with 20 ms of history, handled higher steps with 2 s and deviated 35.5% less under a 50 N push (Lee et al. 2020); a feedforward Cassie policy could not learn stairs that an LSTM learned (Siekmann, Green, Warila, Fern and Hurst, RSS 2021, arXiv:2105.08328); and a distilled depth policy with an MLP in place of its GRU fell from 86% to 0% on climbing because the rear legs must remember what the camera saw (Zhuang et al. 2023, arXiv:2309.05665). The one-stage methods manage with 5 steps, 0.1 s at 50 Hz, because they add an explicit velocity estimate and a privileged critic. Shappy's 20-step history spans 0.4 s, Lee's middle setting, without either addition.
Blind policies find risers by contact; perception pays on gaps and high steps
A blind policy learns where a riser is by hitting it. Lee's controller "identifies the trapping of the foot purely from proprioceptive observations and lifts the foot over the obstacle", raising front-foot clearance from 12.9–13.6 cm on flat ground to 18.5–22.5 cm after a trap (Lee et al. 2020); DreamWaQ "must first hit the obstacles with its legs" (Nahrendra et al. 2023); its blind version "often collides and drags the foot along the stair edge before stepping" (Nahrendra et al., DreamWaQ++, T-RO 2026, arXiv:2409.19709); and CTS lifts a front leg "after being stumbled" (Wang et al. 2024). The documented costs follow from that: conservative gaits, stubbing at speed, failures concentrated on the hind legs when memory is short, reliance on a solid riser face (slatted stairs tripped Cassie even when they were in training), and more failures at low speed, where there is no momentum to recover a poor foothold (Siekmann et al. 2021). Ascent is the hard direction: Cassie climbed a real staircase in 80% of trials and descended it in 100%, RMA's A1 stepped down 15 cm more reliably than up 8 cm, and TAR's Go2 steps up 30 cm and down 60 cm. Two remedies keep the robot blind. An estimated foot height fed to the actor raised clearance at low speed where a foot-clearance reward with a 0.09 m target alone "is not sufficient" (Ji et al. 2022), and Walk These Ways conditions one flat-trained policy on a commanded swing height, reporting better survival on 16 cm simulated platforms at higher swing and smooth climbing of real stairs and curbs, with platform numbers only plotted and no real success rates (Margolis and Agrawal, CoRL 2022, arXiv:2212.03238). Shappy's earlier runs show the same signature: two stair-trained policies stopped before the first riser with a 95th-percentile front-foot swing of 1.5 cm, below a 2 cm riser, against 5.0 cm for Stanford's released climbing policy, and every policy evaluated crossed fewer high steps at 0.3 m/s than at 0.5 m/s (terrain_training README).
Same-paper comparisons put perception's payoff on discontinuous terrain and on rises near the robot's limit. On ANYmal C a blind baseline's success "dropped at 20 cm step height" while a height-map policy "reliably traversed steps of up to 30.5 cm" (Miki et al., Science Robotics 2022, arXiv:2201.08117). On an A1 a depth policy climbed 17 cm stairs in every trial while the blind policy averaged 2.2 stairs and never finished; both descended, but the blind one used a falling gait that dislocated a rear leg, and on 26 cm gaps and 30 cm stepping stones it scored 0% against 100% and 94% (Agarwal, Kumar, Malik and Pathak, CoRL 2022, arXiv:2211.07638). In simulation a blind parkour student scored 0% on climbing, leaping and tilting where the depth student reached 86%, 80% and 73% (Zhuang et al. 2023), and a 2026 Go1 ablation found blind and depth policies equal on flat ground, descents and unseen slopes but at 40.0–40.3% against 69.0–98.3% on gaps (Affonso et al., arXiv:2606.19633, venue not verified). On moderate stairs blind policies are partly competent: a blind A1 succeeded in 40% of trials on 13.4–19 cm stairs before an RGB module trained on the robot raised that to 60–100% (Loquercio, Kumar and Malik, ICRA 2023, arXiv:2211.03785).
Most perceptive pipelines still learn terrain from privileged heights and close the sensor gap in a second stage. Height-map controllers train a teacher on noiseless heights, then a recurrent student under a noise model that shifts scan points laterally, perturbs heights, adds large offsets for pose drift and near-total noise for occlusion (Miki et al. 2022); newer ETH controllers add a noise-and-drift fine-tuning stage (about 6 days on an A100 in total) or learn the mapping itself inside simulation (about 60 RTX 4090-days), and run mapping on a Jetson or an i7-class CPU (He et al., Science Robotics 2025, arXiv:2506.09588; Zhang, Klemm, Yang and Hutter, T-RO 2026, arXiv:2601.08485). Depth pipelines run RL on cheap scandots or obstacle parameters and distill into a ConvNet-GRU student, because images "slow training down as much as 40 times" (Yang, Yang and Wang, CVPR 2023, arXiv:2304.01201); they feed 48 × 48 to 58 × 87 depth images at about 10 Hz into a 50 Hz policy and train in under 20 hours on one consumer GPU (Cheng, Shi, Agarwal and Pathak, ICRA 2024 per its DOI record, arXiv:2309.14341). The precedent closest to Shappy's hardware is SoloParkour: a 26 cm-tall Solo-12 runs a 48 × 48 depth policy at 50 Hz on a Raspberry Pi 5, with a RealSense D405 delivering depth at 30 Hz, trained by RL from privileged experience instead of DAgger (Chane-Sane et al., CoRL 2024, arXiv:2409.13678). Monocular RGB has worked three ways: learning vision on the real robot with labels from the robot's own later proprioception (40% to 100% with under 30 minutes of real data; Loquercio et al. 2023), training on generated images (a Go1 with a budget webcam and a Jetson AGX Orin crossed real stairs in 10 of 10 trials; Yu et al., LucidSim, CoRL 2024, arXiv:2411.00083), and Gaussian-splat simulators (GaussGym reports "initial zero-shot transfer" to real stair climbing; Escontrela et al., arXiv:2510.15352, venue not found). GaussGym and PIE train perceptive policies in a single stage, the exceptions to the two-stage pattern (Luo et al., RA-L 2024, arXiv:2408.13740). No peer-reviewed work found runs monocular depth estimation inside a quadruped control loop, and none uses a fisheye camera.
One policy covers walking terrain; specialists need distinct skills
Distilling several specialists into one policy entered quadruped locomotion in 2023 for agile skills and has stayed there. Robot Parkour distilled five privileged specialists with DAgger into one depth GRU that scored 86/80/100/73/100% on climb, leap, crawl, tilt and run against its teachers' 95/82/100/100/100%; the same student trained directly with PPO reached 0/0/73/0/100%, a comparison that confounds "one policy" with "no privileged information" (Zhuang et al. 2023). Barkour's distilled transformer scored 0.73 on a real agility course against 0.77 for switched specialists (19 against 71 runs), and a single multi-task RL run could not climb the 30° A-frame even with its training mix biased toward slopes (Caluwaerts et al., arXiv:2305.14654, 2023, no venue found). Risky Terrains reversed the direction, fine-tuning specialists from a stepping-stone generalist in 1,000–3,000 iterations where specialists trained from scratch for 10,000 "can not learn to traverse the terrains" (Zhang et al. 2024), while Extreme Parkour and Acrobotics trained single policies with one unified reward, the latter completing 99.61% of simulated courses (Gagné-Labelle, Atanassov and Havoutis, LNCS 16045, 2025, conference not verified, arXiv:2509.02727). Across these papers specialists appear when the teacher needs inputs the robot lacks, when a skill needs its own reward, curriculum or termination, or at cross-embodiment scale; for walking-class mixtures of rough ground, slopes and stairs, one PPO policy remained the default from 2019 to 2026. The 2024–2026 "generalist" controllers generalize across bodies on mild terrain rather than across hard terrain and rely on attention or long-context transformers; a GRU generalist averaged 0.37 against 0.96 for a Transformer-XL on ten unseen robots (Liu, Pathak and Agarwal, LocoFormer, CoRL 2025, arXiv:2509.23745).
Mixture-of-experts actors beat parameter-matched MLPs in every paper that ran the comparison, but the wins sit in gait-mode changes and perception-triggered maneuvers. MoE-Loco's blind Go2, walking on four legs and on two, scored 0.879 against 0.571 on a mixed course for a same-size MLP, yet only 0.684 against 0.568 on quadrupedal stairs, and lost on slopes, 0.956 against 0.988 (Huang, Zhu, Du and Zhao, IROS 2025 per the project page, arXiv:2503.08564). Its measurement of gradient conflict found negative cosine similarity only between bipedal and quadrupedal tasks; quadrupedal bar, baffle and stair tasks were positively aligned even in the plain MLP, at 0.37–0.61. A depth-gated Go1 MoE gained on gaps, 98.3% against 69.0%, but "yields no improvement for the blind baseline", whose ascent success fell from 85.0% to 71.3% with experts (Affonso et al. 2026, venue not verified). Capacity is the confound to beat: in sparse-MoE parkour a 1.6 M-parameter MLP climbed a 32 cm box in 9 of 10 trials against 10 of 10 for the MoE, where MLPs of 0.2–0.8 M managed 0/5 to 5/10 (Ziegltrum et al., arXiv:2604.19344, venue not verified). Shappy's 1024-512-512-512 actor already has about 1.8 M parameters (computed).
Skill hierarchies earn their cost when skills need different commands, rewards or terminations and the robot can see what lies ahead. ANYmal Parkour's learned selector over walking, climbing, crouching and jumping skills succeeded on 96.3% of a randomized parkour line where hand-coded sequencing managed 60.9%, a win over manual selection rather than over one policy (Hoeller, Rudin, Sako and Hutter, Science Robotics 2024, arXiv:2306.14874). The costs recur: jerky motions when one specialist hands the robot to another in an unfamiliar state (Barkour), asymmetric skills that strand the robot between obstacles, and eight interdependent networks to retrain when one skill changes. The one hierarchy compared with a single policy reports 100% against 30% on full-difficulty simulated stairs at 0.75 m/s, without trial counts (Shah, Tiwari and Bera, MTAC, arXiv:2401.03337, submitted to ICRA 2024, acceptance not verified). A blind selector can recognize a staircase only after a foot has struck it.
Two cheaper structural changes have better evidence for a fixed terrain mixture. Separate value heads per terrain raised a privileged oracle's success over flat, rough and climb-up terrain from 65.0% to 74.6% with terrain-specific rewards and from 53.4% to 61.8% with one shared reward, at lower value loss, because "the same reward function induces different value functions across tasks due to the differing transition dynamics of their terrains" (Affonso et al. 2026, venue not verified); multi-critic PPO also made keyframed motion and loco-manipulation insensitive to reward reweighting (Zargarbashi et al., RobotKeyframing, CoRL 2024, arXiv:2407.11562; Vijayan et al., arXiv:2507.08656, venue not verified). Forgetting is the other constraint. Specialists fine-tuned from a generalist that solved all nine levels of its terrain kept 9/9 there when their new terrain was similar but fell to 3/9 and 4/9 when it was not (Zhang et al. 2024), and sequential PPO across flat ground, slopes, stairs and tiles lost earlier terrains at several transitions, with stairs-up training hurting flat and slope walking (Minelli and Vassiliades, IMET 2023, arXiv:2311.06828, figures only). The remedies with evidence are keeping old terrain in the mix, as legged_gym's loop-back does, adding parameters while freezing old ones, and regularizing toward the old policy's behavior; weight-space regularization such as EWC did worst in a quadruped continual-learning study (Gai, Lyu, Zhang and Wang, Entropy 2024) and in general RL, where behavior cloning and kickstarting toward the old policy did best (Wołczyk et al., ICML 2024, arXiv:2402.02868).
Terrain-gated constraints and goal rewards beat always-on shaping
The legged_gym family shapes behavior with terrain-agnostic terms — a feet-air-time reward Σ(t_air − 0.5) paid at touchdown, a count of non-foot contacts, a stumble test ‖F_xy‖ > 5·|F_z| that ships switched off, a base-height term measured from the mean scanned terrain that also ships at zero — and floors each step's total reward at zero (legged_robot.py). The terms that know the terrain come from elsewhere: Lee's reward for the share of swing feet above the highest scanned point around them (Lee et al. 2020); Kim et al.'s average constraint on peak-swing foot clearance alongside probabilistic constraints on body contact, joint limits and orientation, which leave only three reward terms (Kim et al. 2024); and Extreme Parkour's penalty on foot contacts within 5 cm of an edge, which cut mean edge violations from 0.08 to 0.03 with progress unchanged (Cheng et al. 2024). All of them read terrain that a blind actor never sees but a simulator's reward function always can. The zero floor matters for small robots on stairs. When knee-collision penalties outweigh tracking, a falling policy and a surviving one both earn zero, which stalled Shappy's first from-scratch stair run; the project read its later stalls as the same effect, a robot standing before a riser keeping part of its tracking reward while one whose knee strikes the nosing earns nothing, though cutting the knee weight from −10 to −1 left one such run's outcome unchanged (terrain_training README).
Constraints as Terminations (CaT) is the most direct alternative, and it was tested on the robot closest to Shappy's size. Each violation raises a per-step termination probability δ = max_i p_max,i·clip(c_i⁺/c_max,i, 0, 1); rewards are scaled by (1 − δ) and δ enters PPO's done signal, so a violation costs future return instead of vanishing into a clip (Chane-Sane et al., IROS 2024 per the project page and HAL record, arXiv:2403.18765). Hard constraints (knee and base contact, foot contact force) terminate with probability 1, soft ones (torque, joint velocity and acceleration, action rate) ramp from 0.05 to 0.25, more than 60 terms need no grouping, and style constraints on orientation, hip angle, air time and contact count apply only where the local terrain is flat. On a 2.5 kg Solo-12 held to 3 N·m, the torque at which Shappy's MJX model clips, that last choice decided the real obstacle course: with style always on, the robot averaged 34.4% success over front stairs, sideways stairs, a slope and a 24 cm platform, against 79.4% with terrain-gated style and 90.6% with tracking also posed as a constraint (the platform alone 17.5% against 77.5–85.0%). The gate reads the terrain under the robot, which a blind training loop has even though its actor does not. Shappy's record points the same way from both sides: an always-on foot-clearance penalty scaled by horizontal foot speed, with a 6 cm target, left the policy covering 0.06–0.09 m forward in 3 s under 0.3–0.75 m/s commands while it still walked 0.54 m backward, whereas a terrain-relative base-height term (target 0.18 m, weight −300) raised standing height from 0.115 m to 0.183 m and 3 cm crossings from 85.5 to 96.5 of 100 (terrain_training README).
The largest reported change in climbable stair height came from changing the task. Rewarding the final position — a target 1–5 m away, credited only in the last second of a 6 s episode — instead of velocity tracking raised the highest simulated stair rise solved at ≥ 95% success from 0.22 m to 0.40 m, slopes from 35° to 48° and gaps from 0.15 m to 1.2 m, at the cost of a sparse reward and more sensitivity to training instabilities (Rudin et al., IROS 2022, arXiv:2209.12827). The command interface also decides whether a robot holds a line. legged_gym and Isaac Lab default to a heading command that recomputes ω*_z = clip(0.5·wrap(ψ* − ψ), −1, 1) rad/s every step, closing the loop on yaw but not on lateral position, so lateral drift is penalized only through v_y tracking, where exp(−e²/0.25) gives up 0.6% at a 4 cm/s error (computed; legged_robot.py). Extreme Parkour tracks world-frame directions to waypoints with min(⟨v, d̂_w⟩, v_cmd) because "even a few degrees of error in heading leads to failure", and base-frame tracking cut its mean progress from 0.98 to 0.75, and to 0.14 on steps, where the robot learned to walk around obstacles (Cheng et al. 2024). No published head-to-head of heading and yaw-rate commands on stair success or lane deviation was found.
Shappy climbs 0.23 leg lengths where blind A1-class robots climb 0.40
How far Shappy trails depends on the yardstick, and the two common ones disagree. By leg length L — thigh plus shank, 84.5 + 88.0 mm = 0.1725 m in the official MJX model — its 3 and 4 cm rises are 0.17 and 0.23 L, against 0.375–0.40 L for blind A1 policies, 0.60–0.65 L for an A1 with a depth camera and about 1.0 L for Robot Parkour's 0.40 m climb; carried over at 0.40 L, the blind A1 level would be about 6.9 cm on Pupper v3 (all computed). By standing height, the same rises are 0.17–0.22 of about 0.18 m against 0.59 for 16 cm on a 0.27 m A1 or Go2, which scales to about 10.7 cm (computed). The yardsticks diverge because the robots stand differently: Pupper v3's hip sits 0.161 m above the foot at its default pose, 0.93 L, while A1, Go1 and Go2 stand at 0.27 m on 0.40–0.426 m legs, 0.63–0.68 L (computed), so dividing by standing height credits the more crouched robots with larger steps for their size. Leg length is the better-grounded measure for stepping up, where a foot must reach the next tread; standing height bears on clearing the nosing with the body. Neither is a law. No robot paper fits climbable step height against size, and the only cross-size evidence found comes from running birds, which kept peak leg forces within 0.35 body weights of level running over obstacles of 0.1–0.5 leg lengths across a 500-fold mass range (Birn-Jeffery et al., J Exp Biol 2014). The papers' own normalizations add noise: Agarwal's "89% relative to its height" divides by a 28 cm hip-joint height, Robot Parkour's "1.53x robot height" by about 26 cm, and the 70 cm quoted for ANYmal and Spot is overall height.
| Robot and policy (sensing) | Leg L | Reported result | Rise / L (computed) | Rise / standing height (computed) |
|---|---|---|---|---|
| Pupper v3, Shappy own3_h1 (blind, simulated course) | 0.1725 m | 3 cm 96–99, 4 cm 77–86 of 100 | 0.17, 0.23 | 0.17, 0.22 |
| Pupper v3, Stanford climbing policy (blind, same trials) | 0.1725 m | 3 cm 87–89, 4 cm 0–1 of 100 | 0.17 | 0.17 |
| A1, HIMLoco (blind, real) | 0.40 m | 16 × 27 cm stairs, 20/20 | 0.40 | 0.59 |
| Go2, SLR (blind, real) | 0.426 m | 16 × 29 cm stairs; 35.4 cm single step | 0.38; 0.83 | 0.59; 1.31 |
| ANYmal C, Lee 2020 (blind, real) | ≈ 0.62 m | 16.8 cm step | 0.27 | 0.34 |
| ANYmal C, Miki 2022 (blind vs height map, real) | ≈ 0.62 m | Blind fails from 20 cm; perceptive to 30.5 cm | 0.32; 0.49 | 0.40; 0.61 |
| A1, Agarwal 2022 (blind vs depth, real) | 0.40 m | 17 cm: blind 0%, depth 100%; depth to 24–25 cm (the paper gives both) | 0.43; 0.60–0.63 | 0.63; 0.89–0.93 |
| Solo-12, CaT (motion-capture height map, real) | 0.32 m | 24 cm platform 85% | 0.75 | 0.92 |
| Solo-12, SoloParkour (depth, real) | 0.32 m | 40 cm step 85% | 1.25 | 1.54 |
Standing heights used are about 0.18 m for Pupper v3 (measured torso height), 0.27 m for A1 and Go2 (the MuJoCo Menagerie home keyframe), 0.5 m for ANYmal C (legged_gym's base-height target) and 0.26 m for Solo-12 (SoloParkour); ANYmal C's L is computed from its model's body offsets.
Tread depth is where Shappy's course is genuinely unusual. Published stair tests on A1-class robots use 27–31 cm treads with hips 0.37–0.39 m apart, 0.74–0.85 of the hip spacing; the printed course's 80 mm treads are 0.53 of Pupper v3's 0.150 m spacing and the training field's 70–120 mm span 0.47–0.80 (computed), so front and rear feet stand on different steps at once. The only match found is an unregistered Go1 stairs scene in MuJoCo Playground, with 0.20 m treads at 0.53 of the hip spacing (scene file). By leg length the gap narrows: 80 mm is 0.46 L against about 0.68 L in the A1 and Go2 tests, while legged_gym's 0.31 m treads on ANYmal C come to 0.50 L (computed). Stanford's released climbing policy shows what short treads cost a blind gait: climbable 4 cm on 240 mm treads, 2–3 cm on 80 mm (terrain_training README), the same rise-tread interaction Lee's filter learned when it avoided short, steep stairs first.
Peak torque does not single Pupper v3 out; its continuous rating does. As τ_peak/(m·g·L), the GIM4305's 3.5 N·m peak on a 3.17 kg robot gives 0.65, level with A1 (0.69) and the Go1 and Go2 knees (0.67–0.71) and nearly twice Solo-12 (0.34), while the 1.0 N·m continuous rating gives 0.19 (computed from the Pupper v3 specifications and the official MJX model). A static estimate from the model's geometry puts the knee near 0.7 N·m standing, about 1.1 N·m with a foot placed on a 4 cm riser before the body rises, and about 1.25 N·m at 8 cm, where the knee also reaches its roughly 40° flexion limit; doubling for push-off gives 2–2.5 N·m, under the peak, above the continuous rating and close to the 3 N·m training clip (estimates from forward kinematics, not measurements). Two readings of these numbers disagree. One holds that a 0.17 ratio far below blind A1's means actuation, leg geometry and tread limit Pupper v3 as much as missing perception does; the other points out that Pupper's peak-torque ratio matches A1's and that Solo-12 climbed a 0.75 L platform with about half of it, so perception and gait, not torque, bound a robot of this size. They differ in which torque figure they trust and in whether Solo-12's single 24 cm platform, climbed with a motion-capture height map, speaks for repeated blind steps. The static estimate sides with the continuous rating for sustained climbing, a step-up from the default stance has a kinematic ceiling near 8 cm either way, and only knee torque logged during training rollouts can settle the rest. The crouched gaits of Shappy's earlier policies, at 0.115–0.125 m, lengthen knee lever arms further.
Small-robot sim-to-real for terrain policies leans on limits rather than actuator models. CaT and SoloParkour keep Solo-12 within a 3 N·m constraint, violated 0.5–3.4% of the time on hardware, and SoloParkour's policy still "is likely hitting the battery current limits", which simulation did not model (Chane-Sane et al. 2024, arXiv:2403.18765; arXiv:2409.13678); Robot Parkour clips A1 torque at 25 N·m of a 33.5 N·m rating to protect the motors. Friction is the one parameter every work randomizes, from legged_gym's [0.5, 1.25] to [0.05, 4.0] for fast running on natural ground, alongside added mass of about −1 to +3 kg on 9–12 kg robots, motor strength ±10–20% and pushes of 0.5–1 m/s every 8–15 s (legged_gym config; Margolis et al. 2022; walk-these-ways train.py); none of the works read isolates one randomization range's effect on stair success, and Isaac Lab's velocity task leaves friction fixed unless a task overrides it (velocity_env_cfg.py). Upstream Pupper v3 already randomizes PD gains (kp ×[0.6, 1.1], kd ×[0.8, 1.5]), action latency, friction [0.6, 1.4], mass and inertia ×[0.9, 1.3] and the CoM offset, and its ROS 2 simulator adds ±0.01 rad backlash joints that the MJX training model lacks (training/default.yaml; backlash model). Height-scan noise of ±0.1 m, the legged_gym and Isaac Lab default, exceeds a 3 cm rise; CaT's ±1 cm is the small-robot precedent for any terrain input. No real-hardware stair result exists for any Pupper v3 policy yet, Shappy's included.
What transfers to a Brax PPO MLP, and what needs a second stage
Shappy's pipeline already has the default skeleton — one PPO MLP, 2 m tiles of flat ground, pyramid stairs and pits, a flat stage before the stair stage, terrain-relative contact, fall and base-height terms, and domain randomization — and lacks three standard pieces: a critic that sees more than the actor, a difficulty sampler that tracks success, and constraints that act only where the terrain calls for them. Its own record adds a warning. Three runs that raised the rise range ended below where they started: a fine-tune on rises up to 8 cm, the last 80 M steps of a row-curriculum run with levels up to 8 cm, and a 3–5 cm run started from the current policy, which fell to 5 of 100 even at 2 cm against 100 for its starting point while Brax's evaluation reward on the training field showed no change (terrain_training README). The two runs whose failures were classified stopped in front of the first riser. The first two runs started from Stanford's released weights before the project stopped using them as initialization, so they stand only as references. The project read all three as a field mostly beyond the policy teaching it to stop, but a 1–5 cm run started from its own flat policy improved instead, so what tips a policy into refusal is unmeasured. Lee's argument predicts the direction — terrain the policy cannot pass returns little signal, and with per-step rewards floored at zero, stopping is the cheaper way to fail — and points to sampling by pass rate rather than by rise range.
Sorted by what they would cost this pipeline, the published designs fall into three classes: modest (a change to the environment, configuration or network inside one Brax PPO run, with the exported actor unchanged on the robot), second stage (a further training phase after a policy converges), and new sensor.
| Published design | Change to Shappy's pipeline | Class | Evidence and caveat |
|---|---|---|---|
| Terrain mixing with loop-back (Rudin 2021; Zhang 2024) | Keep flat tiles and rises the policy already passes in every field; check flat walking at every stage boundary | Modest: field configuration | Fine-tuning on dissimilar terrain cut the original terrain from 9/9 to 3/9 and 4/9 |
| Pass-rate sampling (Lee 2020; Kim 2024; Margolis 2022) | Move each robot's level by its recent pass rate toward 0.5–0.9 rather than to the frontier, on one grid of rise, tread and speed | Modest: environment code on the existing row curriculum | Uniform sampling plateaued lower (plotted only); no head-to-head against legged_gym rows |
| Asymmetric critic (Pinto 2017, venue not verified; Playground Go1) | Emit a privileged observation (base velocity, foot heights above terrain, local heights, contact forces, friction, push force) and point Brax's value_obs_key at it | Modest: the key exists on Brax main; the pinned commit was not checked | TAR +28.2%, mostly out of distribution; SLR found no in-distribution need |
| Estimator heads (Ji 2022) | Regress base velocity, foot height and contact probability to simulator truth and feed them to the actor | Modest to moderate: Brax PPO has no auxiliary-loss hook (inferred, not checked in source) | Time-to-fall 25.0 → 85.7 s; higher clearance at low speed |
| Constraints as terminations (CaT 2024) | Knee and base contact as hard terminations; torque near the continuous rating, action rate and style as soft constraints, style on flat tiles only | Modest: environment step; an mjlab port runs on MuJoCo Warp | Solo-12 course 34.4% → 79.4–90.6% at a 3 N·m limit |
| Terrain-relative clearance or swing command (Kim 2024; Extreme Parkour; Walk These Ways) | Clearance above the heightfield under each swing foot as an average constraint on stair tiles, or a commanded swing height | Modest | Edge violations 0.08 → 0.03; Shappy's always-on speed-scaled version stopped forward walking |
| Multi-critic value heads (Affonso 2026, venue not verified) | K-column reward and value, per-column GAE and advantage normalization | Moderate: PPO loss | 65.0 → 74.6% and 53.4 → 61.8% on a privileged oracle |
| Lane-referenced task (Extreme Parkour; Rudin 2022) | World-frame direction to lane waypoints, or reach-the-lane-end position goals | Moderate: task and reward | Mean progress 0.98 world-frame vs 0.75 base-frame; stairs 0.22 → 0.40 m with goals |
| Longer memory or recurrence (Lee 2020; Siekmann 2021) | History of 50+ steps, or a GRU | Moderate: a GRU needs training-loop and robot-runtime support | Hind-leg failures with short memory; no small-robot ablation |
| Mixture of experts (MoE-Loco 2025) | Soft-gated experts in the Flax actor | Moderate: network and runtime | No blind gain; a same-total-size MLP nearly matched |
| Teacher-student distillation (Lee 2020; RMA 2021) | Shappy's own privileged policy as teacher; blind student by DAgger or latent regression | Second stage | One-stage CTS beat two-stage on every terrain |
| Depth student (Agarwal 2022; SoloParkour 2024) | Privileged teacher in MJX, batched depth rendering, a D405-class camera, a 48 × 48 ConvNet-GRU on the Pi 5 | Second stage and new sensor | Pi 5 at 50 Hz shown; depth rendering in MJX or MuJoCo Warp unmeasured |
| RGB from the existing camera (Loquercio 2023; LucidSim 2024; GaussGym) | Vision trained on the robot from proprioceptive labels, or photoreal rendering in training | Second stage on hardware, or GPU rendering | 40% → 100% in under 30 min of real data; no fisheye precedent; Pi 5 encoder cost unreported |
| Skill hierarchy (ANYmal Parkour 2024) | Selector over the project's own skills; switching at runtime | Second stage plus perception for selection | A blind selector sees stairs only after contact |
The perception routes need one more distinction because the robot already carries a global-shutter fisheye RGB camera. A depth route copies SoloParkour. Its privileged teacher is cheap in MJX, where heights under and ahead of the feet are heightfield lookups, and a grid of roughly 2–4 cm spacing over a few tens of centimetres would match 80 mm treads by scale (inference); its student needs batched depth rendering during training, which is unmeasured for MJX and MuJoCo Warp — Playground's Madrona renderer did not support heightfields when its paper was written (arXiv:2502.08844) — plus an added depth camera and battery-current limits in simulation. The RGB route needs no new sensor: Loquercio's cross-modal supervision trains the visual module on the robot with labels from the blind policy's own proprioception, which also avoids simulating the fisheye lens, at the cost of real-world walking time and a training loop on or near the robot. An elevation-map route needs depth or LiDAR, state estimation and a mapping computer, and fits a Raspberry Pi 5 least. In every route the teacher must be one of the project's own policies, since Stanford's serve only as baselines.
Each open question has an experiment that separates its alternatives inside the existing pipeline.
| Open question | Alternatives | Separating experiment | Reading |
|---|---|---|---|
| What sets the 4–5 cm ceiling? | Missing terrain information, or torque, knee kinematics and tread | Train a privileged-height actor (heights under and ahead of each foot as actor input) with the current recipe and field; evaluate 3–6 cm on the 80 mm course with knee torque and angle logged; repeat with the 3 N·m clip lifted in simulation only | Privileged actor crosses 5–6 cm where the blind one does not: information binds and perception is worth a second stage. Both stall at the same rise with knees at the clip or flexion limit: actuation or geometry binds, and a camera will not help |
| Does a privileged critic help a blind MLP here? | SLR (no need in distribution) or TAR (gain out of distribution) | Same start, field and seeds, both with a newly trained critic, one critic also seeing privileged inputs; score 3 and 4 cm nominally and under pushes, 0.7 m/s, friction extremes and added mass; three PPO seeds per arm | Gain only off-nominal: TAR's reading holds at this scale. No gain anywhere: SLR's does |
| Is difficulty sampling the lever above 4 cm? | Sampling, field range or training length | From own3_h1: a fixed 2–4 cm field (control), the implemented 1–8 cm row curriculum, and pass-rate sampling, at equal steps; score 3–5 cm crossings and the share of trials that stop before a riser | Pass-rate sampling beats both: sampling. Both curricula beat the control: any curriculum. All equal: neither |
| Do treads or rises limit the blind gait? | Rise-tread coupling, or rise alone | Evaluate the current policy on 80, 120, 160 and 240 mm treads at 3–6 cm; if tread matters, add tread to the curriculum grid | Climbable rise grows with tread: train on tread explicitly. Unchanged: the rise binds |
| Are lane exits a command problem? | Lateral drift under heading commands, or balance swerves on short treads | Heading command with the evaluation's lateral v_y correction, world-frame waypoint tracking, and lane-end position goals; count exits per 100 trials | Exits vanish with waypoints or goals: formulation. They persist: balance |
| Does stair training erode flat walking? | Retention or forgetting | Displacement under fixed commands, standing height, pitch-rate RMS and zero-command standing at every stage boundary, for stair-only, mixed and KL-to-own-flat-policy training | Within noise: mixing suffices. A loss: regularize toward or distill from the project's own flat policy |
| Is 0.4 s of memory enough? | Memory-bound or not | 5 steps plus estimator, 20 steps and 50 steps; classify failures by the leg pair that first meets the riser and by ascent or descent | Hind-leg failures fall with longer history: memory-bound, as for Lee's student |
| Will simulated crossings survive hardware? | Backlash, sustained torque or printed-surface friction | ROS 2 simulator with ±0.01 rad backlash; friction sweep around the printed material; a CaT torque constraint at the continuous rating; then printed-course trials | Crossings hold under all three: proceed to hardware. One breaks them: model it in training first |
These comparisons need the project's stricter measurement, not the literature's. Real-robot tables in this field rest on 5–40 trials per condition, where the binomial standard error at 80% success is about 9 percentage points for 20 trials (computed). The project's identical 100-trial simulated runs differ by up to 14 crossings, later re-runs placed the current policy at 91–99 at 3 cm and 71–80 at 4 cm, 10-trial checkpoint screens did not rank checkpoints, and Brax's training-field reward missed both a flat stage that barely followed commands and the 3–5 cm collapse (terrain_training README). At about 24 minutes per 400 M-step run on MuJoCo Warp, a two-arm comparison with three PPO seeds per arm costs about 2.5 GPU-hours before evaluation (computed).
Conclusion
The multi-terrain literature is less a story of architectures than of keeping a policy learning at the edge of what it can do: success bands and loop-backs in the curriculum, penetrable obstacles before solid ones, constraints that switch off where they would block a skill, and critics that know the terrain the actor must infer. For a 3 kg blind robot on 80 mm treads there is no published comparator — Solo-12 is the only sub-5 kg robot with published learned terrain numbers, and both of its results used terrain perception — so Shappy's course is effectively a new benchmark, and the literature transfers by mechanism rather than by number. The mechanism with the most direct support in Shappy's own data is difficulty sampling: losses of climbing ability on harder fields, invisible in at least one case to the training reward, are the failure Lee et al. attributed to sampling terrain the policy cannot pass, which argues for curricula specified by pass rate rather than by rise range.
The decision that matters most for the hardware is still open. Leg-length scaling says blind headroom remains, 0.23 L against 0.40 L, while the continuous torque rating, the knee's flexion limit and treads at half the usual body-relative depth could each consume it. A privileged-height actor in the existing MJX pipeline settles which within a few GPU-hours and before any sensor is bought: if it climbs well past 4–5 cm, SoloParkour's Raspberry Pi 5 plus depth-camera route is the one small-robot precedent, gated on depth rendering in MJX or MuJoCo Warp; if it stalls where the blind policy stalls, the next gains lie in torque-aware constraints and gait, and a camera would add cost without adding height.
Source notes, scripts and their outputs: notes/research_notes/Multi terrain quadruped policy training/ in the Shappy repository.