mountainsFase 4: Cambio de terreno

Objetivos de la Fase 4

En esta fase cambiaré el plano utilizado hasta ahora como terreno para el entrenamiento por un terreno con inclinaciones. El robot deberá aprender a balancearse en este tipo de terrenos inclinados sin olvidar lo aprendido en las fases anteriores.

  • Que el robot sea capaz de mantenerse en equilibrio estático cuando el comando de movimiento es cero.

  • Que el robot sea capaz de desplazarse recto a la velocidad lineal solicitada cuando el comando de velocidad no tiene componente angular, manteniendo el equilibrio cuando se encuentre sobre un terreno inclinado.

  • Que el robot sea capaz de realizar movimientos curvilineos, adaptando su velocidad linear y angular a la solicitada cuando el comando tiene tanto componente lineal como angular. Todo ello mientras mantiene el equilibrio cuando se encuentre sobre un terreno inclinado.

Estrategia de entrenamiento

En esta fase no vamos a cambiar el vector de observaciones ni de acciones, sólamente el terreno. Así que podremos utilizar la política obtenida en la fase 3 directamente para realizar el entrenamiento.

Creación del nuevo terreno

Utilizando blender he creado un plano de 75x75m:

En el centro del plano he creado una serie de rampas:

El resto del terreno es plano, para que el robot no olvide cómo mantener el equilibrio cuando no existe inclinación.

Exporto el archivo en formato STL, abro un proyecto vacio de IsaacSim e importo el STL del terreno:

Una vez importado, hay que agregar el Colliders Preset al terreno: Clic derecho sobre el terreno > Add > Physics > Colliders Preset

Una vez hecho esto, IsaacSim debería mostrar una malla sobre el terreno, que es la mesh de colisión que utilizará para calcular las físicas (el contacto del robot sobre el terreno).

Si esto no sucede, hay que activar su visualización:

Para comprobar que la malla de colisión está bien, a mi me gusta comprobarlo creando una esfera a la que le agrego "Rigid Body with colliders preset". Situo la esfera sobre el plano y ejecuto la simulación.

Una vez comprobado que todo funciona como debe, en el Stage Tree pulso sobre el objeto del terreno con el botón derecho y selecciono la opción Save Selected y guardo el USD del terreno en mi carpeta del proyecto.

Una vez hecho esto, ya podemos utilizar este USD para cargar el nuevo terreno en el entrenamiento.

Cambios en __init__.py

He registrado una nueva fase para incluir la 4.

Cambios en simplerobot_env_cfg.py

scene: InteractiveSceneCfg = InteractiveSceneCfg(num_envs=400, env_spacing=20.0, replicate_physics=True)

He separado a los robots 20 metros entre sí para hacer más fácil la visualización. Esto sólamente afecta a nivel visual. El terreno es de 70x70m, lo que significa que los terrenos van a solaparse unos con otros, pero solo visualmente, ya que cada instancia de robot tiene asociado su propio terreno y calcula las colisiones únicamente con este.

He creado una nueva clase para la fase 4, manteniendo los mismos valores que en la fase 3 a excepción del valor de la variable phase.

Cambios en simplerobot_env.py

Cambios en _setup_scene

He cambiado la manera en la que se spawnea el terreno. Ahora, si la fase de entrenamiento es la 4, utilizaré el USD que he creado antes para el terreno con rampas.

Cambios en _reset_idx

He hecho dos cambios. El primero de ellos ha sido subir la posición inicial del robot 0.3m sobre el nivel del suelo. El robot comienza en el aire y cae hasta colisionar con el terreno. En las primeras pruebas tuve problemas con las colisiones y algunos robots spawneaban por debajo del terreno y no se calculaban bien las colisiones, así que decidí levantarlo un poco.

El otro cambio ha sido este: elif self.cfg.phase >= 3: para incluir tanto la fase 3 como la 4.

Entrenamiento Fase 4

Como no hemos tocado ningún parámetro del entrenamiento más allá del terreno y la posición inicial del robot, podemos utilizar como base la política entrenada en la Fase 3 directamente:

~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/train_mod.py --task=Template-Simplerobot-Direct-Phase4-v0 --load_policy /home/angellm/logs/rsl_rl/simplerobot_direct/2026-01-24_21-59-22/model_9999.pt --max_iterations 2500 --headless

Run: 2026-01-29_19-54-12

En la gráfica de la izquierda puedo ver que, desde casi las primeras iteraciones, la duración de los episodios se aproxima al máximo. Esto es debido a que estamos utilizando la política de la fase 3 directamente como base para entrenar esta. Por otro lado, en la gráfica de la derecha puedo ver que, tras unas primeras iteraciones prometedoras, a partir de la número 500, la media de las recompensas cae. Probablemente esto significa que ha entrado en un espacio de soluciones que no es muy óptimo y que, seguramente, con más iteraciones logrará salir de ese espacio de soluciones y llegar a uno más óptimo. Pero como veo que la iteración 100 tiene una buena relación de tiempo por episodio y recompensa, lo elijo como checkpoint para visualizar el comportamiento de la política:

~/IsaacLab/isaaclab.sh -p ~/SimpleRobot/scripts/rsl_rl/play.py --task=Template-Simplerobot-Direct-Phase4-v0 --checkpoint=/home/angellm/logs/rsl_rl/simplerobot_direct/2026-01-29_19-54-12/model_100.pt

En la simulación veo que existen:

  • Robots en equilibrio estático

  • Robots que se mueven en linea recta sin girar, "escalando" planos inclinados sin caerse

  • Robots que se mueven con velocidad linear y angular, navegando por planos inclinados sin caerse.

Por lo que considero que este checkpoint es válido.

Evaluación

La política entrenada se comporta como cabría esperar y se cumplen todos los objetivos marcados para esta fase.

¡Fase 4 completada con éxito!

Última actualización