Aller au contenu


Photo
- - - - -

Un jeu qui apprend à se jouer lui-même

arduino IA unity

48 réponses à ce sujet

#1 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 18 avril 2020 - 03:43

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...)

 

network.jpg

 

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é .

 

UNITY.png

 

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' .

 

UNITY BALANCING BALLS.jpg

 

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 .

 

parts.jpg

assembled.jpg

 

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 .

 

calibration.jpg

 

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 .

 

left stick.png

 

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!)

 

game.png

 

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 .

 

cycle.png

 

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 .

 

stack.png

 

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!!!
 


  • Mike118 , macerobotics , Path et 1 autre aiment ceci

#2 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 18 avril 2020 - 07:00

Un bon vieux controller PID aurai fait largement l'affaire et aurai surment meme été meilleur . 

Non, pas du tout ! J'ai de suite compris que tu proposais une alternative au PID.

C'est un super exercice ! Ce n'est certainement pas l'application la plus facile en IA.

Là, je dis bravo !

 

De plus, je vois que tu fais un joli carton sur YouTube. C'est vraiment mérité !


  • Little french kev aime ceci

#3 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 18 avril 2020 - 11:47

Comme tu le dis c'est purement un exercice mais je trouve ca aussi assez interessant de voir que les techniques plus modernes ne sont pas forcement la solution a tout les problemes .

Le nombre d'abonnés monte tout doucement mais j'ai encore du chemin à parcourir pour te rattraper !



#4 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 19 avril 2020 - 06:32

Le nombre d'abonnés monte tout doucement mais j'ai encore du chemin à parcourir pour te rattraper !

Mais, tu m'as rattrapé et même dépassé ! Ta vidéo va faire environ 600 vues les premieres 24h, alors que mes vidéos ne font au mieux que 300 vues.

De plus, ces derniers temps, le nombre de vues s'est écroulé sur YouTube. Il semblerait que ce soit dû au confinement.

Non, à mon avis, tu vas cartonner.

Par contre, va falloir que tu refasses tes pièces et que tu mettes à jour ton blog. Un fan club, ça se ménage . . .

Dans ton titre, il n'y a pas le terme "IA". A mon avis, un titre du style, "Virtual robot Ball balancing, with IA learning", ce serait beaucoup mieux.

Sur la photo de couverture, il faudrait que tu agrandisses le plan avec la balle dessus. C'est certain, l'idée du joystick, c'est génial, mais je ne suis pas sûr que l'on perçoive bien l'idée en raison d'un plateau nettement plus petit que la radiocommande. A mon avis, le plateau à gauche et la radiocommande à droite. Si tu peins un paysage avec un arbre, l'arbre doit être situé à gauche, pas à droite. C'est comme ça ! Et c'est pas négociable.

Encore, bravo !



#5 Ludovic Dille

Ludovic Dille

    Habitué

  • Membres
  • PipPip
  • 185 messages
  • Gender:Male
  • Location:Belgique

Posté 19 avril 2020 - 12:47

Vraiment sympa ton projet ! Prochaine étape, réaliser le plateau en vrai ? :D


  • Little french kev aime ceci

#6 Laurent42

Laurent42

    Membre

  • Membres
  • 58 messages
  • Gender:Male
  • Location:LV-426

Posté 19 avril 2020 - 02:36

joli projet ! une prochaine étape sympa serait de faire tout ça avec du traitement de l'image, avec une caméra qui filme l'écran !


  • Little french kev aime ceci

#7 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 19 avril 2020 - 09:38

Vraiment sympa ton projet ! Prochaine étape, réaliser le plateau en vrai ? :D

 
J'y pense, Il faut que je trouve un moyen de recupérer les donnés nécéssaires au réseau de neurones avec une camera . Et aussi espérer que la physique de Unity sois assez fidèle à la réalité .

 

joli projet ! une prochaine étape sympa serait de faire tout ça avec du traitement de l'image, avec une caméra qui filme l'écran !

J'y pense aussi . Un jeu type pong ou un casse brique il pourrait etre un bon candidat . Un truc en 2D avec pas mal de contrast pour un debut pourrait etre pas mal en tout cas .

 

Mais, tu m'as rattrapé et même dépassé ! Ta vidéo va faire environ 600 vues les premieres 24h, alors que mes vidéos ne font au mieux que 300 vues.

