Simulateur

Cette page de documentation détaille le fonctionnement des scripts utilisés dans le cadre de l'utilisation de Webots pour entrainer une IA sur une simulation de piste.


Objectifs

On cherche à simuler le déplacement d'une voiture dans un environnement semblable à la piste de la course. A chaque étape de la simulation on donne en entrée les données des différents capteurs à un model qui nous renvoie une consigne d'angle de roues à appliquer au véhicule pour la prochaine étape de la simulation.


Organisation basique à une voiture

Une première approche pourrairt être d'organiser notre monde avec une Piste et une Voiture. Dans cette approche toute la logique serait géré au niveau du Driver de la Voiture: - obtenir la data des capteurs - exécuter le model pour obtenir une consigne - update l'état de la voiture en accord avec cette consigne - puis finalement calculer les rewards données à la fin de chaque episode pour entrainer l'IA

Note

Le problème de cette architecture est qu'elle n'est pas scalable. Elle nous force à n'utiliser qu'une seule voiture en même temps car en augmentant le nombre de voitures, elles gèreraient toutes leur propre model en local et on entraînerait donc n models au lieu d'un 1 ce qui est inutile.

flowchart TD A("`__fa:fa-car TT02_0__ RpLidarA2 (_AI model_)`")

Organisation complexe à n voitures

Pour s'affranchir de ces limites on propose de déplacer l'éxécution du model dans un controller séparé des n voitures. On choisira donc de crééer un Robot de type Supervisor qu'on nommera WorldSupervisor en ajoutant le field supervisor TRUE dans la string de définition du node correspondant à notre supervisor. Notre objectif est de créer n voitures à l'initialisation du monde et de faire communiquer les voitures et le WorldSupervisor via des Emitters/Receivers. Il faut donc que le WorldSupervisor ait n couples d'Emitters/Receivers pour communiquer à chaque voiture sur un channel différent.

Warning

n n'est pas connu avant l'éxecution du controller du WorldSupervisor. Or, l'état d'un Robot pour les fonctions de controller dans Webots ne change pas dynamiquement i.e. si le WorldSupervisor s'ajoute lui-même des devices via son controller au cours de l'éxecution, ces derniers ne seront pas acessibles via la méthode getDevice(name).

C'est pour cela qu'en plus d'un WorldSupervisor gérant la logique de l'IA, nous avons besoin d'un autre Supervisor dont le rôle est de créer le WorldSupervisor avec ses n couples d'Emitters/Receivers et les n voitures au début de l'initialisation du monde. On nommera ce nouveau Supervisor WorldInit.

Warning

L'API Emitters/Receivers ne garantit pas un planning spécifique pour la transmission. Il arrive parfois que plusieurs paquets soient regroupés et reçus ensemble ou qu'aucun packet ne soit reçu. Ces cas doivent donc être traités et on perd le déterminisme de l'entraînement.


Pendant l'initialisation du monde

flowchart TD Init("WorldInit") --> |crée| A("`__WorldSupervisor__ (_AI model_) supervisor_emitter_0 supervisor_receiver_0 supervisor_emitter_1 supervisor_receiver_1 ... supervisor_emitter_n-1 supervisor_receiver_n-1`") Init --> |crée| B("`__fa:fa-car TT02_0__ RpLidarA2 TT02_emitter TT02_receiver`") Init --> |crée| C("`__fa:fa-car TT02_1__ RpLidarA2 TT02_emitter TT02_receiver`") Init --> D[...] style D fill:none,stroke:none linkStyle 3 stroke-width:0,marker-end:none Init --> |crée| E("`__fa:fa-car TT02_n-1__ RpLidarA2 TT02_emitter TT02_receiver`")

Pendant l'exécution des controllers

flowchart TD Super("`__WorldSupervisor__ supervisor_emitter_0 supervisor_receiver_0 supervisor_emitter_1 supervisor_receiver_1 ... supervisor_emitter_n-1 supervisor_receiver_n-1`") --> |commande| B("`__fa:fa-car TT02_0__ RpLidarA2 TT02_emitter TT02_receiver`") Super --> |commande| C("`__fa:fa-car TT02_1__ RpLidarA2 TT02_emitter TT02_receiver`") Super --> D[...] style D fill:none,stroke:none linkStyle 2 stroke-width:0,marker-end:none Super --> |commande| E("`__fa:fa-car TT02_n-1__ RpLidarA2 TT02_emitter TT02_receiver`")

Environnement Webots utilisé

Piste

Le monde utilisé est Simulateur/worlds/piste2.wbt. Ce monde vient de la version 2023 du github officiel CoVAPsy.

Voiture

La voiture utilisé est TT02(Simulateur/protos/TT02_2023b.proto). Ce proto vient de la version 2023 du github officiel CoVAPsy.

Capteurs

Les capteurs utilisés sont :

  • Un Lidar aux specifications de notre vrai lidar.

  • Un TouchSensor uniquement sur le simulateur pour détecter les collisions.