rhoyn

rhoyn is a humanoid data company. We build bleeding-edge teleoperation software and use it to collect high-quality datasets in diverse environments, then provide them to the teams training humanoid robots.

github.com/rhoyn

Walk slowly and precisely

When you drive a humanoid by hand, most of what you ask for is small: ten centimetres closer to the counter, a tenth of a radian to face the shelf. We tested how thirty-four open-source walking policies for the Unitree G1 handle those small requests. Most ignore them. A few seem to obey but are really just drifting.

github.com/rhoyn/teleop-walking-benchmark

The policies are other people’s work; we only measure them. Everything below is in simulation, MuJoCo and PhysX, except the robot test.

Drive it yourself. This is gr00t_wbc at 0.74 m, the best policy below, running in your browser on MuJoCo. Click the robot, then W/S walks forward and back, A/D steps sideways and Q/E turns. Pick how big each request is:

You asked for 0.2 rad/s. The robot gave you zero.

We tried it on our own G1. We asked it to turn on the spot, raising the request slowly from nothing to 0.8 rad/s. It turned at roughly a fifth of what we asked, in fits and starts.

Then we held three fixed speeds. Asked for 0.2 rad/s, it did not turn at all. Asked for 0.4, it crept round at 0.01 rad/s. Asked for 0.6, it managed 0.1 — a sixth of the request. It never really stepped; it shuffled, lifting its feet less than a centimetre.

The policy was gr00t_wbc, crouched at 0.66 m — the height that won our punch benchmark.

Why policies ignore small requests

Mostly because they were built to. Small requests get thrown away in three places.

REFINE-DP describes the same problem and suggests placing footsteps instead. Nobody had measured it across policies, so we did.

The test

Each run gives the robot one request and holds it for ten seconds: turn at a set speed, or walk at a set speed in a set direction — forwards, backwards or sideways. Requests go up to 1 m/s or 1 rad/s. Every policy ran 4096 times per request type, per simulator. We measure what the robot actually did from the second second to the end, and drop runs where it fell.

Our first scoring looked only at speed, and it was misleading: a robot that wanders off at 13 cm/s no matter what you ask looked like the most responsive one. So we score small requests, 0.05 to 0.15, by how far the robot moved in the direction it was asked.

In this video every robot was asked to turn right on the spot at 0.1 rad/s and nothing else — stand in place and rotate. Any walking forward, backward or sideways you see is drift, and it counts as error.

In this one every robot was asked to walk straight forward at 0.1 m/s and nothing else — no turning, no sidestep. Any turning or sliding sideways you see is drift, and it counts as error.

Results

Twenty-two of the forty-two configurations stay upright reliably enough to score. The columns:

policylegs KP/KDerrorwalk: right waywalk: delivereddrift at zero m/sturn: right wayturn: delivered
gr00t_wbc_h074_p000x1.037%97%0.850.001 / 0.00299%0.90
openwbtx1.062%90%0.790.042 / 0.05399%0.75
gr00t_wbc_h070_p000x1.065%80%0.580.001 / 0.00286%0.59
gr00t_wbc_h066_p012x1.569%85%0.530.001 / 0.00183%0.60
wbc_agile_velocityx1.075%11%0.020.002 / 0.00169%0.54
gr00t_wbc_h066_p000x1.577%77%0.530.001 / 0.00181%0.59
zealotx1.085%50%0.360.011 / 0.00121%0.09
wbc_agilex1.088%37%0.110.003 / 0.00316%0.17
sonicx1.093%6%0.010.006 / 0.00744%0.22
mimic_litex1.096%10%0.010.009 / 0.00549%0.26
clobot_with_armsx1.097%17%0.000.001 / 0.00128%0.07
decoupled_wbc_h070_p000x1.099%26%0.010.001 / 0.01024%0.03
handoff_with_armsx1.099%48%0.010.000 / 0.00051%0.52
decoupled_wbc_h074_p000x1.0100%11%0.000.001 / 0.0011%0.01
homiex1.0100%14%0.000.001 / 0.0010%0.01
rl_labx1.0100%24%0.010.001 / 0.0020%0.01
decoupled_wbc_h066_p012x1.0100%29%0.000.000 / 0.12425%0.02
amox1.0100%44%0.050.002 / 0.00577%1.07
robomimicx1.0101%13%0.000.004 / 0.00420%0.08
decoupled_wbc_h066_p000x1.0101%32%0.000.001 / 0.15327%0.01
falconx1.0135%69%0.820.132 / 0.112100%0.95
asapx1.0172%69%0.750.129 / 0.11766%0.52

gr00t_wbc at 0.74 m is the clear winner. It goes the right way almost every time, delivers 85–90% of what you ask, and stands perfectly still when you let go. 0.74 m is the height its authors ship. The lower, crouched heights survive punches better but lose this precision.

gr00t_wbc at 0.74 m, measured against commanded speed: rotate on top, direction below, legs KP/KD x1.0, x1.5 and x2.0 left to right. MuJoCo in white and PhysX in black follow a line close to x = y from the smallest commands

The same chart for every policy — how it turns and how it walks for each request, in both simulators and at every leg stiffness — is in results/cmd_vs_real_movements.

openwbt follows small requests but creeps forward at 4–5 cm/s whenever it is walking, even while turning on the spot. It only stops creeping when the request is exactly zero. OpenWBT’s own cut-off at 0.1 hides this. It also falls much sooner under punches: 34 seconds on average, against over 80 for gr00t_wbc.

falcon and asap only look responsive. Asked to stand still, they wander at 11–14 cm/s, and a third of the time they go the wrong way.

The rest barely move. homie, rl_lab and decoupled_wbc at 0.74 m will not turn until asked for 0.4–0.6 rad/s. decoupled_wbc at 0.66 m stands still in MuJoCo but drifts at 12–15 cm/s in PhysX — same network, different simulator.

What works and what does not

Why we wrote this

To help you pick the right policy for your job. Every one of them has strengths and weaknesses: gr00t_wbc at 0.74 m places the robot precisely but falls sooner under punches; the crouched heights survive punches but ignore small requests; openwbt follows every request but creeps. Most of the time the top policies are interchangeable, depending on what you need the robot to do — but only if you know where each one falls short.

And to get small, precise movements taken seriously. Today few policies support them well. We hope that showing the gap will bring more policies that do it right.

Everything is in github.com/rhoyn/teleop-walking-benchmark.

If you need high-quality humanoid teleoperation datasets, contact us hello@rhoyn.com

Let’s talk!

hello@rhoyn.com