Overview / Simulation
The digital twin

A robot you can
break for free.

MABEL exists twice. One copy is aluminium and 59 motors; the other is a 2 ms MuJoCo timestep, and both answer to the same controller through the same wire contract. Every trajectory, every policy and every bug is cheaper to find on the second one — so that is where the work starts.

500 Hz physics35 environments59 actuatorsPPO + imitationno hardware needed
One model

The twin is the same robot.

There is one file. simulation/mabel_mujoco/models/mabel_full.xml is the canonical MABEL — 67 generalized coordinates, 59 actuators, 9 cameras, 370 sensors — and the ROS URDF, the web GLB you have been orbiting, the headset rigs and the controller’s tip-over constants are all generated from it. Nothing on this site was modelled twice.

01

Edit the MJCF

Geometry, inertia, joint limits — one file, one place.

02

Re-run the chain

MJCF → URDF → GLB → app rigs → mirror, in order. Each step eats the last step’s output.

03

Never edit the output

A hand-edited URDF survives until the next regeneration, then silently does not.

1 · THE CANONICAL MODEL mabel_full.xml MuJoCo MJCF — one source of truth URDF + TF meshes + GLB balance params 67 q · 59 actuators 9 cameras · 370 sensors 2 · ONE COMMAND CONTRACT — EITHER PLANT VISION PRO IPHONE WEB POLICY NAV2 RobotCommand base · body · hands controller retarget · WBC · impedance · safe_base_step MuJoCo plant the twin — 500 Hz OR hardware bridge the real robot ONE LAUNCH FLAG joint state · TF · RGB-D · LiDAR · diagnostics — back to every client 34 rendered scenes · 18 still · 16 with moving actors
The plant

One process owns
the physics.

On the robot, hardware_bridge is the only thing that opens a device. In simulation, simulation_bridge is the only thing that calls mj_step. Same rule, same seam — which is why the teleop server, ROS, the cameras and every viewer are clients either way, and why the launch flag use_sim:=true is the whole difference.

WhatReal robotSimulation
Owns the hardwarehardware_bridgesimulation_bridge
Steps atthe motors’ own loops2 ms — 500 Hz
Publishes joint state50 Hz50 Hz
Command contractRobotCommandRobotCommand
Clients are toldkind = "real"kind = "sim"
Base velocity caps1.0 m/s · 2.0 rad/s1.0 m/s · 2.0 rad/s
Holonomic swerve — translating and spinning at once (studio nav clips)
ORCA hands — 17 tendon DOF each, per-finger retargeting
Lift — 0.635 m of travel, tip-over envelope tightening as it rises
Wave Hello — a Control Studio animation clip played on the twin
The scene library

Thirty-five places
to get it wrong.

A robot that only works in an empty room works in an empty room. The scene library is 35 released worlds that <include> the canonical model — homes, kitchens, cafes, warehouses, streets — each a registry entry in scenes.json with its own XML, thumbnail and category. The gallery below is the 34 of them that ship a render — each tile orbiting live, with its physics running. Sixteen have scripted actors moving in them.

9 city & streets6 home & living6 food & dining6 outdoor & leisure4 work & public3 industrial
Nine rooms from the library, the same model in each
Renderers & engines

Physics is the authority.
Pixels are negotiable.

Three simulators live in the tree, and they are not competing. MuJoCo owns time and contact; the other two change what the cameras see, or what steps the world, without changing a single byte of the contract the apps and ROS speak.

MuJoCo

The default, and the truth

Headless, 500 Hz, elliptic friction cone with 3 noslip iterations. This is the plant every number on this site was measured against.

simulation/mabel_mujoco/

Unity

Photoreal sensors

MuJoCo still steps the world; Unity (URP, Metal) renders it and simulates the cameras and lidar. The prime directive is that ROS, the teleop apps and a policy cannot tell — same topics, rates, intrinsics and TF.

simulation/mabel_unity_sim/

Genesis

A second physics backbone

Swaps MuJoCo out for the Genesis engine while keeping every client-facing wire contract byte-compatible, so the iOS, web and Vision Pro clients connect unchanged.

simulation/mabel_gensis_world/

Not released as a build target. Unity and Genesis are working branches of the simulation stack, not part of the reproduction path. Build MABEL against MuJoCo; the install chapter covers that one.
Data collection in simulation

Episodes that don’t
know they’re fake.

Teleoperate the twin and the collector writes exactly the file it writes on hardware: one HDF5 per episode, axis 0 = frame at 15 Hz. Because the format is identical, a dataset can mix simulated and real episodes, and the trainer never learns which is which.

In every episode_XXXX.h5What it holds
camerasJPEG blobs, one group per camera
planar lidarthe same scan the RPLIDAR produces
per-actuatorjoint_pos / vel / torque, all 59
generalized stateqpos / qvel, plus body poses and base twist
action/ctrlthe training label — a 59-vector of absolute joint targets, not deltas
schema_jsonactuator names and order, camera list, units — so nothing downstream hard-codes them
Step 2

Collect

Drive the twin from a headset, a phone or the browser studio. Every frame is logged.

Step 3

Curate

The curation studio scores quality and drift, then exports a LeRobot v2.1 dataset — the contract between curation and training.

The live curation lab →

Step 4

Train

ACT, Diffusion Policy, Pi0 and Pi0.5, scoped to a camera subset and a joint group.

The training stage →