Robot transporteur : Différence entre versions
(→La reconnaissance RFID) |
(→Introduction) |
||
(49 révisions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
=Introduction= | =Introduction= | ||
− | Nous allons vous | + | |
+ | Nous allons vous présenter notre projet pour le bureau d'étude IMA 2012/2013. Nous sommes tous les deux très intéressés par ce département, et ce petit robot nous a passionné dans sa conception et dans sa programmation. Nous avons choisi de mélanger les différents styles de robots à concevoir, pour proposer une idée personnelle de projet. Notre objectif est de créer un robot autonome qui transporte des objets. Cela passe par deux grandes étapes : la conception d'un système à 4 servomoteurs et la programmation des tâches réalisées en autonomie. Voici une vidéo de présentation résumant les fonctionnalités du robot : | ||
+ | |||
+ | <include style="align:center;" nopre noesc src="/home/pedago/ppeip/include/video-RobotTransporteur-Final-2012-iframe.html" /> | ||
+ | <include style="align:center;" nopre noesc src="/home/pedago/ppeip/include/video-RobotTransporteur-2012-iframe.html" /> | ||
+ | <br style="clear: both;"> | ||
=La Conception= | =La Conception= | ||
− | Le robot est composé deux éléments essentiels : une base motrice et une pince de levage. Il comporte | + | Le robot est composé de deux éléments essentiels : une base motrice et une pince de levage. Il comporte également deux capteurs afin de le rendre autonome. |
==La base motrice== | ==La base motrice== | ||
[[Image:receptacle.jpg|thumb|upright=0.75|alt=receptacle|right|Réceptacle pour boîtes NXT et Foxboard]] | [[Image:receptacle.jpg|thumb|upright=0.75|alt=receptacle|right|Réceptacle pour boîtes NXT et Foxboard]] | ||
− | La base est composée de deux servomoteurs qui sont reliés entre eux pour former un socle solide. En effet, ce socle doit être capable de supporter le poids de deux boites NXT, ainsi que celui de la pince et de l'objet transporté. Les servomoteurs entraînent la rotation de 4 roues sur lesquelles sont fixées des chenilles pour | + | La base est composée de deux servomoteurs qui sont reliés entre eux pour former un socle solide. En effet, ce socle doit être capable de supporter le poids de deux boites NXT, ainsi que celui de la pince et de l'objet transporté. Les servomoteurs entraînent la rotation de 4 roues sur lesquelles sont fixées des chenilles pour permettre au robot d'avancer. La première boite NXT est directement fixée sur les servomoteurs, puis derrière, nous avons mis en place un réceptacle capable de contenir une deuxième boite NXT ou une Foxboard (nous ne savions pas encore comment guider le robot). La structure devait être solide puisqu'on devait encore ajouter la pince de levage sur le dessus. Voici quelques illustrations de la construction. |
− | [[Image:Basemoteur.jpg|thumb|alt=basemoteur|center|Base motrice à chenille, composée de deux | + | [[Image:Basemoteur.jpg|thumb|alt=basemoteur|center|Base motrice à chenille, composée de deux servomoteurs]] |
==La pince de levage== | ==La pince de levage== | ||
− | La pince de levage a été l'objet de toute la première séance | + | La pince de levage a été l'objet de toute la première séance; c'était l'élément le plus compliqué à assembler. Nous avons été confrontés à plusieurs contraintes : le poids des objets transportés, la résistance du système de levage et l'adaptation de la forme de la pince. |
+ | |||
+ | Nous avons d'abord créé une pince composée de deux servomoteurs : un pour le serrage et un autre pour le levage de la pince, mais ce système était trop lourd et peu pratique à solidariser avec le reste du robot. Nous avons donc évolué vers un système plus léger composé de seulement 2 servomoteurs. Dans ce nouveau système, un servomoteur était dédié à serrer la pince et l'autre à la soulever par un mouvement de rotation. Le problème est que la pince était encore lourde et compliquée à fixer, car tout était accroché à l'avant du véhicule; il y avait donc un problème de répartition du poids. Inutile de préciser qu'en ajoutant en plus un objet dans la pince, le robot se serait effondré. Nous avons alors pensé à mettre en place une poulie, ce qui a permis de surmonter ces obstacles. | ||
+ | [[Image:modelepince.jpg|thumb|alt=modelepince|left|Modèle de la pince, avec un bras mobile fixé sur le servomoteur et une barre fixe]] | ||
− | |||
− | |||
La pince est donc composée de deux parties : | La pince est donc composée de deux parties : | ||
− | *Un servomoteur fixé sur le dessus du robot, pour répartir le poids et assurer une fixation solide. Sur ce moteur, nous avons | + | *Un servomoteur fixé sur le dessus du robot, pour répartir le poids et assurer une fixation solide. Sur ce moteur, nous avons fixé de petits embouts, ainsi que l’extrémité d'un fil. De cette manière, quand le moteur tourne, le fil s'enroule autour de celui-ci. C'est donc la poulie. |
− | *Un servomoteur relié à l'avant du véhicule par une liaison pivot. Il peut donc se déplacer de haut en bas sans problème. Ce moteur permet de serrer la pince par | + | *Un servomoteur relié à l'avant du véhicule par une liaison pivot. Il peut donc se déplacer de haut en bas sans problème. Ce moteur permet de serrer la pince par la rotation d'une des deux branches qui la compose. Vous voyez, à gauche, que la pince est constituée d'une barre fixe sur laquelle s'appuie l'objet quand la pince est en position fermée, et d'une partie mobile liée au moteur (en arc de cercle pour favoriser la prise des objets à transporter) qui change de position pour ouvrir et fermer la pince. L'autre extrémité du fil, provenant de la poulie, est fixée sur la barre fixe. |
− | Nous avons donc une pince qui se ferme pour saisir un objet, puis qui se soulève et redescend grâce à une poulie, pour enfin se rouvrir et déposer l'objet. | + | Nous avons donc une pince qui se ferme pour saisir un objet, puis qui se soulève et qui redescend grâce à une poulie, pour enfin se rouvrir et déposer l'objet. |
− | |||
− | |||
==Les capteurs== | ==Les capteurs== | ||
− | Le robot est doté de deux | + | Le robot est doté de deux capteurs : un capteur de couleur pour suivre une ligne, et un capteur RFID qui lui sert à détecter les bases sur lesquelles il doit effectuer une action. |
− | Nous | + | Nous avons d'abord pensé à installer un capteur de pression sur la pince pour vérifier si l'objet était bien maintenu dans celle-ci. Mais le capteur s'est avéré inutile après programmation, car le programme permet de serrer l'objet autant que nécessaire pour que celui-ci soit correctement maintenu. La détection de pression n'était donc pas nécessaire. |
[[Image:capteur.jpg|thumb|upright=1.25|alt=capteur|right|Emplacement des capteurs sur le robot]] | [[Image:capteur.jpg|thumb|upright=1.25|alt=capteur|right|Emplacement des capteurs sur le robot]] | ||
− | En revanche,comme nous voulions faire un robot | + | En revanche, comme nous voulions faire un robot guidé par des bandes noires au sol, nous avions besoin d'un capteur de couleurs. La difficulté est que ce capteur n'a qu'une très courte portée. C'est pourquoi nous avons dû le placer dans un endroit ou il serait immobile, le plus proche du centre de l'avant du robot et le plus proche du sol possible. De cette façon, la détection est bonne et permet une bonne correction de la trajectoire. Cependant, le robot n'était pas conçu pour avoir un capteur à cet endroit, nous l'avons donc un peu décentré. Mais après quelques tests, la position que nous avons choisie nous a permis d'obtenir une trajectoire correcte. |
− | Le capteur RFID a été beaucoup plus simple à installer, car il a une plus grande portée (3cm). Nous l'avons donc placé juste à coté du capteur de | + | Le capteur RFID a été beaucoup plus simple à installer, car il a une plus grande portée (3cm). Nous l'avons donc placé juste à coté du capteur de couleurs. Cet emplacement permet une bonne détection des cartes RFID,et le robot distingue facilement la position des objets à transporter. |
− | |||
==Robot final== | ==Robot final== | ||
− | Voici l'allure de notre robot totalement assemblé | + | Voici l'allure de notre robot totalement assemblé; on peut voir les capteurs, la pince, mais surtout le fil qui relie la poulie et la pince. |
[[Image:final.jpg|thumb|upright=1.25|alt=final|center|Robot totalement assemblé]] | [[Image:final.jpg|thumb|upright=1.25|alt=final|center|Robot totalement assemblé]] | ||
Ligne 52 : | Ligne 55 : | ||
Nous avons choisi de programmer en langage NXC (Not eXactly C) que nous avons compilé avec l'IDE BricxCC (Bricx Command Center). | Nous avons choisi de programmer en langage NXC (Not eXactly C) que nous avons compilé avec l'IDE BricxCC (Bricx Command Center). | ||
− | Nous avons décidé de faire suivre au robot un ensemble d' | + | Nous avons décidé de faire suivre au robot un ensemble d'actions dans un ordre précis. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | La première partie consiste à initialiser le capteur de couleurs et le capteur RFID. | ||
+ | ==Les étapes du parcours== | ||
+ | Durant ces phases, le robot suit les lignes de couleur verte. | ||
+ | Dès qu'il détecte une ligne rouge, il tente de lire la carte RFID présente sur le sol pour savoir s'il faut déposer ou prendre un colis. | ||
+ | Le programme suit six étapes distinctes. Chaque étape contrôle entièrement les moteurs et les communications Bluetooth. Les deux seuls capteurs indépendants des étapes sont le capteur de couleur et le capteur RFID. On passe d'une étape à une autre dès que le capteur de couleurs détecte la couleur qu'il recherche. Il y a une petite exception : même si le capteur détecte la couleur qu'il souhaite, le programme vérifie que le robot ne va pas s'engager sur la ligne de dépôt alors qu'il n'a pas encore le colis, ou sur la ligne de retrait alors qu'il a déjà le colis. Cette vérification est effectuée par le capteur RFID et par une variable d’environnement. Voici donc un résumé des couleurs acceptées par le capteur en fonction des étapes. On rappelle que le circuit est composé de trois couleurs : vert pour la ligne principale, rouge pour le ligne de dépôt, et bleu pour le repérage, pour déposer et prendre le colis. | ||
+ | {| class="wikitable alternance centre" | ||
+ | |+ Tableau des couleurs acceptées par le capteur en fonction des étapes | ||
+ | |- | ||
+ | | | ||
+ | ! scope="col" | Couleur suivie par le robot | ||
+ | ! scope="col" | Couleur acceptée | ||
+ | ! scope="col" | Couleur refusée | ||
+ | ! scope="col" | Vérification RFID | ||
+ | |- | ||
+ | ! scope="row" | Recherche de base pour prendre un colis | ||
+ | | VERT | ||
+ | | ROUGE | ||
+ | | BLEU | ||
+ | | Oui | ||
+ | |- | ||
+ | ! scope="row" | Retrait du colis | ||
+ | | ROUGE | ||
+ | | BLEU | ||
+ | | VERT | ||
+ | | Non | ||
+ | |- | ||
+ | ! scope="row" | Sortie de la base | ||
+ | | ROUGE | ||
+ | | VERT | ||
+ | | BLEU | ||
+ | | Non | ||
+ | |- | ||
+ | ! scope="row" | Recherche de base pour déposer un colis | ||
+ | | VERT | ||
+ | | ROUGE | ||
+ | | BLEU | ||
+ | | Oui | ||
+ | |- | ||
+ | ! scope="row" | Déposer colis | ||
+ | | ROUGE | ||
+ | | BLEU | ||
+ | | VERT | ||
+ | | Non | ||
+ | |- | ||
+ | ! scope="row" | Sortie de la base | ||
+ | | ROUGE | ||
+ | | VERT | ||
+ | | BLEU | ||
+ | | Non | ||
+ | |- | ||
+ | |} | ||
==La recherche de ligne== | ==La recherche de ligne== | ||
− | Dans un premier temps, nous avons | + | Dans un premier temps, nous avons créé un programme permettant de retrouver une ligne de couleur suivant le raisonnement suivant : |
<pre> | <pre> | ||
Ligne 94 : | Ligne 140 : | ||
Cette problématique nous a amenés à écrire un deuxième algorithme permettant de retrouver une ligne plus rapidement, quelque soit le côté où elle se trouve par rapport au robot. | Cette problématique nous a amenés à écrire un deuxième algorithme permettant de retrouver une ligne plus rapidement, quelque soit le côté où elle se trouve par rapport au robot. | ||
+ | <pre> | ||
+ | INITIALISER timer A 0 ms | ||
+ | INITIALISER timer2 A 0 ms | ||
+ | INITIALISER multi A 100 | ||
+ | INITIALISER cpt A 0 | ||
+ | INTIALISERR rl A 1 // 1 pour la gauche et -1 pour la droite | ||
+ | INITIALISER ligne_trouvee A faux | ||
+ | TANT QUE ligne_trouvee DIFFERENT DE vrai ET QUE cpt <= 5 FAIRE | ||
+ | FAIRE ALLER LE ROBOT DANS LE SENS RL | ||
+ | SI detecteur_de_couleur = couleur_ligne | ||
+ | ligne_trouvee = vrai | ||
+ | FIN SI | ||
+ | SI timer < multi | ||
+ | rl = -1 | ||
+ | ET SI timer <= (multi * 2) | ||
+ | rl = 1 | ||
+ | SINON | ||
+ | multi = multi * 4 | ||
+ | cpt = cpt + 1 | ||
+ | FIN SI | ||
+ | FIN TANT QUE | ||
+ | </pre> | ||
− | Nous avons donc | + | Nous avons donc créé un algorithme dit d'exagération de recherche, c'est à dire qu'il cherche pendant un court laps de temps dans un sens, puis dans l'autre pendant une durée plus importante. Le robot répète ces deux opérations un certain nombre de fois, en augmentant à chaque fois un peu plus la durée de recherche. Si au bout d'un nombre d'itérations le robot ne trouve toujours pas la ligne, on lui ordonne de faire demi-tour. |
Après avoir effectué des tests comparatifs, nous sommes arrivés à la conclusion que le robot était, avec le deuxième programme, 50 à 60 % plus rapide. | Après avoir effectué des tests comparatifs, nous sommes arrivés à la conclusion que le robot était, avec le deuxième programme, 50 à 60 % plus rapide. | ||
Ligne 105 : | Ligne 173 : | ||
Cette librairie est disponible à [https://code.google.com/p/pobot-playground/source/browse/trunk/PobotKey/Projects/Lego+NXT/NXC/RFIDlib.nxc l'adresse suivante] | Cette librairie est disponible à [https://code.google.com/p/pobot-playground/source/browse/trunk/PobotKey/Projects/Lego+NXT/NXC/RFIDlib.nxc l'adresse suivante] | ||
− | + | Cette librairie nous permet de récupérer les 5 informations disponibles sur la carte. De façon à pouvoir les traiter nous avons décidé d'utiliser le secteur numéro quatre, et d'effectuer un modulo 3 sur la valeur. En fonction de la réponse, le robot est programmé pour effectuer des tâches particulières: | |
− | Cette librairie nous permet de récupérer les 5 informations disponibles sur la carte. De façon à pouvoir les traiter nous avons | ||
− | |||
* 0 : Ces cartes sont retirées car la réponse 0 est identique à la réponse du lecteur en cas d'erreur | * 0 : Ces cartes sont retirées car la réponse 0 est identique à la réponse du lecteur en cas d'erreur | ||
* 1 : La valeur 1 ordonne au robot de récupérer un objet s'il n'en a pas actuellement | * 1 : La valeur 1 ordonne au robot de récupérer un objet s'il n'en a pas actuellement | ||
− | * 2 : La valeur 1 ordonne au robot de déposer l'objet qu'il tient s'il en | + | * 2 : La valeur 1 ordonne au robot de déposer l'objet qu'il tient s'il en possède un actuellement |
==La communication entre les deux boîtiers NXT== | ==La communication entre les deux boîtiers NXT== | ||
− | + | Bien qu'au début nous avions commencé le projet dans l'optique d'utiliser un seul boîtier NXT, nous avons été contraints d'opter pour deux boîtiers car un seul ne peut commander que 3 servomoteurs, et il nous était nécessaire d'en utiliser quatre. Nous avons donc décidé d'utiliser ces deux boîtiers, et de les faire communiquer par la technologie Bluetooth. | |
+ | |||
+ | Cela nous a donc amené à utiliser une bibliothèque externe OpenSource, qui nous permet d'utiliser plus simplement la fonctionnalité Bluetooth. | ||
La page Web de cette librairie est la [http://robotics.benedettelli.com/BT_NXC.htm suivante]. | La page Web de cette librairie est la [http://robotics.benedettelli.com/BT_NXC.htm suivante]. | ||
− | Lorsque le robot se trouve sur une base, et qu'il doit récupérer un colis, le | + | Lorsque le robot se trouve sur une base, et qu'il doit récupérer un colis, le boîtier NXT maître (celui contrôlant les moteurs de déplacement) envoie au NXT esclave l'instruction "PRENDRE COLIS". |
L'instruction est envoyée en boucle tant que le NXT esclave ne lui renvoi pas l'instruction "COLIS EMBARQUÉ" | L'instruction est envoyée en boucle tant que le NXT esclave ne lui renvoi pas l'instruction "COLIS EMBARQUÉ" | ||
− | De façon analogue, lorsque le robot se trouve sur une base et qu'il doit déposer un colis, le | + | De façon analogue, lorsque le robot se trouve sur une base et qu'il doit déposer un colis, le boîtier NXT maître envoie au NXT esclave l'instruction "DEPOSER COLIS" tant que l'esclave ne lui renvoie pas l'instruction "COLIS DÉPOSÉ" |
Toutes les instructions sont envoyées à l'aide de la boîte 0. | Toutes les instructions sont envoyées à l'aide de la boîte 0. | ||
− | De plus, pour éviter que le robot | + | De plus, pour éviter que le robot démarre alors que la connexion Bluetooth n'est pas active, nous avons utilisé un programme qui nous permet de vérifier au démarrage que les deux boîtiers sont bien connectés. |
+ | |||
+ | Voici un schéma résumant les rôles de chacun des boîtiers : | ||
+ | |||
+ | |||
+ | [[Fichier:communication.jpg|center]] | ||
+ | |||
+ | ==Résumé de la première phase== | ||
+ | |||
+ | |||
+ | Nos objectifs ont été remplis : | ||
+ | * Le robot se déplace de façon autonome | ||
+ | * Le robot va chercher et dépose un colis sur des bases spécifiques | ||
+ | * Le robot lit les cartes RFID pour connaitre l'état des bases | ||
+ | |||
+ | [[code-source-robot-transporteur|Voici le code source au terme de cette étape]] | ||
=L'intégration des fonctionnalité= | =L'intégration des fonctionnalité= | ||
− | Nous avons commencé à intégrer les | + | Nous avons commencé à intégrer les fonctionnalités supplémentaires lors de la séance du 7/03. Le robot doit : |
*être contrôlable à distance avec une webcam par l’intermédiaire du site internet de la Foxboard | *être contrôlable à distance avec une webcam par l’intermédiaire du site internet de la Foxboard | ||
− | *pouvoir lire des RFID pour se | + | *pouvoir lire des RFID pour se localiser sur le circuit |
− | * | + | *suivre une ligne discontinue et emprunter des voies de garage |
+ | *pouvoir s’arrêter en cas d'obstacle sur le circuit | ||
+ | |||
+ | ==Ajouts des nouveaux éléments== | ||
+ | |||
+ | Nous avons équipé le robot d'une Foxboard que nous avons placée sur le dessus du robot avec la webcam pour répartir le poids. De plus nous avons ajouté un capteur boussole pour que le robot puisse suivre une ligne discontinue. Nous avons aussi ajouté un capteur d'ultrasons pour détecter les obstacles. L'architecture générale du robot n'a pas changée. Voici le nouveau schéma des capteurs et des servomoteurs : | ||
+ | |||
+ | [[Fichier:communication2.jpg|center]] | ||
==Contrôle à distance== | ==Contrôle à distance== | ||
+ | |||
+ | Pour le contrôle à distance nous avons dû intégrer la Foxboard sur notre robot. La Foxboard est équipée de plusieurs éléments : | ||
+ | *une carte Wifi pour la communication entre le site internet du robot et la Foxboard. | ||
+ | *une clé Bluetooth pour les échanges d'informations entre le boitier NXT maître et la Foxboard. | ||
+ | *une webcam pour visualiser en direct ce que voit le robot depuis le site internet. | ||
+ | |||
+ | Le contrôle a distance s'est effectué en deux temps : | ||
+ | *La programmation des actions en fonction du "bouton" sur lequel on clique. | ||
+ | *Une amélioration du site dédié au contrôle par Foxboard. | ||
+ | |||
+ | L'amélioration du site de la Foxboard s'est déroulé en plusieurs étapes: tout d'abord nous avons recréé une norme pour que le robot NXT et la Foxboard se comprennent (les faire dialoguer sur la même boite mail, et les faire dialoguer avec les mêmes déclarations). Par la suite nous avons recréé un tableau de bord accessible à n'importe quel utilisateur en utilisant des flèches de directions et un panneau Stop comme boutons de commandes. Nous avons ensuite intégré la caméra au site. Puis finalement, nous avons défini une norme de communication de telle façon à ce que le robot indique en temps réel sa position à la Foxboard. Le nouveau site indique lui la dernière position connue du robot. | ||
+ | |||
+ | ==Lecture des RFID== | ||
+ | |||
+ | Pendant l'intégration des fonctionnalités, nous avons utilisé les RFID de deux manières différentes. D'une part pour séquencer notre algorithme de suivi de ligne, et d'autre part pour se repérer en temps réel sur le circuit. La première chose indispensable était donc la création d'une base de données RFID. Pour cela nous avons scanné toutes les RFID pour choisir les informations les plus pertinentes à utiliser afin de les distinguer. Chaque carte a donc pu être reconnue comme unique par le robot. | ||
+ | |||
+ | Lors du suivi de la ligne les RFID indiquent au robot comment il doit se comporter. Il y a 7 étapes différentes : | ||
+ | *Aller chercher l'objet | ||
+ | *Entrer dans la base de récupération de l'objet | ||
+ | *Sortir de cette base | ||
+ | *Aller déposer l'objet | ||
+ | *Passer en mode ligne discontinue | ||
+ | *Entrer dans la base de dépôt de l'objet | ||
+ | *Sortir de cette base | ||
+ | |||
+ | Le suivi du robot en temps réel s'effectue par transmission de la dernière carte RFID scannée. Le NXT envoi l'information à la Foxboard qui l'envoi au site internet, on voit alors la dernière base où s'est trouvé le robot sur le site internet. | ||
+ | |||
+ | ==Les lignes discontinues== | ||
+ | |||
+ | Pour intégrer cette fonction nous nous sommes initialement fortement inspirés du code réalisé par Alexandre Jouy et Kévin De Arriba. En effet, leur code permettait de suivre une direction donnée à partir de la boussole. Nous avons par la suite recréé notre propre programme de telle façon à éviter la surcharge du capteur RFID. | ||
+ | |||
+ | En effet dans la partie précédente, le robot fonctionnait en fonction des couleurs qu'il détectait. Tandis que dans cette partie, le robot fonctionne majoritairement en fonction des cartes RFID qu'il détecte, et aussi faiblement en fonction des couleurs qu'il lit. Ainsi, le réel défi de la partie intégration était de maintenir un temps de rafraîchissement correct sur le lecteur RFID, tout en évitant de faire rebooter le boitier NXT. En effet, la surcharge du capteur RFID avait pour effet de faire redémarrer le robot. Nous nous sommes donc orientés sur l'utilisation des "task" du robot. Ceci nous a permis de mettre en marche plusieurs processus du programme sans surcharger le capteur RFID. C'est ainsi que l'étape des lignes discontinues est devenu une simple "task". | ||
+ | |||
+ | En résumé, dès que le capteur RFID détecte une carte associée aux lignes discontinues, il stoppe les tâches en cours et lance la tâche "ligne_discontinue" qui fait suivre au robot un cap indiqué par un tableau liant la carte RFID à ce cap. | ||
+ | |||
+ | ==Arret d'urgence== | ||
+ | |||
+ | A ce stade de l'intégration des fonctionnalités, notre robot fait tourner simultanément plusieurs tâches, dont la tâche "rouler". Nous avons donc juste rajouter à cette tâche une condition qui vérifie qu'il n'y a pas d'obstacles devant le robot, et qui dans le cas contraire, arrête les moteurs. Nous avons aussi rajouté l'initialisation de ce capteur dans la procédure d'initialisation. | ||
+ | |||
+ | =Conclusion= | ||
+ | |||
+ | Pour conclure, nous pouvons avancer que nous avons réussi, non sans difficultés, à intégrer l'intégralité des fonctionnalités proposés: | ||
+ | *Le robot se déplace de façon autonome | ||
+ | *Le robot va chercher et dépose un colis sur des bases spécifiques | ||
+ | *Le robot lit les cartes RFID pour se repérer en temps réel sur le circuit | ||
+ | *Le robot est contrôlable à distance par l’intermédiaire du site internet de la Foxboard et peut être suivi à l'aide de la Webcam | ||
+ | *Le robot est capable de suivre des lignes discontinues | ||
+ | *Le robot peut s’arrêter en cas d'obstacle sur le circuit | ||
+ | |||
+ | [[code-source-robot-transporteur-integrations|Voici le code source après l'intégration de toutes les fonctionnalités]] |
Version actuelle datée du 27 mai 2013 à 11:09
Sommaire
Introduction
Nous allons vous présenter notre projet pour le bureau d'étude IMA 2012/2013. Nous sommes tous les deux très intéressés par ce département, et ce petit robot nous a passionné dans sa conception et dans sa programmation. Nous avons choisi de mélanger les différents styles de robots à concevoir, pour proposer une idée personnelle de projet. Notre objectif est de créer un robot autonome qui transporte des objets. Cela passe par deux grandes étapes : la conception d'un système à 4 servomoteurs et la programmation des tâches réalisées en autonomie. Voici une vidéo de présentation résumant les fonctionnalités du robot :
La Conception
Le robot est composé de deux éléments essentiels : une base motrice et une pince de levage. Il comporte également deux capteurs afin de le rendre autonome.
La base motrice
La base est composée de deux servomoteurs qui sont reliés entre eux pour former un socle solide. En effet, ce socle doit être capable de supporter le poids de deux boites NXT, ainsi que celui de la pince et de l'objet transporté. Les servomoteurs entraînent la rotation de 4 roues sur lesquelles sont fixées des chenilles pour permettre au robot d'avancer. La première boite NXT est directement fixée sur les servomoteurs, puis derrière, nous avons mis en place un réceptacle capable de contenir une deuxième boite NXT ou une Foxboard (nous ne savions pas encore comment guider le robot). La structure devait être solide puisqu'on devait encore ajouter la pince de levage sur le dessus. Voici quelques illustrations de la construction.
La pince de levage
La pince de levage a été l'objet de toute la première séance; c'était l'élément le plus compliqué à assembler. Nous avons été confrontés à plusieurs contraintes : le poids des objets transportés, la résistance du système de levage et l'adaptation de la forme de la pince.
Nous avons d'abord créé une pince composée de deux servomoteurs : un pour le serrage et un autre pour le levage de la pince, mais ce système était trop lourd et peu pratique à solidariser avec le reste du robot. Nous avons donc évolué vers un système plus léger composé de seulement 2 servomoteurs. Dans ce nouveau système, un servomoteur était dédié à serrer la pince et l'autre à la soulever par un mouvement de rotation. Le problème est que la pince était encore lourde et compliquée à fixer, car tout était accroché à l'avant du véhicule; il y avait donc un problème de répartition du poids. Inutile de préciser qu'en ajoutant en plus un objet dans la pince, le robot se serait effondré. Nous avons alors pensé à mettre en place une poulie, ce qui a permis de surmonter ces obstacles.
La pince est donc composée de deux parties :
- Un servomoteur fixé sur le dessus du robot, pour répartir le poids et assurer une fixation solide. Sur ce moteur, nous avons fixé de petits embouts, ainsi que l’extrémité d'un fil. De cette manière, quand le moteur tourne, le fil s'enroule autour de celui-ci. C'est donc la poulie.
- Un servomoteur relié à l'avant du véhicule par une liaison pivot. Il peut donc se déplacer de haut en bas sans problème. Ce moteur permet de serrer la pince par la rotation d'une des deux branches qui la compose. Vous voyez, à gauche, que la pince est constituée d'une barre fixe sur laquelle s'appuie l'objet quand la pince est en position fermée, et d'une partie mobile liée au moteur (en arc de cercle pour favoriser la prise des objets à transporter) qui change de position pour ouvrir et fermer la pince. L'autre extrémité du fil, provenant de la poulie, est fixée sur la barre fixe.
Nous avons donc une pince qui se ferme pour saisir un objet, puis qui se soulève et qui redescend grâce à une poulie, pour enfin se rouvrir et déposer l'objet.
Les capteurs
Le robot est doté de deux capteurs : un capteur de couleur pour suivre une ligne, et un capteur RFID qui lui sert à détecter les bases sur lesquelles il doit effectuer une action.
Nous avons d'abord pensé à installer un capteur de pression sur la pince pour vérifier si l'objet était bien maintenu dans celle-ci. Mais le capteur s'est avéré inutile après programmation, car le programme permet de serrer l'objet autant que nécessaire pour que celui-ci soit correctement maintenu. La détection de pression n'était donc pas nécessaire.
En revanche, comme nous voulions faire un robot guidé par des bandes noires au sol, nous avions besoin d'un capteur de couleurs. La difficulté est que ce capteur n'a qu'une très courte portée. C'est pourquoi nous avons dû le placer dans un endroit ou il serait immobile, le plus proche du centre de l'avant du robot et le plus proche du sol possible. De cette façon, la détection est bonne et permet une bonne correction de la trajectoire. Cependant, le robot n'était pas conçu pour avoir un capteur à cet endroit, nous l'avons donc un peu décentré. Mais après quelques tests, la position que nous avons choisie nous a permis d'obtenir une trajectoire correcte.
Le capteur RFID a été beaucoup plus simple à installer, car il a une plus grande portée (3cm). Nous l'avons donc placé juste à coté du capteur de couleurs. Cet emplacement permet une bonne détection des cartes RFID,et le robot distingue facilement la position des objets à transporter.
Robot final
Voici l'allure de notre robot totalement assemblé; on peut voir les capteurs, la pince, mais surtout le fil qui relie la poulie et la pince.
La programmation
Nous avons choisi de programmer en langage NXC (Not eXactly C) que nous avons compilé avec l'IDE BricxCC (Bricx Command Center).
Nous avons décidé de faire suivre au robot un ensemble d'actions dans un ordre précis.
La première partie consiste à initialiser le capteur de couleurs et le capteur RFID.
Les étapes du parcours
Durant ces phases, le robot suit les lignes de couleur verte. Dès qu'il détecte une ligne rouge, il tente de lire la carte RFID présente sur le sol pour savoir s'il faut déposer ou prendre un colis.
Le programme suit six étapes distinctes. Chaque étape contrôle entièrement les moteurs et les communications Bluetooth. Les deux seuls capteurs indépendants des étapes sont le capteur de couleur et le capteur RFID. On passe d'une étape à une autre dès que le capteur de couleurs détecte la couleur qu'il recherche. Il y a une petite exception : même si le capteur détecte la couleur qu'il souhaite, le programme vérifie que le robot ne va pas s'engager sur la ligne de dépôt alors qu'il n'a pas encore le colis, ou sur la ligne de retrait alors qu'il a déjà le colis. Cette vérification est effectuée par le capteur RFID et par une variable d’environnement. Voici donc un résumé des couleurs acceptées par le capteur en fonction des étapes. On rappelle que le circuit est composé de trois couleurs : vert pour la ligne principale, rouge pour le ligne de dépôt, et bleu pour le repérage, pour déposer et prendre le colis.
Couleur suivie par le robot | Couleur acceptée | Couleur refusée | Vérification RFID | |
---|---|---|---|---|
Recherche de base pour prendre un colis | VERT | ROUGE | BLEU | Oui |
Retrait du colis | ROUGE | BLEU | VERT | Non |
Sortie de la base | ROUGE | VERT | BLEU | Non |
Recherche de base pour déposer un colis | VERT | ROUGE | BLEU | Oui |
Déposer colis | ROUGE | BLEU | VERT | Non |
Sortie de la base | ROUGE | VERT | BLEU | Non |
La recherche de ligne
Dans un premier temps, nous avons créé un programme permettant de retrouver une ligne de couleur suivant le raisonnement suivant :
INITIALISER timer A 0 ms INITIALISER ligne_trouvee A faux TANT QUE ligne_trouvee DIFFERENT DE vrai FAIRE SI detecteur_de_couleur = couleur_ligne ligne_trouvee = vrai FIN SI SI timer < 2500 ms ROBOT tourne a GAUCHE ET SI timer < 6000 ms ROBOT tourne a DROITE SINON timer = 0 ms FIN SI INCREMENTER timer DE 1 ms FIN TANT QUE
Cette solution nous a permis de faire fonctionner le robot avec toutes les autres parties du programme. Cependant, il était plutôt long pour trouver les lignes de couleurs sur sa droite.
Cette problématique nous a amenés à écrire un deuxième algorithme permettant de retrouver une ligne plus rapidement, quelque soit le côté où elle se trouve par rapport au robot.
INITIALISER timer A 0 ms INITIALISER timer2 A 0 ms INITIALISER multi A 100 INITIALISER cpt A 0 INTIALISERR rl A 1 // 1 pour la gauche et -1 pour la droite INITIALISER ligne_trouvee A faux TANT QUE ligne_trouvee DIFFERENT DE vrai ET QUE cpt <= 5 FAIRE FAIRE ALLER LE ROBOT DANS LE SENS RL SI detecteur_de_couleur = couleur_ligne ligne_trouvee = vrai FIN SI SI timer < multi rl = -1 ET SI timer <= (multi * 2) rl = 1 SINON multi = multi * 4 cpt = cpt + 1 FIN SI FIN TANT QUE
Nous avons donc créé un algorithme dit d'exagération de recherche, c'est à dire qu'il cherche pendant un court laps de temps dans un sens, puis dans l'autre pendant une durée plus importante. Le robot répète ces deux opérations un certain nombre de fois, en augmentant à chaque fois un peu plus la durée de recherche. Si au bout d'un nombre d'itérations le robot ne trouve toujours pas la ligne, on lui ordonne de faire demi-tour.
Après avoir effectué des tests comparatifs, nous sommes arrivés à la conclusion que le robot était, avec le deuxième programme, 50 à 60 % plus rapide.
La reconnaissance RFID
De façon à pouvoir lire les cartes RFID avec le capteur RFID, nous avons choisi d'utiliser une librairie externe OpenSource.
Cette librairie est disponible à l'adresse suivante
Cette librairie nous permet de récupérer les 5 informations disponibles sur la carte. De façon à pouvoir les traiter nous avons décidé d'utiliser le secteur numéro quatre, et d'effectuer un modulo 3 sur la valeur. En fonction de la réponse, le robot est programmé pour effectuer des tâches particulières:
- 0 : Ces cartes sont retirées car la réponse 0 est identique à la réponse du lecteur en cas d'erreur
- 1 : La valeur 1 ordonne au robot de récupérer un objet s'il n'en a pas actuellement
- 2 : La valeur 1 ordonne au robot de déposer l'objet qu'il tient s'il en possède un actuellement
La communication entre les deux boîtiers NXT
Bien qu'au début nous avions commencé le projet dans l'optique d'utiliser un seul boîtier NXT, nous avons été contraints d'opter pour deux boîtiers car un seul ne peut commander que 3 servomoteurs, et il nous était nécessaire d'en utiliser quatre. Nous avons donc décidé d'utiliser ces deux boîtiers, et de les faire communiquer par la technologie Bluetooth.
Cela nous a donc amené à utiliser une bibliothèque externe OpenSource, qui nous permet d'utiliser plus simplement la fonctionnalité Bluetooth.
La page Web de cette librairie est la suivante.
Lorsque le robot se trouve sur une base, et qu'il doit récupérer un colis, le boîtier NXT maître (celui contrôlant les moteurs de déplacement) envoie au NXT esclave l'instruction "PRENDRE COLIS".
L'instruction est envoyée en boucle tant que le NXT esclave ne lui renvoi pas l'instruction "COLIS EMBARQUÉ"
De façon analogue, lorsque le robot se trouve sur une base et qu'il doit déposer un colis, le boîtier NXT maître envoie au NXT esclave l'instruction "DEPOSER COLIS" tant que l'esclave ne lui renvoie pas l'instruction "COLIS DÉPOSÉ"
Toutes les instructions sont envoyées à l'aide de la boîte 0.
De plus, pour éviter que le robot démarre alors que la connexion Bluetooth n'est pas active, nous avons utilisé un programme qui nous permet de vérifier au démarrage que les deux boîtiers sont bien connectés.
Voici un schéma résumant les rôles de chacun des boîtiers :
Résumé de la première phase
Nos objectifs ont été remplis :
- Le robot se déplace de façon autonome
- Le robot va chercher et dépose un colis sur des bases spécifiques
- Le robot lit les cartes RFID pour connaitre l'état des bases
Voici le code source au terme de cette étape
L'intégration des fonctionnalité
Nous avons commencé à intégrer les fonctionnalités supplémentaires lors de la séance du 7/03. Le robot doit :
- être contrôlable à distance avec une webcam par l’intermédiaire du site internet de la Foxboard
- pouvoir lire des RFID pour se localiser sur le circuit
- suivre une ligne discontinue et emprunter des voies de garage
- pouvoir s’arrêter en cas d'obstacle sur le circuit
Ajouts des nouveaux éléments
Nous avons équipé le robot d'une Foxboard que nous avons placée sur le dessus du robot avec la webcam pour répartir le poids. De plus nous avons ajouté un capteur boussole pour que le robot puisse suivre une ligne discontinue. Nous avons aussi ajouté un capteur d'ultrasons pour détecter les obstacles. L'architecture générale du robot n'a pas changée. Voici le nouveau schéma des capteurs et des servomoteurs :
Contrôle à distance
Pour le contrôle à distance nous avons dû intégrer la Foxboard sur notre robot. La Foxboard est équipée de plusieurs éléments :
- une carte Wifi pour la communication entre le site internet du robot et la Foxboard.
- une clé Bluetooth pour les échanges d'informations entre le boitier NXT maître et la Foxboard.
- une webcam pour visualiser en direct ce que voit le robot depuis le site internet.
Le contrôle a distance s'est effectué en deux temps :
- La programmation des actions en fonction du "bouton" sur lequel on clique.
- Une amélioration du site dédié au contrôle par Foxboard.
L'amélioration du site de la Foxboard s'est déroulé en plusieurs étapes: tout d'abord nous avons recréé une norme pour que le robot NXT et la Foxboard se comprennent (les faire dialoguer sur la même boite mail, et les faire dialoguer avec les mêmes déclarations). Par la suite nous avons recréé un tableau de bord accessible à n'importe quel utilisateur en utilisant des flèches de directions et un panneau Stop comme boutons de commandes. Nous avons ensuite intégré la caméra au site. Puis finalement, nous avons défini une norme de communication de telle façon à ce que le robot indique en temps réel sa position à la Foxboard. Le nouveau site indique lui la dernière position connue du robot.
Lecture des RFID
Pendant l'intégration des fonctionnalités, nous avons utilisé les RFID de deux manières différentes. D'une part pour séquencer notre algorithme de suivi de ligne, et d'autre part pour se repérer en temps réel sur le circuit. La première chose indispensable était donc la création d'une base de données RFID. Pour cela nous avons scanné toutes les RFID pour choisir les informations les plus pertinentes à utiliser afin de les distinguer. Chaque carte a donc pu être reconnue comme unique par le robot.
Lors du suivi de la ligne les RFID indiquent au robot comment il doit se comporter. Il y a 7 étapes différentes :
- Aller chercher l'objet
- Entrer dans la base de récupération de l'objet
- Sortir de cette base
- Aller déposer l'objet
- Passer en mode ligne discontinue
- Entrer dans la base de dépôt de l'objet
- Sortir de cette base
Le suivi du robot en temps réel s'effectue par transmission de la dernière carte RFID scannée. Le NXT envoi l'information à la Foxboard qui l'envoi au site internet, on voit alors la dernière base où s'est trouvé le robot sur le site internet.
Les lignes discontinues
Pour intégrer cette fonction nous nous sommes initialement fortement inspirés du code réalisé par Alexandre Jouy et Kévin De Arriba. En effet, leur code permettait de suivre une direction donnée à partir de la boussole. Nous avons par la suite recréé notre propre programme de telle façon à éviter la surcharge du capteur RFID.
En effet dans la partie précédente, le robot fonctionnait en fonction des couleurs qu'il détectait. Tandis que dans cette partie, le robot fonctionne majoritairement en fonction des cartes RFID qu'il détecte, et aussi faiblement en fonction des couleurs qu'il lit. Ainsi, le réel défi de la partie intégration était de maintenir un temps de rafraîchissement correct sur le lecteur RFID, tout en évitant de faire rebooter le boitier NXT. En effet, la surcharge du capteur RFID avait pour effet de faire redémarrer le robot. Nous nous sommes donc orientés sur l'utilisation des "task" du robot. Ceci nous a permis de mettre en marche plusieurs processus du programme sans surcharger le capteur RFID. C'est ainsi que l'étape des lignes discontinues est devenu une simple "task".
En résumé, dès que le capteur RFID détecte une carte associée aux lignes discontinues, il stoppe les tâches en cours et lance la tâche "ligne_discontinue" qui fait suivre au robot un cap indiqué par un tableau liant la carte RFID à ce cap.
Arret d'urgence
A ce stade de l'intégration des fonctionnalités, notre robot fait tourner simultanément plusieurs tâches, dont la tâche "rouler". Nous avons donc juste rajouter à cette tâche une condition qui vérifie qu'il n'y a pas d'obstacles devant le robot, et qui dans le cas contraire, arrête les moteurs. Nous avons aussi rajouté l'initialisation de ce capteur dans la procédure d'initialisation.
Conclusion
Pour conclure, nous pouvons avancer que nous avons réussi, non sans difficultés, à intégrer l'intégralité des fonctionnalités proposés:
- Le robot se déplace de façon autonome
- Le robot va chercher et dépose un colis sur des bases spécifiques
- Le robot lit les cartes RFID pour se repérer en temps réel sur le circuit
- Le robot est contrôlable à distance par l’intermédiaire du site internet de la Foxboard et peut être suivi à l'aide de la Webcam
- Le robot est capable de suivre des lignes discontinues
- Le robot peut s’arrêter en cas d'obstacle sur le circuit
Voici le code source après l'intégration de toutes les fonctionnalités