De plus, ces derniers temps, le nombre de vues s'est écroulé sur YouTube. Il semblerait que ce soit dû au confinement.

Non, à mon avis, tu vas cartonner.

Par contre, va falloir que tu refasses tes pièces et que tu mettes à jour ton blog. Un fan club, ça se ménage . . .

Dans ton titre, il n'y a pas le terme "IA". A mon avis, un titre du style, "Virtual robot Ball balancing, with IA learning", ce serait beaucoup mieux.

Sur la photo de couverture, il faudrait que tu agrandisses le plan avec la balle dessus. C'est certain, l'idée du joystick, c'est génial, mais je ne suis pas sûr que l'on perçoive bien l'idée en raison d'un plateau nettement plus petit que la radiocommande. A mon avis, le plateau à gauche et la radiocommande à droite. Si tu peins un paysage avec un arbre, l'arbre doit être situé à gauche, pas à droite. C'est comme ça ! Et c'est pas négociable.

Encore, bravo !

C'est marrant, j'aurai parié que ca aurait l'inverse . Il y a pas mal de gens avec du temps à perdre .

J'ai fait un miniature avec la manette de l'autre coté avant celle que j'ai utilisé mais ca me parraissait bizare . Jvais tester pour voir si ca marche mieux . 
Jvais réfléchir à un titre a base d'IA . C'est vrai que ca parait evident maintenant que tu le dis !


  • Mike118 aime ceci

#8 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 20 avril 2020 - 07:02

J'ai fait un miniature avec la manette de l'autre coté avant celle que j'ai utilisé mais ca me parraissait bizare . 

J'ai fait un peu de peinture, il y a longtemps.

Il y a des règles, mais les génies les bousculent ou en jouent. Les mêmes règles sont applicables en photo.

 

Cela te paraissait bizarre parce que, peut-être, avais-tu mis la manette à droite, en premier plan.

Si tu mets la manette à droite, il faut qu'elle soit en second plan et plus petite que le plateau qui lui doit être à gauche.

Si tu mets l'image ici, on pourra en discuter.

 

Et mais, là, tu cartonnes, à mort ! Déjà plus de 1100 vues ! En un jour !

Peut-être que le mot "Game" est très vendeur. Si je compare avec tes autres vidéos, c'est le Nerf Turret qui fait le meilleur score. C'est aussi un jeu. Non ? J'y connais rien !

En tout cas, garde le mot "Game" dans le titre. Du coup, c'est peut-être la manette qui est vendeur et non le plateau.

 

La truc est simple, tu peux toujours modifier le titre et la page de présentation, mais pas le contenu de la vidéo. Il ne faut pas perdre cela de vue.

Mais tout ceci est très bizarre. Tant que je faisais des chars, je cartonnais, depuis que je fais des quadrupèdes, c'est la misère.


  • Little french kev aime ceci

#9 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 20 avril 2020 - 07:31

Mon traffic vient surtout des sites exterieurs comme hackster.io .

J'avais jamais entendu parler de cette règle! Par contre ca ne m'etonne pas plus que ca, je travail dans le milieu du design et il a des choses qui déplaise au yeux/cerveau et il faut juste faire avec .

Comme tu le dis, je pense que le terme AI doit etre inclus dans le titre et que le mot game/gaming est assez vendeur . Je vais essayer de trouver un truc qui mixe un peu tt ca .

Peut etre que les gens qui se sont abonnés au moment ou tu fesais des chars se sont abonnés que pour ca, Je sais que sur Instagram j'ai des vagues de followers qui viennent et qui partent . J'avais eu beaucoup de gens qui m'avaient follower au moment ou j'ai fait la tourelle et quand j'ai commencé a faire autre chose certains sont partis et d'autres sont arrivés . Le plus important c'est de se faire plaisir ! 



#10 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 20 avril 2020 - 10:32

Le plus important c'est de se faire plaisir ! 

C'est ce que je fais depuis que je suis à la retraite.

 

Je reviens sur ce que j'ai dit précédemment. C'est pas bon.

Si la manette est à droite, alors je pense que tout compte fait, il serait préférable de la placer au premier plan, l'écran en second plan à gauche.

Parce que, là, on est dans une situation spécifique de l'utilisation d'un ordinateur avec une notion de "droitier". C'est à dire, le clavier devant, l'ordinateur derriere., le joueur regarde l'image.

Les droitiers sont archi majoritaires (85%), donc toutes les cultures sont droitières.

