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

Clase 2 · 16 min

Domain randomization: entrenar para el mundo variado

Si el simulador nunca acierta con el mundo, se entrena la política en muchos mundos sorteados. En esta clase lees los rangos que la propia Unitree randomizó en el entrenamiento de la política, sorteas 20 mundos dentro de ellos y 20 fuera, y mides la diferencia. La política aguanta lo que vio en el entrenamiento y falla justo después.

Empezar la clase
Pared de monitores en un laboratorio oscuro, cada uno con un robot humanoide simulado caminando sobre un piso distinto.

En esta clase vas a

  1. 1Dónde vive la randomización en un proyecto real: los eventos de Isaac Lab
  2. 2Los rangos de la política del G1: fricción, masa y empujón (y lo que quedó fuera)
  3. 320/20 dentro del rango, 8/20 fuera de él
  4. 4Por qué randomizar todo al máximo tampoco sirve

Objetivo: leer los rangos de randomización de un entrenamiento real y medir la supervivencia de la política dentro y fuera de ellos.

01Del entrenamiento randomizado a la prueba fuera del rango

Haz clic en cada bloque.

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

Randomizar no es "cuanto más, mejor": es cubrir el mundo donde el robot va a caminar.

02Lo que la Unitree randomizó (y lo que no)

Leído en velocity_env_cfg.py, unitree_rl_lab 4960b84 (19/11/2025). Haz clic en cada elemento.

1. Fricción

Evento physics_material, al inicio (startup): fricción estática y dinámica entre 0,3 y 1,0 en todos los cuerpos del robot.

En el sorteo de fuera de esta clase, los mundos con fricción cercana a 0,2 (el 2 y el 5) se caen; el piso del rango de entrenamiento es el piso que la política vio.

03Los dos rangos del kit

treino.json copia los rangos de Unitree; fora.json va un poco más allá y agrega kp y retardo (latencia).

Archivo · kit/mundos/treino.json
{
  "nome": "treino",
  "descricao": "as faixas que a própria tarefa Unitree-G1-29dof-Velocity randomiza no treino (unitree_rl_lab 4960b84, velocity_env_cfg.py, classe EventCfg)",
  "atrito": [0.3, 1.0],
  "massa": [-1.0, 3.0],
  "empurrao_vel": [-0.5, 0.5]
}
Archivo · kit/mundos/fora.json
{
  "nome": "fora",
  "descricao": "além do treino: atrito um pouco abaixo de 0.3, carga maior e kp e atraso, que o treino não randomizou",
  "atrito": [
    0.2,
    0.6
  ],
  "massa": [
    2.0,
    8.0
  ],
  "kp": [
    0.6,
    1.0
  ],
  "atraso_ms": [
    0,
    30
  ],
  "empurrao_vel": [
    -0.5,
    0.5
  ]
}

04Sortear y contar

randomizar.py sortea 20 mundos por rango con semilla fija (7) y corre 10 s caminando en cada uno, con el empujón en t = 3 s.

Terminal · dentro y fuera del rango
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20
Terminal · los primeros mundos de fora, uno por uno
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20 --faixa fora --detalhe | head -6
Ejemplo del repositorio
faixa treino  sobreviveu: 20/20
faixa fora    sobreviveu: 8/20

Dentro del rango del entrenamiento, 20 de 20. Fuera, 8 de 20.

05Práctica

Medir lo que cubrió el entrenamiento.

E1 · Dentro × fuera

3 min

Corre el sorteo de los dos rangos.

Listo cuando: python3 kit/randomizar.py --seeds 20 → faixa treino sobreviveu: 20/20 y faixa fora sobreviveu: 8/20.

E2 · Solo el kp fuera

5 min

Escribe un rango igual al del entrenamiento, pero con kp entre 0,5 y 0,8 (el bloque de abajo ya lo hace), y córrelo.

Listo cuando: python3 kit/randomizar.py --seeds 20 --faixa ~/fth/so-kp.json → faixa so-kp sobreviveu: 11/20.

E3 · Qué randomizarías

10 min

Para un G1 que va a caminar en un piso de fábrica con una cámara de 2 kg en la cabeza, escribe en tres líneas qué agregarías a los rangos del entrenamiento y por qué.

Listo cuando: tres líneas, cada una con parámetro, rango y el motivo medido (p. ej.: "kp 0,5–1,0: solo kp fuera dio 11/20").

06El rango del E2

Los mismos rangos del entrenamiento, más el kp entre 0,5 y 0,8.

Terminal · solo el kp fuera del rango
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
cat > $F/so-kp.json <<'J'
{"nome": "so-kp", "atrito": [0.3, 1.0], "massa": [-1.0, 3.0], "kp": [0.5, 0.8], "empurrao_vel": [-0.5, 0.5]}
J
python3 kit/randomizar.py --seeds 20 --faixa $F/so-kp.json
Ejemplo del repositorio
faixa so-kp   sobreviveu: 11/20

Solo agregar el kp, que el entrenamiento no varió, derriba 9 de 20.

07Prueba de la clase

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

Pregunta 1 de 4

La policy sobrevivió 20/20 dentro de los rangos del entrenamiento y 8/20 fuera. ¿Qué mide esto?competencia

08En tres frases

RangosEl entrenamiento del G1 randomiza fricción 0,3–1,0, masa −1 a +3 kg y empujones; no randomiza kp ni retardo.
Marcador20/20 dentro del rango, 8/20 fuera, 11/20 con solo el kp fuera.
ReglaLee lo que cubrió el entrenamiento y mide fuera de él antes de llegar al robot.

Para ir más allá

Clase anteriorSiguiente clase