Je vais commencer par poster la vidéo final du projet avant de commencer a blablater . Elle est en anglais mais sur la deuxième moitié de la vidéo on voit le processus d'apprentissage de l'IA ce qui ne nécéssite pas forcement de comprendre quoi que ce soit à la voie off :
Depuis un petit moment je me balade entre plusieur hobbys vagement en relation les uns avec les autres, l'apprentissage machine, le devellopement de jeux et la mécatronique .
J'ai donc eu l'idée de créer un jeu qui apprendrai à se jouer lui-même a l'aide d'une manette de Xbox . je me suis dis que ca pourrait etre un projet sympa qui combinerait trois choses que j'aime .
Avant d'aller plus loin . Oui, je sais que dans ce projet j'utilise un methode completement inappropriée pour le problème que j'éssaye de résoudre ! Un bon vieux controller PID aurai fait largement l'affaire et aurai surment meme été meilleur . J'ai decidé d'utiliser un réseau de neurones parce que je voulais voir comment il allait s'adapter à tout les défauts liés à un controlleur physique (jeux entre les pièces, inertie des pièces, calibration imparfaite...)
LE PLAN INITIAL :
Je voulais que ce projet soit assez rapide sans avoir à faire face a de grosses inconnues, j'ai donc décidé de réutiliser des compétences que j'avais déjà développées au cour de projets précédents . Je pensais que j'aurai fini en deux jours...lol
Pour le jeux et l'apprentissage machine, ca serait donc fait sur Unity avec le 'ML-agents toolkit' aussi développé par Unity . J'étais déjà familier avec ces deux éléments meme si j'ai été assez surpris de voir à quel point ils avaient évolué depuis la dernière fois que je les avais utilisé .
Le choix du jeu s'est fait très tot, il fallait quelque chose qui puisse se controller avec un minimum de button pour garder la partie physique du projet assez simple .
Le 'ML-agents toolkit' contient quelques examples dont un qui pouvait facilement etre utilisé comme un jeu ne nécéssitant qu'un seul joystick, l'exercice du 'ball balancing' .
LE ROBOT.
J'ai commencé par créer un simple bras qui bouge le joystick droit de la manette . J'avais quelques servos MG-90 et un arduino nano qui trainaient dans un tiroir, c'est donc ce que j'ai utilisé .
La seule chose à laquelle j'ai du faire attention était de bien aligner le point de pivot du joystick avec l'axe des servos histoire de rendre la tache plus simple au niveau de la programmation du arduino .
L'étape suivante était d'écrire un programme pour le arduino qui permetterait de controller le joystick .
Une scène basique fut aussi créée pour permettre la calibration des mouvements .
Maintenant, il était temps de faire en sorte que le réseau de neurones puisse prendre le controle de la manette . La scene unity fut modifiée pour permettre au joystick droit d'etre controllé par celui de gauche .
Le joystick gauche est utilisé pour simuler les données de sorti du réseau de neurones, ceci permet de vérifier que la communication entre le PC et le arduino fonctionne correctement .
LE JEU .
Comme mentionné plus tot, j'ai donc recréé le jeu d'équilibrage de balle tout en y ajoutant un peu de difficulté . La première étant que la balle doit etre positionnée le plus près d'une cible se trouvant sur la platform . Le seconde étant que la balles est lancée d'une position et à une vitesse aléatoire en début de partie .
J'ai aussi éssayé de créer quelques magnifiques textures (je dis bien éssayer!)
L'APPRENTISSAGE .
Il était donc temps de commencer l'apprentissage .
Je vais pas rentrer en détail dans l'apprentissage par renforcement parce que c'est un sujet vaste et compliqué mais ici je vais expliquer très brièvement ce qu'il va se passer durant cette étape .
1 - On va prendre notre IA, appelé agent . Il va observer l'état du jeu . Ici il va collecté la vitesse et position de la ball, la position de la cible et l'inclinaison de la platform .
2 - A partir de cette observation il va accomplir une action . Bouger le joystick .
3 - Suivant le résultat de cette action il va recevoir une punition (score negatif) si la balle est tombée, ou une récompense (score positif) si la balle est toujours sur la platform, plus la balle est proche de la cible plus la récompense est grande .
Le cycle va se répéter jusqu'à ce que l'IA apprend a prendre les décisions lui perméttant de gagner un score maximum .
Arrivé à ce point du projet je pensais que je n'aurai qu'à lancer l'entrainement et que par miracle j'obtienerai un robot en parfait état de marche quelques heures plus tard...J'avais tort .
Après la première session d'entrainement, l'IA avait en effet appris à jouer mais elle était très nerveuse .
J'ai donc relancé une nouvelle session, cette fois ci avec une récompense suplémentaire pour la souplesse .
Le résultat était un peu meilleur mais loin d'etre extraordinaire .
Un des gros facteur limitant en incluant la manette durant l'entrainement est que je ne pouvais entrainer qu'un seul agent à la fois et à vitesse réel .
J'ai donc opté pour une nouvelle stratégie, diviser l'apprentissage en deux . La première partie se fairait en excluant la manette, ceci me permettrai d'entrainer plusieurs agents a la fois et en accéléré . En deuxième partie je réintroduirai la manette à l'entrainement pour laisser le temps à l'IA 'd'apprendre' la manette .
Cette technique me permettrai de tester differents systemes de punitions/récompenses et aussi de tester différents paramètres liés au réseau de neurones lui meme comme le nombre de couches, nombre de neurones...etc . Ceci me permettrait d'économiser plusieurs heures .
La partie de l'entrainement completement virtuelle s'est très bien passé et m'a permit de trouver de bon paramètres . Maheureusement au moment de réintroduire la manette, il était clair que quelque chose ne fonctionnait pas correctement, la balle était constament jetée hors de la platform, la bonne nouvelle était que cela était fait de manière très souple sans aucune nervosité .
Je pense que l'érreur vient de mon code et pas de l'IA elle-meme mais je n'ai pas été capable de la trouver malgré le fait que je suis quasiment sure que c'est quelque chose d'extrement simple . A ce moment la, je savais que j'avais de bon parametres donc je pris la decision de recommencer l'entrainement avec la manette depuis le debut .
Après une dizaine d'heures d'entrainement, j'avais enfin un résultat avec lequel j'était satisfait!!!