Oui, effectivement, il y a des choses qui déplaisent sans que l'on sache vraiment pourquoi.

Le truc qui m'a toujours intrigué, c'est le problème de l'escalier. Un escalier monte de gauche à droite et il descend de gauche à droite. Je le ressens bien comme ça, sans doute comme la majorité des gens, mais pourquoi ?

 

Dans mon cas, je suppose que les gens se sont abonnés parce que c'était du Lego, mais pas du Lego de boites achetées. Ceux là sont largement majoritaires et je ne les intéresse pas du tout. 

Depuis que j'ai laissé tomber l'EV3, Mindstorms, les choses ont changées. Je perds beaucoup d'abonnés, même si le solde est positif.

Le mélange des technos Lego, Arduino, RC, c'est mon "combat". Il faut reconnaitre que cela ne marche pas très fort.

Ceux qui font du Lego ne veulent pas entendre parler d'autre chose et ceux qui font autre chose ne veulent pas entendre parler de Lego, pas sérieux.

Mais on est plus dans la religion que dans le rationnel. Donc, il n'y a pas de débat possible.


  • Little french kev aime ceci

#11 Laurent42

Laurent42

    Membre

  • Membres
  • 58 messages
  • Gender:Male
  • Location:LV-426

Posté 20 avril 2020 - 07:10

est il possible d'avoir les plan de la "pince" qui manipule le joystick pour pouvoir l'imprimer ? :)


  • Little french kev aime ceci

#12 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 20 avril 2020 - 09:44

est il possible d'avoir les plan de la "pince" qui manipule le joystick pour pouvoir l'imprimer ? :)

 

Je pensais pas partager le projet au début parce que le code est vraiment degueux mais j'ai eu tellement de demande que j'ai fini par me motiver à mettre mon site à jour! pieces dispo ici : https://www.littlefr...-controller-arm


  • Oracid aime ceci

#13 Laurent42

Laurent42

    Membre

  • Membres
  • 58 messages
  • Gender:Male
  • Location:LV-426

Posté 21 avril 2020 - 08:29

 

Je pensais pas partager le projet au début parce que le code est vraiment degueux mais j'ai eu tellement de demande que j'ai fini par me motiver à mettre mon site à jour! pieces dispo ici : https://www.littlefr...-controller-arm

 

merci c'est sympa, le bras à l'air vraiment bien fait ! 


  • Little french kev aime ceci

#14 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 04 mai 2020 - 08:53

La prochaine étape pour ce projet est d'incorporer une caméra et d'éssayer de le faire jouer en regardant la télé . Pour ca je vais tenter d'entrainer un réseaux convolutif .
Niveau design je me suis bien amusé, . Il est basé sur un de mes personnage de jeu vidéo favori, GLaDOS du jeu portal . J'ai éssayé d'imaginer comment la première version du robot aurai pu voir le jour et à quoi il aurai pu ressembler . J'ai aussi créé un jeu qui consiste a essayé d'attraper un gateau histoire de rester sur le thème du jeu .

dark_vertical.jpg

 

J'espere que le Jetson Nano va etre efficasse!

20200504_181633.jpg
 


  • Oracid , Mike118 et Romaric aiment ceci

#15 XB2000

XB2000

    Membre occasionnel

  • Membres
  • Pip
  • 81 messages

Posté 04 mai 2020 - 11:07

whouah, m’intéressant au réseaux de neurones je suis ton sujet avec attention

autant la première version fais très bricolage, autant celle-ci fait très bien fini, j'espère juste que GlaDos n'a pas ramené son ami la neurotoxine...

et le gâteau aussi en une référence à Portal

 

pour un plateau physique j'ai vu ça :

 

Du coup tu utilise un Jetson Nano ? c'est une carte qui m'intéresse beaucoup aussi



#16 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 05 mai 2020 - 07:27

Je pense qu'on peut lui faire confiance avec la neurotoxine. Y a rien a craindre!

Le project de l'octo-bouncer est vraiment cool . Sur le site de la personne qui l'a crée et on peut voir qu'il a bien perfectionné sa technique sur plusieur projets . Les mouvements du mecanisme on l'air vraiment bien controllés .

La premiere version c'etait totalement du bricolage mais c'est dur de battre les Colson et le scotch niveau rapidité de montage! Je vais essayé de faire tourner ca sur le Nano . J'ai pas encore eu l'occasion de l'utiliser ducoup j'attend aussi de voir ce que ca donne niveau performance !



