CUTE Robot Simulator
Drive a simulation of CUTE, a small bipedal robot, in your browser. It runs the same control policies we deploy on the real robot, on a physics model of the real hardware.
You'll need the password you were given. The sim opens in a new tab.
What this is
CUTE is a small two-legged robot (about 0.8 m tall, 16.8 kg, 14 motors: 5 per leg and 4 in the neck). This is a physics simulation of the real robot's test-rig plant, driven by the same kind of neural-network controllers that run on the hardware. None of what you see here has run on the real robot yet except the walker.
Four policies, one supervisor
- STAND - the standing policy and the hub. It stands still and follows head and torso commands; the gestures (nod, shake, bow ...) are command timelines played into it. This is where you start.
- Walker - walks forward and turns on command.
- Foot tap and happy dance - each plays one clip from STAND and ends standing.
You never switch between them yourself. You ask for something and the supervisor makes the switch: walker <-> STAND and STAND -> clip -> STAND, never walker <-> clip. Every switch is hard: on one control tick, when both feet carry load, with no blending. A refused request shows its reason as last call in the status panel.
Your session
- Your own robot; at most 4 at once; freed after 10 minutes without any input.
Startup
A new robot (and every Reset) comes up in STAND through the walker's start sequence, about 8.5 s: HOLD (2 s approach to the hold pose), GO at 3.5 s, BLEND 5 s, ACTIVE.
Walking
Push a walk command and the walker takes over at once (one tick, in double support). When the command is back to zero, STAND takes back by itself once the walker stands still, about 1.5 s later. Limits: forward 0 to 0.15 m/s, turn +-0.4 rad/s. Backward is refused (this walker falls on it) and sideways is clamped to 0 (the walker's own ranges are vx -0.15 to 0.3).
Keys (click once on the 3D view first):
| key | action |
|---|---|
| I / K | walk faster / slower, +0.025 / -0.025 m/s |
| J / L | turn left / right, +-0.1 rad/s |
| Space | stop |
| Shift + I / K / J / L | head up / down / left / right, 0.1 rad a press |
| C | centre the head |
| U / O | squat lower / raise, 10 mm a press |
| Shift + U / O | bow more / less, 0.05 rad a press |
| 1 - 8 | nod, shake, scan, bow, squat, greeting, bob, perk |
| 9 / 0 | foot tap / happy dance |
| N | neutral stance |
| B | say the selected sound |
| M | MOTION STOP |
| G / R / X / P / F / H | GO, Reset, E-STOP, pause, camera follow, this guide |
Gamepad (PS4-style, on your computer, Chrome or Edge; press any button once so the browser sees it): left stick: walk and turn | right stick: head | L2 squat, R2 bow | L1 + right stick: torso twist / lean | cross nod, circle shake, square scan, triangle greeting | d-pad up bow, down squat, left bob, right perk | R1 foot tap, SHARE happy dance | L3 neutral stance, R3 centre head | OPTIONS motion stop. If the pad goes silent for 0.5 s while the walk stick is held, the walk command is zeroed.
Head and torso
Head and torso (STAND) panel, the right stick and the triggers, or the Shift keys. The head also acts while the robot walks: the walking policy runs the legs and the head command drives the neck beside it (yaw within 30 deg, at most 2.5 rad/s), and it carries over when STAND takes back. The torso needs STAND: it is refused while walking and returns to neutral before the walker takes over. Both are refused while a clip plays. Commands are clamped and rate-limited to what the policies were tested with, and one head command moves an angle by at most 0.4 rad.
Gestures and clips
- Gestures (yes, no, scan, perk, roll, sweep, admire_down, bow, squat, greeting, bob): timelines of head and torso commands played into STAND once. No policy switch.
- Foot tap and happy dance: their own policies. STAND must have been in control for 1 s; then STAND -> clip -> STAND, both switches hard.
- A clip or gesture cannot be interrupted. Requests during one are refused with busy; stop leaves it playing. Only MOTION STOP ends one early: the walk command is zeroed and the joints are held from the next double support (Reset to continue).
Switching, underneath
A switch waits for double support (both feet over 60 N for 3 ticks, forced after 3 s), then happens on that tick. The incoming policy is given the last three actions and the last target that was sent, and its command starts where the robot is: STAND's head command at the measured neck angles, its torso command at zero, a clip at its first frame.
People
Scripted people can walk around the robot: 13 short scenarios (someone walks past, comes up and stops, crouches, a child, two people at once ...). They are drawn figures on a script; they cannot touch the robot.
- Wait for ACTIVE, pick a scenario and press Start. The view moves back so you see the people arrive.
- behaviour layer
none: you drive, with the keys or the gamepad, and the people still react to the robot. fast: a small hand-written layer looks at the person, turns and walks up to them, stops at about 1.1 m and greets, all through the same requests your buttons send.fast+directoranddirectoradd a slow decision-maker that acts on a picture slow caller delay seconds old;followeris a simple baseline.- perception sets how well the robot sees (field of view, noise, dropouts). The panel shows what it currently sees of each person and the layer's last requests. A scenario ends by itself or with Stop.
Floor / plant
Harness cell presets (each rebuilds the floor and resets):
- v254 (rig nominal: v2, 54 ms)
- c54 (soft foot v6c10s, 54 ms)
- osc (c54 + IMU roll 2.5 deg @ 0.62 Hz)
- c74 (v2, 74 ms)
- plant_v2.sh (v2, 54 ms + 52 ms hip-roll torque lag)
Floor (pick, then Build floor):
- flat v2 (rig nominal plant)
- soft box-sole foot cell (v6c10s)
- bump15 field, v2 feet
- bump15 field, v6c10s feet
- generated small bumps
-
slope
-
feet for generated floors: v2 sphere soles or the soft v6c10s box sole.
- generated small bumps: shape (domes, low boxes, boxes + lying capsules (teammate bump15 style), dense domes (random terrain)); bump height 2-20 mm, size / spacing 3-15 cm, density 1-40 per m^2, layout seed (Reseed layout = next seed). A 0.3 m disc around the start stays clear.
- slope: -5 to +5 deg (+ = uphill ahead); flat start plateau, the ramp begins 0.35 m ahead.
- friction: scene default (v2 mu 1.0, v6c10s soles 0.8) or the mu slider 0.3-1.3 (applies immediately).
- hip-roll 52 ms load-gated torque lag and robot torque law r x clip(u, cap): plant options, applied with Apply plant options (rebuild + reset).
Domain randomization
Each item has on and range slider(s). Turning an item on draws a value inside its range right away; Resample redraws every enabled item; Reset + resample does it through a reset; All off returns to nominal. Items marked +- use the slider's upper value as a symmetric bound. The drawn value is shown under each item.
| item | ranges | what it simulates |
|---|---|---|
| loop latency (obs age + lag + act) | ms 20-110 ms (default range 26-74) | plant: all controllers |
| kp scale | x 0.5-1.5 (default range 0.9-1.05) | plant: all controllers |
| kd scale | x 0.5-1.5 (default range 0.8-1.05) | plant: all controllers |
| RS03 firmware cap | units 20-60 (default range 33-60) | plant: all controllers |
| joint friction scale (BAM law, per joint) | x 0.3-2 (default range 0.8-1.3) | plant: all controllers |
| mass scale + payload | scale 0.9-1.1 (default range 0.97-1.03); payload 0-1 kg (default range 0-0.5) | plant |
| base CoM offset (B frame) | x fwd -15-15 mm (default range -8-8); y left -15-15 mm (default range -5-5); z up -15-15 mm (default range -5-5) | plant |
| encoder bias (+-, per joint) | legs 0-5 deg (default range 0-1); hip roll 0-5 deg (default range 0-2.5) | sensor: every controller's q (walker obs, idle/neck obs + estimator) AND the motor PD frame |
| IMU mount error (+-) | roll 0-10 deg (default range 0-6); pitch 0-10 deg (default range 0-5) | sensor: walker IMU (Mahony, obs) + idle/neck estimator IMU |
| IMU roll oscillation | amp 0-6 deg (default range 0-4); freq 0.1-2 Hz (default range 0.4-1) | sensor: walker IMU + idle/neck obs attitude/ang-vel (harness --imu-roll-osc) |
| extra gyro noise (std) + bias (+-) | std 0-0.1 rad/s (default range 0.01-0.02); bias 0-0.05 rad/s (default range 0-0.01) | sensor: walker + estimator IMU (on top of the harness --imu-noise 1.0 model) |
| sole z stiffness | K 5-80 kN/m (default range 20-45) | plant (scenes with the sole slide joint) |
| floor friction | mu 0.3-1.5 (default range 0.6-1.3) | plant (floor/bump geoms + sole geoms) |
| random pushes (heading frame) | interval 1-15 s (default range 4-8); dvx +- 0-0.4 m/s (default range 0-0.15); dvy +- 0-0.4 m/s (default range 0-0.1) | plant (base velocity kicks) |
External force
Push the robot: application point (pelvis or any body), azimuth 0-360 deg (0 = forward, 90 = left, robot heading frame), elevation -90 to 90 deg (+ = up), mode force (magnitude 0-200 N for duration 0.02-2 s) or impulse (a sudden velocity change delta-v 0-1 m/s of the whole robot's mass), then Apply. A red (force) or orange (impulse) arrow shows it. 40 N for 0.2 s sideways is a gentle push; 1.5 m/s sideways knocks it over.
Sound
Sounds for what your robot does (other visitors never hear them):
- walking: a melody loops the whole time the walker walks; it fades out when you stop (command back to zero and the robot stands) or when the walker loses control (switch, fall, reset);
- the walker or idle takes control (walker ready, back to idle after walking): "hi, hello";
- a turn starts: "woohoo"; speed change (vx up / down): a little blip;
- neck clips, when a clip starts: yes "yeah-yeah", no "hmm", perk "yippee", scan "hoo-hoo", roll a giggle, sweep "yay", admire_down "wow";
- standing idle a while: now and then a sound or a gesture, chosen by the mood (calm: every 20-40 s, mostly nothing; playful: every 6-12 s; quiet: never); Say sound plays any of the robot's sounds on demand;
- e-stop: "uh-oh" (the melody stops at once); end of your session: "bye-bye".
Sound panel: Sound on (default) / off, volume, Play melody, a Sound test dropdown (two longer clips) and Stop sounds. A cue repeats at most every 2 s (the blip every 0.15 s) and at most two cues play at once; the walking melody is separate and never blocks them.
View and camera
- Rotate: left-drag. Pan: right-drag (or shift + drag). Zoom: scroll / pinch.
- W/A/S/D/Q/E and the arrow keys move the camera (that is why the robot uses I/J/K/L/U/O).
- Follow (F, on by default) keeps the robot centred by moving the world under it. trail draws the path; show collision geoms shows the sole contact spheres.
Reading the status panel
- Stage: HOLD, BLEND, ACTIVE, FELL / ESTOP / FROZEN.
- in control: walk, stand, foot_tap or happy_dance. behaviour / state / mood: what the runtime is doing. supervisor: the switch it is carrying out. last call: the latest request and its answer, ok or REFUSED (reason).
- cmd set / walker sees / achieved: the walk command, after the walker's smoothing, and the robot's velocity.
- tilt (fall above 25 deg; a commanded bow shows here too), feet R/L in newtons.
- The last lines are the event log (hard switches, timelines, refusals, falls).
Troubleshooting
- The robot fell: tilt over 25 deg or a motor at its torque limit. Press Reset (R).
- A request did nothing: last call says why (busy with a clip, walking, startup not finished, fallen ...).
- Keys do nothing: click once on the 3D view; W/A/S/D and the arrows move the camera, not the robot.
- Gamepad not seen: press a button on it, use Chrome or Edge, check the Gamepad panel.
- Turning on the soft-sole floor can trip the walker's torque limit; that is the walker, not the switch.
Limitations
- A simulation of the test-rig model. STAND, the gestures, foot tap and happy dance have not run on the real robot.
- Forward and turning only; no backward or sideways walking.
- Please free your robot (close the tab) when done.
Upcoming motions
Motions in development, rendered from their reference clips on the same robot model. Not in the sim yet. (Bow, squat, greeting, foot taps and the happy dance moved into the sim on 2026-10-09.)
Loading…