Go2 crawl¶
A Unitree Go2 must duck under a low bar or stop — the campaign's second benchmark for temporal commitment: a closing gate creates a region where standing still eventually becomes unsafe, so the robot must decide to crawl through in time. Unlike the gap, there is no gait-phase launch conversion, which sidesteps the co-adaptation wall.

Experimental — a folded thread
The crawl / low-bar / tunnel line is shelved: a model-free reach-avoid executor hit a ~0.3 success ceiling on sustained crawling (a sustained crouch-crawl is a harder problem than the one-decision gap jump). The environments below remain registered for reference but are not recommended entry points and may not reproduce a clean result. The negative finding — and the filter-as-gate pivot for resuming it — is preserved in the project record.
Tasks¶
| task | objective | learner |
|---|---|---|
go2_crawl |
duck under the bar → safe rest past it | ReachAvoidPPO1P |
go2_crawl_duck |
momentum approach at a low bar + forward-velocity reach | ReachAvoidPPO1P |
go2_crawl_gate_ra / _gate_avoid |
closing-gate twins: descending virtual ceiling (RA vs avoid) | ReachAvoidPPO1P / SafetyPPO1P |
go2_crawl_twin_ra / _twin_avoid |
static-bar twins (negative control: no committed region ⟹ avoid == RA) | ReachAvoidPPO1P / SafetyPPO1P |
go2_crawl_isaacs |
crawl + worst-case base-force adversary | ReachAvoidPPO2P |
The *_twin_* and *_gate_* pairs are the claim's controlled experiment: the
avoid and reach-avoid twins share one g, and differ only in whether an l
target is present — the contrast should appear only where a committed region
exists (the closing gate), not on the static bar.
Margins¶
g(safety) = crawl integrity: terrain-relative height / tilt / non-foot contact, plus (gate variant) a virtual descending-ceiling term and acrushed_by_gatetermination.l(target) = forward-velocity liveness / rest past the bar (≥ 0once through). The avoid twin declares nol(compose(g_fn)); see margins.
Run it¶
python examples/train.py --family on_policy --task go2_crawl_gate_ra # reach-avoid, closing gate
python examples/train.py --family on_policy --task go2_crawl_gate_avoid # avoid control
from robot_safety_sandbox import make_tensor
env = make_tensor("go2_crawl_gate_ra", num_envs=2048)