#17 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 13 mai 2020 - 05:39

J'ai commencé à m'attaquer à la partie logiciel et surtout à la vision du robot qui ne se passe pas tout à fait comme prevu . J'ai donc commencer par créer un jeu tout simple dont le but est de bouger le portal(le truc rond) au dessus du gateau .

game_screenshot.png

 

Une fois le jeux fini, j'ai commencé à m'interesser à comment le robot allait voir le jeux . J'ai un peu hésité à utiliser un méthode de traitement d'image 'classique' (détection de couleur et autre) . Et comme le but de ce projet est quand meme d'apprendre de nouvelle chose je me suis dis qu'il serai sympa de créer et entrainer un réseau neuronal convolutif à l'aide de tensorflow .

Le but de ce 
réseau neuronal convolutif est de prendre une image en entrée et de donner une position de joystick en sortie . Il y a 9 positions de joystick, centre, gauche, haut+gauche, haut, haut+droite...etc
Pour entraîner un réseau de neurones il faut du data et si possible beaucoup . Ici le data consiste en des images du jeu avec le label associé a chaque image est la position du joystick . Collecter toutes ces images prend du temps, j'ai décidé de créer du data synthetique , c'est à dire qu'au lieu de prendre des photos du jeux en train de tourner sur ma télé, j'ai créer des images completements digitales du jeu .

synthetic_data.png

Ici on peu voir que j'ai donc créé un écran noir qui simule l'écran de la télé avec les éléments du jeu dessus . La position de la télé est assez aléatoire de manière à ce que le robot puisse apprendre à jouer sans être parfaitement aligné avec l'écran . Le fond est aussi remplacé par un bruit aléatoire, l'idée derrière cela est que le robot apprendrai à ignorer ce qui se passe en dehors de l'écran .

Avec cette méthode, j'ai pu en quelques heures créer un demi millions d'images labelées . J'ai ensuite créé mon réseau neuronal à l'aide de Tensorflow . J'ai même passé quelques heures a créer un script pour importer les images et labels pour l'entrainement du réseau pour finalement me rendre compte que Tensorflow avait un fonction qui permet de le faire de manière plus efficace en 2 lignes de code!!!

Apres avoir bidouiller un moment avec les paramètres et entraîné le réseau neuronal, il était capable de prédire correctement la bonne position du joystick pour une image donnée a 90% sur le data synthétique.

Malheureusement sur les photos réelles les performances sont très mauvaises .

bad_prediction_on_real_data.png

 

Je pense que cela vient du fait que mon data synthétique est bien trop simpliste (pas de réflexion sur l'écran et fond trop uniforme) .
Je pense que le travail effectué sur le réseau neuronal peut être gardé mais il faut que les data collectées soient de meilleure qualité .
 


  • Oracid et Mike118 aiment ceci

#18 Laurent42

Laurent42

    Membre

  • Membres
  • 58 messages
  • Gender:Male
  • Location:LV-426

Posté 14 mai 2020 - 10:22

Sauf si j'ai raté un truc, j'ai l'impression que vous vous compliquez la vie; si c'est juste pour détecter quelque chose au milieu d'un rectangle à peu près gris, et un peu inhomogène, quelques lignes d'opencv suffisent largement.


  • Little french kev aime ceci

#19 Little french kev

Little french kev

    Membre occasionnel

  • Membres
  • Pip
  • 110 messages

Posté 14 mai 2020 - 12:18

Oui je suis bien conscient que j'aurai pu régler le problème de manière beaucoup plus simple avec openCV mais ce projet est plus un exercice pour apprendre à utiliser tensorflow et en apprendre plus sur les réseaux de neuronnes en général .

Vaut vidéos mon aidé quelques fois d'ailleur . Continuez ce super boulot!



#20 Laurent42

Laurent42

    Membre

  • Membres
  • 58 messages
  • Gender:Male
  • Location:LV-426

Posté 14 mai 2020 - 01:37

Voila la donnée qui me manquait :) pour apprendre c'est en effet un très bon exercice ! je suis content que mes vidéos aident ! si vous voulez un avis sur le modèle, le code ou l'algo, n’hésitez pas ;) c'est un très beau projet !


  • Little french kev aime ceci



Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : arduino, IA, unity

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users