Fase 2: Movimiento básico
Objetivos de la fase 2
El objetivo principal de esta fase es que el robot sea capaz de combinar equilibrio y movimiento de forma controlada. De momento no busco mucha velocidad ni precisión en el movimiento, sino un comportamiento estable.
Por lo tanto los objetivos son:
Que el robot sea capaz de mantenerse en equilibrio cuando el comando de movimiento es cero.
Que el robot sea capaz de moverse cuando se le solicita, manteniendo el equilibrio durante el desplazamiento.
Estrategia de entrenamiento
Para lograr los objetivos, será necesario agregar nuevas observaciones para incluir información relacionada con el movimiento y los comandos de velocidad, ya que las utilizadas en la Fase 1 no son suficientes para lograr el objetivo del movimiento controlado. En principio, el vector de acción no va a cambiar, ya que solo actuaremos sobre la velocidad de las ruedas igual que en la fase anterior.
Este cambio en el espacio de observaciones hace que la política entrenada en la Fase 1 deje de ser compatible y no pueda reutilizarse directamente (mas info en ¿Entrenar de cero o a partir de una política anterior?). Por este motivo, el primer paso de esta fase es entrenar desde cero una nueva política utilizando el vector de observaciones ampliado, pero manteniendo inicialmente el objetivo de equilibrio.
Una vez obtenga una política base capaz de mantenerse estable con el nuevo vector de observaciones, utilizaré esta política como punto de partida para entrenar el movimiento. De esta forma, el aprendizaje del desplazamiento se apoyará sobre una base de equilibrio ya aprendida, en lugar de intentar aprender ambos comportamientos a la vez.
Entrenamiento del objetivo de estabilidad (Fase 1)
Para este primer entrenamiento los cambios que realizaremos sobre el código van a ser mínimos.
Por un lado, en la funcion _get_observations del simplerobot_env.py agregaremos la componente del eje X de la velocidad lineal del robot y del comando de velocidad al vector de las observaciones.
Y, por ende, tendremos que adaptar el tamaño del observation_space del simplerobot_env_cfg.py
Hechos estos 2 pequeños cambios, lanzo el entrenamiento desde cero para que el robot aprenda a estabilizarse de nuevo.
~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/train.py --task=Template-Simplerobot-Direct-v0
Tras aproximadamente 100-150 iteraciones, el robot aprende a estabilizarse sin problema.

Entrenamiento del objetivo de movimiento (Fase 2)
Ahora ya tengo una politica capaz de mantener el robot estable de la que puedo partir para entrenar el movimiento.
Para que la política no se olvide de cómo mantener la estabilidad cuando el comando de velocidad es nulo, tendremos que hacer que no todos los entornos simulados se comporten igual. Algunos robots recibirán comandos de movimiento, mientras que otros no. Esto permite entrenar el desplazamiento sin perder la capacidad de mantenerse estable cuando no el comando de velocidad es cero, evitando que el robot olvide el comportamiento aprendido en el entrenamiento anterior.
A continuación detallaré los cambios realizados sobre el archivo simplerobot_env.py, pero antes dejo el código por aquí:
Cambios en el _get_rewards
_get_rewardsEn esta función he creado nuevas penalizaciones:
vel_penalty: Si el robot debe moverse, penaliza al robot por la diferencia entre su velocidad y la comandada
no_still_penalty: Penaliza al robot por moverse si no tiene que hacerlo
diff_penalty: Penaliza al robot por la diferencia entre la velocidad de sus ruedas (evita giros sobre si mismo)
También he ajustado los pesos de las recompensas anteriores.
¿Cómo he llegado a estas recompensas y penalizaciones?
Prueba y error. Los pasos que seguí fueron los siguientes:
Empecé agregando la penalización
vel_penaltysolamente y lancé el entrenamientoLos robots no aprendían a moverse, se quedaban estáticos
Bajé los pesos de las recompensas
upright_rewardyang_vel_penaltyy lancé otro entrenamientoLos robots comenzaron a moverse. Todos ellos, incluso los que recibían comandos de velocidad nulos
Agregué la penalización
no_still_penaltyy lancé un nuevo entrenamientoLos robots aprendieron a moverse y a estarse quietos cuando debían
Alguno de los robots que se movían lo hacían en círculos.
Agregué la penalización
diff_penaltyy lancé un nuevo entrenamientoLos robots dejaron de moverse en círculos.
Cambios en _reset_idx
_reset_idx Ahora al comando de velocidad se le asigna, para el 30% de los entornos una velocidad de 0 en todos los ejes. Para el otro 70% de los entornos al comando de velocidad se le asigna una velocidad en el eje X de 0.2 m/s
¡A entrenar!
Como he detallado en Entrenar a partir de una política anterior (weights-only), utilizaré el script de entrenamiento modificado para cargar los pesos de la política de un checkpoint anterior. Para ello utilizaré el argumento --load_policy <checkpoint_path>
En mi caso, quiero utilizar la política ya entrenada en la fase 1 (200 iteraciones de entrenamiento). Para ello el comando que voy a usar es:
~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/train_mod.py --task=Template-Simplerobot-Direct-v0 --load_policy /home/angellm/logs/rsl_rl/simplerobot_direct/2026-01-19_18-39-40/model_200.pt

Nada más empezar el entrenamiento, podemos ver que hay una cantidad de robots que se mantienen de pie sin caerse (los que no han recibido comandos de velocidad) y robots que tratan de moverse y se caen (los que si han recibido comandos de velocidad).
Se puede ver que despues 60 iteraciones los robots ya no parecen caerse durante el entrenamiento, ¡eso es muy buena señal! Como comparación, lanzando el entrenamiento desde cero (sin cargar una política anterior), los robots tardaban unas 50 iteraciones en aprender a estabilizarse y hasta las iteraciones 150-200 no aprendian a moverse sin caerse.
Evaluación
Pese a que alrededor de las 60 iteraciones la política ya parecía haber encontrado una solución estable, continué el entrenamiento hasta las 1000 iteraciones para observar su evolución a largo plazo.
En torno a las 400 iteraciones el robot comenzó a caerse de forma sistemática y la duración de los episodios disminuyó progresivamente. Pero tras otras 100–200 iteraciones, el entrenamiento se recuperó por sí solo y la política volvió a estabilizar el comportamiento del robot.
Este tipo de comportamiento parece ser normal en algoritmos de aprendizaje por refuerzo. Durante el entrenamiento, la política sigue explorando el espacio de soluciones y temporalmente puede alejarse de una solución estable para intentar maximizar la recompensa. Si esa nueva región del espacio de soluciones resulta no ser favorable, el propio proceso de aprendizaje puede reconducir la política hacia soluciones más estables. Este es el resultado:

Cuando al robot se le da un comando de velocidad este lo sigue sin caerse y cuando no se le da, se queda estable estáticamente.
¡Fase 2 completada con éxito! Y además he aprendido a realizar un entrenamiento basado en una política anterior.
Last updated