HIM Arena · Sports Robotics Challenge · Open Build

A robot that dribbles between its legs.

G1 Brunson is a Unitree G1 humanoid taught, by trial and error inside a physics simulation, to do the between-the-legs crossover with a regulation basketball. No sensors on the ball. It sees it with its own head camera.

0crossovers / 20 s
0chained in a row
0.31 sper bounce
0falls in 12 tests
Fly around it in 3-D ↓ Code on GitHub
simulation · standard 20 s test · real-time
01 · 3-D replay

Fly around the real thing.

This is the recorded test episode, not an animation: the actual G1 meshes from Unitree's robot description, driven by the joint angles the controller produced, frame by frame. Drag to orbit, scroll to zoom, scrub the timeline. Orange ticks are bounces that landed between the feet.

t = 0.0 scrossovers so far 0free camera
loading meshes…
🖱 drag to orbit · wheel to zoom · right-drag to panspace play/pause · step one frameHead cam is the D435 pose from the URDF, so this is the viewpoint the perception module gets.
02 · The build story

Eleven runs, one winner. Click through.

Each run is a training session on a rented GPU. Each one taught us something, usually by breaking. The bar is the number of crossovers per 20-second test.

crossovers per 20 s in the standard test, by run
03 · The reward

Be the referee.

Reinforcement learning is just: do something, get a score, do more of what scored. The whole trick was writing the scoring rule so that only a real crossover pays. Flip the switches to see how one bounce gets scored.

+0score for this bounce

Also in the rulebook
  • +1 every time a palm plays the ball
  • −0.3 for a bounce the robot did not cause
  • −5 if the ball rolls away and has to be replaced
  • −12 per metre the dribble apex is below 0.30 m
  • −50 for falling over (this one mattered most)
  • small charges for jerky motion, feet lifting, bad posture
04 · Perception

What the robot sees.

These frames are rendered by MuJoCo from the robot's head camera during the recorded test, then run through the shipped perception module. Nothing here is illustrated by hand. Pick a stream; it plays on its own, scrub to pause.

head camera framecolour stream · 424×240
1 · colour
2 · depth
3 · minus own body
4 · ball found
1 → 2: depth, not colour

The D435's depth stream is the primary sensor (87° × 58°, wider than the colour stream). Near is bright. It does not care about lighting or floor colour.

2 → 3: subtract yourself

The robot renders what its own body should look like from its joint angles and removes it from the depth image. The floor cancels too. Whatever is left and closer than the body is the ball.

3 → 4: fit a sphere

A sphere of the known radius is fitted to the remaining pixels, giving the ball's centre to about 2 mm. When the ball is hidden under the body (white circle), a Kalman tracker with a bounce model carries it through.

In numbers, this clip

05 · Grounded in real numbers

Nothing made up. Tap a card.

06 · The challenge

Built for the HIM Arena sports robotics challenge.

HIM Arena's Open Build challenge asks for a humanoid skill that is grounded in real physics, evaluated honestly, and shipped as a package anyone can run: a policy, a simulator, and a writeup. Here is how G1 Brunson answered each line of that brief. Click a card.

See the arena entry Download the package

07 · Deploy

Run it yourself.

Three paths: run the test on a laptop in five minutes, retrain from scratch on one GPU in about a day, or put it on a real G1. Tick the boxes as you go; the page remembers.

BRUNSON 11
08 · The name

Why "Brunson"?

Built in the afterglow of the Knicks' championship run. Jalen Brunson keeps the ball low, tight and on a string, and never looks rushed. That is what we were trying to get out of a robot with rubber hands. G1 is the robot, Brunson wears 11. Two ones. We noticed after naming it.

Click the jersey. Not affiliated with the NBA or the Knicks, just fans.