Fase 1: Estabilización
Llegó la parte divertida, ¡comienza el entrenamiento del robot!
Objetivos de la Fase 1
El resultado visible de esta fase es que el robot sea capaz de mantenerse en equilibrio. La Fase 1 está pensada sobre todo como una fase de aprendizaje del propio framework y del flujo de entrenamiento.
En esta fase busco entender cómo se estructura un entrenamiento en Isaac Lab y para qué sirven cada uno de los ficheros que lo componen.
En concreto, los objetivos de esta fase son:
Entender cómo se define un entorno de entrenamiento (
env) y qué responsabilidades tiene.Comprender la función del fichero de configuración del entorno (
env config) y cómo se separa la lógica del código de los parámetros ajustables.Identificar qué partes del entrenamiento se ejecutan en cada paso: observaciones, acciones, recompensas, resets y terminaciones.
Entender cómo y cuándo se inicializa y se reinicia el robot durante el entrenamiento.
El comportamiento del robot en esta fase es simple a propósito. La idea no es optimizar nada ni obtener un resultado espectacular, sino tener un entorno lo más controlado posible que permita centrarse en entender cómo funciona el entrenamiento por dentro.
Archivos de definición del entrenamiento
De momento, vamos a tocar 3 archivos:
simplerobot_env.pyDefine el entorno de entrenamiento: Es decir, cómo se simula el robot, qué observa, qué acciones aplica y cómo se calculan recompensas, resets y terminaciones.simplerobot_cfg_env.pyConfigura el entorno: número de entornos paralelos, duración del episodio, decimation, espacios de observación y acción, recompensas y cómo se instancian y distribuyen los robots.rsl_rl_ppo_cfg.pyDefine cómo se entrena la política: arquitectura de la red, frecuencia y duración del entrenamiento, tamaños de batch, tasas de aprendizaje y parámetros internos del algoritmo.
En resumen, env define qué pasa. cfg_env define en qué condiciones pasa. rsl_rl_ppo_cfg define cómo se aprende de lo que pasa.
simplerobot_env.py
Archivo ubicado en la ruta /home/angellm/SimpleRobot/source/SimpleRobot/SimpleRobot/tasks/direct/simplerobot/
Primero dejo el contenido completo del archivo y luego vamos analizando funcion a función:
__init__
Esta función se ejecuta una vez al iniciar el entrenamiento, inicializa el entorno, lanza _setup_scene() vía super() y guarda los índices de las articulaciones en dof_idx.
_setup_scene
_setup_scene construye la escena de simulación: crea el robot, añade el plano de suelo, clona los entornos, registra el robot en la escena y configura la iluminación. Por último, inicializa con ceros el buffer para los comandos.
_pre_physics_step
_pre_physics_step se ejecuta antes del paso de físicas cuando se aplican acciones. Guarda las acciones de la política y las escala, dejándolas preparadas para aplicarlas al robot.
_apply_action
_apply_action aplica al robot las acciones almacenadas, enviándolas como objetivos de velocidad a las articulaciones controladas antes del paso de físicas.
_get_observations
_get_observations recopila el estado actual del robot desde la simulación y construye el vector de observaciones que se pasa a la política en cada paso de entrenamiento.
Para esta fase he escogido las siguientes observaciones:
Gravedad proyectada (
projected_gravity): indica la dirección de la gravedad en el marco del robot y permite conocer su inclinación (equivalente a un acelerómetro).Velocidad angular (
angular_velocity): indica cómo de rápido está rotando el robot y permite detectar oscilaciones e inestabilidad (equivalente a un giroscopio).Velocidad de las ruedas (
wheel_vel): indica la velocidad actual de las articulaciones motrices y permite saber qué está haciendo realmente el robot (equivalente a encoders).
En un robot real, estas observaciones vendrían de sensores como IMUs o encoders. En este proyecto utilizo directamente los datos que proporciona la simulación para simplificar el entrenamiento y centrarme en entender Isaac Lab.
En la página [Datos accesibles desde self.robot.data]() recopilo algunos de los datos del robot proporcionados por la simulación.
_get_rewards
_get_rewards calcula la recompensa en cada paso de entrenamiento a partir del estado actual del robot, premiando la estabilidad y penalizando comportamientos indeseados.
Inclinación (
upright_reward): Premia que el robot se mantenga erguido. Se basa en la gravedad proyectada y penaliza la inclinación hacia delante o atrás.Velocidad angular (
ang_vel_penalty): Penaliza rotaciones rápidas del cuerpo para evitar oscilaciones y movimientos bruscos.Alive (
alive_reward): Recompensa que el robot siga activo y no haya sido reseteado en ese paso.
Los pesos de la recompensa controlan qué comportamientos se priorizan durante el entrenamiento. Aunque podrían definirse en el fichero de configuración del entorno (env_cfg), de momento los he hardcodeado aquí.
En esta fase de entrenamiento le he dado un valor alto al peso de la recompensa por mantenerse erguido, ya que el objetivo principal es aprender a estabilizar el robot. La penalización por velocidad angular es menor, pero suficiente para reducir oscilaciones y movimientos bruscos sin impedir correcciones rápidas. La recompensa por seguir vivo no es muy grande y sirve únicamente para evitar soluciones en las que el episodio termina lo antes posible.
_get_dones
_get_dones determina cuándo un episodio debe terminar, ya sea porque el robot ha caído o porque se ha alcanzado la duración máxima del episodio.
Por simplicidad, he supuesto que el robot se ha caído cuando se ha inclinado más de 50 grados en el eje X o Y.
_reset_idx
_reset_idx selecciona los entornos a reiniciar, restaura el estado inicial del robot, ajusta su posición según el origen de cada entorno, reinicializa los comandos y escribe el estado reiniciado en la simulación. Esto se hace antes de comenzar un nuevo episodio.
simplerobot_env_cfg.py
Archivo ubicado en la ruta /home/angellm/SimpleRobot/source/SimpleRobot/SimpleRobot/tasks/direct/simplerobot/
Este fichero define las condiciones bajo las que se ejecuta el entorno de entrenamiento. Aquí no se implementa lógica, sino que se ajustan parámetros que controlan cómo de rápido avanza la simulación, cuánto dura un episodio, qué tamaño tienen los espacios y cómo se instancian los entornos.
El objetivo es poder modificar el comportamiento del entrenamiento sin tocar el código del entorno.
decimation: define cada cuántos pasos de simulación se aplican nuevas acciones de la política.
episode_length_s: define la duración máxima de cada episodio en segundos.
actions_scale: factor de escala aplicado a las acciones antes de enviarlas al robot.
action_space: tamaño del vector de acciones generado por la política.
observation_space: tamaño del vector de observaciones que recibe la política.
num_envs: número de entornos que se ejecutan en paralelo durante el entrenamiento.
dof_names: lista de articulaciones del robot que están controladas por la política. Lo utilizo en el
__init__delenv.
rsl_rl_ppo_cfg.py
Archivo ubicado en la ruta /home/angellm/SimpleRobot/source/SimpleRobot/SimpleRobot/tasks/direct/simplerobot/agents
Del contenido de este archivo sólamente cambié el nombre del experimento y el número de iteraciones:
Entrenamiento de la Fase 1
Una vez configurado el entrenamiento, toca ejecutarlo.
Primero, tengo que saber el nombre de la Task. Para averiguarlo ejecuto el comando ~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/list_envs.py que me devuelve la respuesta:
Con lo que ya se que la tarea se llama Template-Simplerobot-Direct-v0 . Sabiendo esto, puedo ejecutar el entrenamiento con el comando ~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/train.py --task=Template-Simplerobot-Direct-v0

