E1 · Dentro × fuera
3 minCorre 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.
Clase 2 · 16 min
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
Objetivo: leer los rangos de randomización de un entrenamiento real y medir la supervivencia de la política dentro y fuera de ellos.
Haz clic en cada bloque.
Randomizar no es "cuanto más, mejor": es cubrir el mundo donde el robot va a caminar.
Leído en velocity_env_cfg.py, unitree_rl_lab 4960b84 (19/11/2025). Haz clic en cada elemento.
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.
Evento add_base_mass: suma de −1 a +3 kg al torso_link. Una carga real (batería extra, cámara, pinza) puede superar eso.
Evento push_robot, cada 5 s: cambia la velocidad de la base hasta ±0,5 m/s en x y en y. El kit aplica el equivalente como una fuerza de 0,1 s en el tronco.
También hay ruido en las observaciones (velocidad angular, gravedad, articulaciones).
No hay randomización de kp, kd ni de retardo en esta tarea. En la clase 1, el kp solo ya cambió la marcha (0,75 m/s pidiendo 0,50); el retardo pesa bajo empujón (clase 4).
Otros proyectos randomizan ganancias y retardo (latencia); lo que importa es saber qué cubrió tu entrenamiento antes de encender el robot.
treino.json copia los rangos de Unitree; fora.json va un poco más allá y agrega kp y retardo (latencia).
{
"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]
}{
"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
]
}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.
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20 --faixa fora --detalhe | head -6faixa treino sobreviveu: 20/20 faixa fora sobreviveu: 8/20
Dentro del rango del entrenamiento, 20 de 20. Fuera, 8 de 20.
1 atrito=0.45 massa=7.38 kp=0.91 atraso_ms=6 empurrão 172 N → de pé 2 atrito=0.20 massa=6.93 kp=0.92 atraso_ms=14 empurrão 119 N → caiu 3 atrito=0.30 massa=4.67 kp=0.80 atraso_ms=16 empurrão 219 N → caiu 4 atrito=0.45 massa=7.93 kp=0.69 atraso_ms=4 empurrão 194 N → caiu 5 atrito=0.21 massa=5.09 kp=0.79 atraso_ms=28 empurrão 50 N → caiu 6 atrito=0.40 massa=3.49 kp=0.60 atraso_ms=6 empurrão 131 N → caiu
El mundo 1 tiene una masa de 7,4 kg y queda de pie; el 4, con 7,9 kg, se cae; el 6 tiene fricción 0,40 y se cae. Ningún parámetro aislado explica el marcador: fuera del rango, es la combinación. Mirar un solo mundo y culpar a un parámetro es el error común; compara marcadores y, para afirmar una causa, varía un parámetro a la vez (E2).
Medir lo que cubrió el entrenamiento.
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.
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.
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").
Los mismos rangos del entrenamiento, más el kp entre 0,5 y 0,8.
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.jsonfaixa so-kp sobreviveu: 11/20
Solo agregar el kp, que el entrenamiento no varió, derriba 9 de 20.
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
Pregunta 2 de 4
En esta policy, ¿qué no randomiza la tarea de unitree_rl_lab?
Pregunta 3 de 4
¿Por qué no randomizar todo en el rango más amplio posible?
Pregunta 4 de 4
¿Por qué randomizar.py usa una semilla fija (7)?
Elige una alternativa. La explicación aparece después de tu intento.