E1 · Término a término
5 minGraba 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.
Clase 4 · 16 min
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
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.
Haz clic en cada bloque. Cada término vale peso × valor × 0,02 s por paso de la política.
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.
Un YAML con un término por línea. Es el archivo que vas a copiar y modificar.
# 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ãoLa 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.
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 -1F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
python3 kit/termos.py $F/treino/andando.npz; echo "saída: $?"F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
python3 kit/termos.py $F/treino/parado.npz --comando-vx 0.7gravado: ~/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.
rollout: parado.npz · 500 passos (10 s) · comando vx = 0.7 m/s (trocado na conta) termo weight valor médio total track_linear_velocity 2 0.140 2.80 track_angular_velocity 2 0.999 19.98 upright 1 0.999 9.99 pose 1 0.956 9.56 dof_pos_limits -1 0.000 0.00 action_rate_l2 -0.1 0.003 -0.00 foot_slip -0.1 0.000 -0.00 RECOMPENSA DO EPISÓDIO 42.32
Parado con un pedido de 0,7 m/s, el seguimiento lineal cae de 18,59 a 2,80, pero giro, upright y pose pagan incluso más. El total queda en 42,32 contra 53,60: quedarse parado ya vale el 79 % de caminar.
ERRO: não achei ~/fth/treino/nao-existe.npz. Grave antes com: python3 kit/andar_demo.py --gravar ~/fth/treino/nao-existe.npz saída: 1
termos.py lee un archivo .npz grabado por andar_demo.py. Grábalo antes; el error te dice el comando.
Una copia del YAML con track_linear_velocity en 0,5 en vez de 2,0. No se entrena nada: solo cambia la cuenta.
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 -1RECOMPENSA 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.
unitree_rl_lab (commit 4960b84) entrena el mismo G1 con términos diferentes. Haz clic para comparar.
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.
base_height con peso −10 y objetivo de 0,78 m: castiga la pelvis fuera de la altura. Evita que el robot aprenda a caminar agachado o de rodillas.
flat_orientation_l2 con peso −5 castiga el torso inclinado, el papel que cumple upright en mjlab.
gait con peso 0,5 premia el patrón de paso: período de 0,8 s, con los dos pies desfasados medio período (alternar). Sin un término así, la policy puede encontrar una forma extraña de desplazarse, como arrastrar los pies.
Revisar la recompensa antes de gastar un entrenamiento.
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.
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".
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).
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
Pregunta 2 de 4
Con track_linear_velocity en 0,5, quieto vale 40,22 y caminando 39,65. ¿Qué tiende a aprender un entrenamiento?
Pregunta 3 de 4
¿Para qué sirve action_rate_l2?
Pregunta 4 de 4
¿Por qué unitree_rl_lab tiene base_height con peso −10?
Elige una alternativa. La explicación aparece después de tu intento.