Si todo va bien y no he metido la pata con el código, se ejecutará una ventana de Isaac Sim donde spawnearán 400 robots un poco torpes que se caerán hacia delante y hacia detrás.
Al principio, los robots no sabrán cómo mantenerse erguidos. Iteración a iteración irán aprendiendo a través de las observaciones cuales son las consecuencias de sus acciones e irán ajustando su algoritmo de control. A medida que vayan transcurriendo las iteraciones, veremos como hay más y más robots que aprenden a no caerse. Esto me pasó aproximadamente a las 100 iteraciones de comenzar el entrenamiento.
Importante: Lo que se ve en pantalla durante el entrenamiento no es un comportamiento “final”. El ruido y la exploración propios del aprendizaje pueden generar movimientos erráticos que desaparecen al ejecutar la simulación en play. Al ejecutar la simulación en play, el comportamiento suele ser mucho más estable y representativo.
Evaluación del entrenamiento de la Fase 1
Para ver la simulación de la politica entrenada utilizo el comando ~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/play.py --task=Template-Simplerobot-Direct-v0

Ahora podemos ver una simulación donde todos los robots siguen la política entrenada y mantienen el equilibrio.
Se puede apreciar un pequeño movimiento de los robots en su eje local X, pero esto es totalmente posible, ya que en ningún momento le hemos dicho que no se mueva, únicamente le hemos pedido que se mantenga erguido y aguante vivo el máximo tiempo posible. Teniendo eso en cuenta, la política ha llegado a una solución donde el robot cumple ambos requisitos.
Por lo tanto, podemos decir que dado que se cumplen el objetivo principal, el entrenamiento de la Fase 1 ha sido un éxito.
Last updated