RobotCompetition2014-3
Sommaire
Introduction :
Le but de ce bureau d'étude est, pour notre groupe, de concevoir un robot joueur en LEGO Mindstorm. Pour cela notre robot doit être capable de repérer la balle et ensuite avancer vers elle. Il doit aussi pouvoir la prendre, faire une rotation en direction du but adverse et tirer. Nous voulons avant tout, construire notre robot selon nos exigences, ensuite le programmer en fonction de la balle, et pour finir le programmer en fonction des buts et de l'arbitre, tout cela en NXC (Not Exactly C).
Première étape : La construction :
Avant de commencer cette étape nous avons effectuer plusieures recherches internet pour nous donner une idée de la forme que pouvait avoir notre robot. Nous n'avons rien trouvé de conforme à nos exigences et nous avons donc décidé de l'assembler selon notre instinct.
Nous voulions dans un premier temps avoir un robot avec trois roues : Deux devants et une à l'arrière, pour faciliter les rotations. les deux devants sont reliées à des moteurs alors que celle à l'arrière est libre, elle sert à stabiliser le robot.
Notre second critère était que le robot soit léger pour faciliter ses déplacements. On s'est vite rendu compte que cela n'était pas possible car pas assez stables. A cause d'un problème de couple au niveau des deux roues avants, nous avons dû ajouter des fixations et donc augmenter le poids du robot. Cette idée fut donc vite abandonnée.
Ensuite, nous avons rajouté des "pinces" à l'avant car l'idée de base était que le robot n'ait qu'à effectuer une rotation rapide en direction du but une fois que la balle se trouvait dans ces "pinces" pour tirer, mais cela était inefficace. Nous nous sommes donc penchés sur un système avec un moteur et un balancier pour tirer.
Au cours de tests, un problème nous est apparu avec le robot ci-dessus : nous pouvions capturer la balle mais lorsque nous tournions celle-ci s'échappait des pinces du robot. Nous avons apporté les modifications nécessaire à la résolution de ce problème.
Nous avons donc changé notre balancier : il ressemble maintenant un simple angle droit qui capture la balle lorsque celle-ci passe entre les "pinces". Le robot garde alors la balle contre lui, le temps de trouver le but, puis le balancier se déploie pour tirer la balle.
Pour les capteurs, nous avons positionné le capteur à ultrasons en hauteur avec une vue plongeante pour qu'il puisse repérer la balle quand elle est au niveau des pinces. Ensuite le capteur infrarouge se situe en dessous du capteur à ultrasons, pour avoir une vue panoramique et pouvoir détecter la balle à bonne distance de notre robot. Le capteur de couleurs se trouve en dessous du robot, au niveau du sol, car il ne peut pas détecter les couleurs avec une distance supérieure à 2cm (On peut le voir sur la première photo).
Pour détecter les autres robots nous avons rajouté un autre capteur à ultrasons sur une des pinces. Nous avons d'abord pensé que la position de ce capteur allait gêner la capture de la balle. Après quelques tests il s'est avéré que non.
Le robot fût amélioré à mesure que le programme avançait. La construction et la programmation se sont faîtes de manière simultanée.
Deuxième étape : Le programme :
En premier lieu nous avons cherché à comprendre comment fonctionnait le langage nxc. Pour cela nous nous sommes aidés d'un site regroupant les principales formules de ce langage ([1]). Grâce à cela nous avons fait en sorte que le robot avance tout droit, tourne, recule... C'est à la suite de ces quelques lignes de code que le problème de couple au niveau des roues nous est apparu.
La seconde étape fût d'apprendre à se servir des différents capteurs. Pour commencer, nous nous sommes intéressés au capteur le plus important, le capteur infrarouge. Ce capteur était notre priorité car il permet de repérer tous les éléments du terrain: la balle et les buts. Ce capteur fonctionne grâce à cinq senseurs chacun orienté dans une direction différente, sur 180°. A chacun de ses senseurs correspond une valeur variant de 0 à 255. On a donc écrit un programme permettant d'afficher les valeurs de chaque senseur. Grâce à ces valeurs nous avons pu écrire un programme qui permettait au robot de repérer la balle et de se diriger vers elle. Ce programme utilisait des valeurs précises, on a vite vu les limites du capteur infrarouge: il manque de précision lorsque la balle est proche ou derrière lui. On a donc décidé de ne plus utiliser de valeurs précises, mais uniquement des 0.
Après le capteur infrarouge, nous nous sommes attaqués au capteur ultrason, qui nous servait à détecter la balle, et à déclencher le balancier. Ce capteur est assez précis et facile à utiliser. Le seul bémol est que pour les valeurs inférieures à 7cm, il ne détecte pas toujours correctement.
Le dernier type de capteur que nous avons utilisé est le capteur de couleur. Il nous sert à repérer les lignes rouges délimitant les bords du terrain. Ce capteur fonctionne bien, mais doit être presque collé à la ligne pour la repérer. Nous n'avons pas eu de problème avec ce capteur, car nous l'avions déjà placé au niveau du sol.
Pour finir nous avons rajouté un un capteur à ultrasons qui nous permet de détecter les divers obstacles(robots et buts). Comme nous avions déjà utilisé un capteur de ce type, nous savions plus ou moins comment l'utiliser, donc nous n'avons pas eu de problème particulier.
Notre code est une fonction "main()" dans laquelle s’exécute diverses sous fonctions: repérer_balle(), repérer_but(), tirer() et garer().
La sous-fonction repérer_balle() lui permet, comme son nom l'indique de repérer la balle, mais aussi de se diriger vers elle, et de la capter.La sous fonction est faite de la sorte que : -Tant que le capteur ultrason n'a pas repéré la balle au niveau des pinces, le robot se dirige vers la position de la balle (indiquée par le capteur infrarouge). -Lorsque la balle est repérée par le capteur à ultrason, le moteur associé au balancier s'active et attrape la balle.
La sous-fonction repérer_but() s'exécute lorsque "repérer_balle()" est fini. Le capteur infrarouge switch alors de 600Hz à 1200Hz, puis le robot tourne sur lui même à la recherche d'un signal infrarouge: un but. Lorsque celui-ci est en face il passe au programme tirer. Il nous reste à l'heure actuelle à coder la différenciation des deux buts. Pour cela nous allons lors des prochaines séances effectuer des tests avec les autres groupes s'occupant des buts.
La sous fonction tirer() active le moteur associé au balancier dans le sens opposé à celui utilisé pour la capture. Le balancier revient ensuite dans sa position initiale.
La fonction se_garer() n'est pas tout à fait finie. Elle repère notre but (le problème étant que nous ne savons pas à l'heure actuelle différencier les deux buts) puis se dirige vers lui. Lorsque le capteur de couleur repère une ligne verte il la suit. Il y a ensuite deux cas de figure: soit il arrive sur la ligne noire et se gare, soit il repère la ligne rouge du coté opposé, et fait demi-tour sur la ligne verte pour rejoindre la ligne noire.
Pour ce qui est des limites du terrain et des obstacles, nous avons intégré ces lignes de code dans la sous-fonction repérer_balle(), car ce problème ne peut se présenter que lorsque notre robot est en mouvement.
Troisième étape : Les Tests :
Ce projet étant nouveau pour nous, notre projet eut plusieurs problèmes tout au long de sa mise en marche. Tous ces problèmes sont apparus lors des différents tests. Mais ces tests nous ont aussi permis d'en régler la majorité. Dans cette partie nous allons vous décrire l'ensemble des tests réalisés au cours de ce bureau d'étude.
Un des plus gros problème qui nous a été confronté était de différencier les deux buts et la balle. Nous avons eu l'idée de différencier leurs fréquences et faire aussi varier la fréquence de réception du capteur(600Hz et 1200Hz). Pour ces test, nous avons eu besoin de deux programmes, des variantes d'un programme précédent. Un qui permettait d'afficher les valeurs des différents senseurs lorsqu'ils étaient réglés sur 600Hz et sur 1200Hz. Nous avons aussi eu besoin d'un mètre et de plusieurs balles. Nous avons ensuite utilisé la valeurs du senseur du milieu (le numéro 3), pour des distances variant entre 30cm et 3m.
Nous avons pu en conclure que le capteur ne voyait que la valeur de 600Hz ou presque, lorsqu'il était réglé sur 600Hz. Suite à cela il nous a semblé logique de définir la balle à 600Hz. Une fois la balle dans les pieds et le capteur réglé sur 1200Hz il ne voyait presque plus la balle mais bien l'autre signal de 1200Hz qui représentait le but.
Suite à ce choix le problème est que si notre joueur se trouve face à son propre but il va tirer dans cette direction.
Quatrième étape : Le Terrain :
En collaboration avec tous les groupes nous avons réalisé le terrain. En premier lieu, il a fallu prendre les mesures de tous les acteurs participant lors d'un match : la taille des robots et des buts. La taille des robots était nécessaire pour savoir quel espace laisser entre les lignes et les limites des plaques. Deuxièmement, il a fallu tracer toutes les lignes au crayon de bois sur les quatre plaques.
Troisièmement et pour finir, nous avons apposé le ruban adhésif de couleur. Il a fallu faire attention à l'ordre de superposition des bandes de couleurs.