Un humanoide en MuJoCo
Vamos a cargar un robot humanoide completo —torso, brazos y piernas, 17 articulaciones— y verlo moverse. Este es el resultado que buscamos:
Ese humanoide está controlado por un agente entrenado con aprendizaje por refuerzo. Aquí lo cargamos ya listo; en la sección de RL veremos cómo aprende.
El bucle de simulación en código
Con Gymnasium por encima de MuJoCo, mover el humanoide un episodio completo es este bucle:
import gymnasium as gym
# Cargamos el humanoide con ventana en pantalla
env = gym.make("Humanoid-v5", render_mode="human")
obs, _ = env.reset() # estado inicial del robot
done = False
while not done:
# Aquí decidiría el agente; de momento, acción aleatoria
action = env.action_space.sample()
obs, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
env.close()
Si lo ejecutas verás al humanoide... desplomarse. Es normal: con acciones aleatorias no sabe andar. Ese es justo el problema que resuelve el aprendizaje por refuerzo.
Grabar la simulación en vídeo
Para guardar un MP4 en vez de abrir una ventana, se cambia el render_mode y se acumulan los fotogramas:
import gymnasium as gym
import imageio
env = gym.make("Humanoid-v5", render_mode="rgb_array", width=1280, height=720)
obs, _ = env.reset()
frames, done = [], False
while not done:
action = env.action_space.sample()
obs, reward, terminated, truncated, _ = env.step(action)
frames.append(env.render()) # capturamos cada fotograma
done = terminated or truncated
env.close()
imageio.mimsave("humanoide.mp4", frames, fps=50, quality=8)
Las tres piezas del bucle
reset()— coloca el robot en su posición de partida y devuelve la primera observaciónstep(action)— aplica una acción (las fuerzas en las articulaciones) y avanza la física un pasorender()— dibuja el estado actual, para verlo o grabarlo
Humanoid-v5 es un entorno de Gymnasium, la capa que envuelve a MuJoCo y le da esta interfaz tan limpia de reset / step. Es lo que vemos en la siguiente sección.