RobotCompetition2014-2
Introduction
Durant le bureau d'étude IMA de cette année, nous avons pour rôle la réalisation d'un robot d'attaque et de défense. Pour la bonne compréhension de ce que nous allons faire au cours de cet enseignement de spécialité nous allons reporter sur cette page tout ce qui sera fait pour atteindre la conception finale de ce robot. Ce twiki expliquera en détail nos manières de procéder pour atteindre nos objectifs, présentant également des lignes de codes. Ces dernières seront copiées en italique, les phrases écrites après un double slash (//) signifiant que c'est un commentaire, en langage C.
Le Robot Mindstorm NXC
Il y a deux moyens de programmer ce robot : en utilisant le logiciel de programmation par blocs fourni avec la machine, ou en langage de programmation pur. Nous avons choisi cette dernière option, l'éditeur et compilateur NxcEditor permet d'écrire en NXC, dérivé du langage C.
Le montage
Voila la seconde version du robot NXC que nous avons réalisé
Les capteurs
Ils sont l'essence même de notre robot, et ce sont eux qui vont nous permettre de faire ce projet. Leur utilisation via un programme NXC requiert :
- Une initialisation, dans laquelle on indique au robot à quel port ils sont branchés.
- Une lecture. C'est-à-dire que le robot ne les utilise pas à tout instant. Il faut déclencher une lecture à un instant t, et à cet instant nous pouvons utiliser les valeurs que nous fournissent ces capteurs.
Le capteur de couleur
Ce capteur permet de différencier les couleurs : il peut reconnaître du blanc, du noir, du rouge, du vert, du bleu. Nous le plaçons sous notre robot (pour une détection correcte, il doit être placé à au moins 1 cm du sol) et il servira à deux buts :
- Se replacer sur le garage en suivant les lignes de couleur.
- Ne jamais sortir du terrain.
Côté programmation :
Initialisation grâce à la commande :
SetSensorColorFull(IN_1); // IN_1 indique que le port auquel il est branché est numéroté 1
Lecture :
SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); // Cette formule bien complète n'est pas si compliquée. A notre niveau, nous //n'utilisons que la variable cval, un int qui va contenir un chiffre entre 0 et 5. Ce chiffre signifie tout simplement une certaine couleur entre //Blanc,Bleu, Rouge, Jaune, Vert et Noir. Nul besoin d'apprendre leur correspondance, un simple test du type "if (cval == INPUT_REDCOLOR)" par exemple suffit.
Le capteur ultrason
Ce capteur détecte la présence d'éventuels obstacles et même la distance à laquelle ils se trouvent. Il nous servira pour remplir la condition du cahier des charges "ne jamais percuter l'adversaire", ainsi que pour détecter la balle.
Initialisation :
SetSensorUltrasonic(IN_3);
Lecture :
dist = SensorUS(IN_3); // dist est un byte (octet) contenant une valeur allant de 0 à 255. Cette valeur correspond à une distance. Plus le nombre est //grand, plus l'obstacle est loin.
Le capteur infrarouge
Il nous sera utile pour détecter la balle et les buts.
Son fonctionnement : 5 capteurs y sont intégrés. Un capteur scanne devant lui, les quatre autres permettent au robot de "voir" sur 180°. Nous avons accès librement à la valeur de chaque capteur.
Initialisation :
SetSensorLowspeed(IN_2);
Lecture :
result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5);
Les valeurs qui nous intéressent sont celles de s1, s2, s3, s4, s5. Ils captent une valeur entre 0 et 255 selon l'intensité du signal reçu. Chacun correspond à un capteur.
Notre capteur peut être réglé pour recevoir plus spécifiquement des ondes de fréquence 600 Hz ou 1200 Hz.
Le capteur de contact
Lorsque le robot rencontre un obstacle, le bouton est enfoncé. Nous pensions que ce capteur aurait pu nous être utile pour vérifier la bonne capture de la balle. Mais son enclenchement était bien trop aléatoire pour être utilisé avec notre configuration. Nous avons donc opté pour le capteur ultrason.
Problèmes
Le premier problème rencontré avec ce capteur est le fait qu'il n'a pas de phase intermédiaire entre le moment où il touche quelque chose et celui où il ne touche rien. Les valeurs de ce capteur passe de 0 (il ne touche rien) à 33 (valeur maximale atteinte quand le bouton du capteur est enfoncé au maximum).
Le deuxième problème rencontré est que le bouton ne s'enfonce pas assez pour activer le moteur quand le robot entre en contact avec la balle. Il faut que la balle soit en mouvement rapide vers le robot pour que le bouton s'enfonce. De plus si la balle arrive sur le côté, bien qu'elle soit entrée dans la pince, elle n'est pas détectée puisque l'enclenchement n'est pas systématique dans ce cas.
Résolution des problèmes
Nous avons opté pour un remaniement du robot. Pour détecter et attraper la balle, nous avons utilisé l'action simultanée du capteur ultrason et du capteur infrarouge; nous avons dû modifier notre programme afin de faire une distinction entre balle et adversaire puisque que le capteur ultrason est aussi utilisé pour détecter les éventuels obstacles.
Le dispositif de capture de la balle
Nous utilisons une pince articulée pour capturer la balle. Cette pince, lorsqu'elle s'ouvre, pousse également la balle en avant; c'est une pince à double action. En plus de cette pince nous avons installé une pince rigide horizontale pour tenir la balle correctement sur les côtés, et permettre une capture plus précise.
Nous installons dans la zone de capture le capteur ultrason. Il sert à détecter la balle et l'adversaire. Lorsque le robot détecte la balle assez prêt, il abaisse la pince. Ensuite il vérifie si la balle qui est présente. Dans le cas contraire il rouvre la pince.
Le jeu
Le terrain
C'est avec plusieurs groupes que nous avons fabriqué le terrain. Nous avons assemblé 4 plaques de placo de 1m / 1,5m, formant un rectangle de 2m / 3m. Le terrain en lui-même ne prend pas la totalité de l'espace : une distance est alloué de chaque côté. A chaque bout du rectangle est monté un mur. Ce dernier a pour but d'empêcher la balle de sortir trop loin en dehors du terrain.
La structure globale de celui-ci, avec les lignes de couleur est donné sur la page de présentation de la saison 5, et a été proposé par l'enseignant. L'un des groupes est allé questionner chacun des acteurs pour connaître la taille minimale à réserver pour chaque partie du terrain : emplacement des buts, espace entre limite du terrain et mur, emplacement de garage des joueurs... Nous avons adapté ces mesures de manière à ce que nos robots joueurs puissent aller jusqu'au bout du terrain sans percuter le mur, et ce pour les 4 côtés.
- Les robots joueurs doivent pouvoir avancer jusqu'au lignes latérales et les dépasser jusqu'au roues sans pour autant que leur pince ne touche le mur.
- Il doivent avoir la place pour se garer à côté des buts.
- Le robot ramasseur doit avoir sa place de garage aussi, donc réserve un emplacement latéral.
Nous avons donc tracé les lignes du terrain au crayon gris
Ensuite nous avons pu installer les vraies lignes; nous avons utilisé du scotch de couleur : fort heureusement nous avions toutes les couleurs nécessaires à disposition.
Les limites du terrain
Les robots joueurs n'ont pas le droit de sortir du terrain. Le bord de celui-ci étant matérialisé par une ligne rouge, nous utiliserons le capteur de couleur, pour détecter la couleur en temps réel et faire faire demi-tour au robot lorsqu'il atteint cette ligne.
Fichier:Arrête.mp4 Le robot s'arrête quand il voit une ligne rouge avec son capteur de couleur, ce qui va l'empêcher de sortir du terrain de foot.
Fichier:Demi tour.mp4 Nous avons modifié le programme qui fait s'arrêter le robot et l'avons retravaillé afin qu'il puisse faire demi-tour toujours lorsqu'il voit une ligne rouge.
Pour ce faire c'est assez simple. Il suffit de vérifier à chaque instant la couleur en-dessous, et dès qu'elle apparaît rouge, de faire demi-tour
while(1) { SV = ReadSensorColorEx(S1, cval, rawData, normData, scaledData); if(arret == 0 && cval == 5) // Variable arrêt utilisée dans un autre programme { OnFwd(OUT_A, 50); OnFwd(OUT_B, -50); demitour = 1; // Cette variable nous sert à empêcher certaines actions lorsqu'elle vaut 1 Wait(2600); // Temps approximatif d'un demi-tour à cette vitesse demitour = 0; Off(OUT_AB); } Wait(250); // Temps de latence entre deux vérifications }
Ne pas percuter l'adversaire
Il est interdit aux deux joueurs de se rentrer dedans. Le capteur ultrason, placé bien en évidence sur le robot, détecte les obstacles. Lorsqu'il voit quelque chose de très près, nous ordonnons à notre robot l'arrêt.
while (1) { dist = SensorUS(IN_3); if ((balle == 0) && dist <= 25)) // La variable balle vaut 1 si le robot considère qu'elle est juste devant. Par conséquent le programme ne s'enclenchera pas dans ce cas { Off(OUT_AB); Wait(500); OnFwd(OUT_AB, 50); } }
La Balle
Le but du jeu est que le robot attrape la balle pour ensuite marquer des points.
Chercher la balle
La difficulté majeure de notre projet est ici. La balle que nous utilisons émet un rayonnement infrarouge en continu. Les buts, pour qu'ils soient détectés par le robot, émettent un signal qui est intermittent. C'est à partir de ça que le robot doit différencier la balle des buts.
Deux solutions furent proposées. Nous avons opté sur le changement de fréquence : Le rayonnement infrarouge se fait à une fréquence : elle peut être de 600 ou de 1200 Hz. Justement, le capteur infrarouge du robot peut être réglé pour recevoir plutôt du 600 Hz, ou du 1200 Hz. Nous utiliserons cette fonctionnalité pour distnguer la balle des buts.
Après initialisation du capteur on peut ajouter
SetHTIRSeeker2Mode(IN_2, HTIR2_MODE_600);
ou
SetHTIRSeeker2Mode(IN_2, HTIR2_MODE_1200);
Après avoir effectué des tests avec un autre groupe, nous avons trouvé que le robot détecte mieux les ondes sur le mode 600 Hz. C'est ce mode qui sera utilisé pour la balle. Nous demanderons donc aux constructeurs de buts de régler leur fréquence à 1200 HZ.
Lorsque le robot est en recherche de balle, il se placera en mode 600 Hz. Une fois la balle attrapée (condition vérifiée par l'activation du capteur ultrason), le robot passe en mode 1200 Hz pour les buts.
Attraper la balle / Lancer la balle
Le principe pour trouver la balle est de regarder la valeur de chaque capteur : le robot comprendra où la balle peut se trouver. Son but est que le capteur central soit le seul à avoir une valeur significative (supérieur à une valeur précise). Une fois positionné face à la balle, il avance vers elle, tout en corrigeant sa trajectoire de manière à rester bien en face de celle-ci : son objectif est de l'attraper.
Une fois arrivé proche de la balle, (le capteur ultrason indique une présence proche), la pince s'abaisse grâce au servomoteur dédié. Si ce capteur voit une faible valeur alors la balle est bien emprisonnée et le robot continue son jeu. Sinon, il relève la pince et réessaie.
Le dispositif de tir consiste à ouvrir la pince avec une certaine vitesse. La bout arrière de notre mécanisme pousse la balle à la vitesse souhaitée, et celle-ci se dirige tout droit. Pour peu que le robot soit correctement dirigé, elle avance vers le but.
Après plusieurs tests voilà les premiers résultats obtenus dans cette vidéo :Fichier:Attrape.mp4
Voici notre programme pour attraper la balle : Fichier:Attrape Balle.txt
Detecter les buts
Voici un autre point compliqué de notre projet. Le robot doit trouver son propre but pour tirer. Les deux buts émettant sur la même fréquence, il convient d'utiliser le clignotement. Chaque but va être programmé pour rester allumé un certain nombre de secondes, puis s'éteindre, et ainsi de suite.
Se replacer
Lorsque l'arbitre le lui ordonne, le robot se replace sur son garage. Nous avons modifié l'algorithme précisé dans la partie "Robot de compétition" du twiki de la saison 5.