FTH — Humanoid Technology Training · course 2 of 5 · 8 lessons
From simulator to ground: sim-to-real in humanoids
A walking policy that walks in the simulator and falls on the robot. In eight lessons you measure that gap, test randomization, identify the actuator, measure the latency, fix the simulator with data, run the policy through a sim2sim gate with DDS, and build the ladder to the ground. All on CPU, no robot.

- 8lessons
- 125minutes of lessons
- 24exercises with "done when"
- 3steps in the sim2sim gate (with DDS)
The lessons
From the measured gap to the deployment ladder: randomization, system identification, actuator latency, fixing with data, sim2sim, real-to-sim, and the plan to the ground.
Lesson 1 · 16 minWhere the simulator lies about a humanoidA policy that walks in the simulator and falls on the robot: that is the problem of this course. In this lesson you set up the bench, run the ready-made Unitree G1 gait policy in the "sim" and in a "simulated real" with hidden parameters, and find out that no single difference knocks it down; the sum of them does.
Lesson 2 · 16 minDomain randomization: training for the varied worldIf the simulator never gets the world right, you train the policy in many randomly drawn worlds. In this lesson you read the ranges Unitree itself randomized when training the policy, draw 20 worlds inside them and 20 outside, and measure the difference. The policy handles what it saw in training and fails just past it.
Lesson 3 · 17 minSystem identification: measure to modelRandomizing covers what you don't know; identifying shrinks what you don't know. In this lesson you hang the "simulated real" robot on the gantry, make the leg swing in a frequency sweep, record the encoders, and use MuJoCo's own system identification toolbox to find the kp and kd the motor really delivers.
Lesson 4 · 16 minThe real actuator: latency, torque limit and actuator networkBetween the policy deciding and the motor turning there is a network, the controller loop and the motor PD. In this lesson you measure the "real robot" latency (delay) with a step on the knee, count the falls that 20 and 40 ms cause under a push, and compensate the kp identified in lesson 3.
Lesson 5 · 15 minFix it with robot data: delta action and friendsSometimes the gap doesn't fit in two parameters. The idea behind ASAP (RSS 2025) is to learn the missing action: a model that, added to the command inside the simulator, makes it repeat what the real robot did. In this lesson you fit a minimal version of that idea with the bench log and measure the simulator's error before and after.
Lesson 6 · 18 minSim2sim as a gate before the robotBefore any robot, the policy has to pass in a second simulator and through the same message path the robot uses. It's the official unitree_rl_lab flow: train in Isaac Lab, validate in unitree_mujoco, and only then the G1. In this lesson you build that gate in three stages, with real DDS, and you see the error that most often brings policies down on this crossing.
Lesson 7 · 14 minReal-to-sim: bringing the real world into the simulatorSo far the path has gone from the simulator to the robot. The reverse path exists too: photograph the real place and build a twin where the robot trains and is tested first. In this lesson you run the twin from the robotica-real2sim project (an arm, not a humanoid) in the course venv and prove a plan in the physics, and you see where this stands for humanoids in 2026.
Lesson 8 · 13 minThe deployment ladder: sim → sim2sim → suspended → floorEverything in this course becomes a plan: four steps, each with what runs, the criterion to move up, and the reason to stop and go back. In this lesson you write your own ladder in a YAML file, check it with a script, and simulate the queue of steps with a failure in the middle. The safety procedure with the robot powered on is in course 4.
Who it's for
- 1You program in Python, have seen ROS 2 (or took the robot course), and want to bring a humanoid policy to the robot.
- 2If you don't have a humanoid: the "real robot" in the practice sessions is a MuJoCo with hidden parameters, and we say so openly.
- 3You took course 0 (the ~/fth bench) and course 1 (locomotion with RL), or you want to start from a ready-made policy.
What you walk away able to do
- 1Measure the gap of a ready-made policy and find which parameters knock it down.
- 2Read the randomization ranges from a real training run and test inside and outside them.
- 3Identify the actuator's kp with the mujoco.sysid toolbox and measure the latency on the bench.
- 4Run the policy through a sim2sim gate with another model and DDS, and write the ladder to the ground.