FTH 2 · Del simulador al suelo|INEMA.CLUB-PRO

Clase 1 · 16 min

Dónde miente el simulador en un humanoide

Una política que camina en el simulador y se cae en el robot: ese es el problema del curso. En esta clase montas el banco de pruebas, ejecutas la política de marcha lista del Unitree G1 en el "sim" y en un "real simulado" con parámetros ocultos, y descubres que ninguna diferencia sola la tumba; la suma de ellas, sí.

Empezar la clase
Robot humanoide en medio de un paso sobre un piso de laboratorio liso, con el pie resbalando y un cable de seguridad sujeto al pórtico.

En esta clase vas a

  1. 1Las cinco fuentes del gap en un humanoide: actuador, retardo (latencia), fricción, masa y contacto
  2. 2La policy de marcha ya hecha del G1 (unitree_rl_lab) corriendo en MuJoCo
  3. 3Sim × "real simulado": 4,7 m caminados contra caída en 2,3 s
  4. 4Cambiar un parámetro a la vez para encontrar al culpable

Objetivo: medir el gap corriendo la misma policy en "sim" y "real simulado", y comprobar que ningún parámetro por sí solo la tira.

01Lo que el simulador simplifica

Haz clic en cada bloque. Son las cinco fuentes de gap que mide este curso.

Haz clic en cada bloque del diagrama para ver qué hace.

Ninguna de estas diferencias desaparece. El sim-to-real consiste en volver la policy robusta a ellas, medir las que se pueden medir y probar antes de pisar el suelo.

02La policy y los dos mundos

Lo que se ejecuta en las prácticas de este curso. Haz clic en cada etapa.

1. La policy

Unitree publica en unitree_rl_lab una policy de marcha del G1 de 29 GDL ya entrenada en Isaac Lab y exportada en ONNX, con el archivo de despliegue deploy.yaml (orden de las articulaciones, kp y kd, pose por defecto, escalas). Licencia Apache-2.0.

Recibe 480 números (5 instantes de velocidad angular, gravedad proyectada, comando, articulaciones y última acción) y devuelve 29 objetivos de posición a 50 Hz.

03Armar el banco de pruebas (reutiliza el del curso 0)

Si hiciste el curso 0, el venv y el Menagerie ya están en ~/fth: el bloque solo agrega onnxruntime, el G1 en el sparse-checkout y la carpeta de la policy de unitree_rl_lab, fijada en el commit probado.

Terminal · preparar ~/fth
F=${FTH:-$HOME/fth}; mkdir -p $F && cd $F
[ -d .venv ] || python3.12 -m venv .venv
. .venv/bin/activate && pip install -q mujoco==3.16.0 numpy onnxruntime==1.31.0 pyyaml
[ -d sim2real ] || git clone -q --depth 1 https://github.com/inematds/formacao-fth-sim2real-v72 sim2real
[ -d mujoco_menagerie ] || git clone -q --filter=blob:none --sparse https://github.com/google-deepmind/mujoco_menagerie
git -C mujoco_menagerie sparse-checkout add unitree_g1 && git -C mujoco_menagerie checkout -q 62ab00f
[ -d unitree_rl_lab ] || git clone -q --filter=blob:none --sparse https://github.com/unitreerobotics/unitree_rl_lab
git -C unitree_rl_lab sparse-checkout set deploy/robots/g1_29dof/config/policy/velocity
git -C unitree_rl_lab checkout -q 4960b84 && git -C unitree_rl_lab log -1 --format='unitree_rl_lab %h (%ad)' --date=short
python3 -c "import mujoco, onnxruntime; print('mujoco', mujoco.__version__, '· onnxruntime', onnxruntime.__version__)"
Ejemplo del repositorio
unitree_rl_lab 4960b84 (2025-11-19)
mujoco 3.16.0 · onnxruntime 1.31.0

Dos líneas y ningún error. La policy viene del commit 4960b84 de unitree_rl_lab: fíjalo, porque un policy.onnx nuevo puede tener otro orden de entradas.

04La misma policy en los dos mundos

dois_mundos.py ejecuta 10 s caminando a 0,5 m/s en cada mundo. Caída = pelvis por debajo de 0,5 m. Sale con 1 si algún mundo se cayó.

Terminal · sim × real simulado
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/dois_mundos.py; echo "saída: $?"
Terminal · un parámetro por vez
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
for p in atrito massa kp atraso_ms; do python3 kit/dois_mundos.py --so $p | tail -1; done
Ejemplo del repositorio
política: unitree_rl_lab G1 29 GDL velocity v0 (ONNX, 480 entradas) · comando 0.50 m/s · 10 s
sim                          queda: não · andou 4.7 m em 10 s (vel. 0.47 m/s; pedida 0.50)
real simulado                queda: sim em t = 2.3 s (andou 1.9 m)
saída: 1

En el sim, 4,7 m en 10 s (0,47 m/s para 0,50 pedidos). En el "real simulado", caída a los 2,3 s.

05Práctica

Mide el gap antes de intentar cerrarlo.

E1 · Banco listo

10 min

Ejecuta el bloque de preparación. Si el curso 0 ya montó ~/fth, solo agrega lo que falta.

Listo cuando: el bloque termina en unitree_rl_lab 4960b84 (2025-11-19) y mujoco 3.16.0 · onnxruntime 1.31.0.

E2 · El gap medido

3 min

Ejecuta la misma policy en los dos mundos y anota cuánto caminó en cada uno.

Listo cuando: python3 kit/dois_mundos.py; echo "saída: $?" → real simulado … queda: sim em t = 2.3 s y saída: 1.

E3 · Encuentra al culpable

5 min

Ejecuta el bucle "un parámetro a la vez" y escribe qué parámetro, por sí solo, cambia más el comportamiento y qué cambia.

Listo cuando: las 4 líneas muestran queda: não y la del kp muestra vel. 0.75 m/s; pedida 0.50; escribiste "ninguno la tumba solo; el kp cambia la velocidad".

06Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 3

Cada parámetro del "real simulado", por sí solo, no derriba la policy; los cuatro juntos sí. ¿Qué te enseña esto?competencia

07En tres frases

FuentesActuador, retardo (latencia), fricción, masa y contacto separan el simulador del robot.
MedidaLa misma policy camina 4,7 m en el sim y cae a los 2,3 s en el "real simulado".
MétodoUn parámetro a la vez encuentra al culpable; la suma es lo que derriba.

Para ir más allá

Siguiente clase