Saltar al contenido principal

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ón
  • step(action) — aplica una acción (las fuerzas en las articulaciones) y avanza la física un paso
  • render() — dibuja el estado actual, para verlo o grabarlo
tip

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.