FTH 1 · Enseñar a caminar|INEMA.CLUB-PRO

Clase 4 · 16 min

Diseñar la recompensa de marcha

La política aprende lo que la recompensa paga, no lo que tú quisiste decir. En esta clase lees los términos de marcha de la tarea de velocidad de mjlab, grabas un rollout caminando y otro parado, mides cuánto pagó cada término y descubres que, con un peso cambiado, quedarse parado pasa a valer más que caminar.

Comenzar la clase
Robot humanoide caminando en un laboratorio oscuro sobre un piso con marcas rectangulares de pisadas en secuencia, junto a una cinta amarilla de seguridad.

En esta clase vas a

  1. 1Los 7 términos de marcha que el kit copia de mjlab, con nombre, peso y escala
  2. 2Caminando: 53,60. Parado con el mismo comando: 42,32
  3. 3Un peso cambiado: parado (40,22) pasa a ganarle a caminar (39,65)
  4. 4Cómo unitree_rl_lab eligió términos distintos para el mismo robot

Objetivo: medir cuánto paga cada término de la recompensa en un rollout grabado y prever el efecto de cambiar un peso antes de entrenar.

01Premios y castigos

Haz clic en cada bloque. Cada término vale peso × valor × 0,02 s por paso de la política.

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

Nombres, pesos y std copiados de la tarea de velocidad de mjlab (commit 8bb2bc9, 18/10/2026). El kit usa un solo std para pose.

02La recompensa del kit

Un YAML con un término por línea. Es el archivo que vas a copiar y modificar.

Archivo · kit/recompensa.yaml
# Recompensa de marcha do kit (FTH 1). Nomes, pesos e std seguem a tarefa de velocidade do mjlab
# (src/mjlab/tasks/velocity/velocity_env_cfg.py, commit 8bb2bc9, 18/10/2026); "pose" usa um std só.
# Cada termo vale weight × valor × 0,02 s por passo da política. Positivo = prêmio; negativo = punição.
track_linear_velocity: {weight: 2.0, std: 0.5}     # exp(-erro² / std²) entre comando e velocidade xy
track_angular_velocity: {weight: 2.0, std: 0.707}  # o mesmo para a rotação em z
upright: {weight: 1.0, std: 0.447}                 # tronco em pé (gravidade sem componente x/y)
pose: {weight: 1.0, std: 0.3}                      # juntas perto da pose padrão
dof_pos_limits: {weight: -1.0}                     # quanto as juntas passaram do limite (rad)
action_rate_l2: {weight: -0.1}                     # ação que muda de um passo para o outro
foot_slip: {weight: -0.1}                          # pé que escorrega enquanto está no chão

03Grabar dos rollouts y medir cada término

La policy lista camina 10 s a 0,7 m/s y después se queda parada con comando 0. termos.py rehace la cuenta término a término; --comando-vx rehace la cuenta del parado como si el pedido fuera 0,7 m/s.

Terminal · grabar caminando y parado
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
mkdir -p $F/treino
python3 kit/andar_demo.py --vx 0.7 --gravar $F/treino/andando.npz | tail -1
python3 kit/andar_demo.py --vx 0 --gravar $F/treino/parado.npz | tail -1
Terminal · términos del rollout caminando
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
python3 kit/termos.py $F/treino/andando.npz; echo "saída: $?"
Terminal · parado, cobrado como si debiera caminar
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
python3 kit/termos.py $F/treino/parado.npz --comando-vx 0.7
Ejemplo del repositorio
gravado: ~/fth/treino/andando.npz (500 passos)
gravado: ~/fth/treino/parado.npz (500 passos)
rollout: andando.npz · 500 passos (10 s) · comando vx = 0.7 m/s
termo                     weight  valor médio    total
track_linear_velocity          2        0.930    18.59
track_angular_velocity         2        0.814    16.28
upright                        1        0.995     9.95
pose                           1        0.925     9.25
dof_pos_limits                -1        0.000     0.00
action_rate_l2              -0.1        0.421    -0.42
foot_slip                   -0.1        0.054    -0.05
RECOMPENSA DO EPISÓDIO                           53.60
saída: 0

Caminando, lo que más paga es seguir la velocidad (18,59) y el giro (16,28). Los castigos casi no pesan: la policy ya es suave.

04Cambia un peso y rehaz la cuenta

Una copia del YAML con track_linear_velocity en 0,5 en vez de 2,0. No se entrena nada: solo cambia la cuenta.

Terminal · peso 0,5 en el seguimiento
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
sed "s/track_linear_velocity: {weight: 2.0/track_linear_velocity: {weight: 0.5/" kit/recompensa.yaml > $F/treino/minha.yaml
python3 kit/termos.py $F/treino/andando.npz --recompensa $F/treino/minha.yaml | tail -1
python3 kit/termos.py $F/treino/parado.npz --comando-vx 0.7 --recompensa $F/treino/minha.yaml | tail -1
Ejemplo del repositorio
RECOMPENSA DO EPISÓDIO                           39.65
RECOMPENSA DO EPISÓDIO                           40.22

Primera línea: caminando, 39,65. Segunda: parado, 40,22. Con ese peso, un entrenamiento que encuentre "quedarse parado y erguido" es recompensado por eso: es recompensa hackeada (reward hacking) antes de cualquier entrenamiento. Hacer esta cuenta cuesta segundos; descubrirlo después de un entrenamiento cuesta horas de GPU.

05El mismo robot, otra receta

unitree_rl_lab (commit 4960b84) entrena el mismo G1 con términos diferentes. Haz clic para comparar.

1. Vivo

alive con peso 0,15: un premio pequeño por cada paso de pie. La clase 6 muestra qué pasa cuando falta y cuando es demasiado grande.

06Práctica

Revisar la recompensa antes de gastar un entrenamiento.

E1 · Término a término

5 min

Graba los dos rollouts y ejecuta termos.py en el rollout caminando.

Listo cuando: python3 kit/termos.py $F/treino/andando.npz; echo "saída: $?" → RECOMPENSA DO EPISÓDIO … 53.60 y saída: 0.

E2 · El parado

5 min

Ejecuta el rollout parado cobrado como si debiera caminar y calcula cuánto vale en relación con el caminando.

Listo cuando: la salida termina en 42.32 y escribiste "quedarse parado vale el 79 % de caminar".

E3 · El peso que cambia el juego

10 min

Ejecuta el bloque con peso 0,5. Luego, en una copia tuya del YAML, busca el menor peso de track_linear_velocity con el que caminar todavía valga más que quedarse quieto.

Listo cuando: con 0,5, la segunda línea (40.22) es mayor que la primera (39.65); anotaste el peso a partir del cual caminar vuelve a ganar (el 19/10/2026: 0,55 todavía pierde, 0,6 gana).

07Prueba de la clase

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

Pregunta 1 de 4

Quieto con un pedido de 0,7 m/s, el robot aún suma 42,32. ¿De dónde viene la mayor parte?competencia

08En tres frases

SumaLa recompensa es una suma de términos con peso; cada término paga o castiga por paso.
MedidaCaminando 53,60, quieto 42,32; con el seguimiento en 0,5, quedarse quieto pasa a ganar.
HábitoAntes de entrenar, mide la recompensa de un rollout bueno y de uno malo.

Para ir más allá

Clase anteriorPróxima clase