DÉPARTEMENT DE GÉNIE ÉLECTRIQUE ET DE GÉNIE INFORMATIQUE
Design III
GEL - 21405

Rapport Final
 
Présenté à :
M. Denis Poussart
 
Par :
periback.gif (7425 bytes)

Mardi 14 décembre 1999
Table des matières
 
1. Module Interface Usager 1.1 Introduction
1.2 Interaction avec les autres sous-modules
1.3 Caractéristiques techniques 1.3.1 Diagramme de classes 1.4 Sections de l’interface 1.4.1 Fenêtre principale
1.4.2 Barre de menu
1.4.3 Barre d’outils
1.4.4 Fenêtre de la calibration du robot
1.4.5 Fenêtre de la mise à jour du robot
1.4.6 Fenêtre de la configuration du port série
1.4.7 Fenêtre de l’état des piles du port série
1.4.8 Fenêtre des commandes manuelles
1.4.9 Fenêtre de l’image de la caméra
1.4.10 Fenêtre de l’image de la matrice indiquant le chemin du robot
1.5 Améliorations futures
2. Vision et caractéristique spécifique 2.1 Introduction
2.2 Idées de base 2.2.1 Trouver la position du robot
2.2.2 Trouver la position des obstacles
2.2.3 Trouver la position des petits cercles à ramasser
2.2.4 Créer et trouver un modèle quelconque
2.3 Contraintes
2.4 Manipulations de base avec schémas et photos 2.4.1 Correction de perspective
2.4.2 Coupure de l'image
2.4.3 Filtrage
2.4.4 Séparation binaire des tons de gris
2.5 Description de chaque fonction 2.5.1 Allocation()
2.5.2 Desallocation()
2.5.3 Trouve_Robot()
2.5.4 Creer_Modele()
2.5.5 Chercher_Modele()
2.5.6 Creer_Modele_Cercles()
2.5.7 Chercher_Modele_Cercle()
2.5.8 Trouve_Obstacles()
2.6 Conclusion
3. Logiciel de contrôle du robot 3.1 Introduction
3.2 Description 3.2.1 Protocole de communication
3.2.2 Identification des commandes
3.3 Programme de contrôle du robot
4. Communication sans fil 4.1 Objectif
4.2 Choix des composante 4.2.1 Modules de transmission et de réception
4.2.2 Choix de l’antenne
4.3 Conception des blocs (transmission/réception) pour le robot et l’ordinateur
5. Électrotechnologie  5.1 La réalisation et l’alimentation de l’électro-aimant
5.2 La conception du module de surveillance des piles
6. Détermination du chemin 6.1 Création de la matrice
6.2 Déduction du chemin optimum
7. Section Intelligence 7.1 Introduction – une orientation dynamique.
7.2 Les deux algorithmes de base – décision et action
7.3 Diagramme de flux de données – une vue directe des interfaces
7.4 Détails des unités de traitement
8. Conclusion
 
 
Retour au menu
Peripleko Technologies Inc.
1. Module Interface Usager

 
1.1 Introduction

        Un point important à ne pas négliger lors de la réalisation d’un projet d’envergure est la réalisation d’une interface usager conviviale, claire et facile d'utilisation. Le module interface usager réalisé permet une interaction de l’usager avec le robot (son contrôle en temps réel) ainsi qu’une visualisation de l’environnement dans lequel le robot se trouve.

        Pour réaliser cette interface, nous avons utilisé l'environnement de développement Microsoft Visual Studio 5. L’application fut codée en C++ à l’aide des Microsoft Fondations Class. L’application fonctionne sous les systèmes d’exploitation Windows 95-98 et Windows NT.

1.2 Interaction avec les autres sous-modules

        Avant d’examiner en détails les caractéristiques de l'interface usager, il est important de bien comprendre les liens de l’interface avec les autres sous-modules du projet. La figure 1. présente les interactions des autres sous-modules.

 
Figure 1.1 Diagramme d’interactions des sous-modules
 

1.3 Caractéristiques techniques

        Cette section contient les informations techniques concernant les diverses parties de l'interface usager.

 

1.3.1 Diagramme de classes

        Lors du développement d’un logiciel, il est important d’avoir une approche structurée du problème. L’analyse détaillée des spécifications demandées permet une programmation efficace. Voici donc le diagramme de classes utilisé lors du codage de l’interface usager :

Figure 1.2 Diagramme de classes du module interface usager

 

 

1.4 Sections de l’interface

        L'interface est divisée en 4 parties principales : la fenêtre principale du logiciel, la fenêtre qui permet d’entrer des commandes manuelles au robot, les fenêtres d’options ainsi que les fenêtres affichant les images de l’aire de travail.
 

1.4.1 Fenêtre principale
 

Figure 1.3 Fenêtre principale de l’interface

 

1.4.1.1 Bloc des commandes

        Le bloc de commandes permet de passer des commandes au robot. Le bouton Commandes Manuelles permet d’ouvrir la fenêtre des commandes manuelles. Des zones de texte Destination X et Destination Y permettent d’entrer une destination relative en X et en Y pour le robot. Cette destination est relative à nos axes de coordonnées provenant de l’acquisition de l’image de la caméra : coordonnée en X maximale : 170 et coordonnée en Y maximale : 140. En appuyant sur le bouton Go !, le robot se rend à la destination choisie. Le bouton Arrêt permet d’arrêter le robot dans son déplacement vers la destination choisie. Le bouton Maison fait retourner le robot à son point de départ qui est la position (0,0) tandis que le bouton Reset permet, quant à lui, de remettre à jour les variables du robot.

        En cours de déplacement, si le robot est arrêté par un obstacle, celui-ci renvoi un code de déplacement arrêté à cause d’un obstacle. Une fois rendu à destination, le robot envoie un code de position atteinte. Ces résultats du déplacement sont affichés dans le bloc de l’état du robot dans la zone de texte État.

Figure 1.4 Bloc des commandes

1.4.1.2 Bloc du modèle
        Le bloc de modèle est la partie importante de notre caractéristique. Le bouton Créer modèle permet de créer un modèle à partir d’un objet placé dans l’aire de travail et analysé par la caméra. L’information sur ce modèle sera stockée dans le fichier nommé dans la zone de texte à côté du bouton. Le bouton Trouver modèle permet au robot de retrouver un objet semblable à un modèle qui a déjà été créé et qu’il a en mémoire. Nous nommerons le modèle que nous voulons que le robot aille chercher dans la zone de texte à côté de ce bouton.

Figure 1.5 Bloc du modèle

 
1.4.1.3 Bloc de la position du modèle

 
        Le bloc de la position du modèle comprend les zones de textes Position X et Position Y. Celles-ci indiquent la position ou le modèle se trouve dans l’aire de travail. Cette position est relative à nos axes de coordonnées provenant de l’acquisition de l’image de la caméra : coordonnée en X maximale : 170 et coordonnée en Y maximale : 140.
Figure 1.6 Bloc de la position du modèle

1.4.1.4 Bloc de l’énergie

        Le bloc de l’énergie contient deux barres de défilement montrant le pourcentage de l’énergie restante des moteurs et l’énergie restante de l’électronique. Lorsqu’il reste 10 % de l’énergie des moteurs, une petite fenêtre apparaît à l’écran pour nous avertir de cet état. Dans le cas de l’électronique, le seuil a été fixé à 5 %.

Figure 1.7 Bloc de l’énergie

1.4.1.5 Bloc de l’état du robot

        Le bloc de l'état du robot est très utile. Il comprend les zones de textes État, Position X, Position Y et Angle. État indique l’état du robot (en attente, en déplacement, position atteinte, obstacle rencontré). Par exemple, si le robot est en train d’avancer, le message en déplacement apparaît. Position X et Position Y indiquent la position ou le robot se trouve présentement sur le terrain. Cette position est relative à nos axes de coordonnées provenant de l’acquisition de l’image de la caméra : coordonnée en X maximale : 170 et coordonnée en Y maximale : 140. Finalement, Angle indique l’angle en degrés que fait le robot par rapport à l’axe des X de notre système de coordonnées.

Figure 1.8 Bloc de l’état du robot

1.4.1.6 Bloc de la vitesse

        Le bloc de la vitesse comprend les zones de textes Vitesse totale, Vitesse roue gauche et Vitesse roue droite. Vitesse totale permet de voir la vitesse globale du robot en cm/s tandis que Vitesse roue gauche et Vitesse roue droite permettent de voir la vitesse la roue gauche et de la roue droite respectivement.

Figure 1.9 Bloc de la vitesse

1.4.1.7 Bloc de la cible

        Le bloc cible comprend les zones de textes Position X et Position Y. Celles-ci indiquent la position de la cible que le robot doit atteindre sur le terrain. Cette position est relative à nos axes de coordonnées provenant de l’acquisition de l’image de la caméra : coordonnée en X maximale : 170 et coordonnée en Y maximale : 140.

Figure 1.10 Bloc de la cible

1.4.1.8 Bloc de la puissance des moteurs

        Le bloc puissance des moteurs comprend les zones de textes Moteur1 et Moteur2. Celles-ci indiquent la puissance en Watts de chaque moteur du robot.

Figure 1.11 Bloc de la puissance des moteurs

 

1.4.1.9 Bloc automatique/manuel

        Le bloc automatique/manuel comprend deux boutons (Automatique et Manuel) permettant de changer le mode d’opération du robot. En mode Manuel, l’usager peut entièrement contrôler le robot. En mode Automatique, c’est l’Intelligence Artificielle du robot qui contrôle celui-ci. Les boutons du bloc des commandes sont alors désactivés. Par défaut, le mode est manuel.

Figure 1.12 Bloc automatique/manuel

1.4.1.10 Bloc des coordonnées des objets

        Le bloc des coordonnées des objets contient un bouton Coordonnées qui permet d’afficher dans la zone de texte la liste des coordonnées des objets, sous la forme X, Y, que le robot a à ramasser. Ces coordonnées sont relatives à nos axes de coordonnées provenant de l’acquisition de l’image de la caméra : coordonnée en X maximale : 170 et coordonnée en Y maximale : 140.

Figure 1.13 Bloc des coordonnées des objets

1.4.1.11 Bloc des pièces ramassées

        Le bloc de pièces ramassées contient un bouton Pièces qui permet d’afficher dans la zone de texte le nombre de pièces ramassées par le robot.

Figure 1.14 Bloc des pièces ramassées
 

1.4.1.12 Bloc des messages du robot

        Le bloc des messages du robot contient une zone de texte affichant les messages provenant du robot. Un exemple de message serait que le robot averti l’usager qu’il ne reçoit pas bien les données via la communication RF.

Figure 1.15 Bloc des messages du robot

1.4.2 Barre de menu

1.4.2.1 Menu Fichier

        Le menu Fichier contient entre autres les commandes Ouvrir, Enregistrer et Imprimer. Ces commandes ne sont pas encore complètement fonctionnelles, mais elles pourraient éventuellement permettre l'exécution de commandes à l'aide d'un fichier " script ", ce qui ouvrirait plusieurs possibilités intéressantes.

1.4.2.2 Menu Édition

        Le menu Édition permet quelques fonctions habituelles de Windows à savoir annuler, couper, copier et coller. Ces commandes ne sont pas encore complètement fonctionnelles.

1.4.2.3 Menu Options

        Le menu Option permet d’ouvrir les fenêtres de configuration du robot. Ce sont les fenêtres de la calibration du robot, de la mise à jour du robot ainsi que de la configuration du port série.

1.4.2.4 Menu Affichage

        Le menu Affichage permet d’ouvrir les fenêtres de commandes et de visualisation du robot. Ce sont les fenêtres de l’état des piles du port série, des commandes manuelles, de l’image de la caméra ainsi que de l’image de la matrice indiquant le chemin du robot.

1.4.2.5 Menu Aide

        Le menu Aide permet d’obtenir de l’aide sur le fonctionnement de l’interface usager ainsi que sur la compagnie Peripleko Technologies.

 
1.4.3 Barre d’outils

        Dans la barre d’outils, des raccourcis ont été ajoutés pour l’affichage des fenêtres qui sont fréquemment utilisées. Il y a un raccourci pour l’affichage de la fenêtre des commandes manuelles, de la fenêtre de l’image de la caméra ainsi que de la fenêtre de l’image de la matrice indiquant le chemin du robot.

 
1.4.4 Fenêtre de la calibration du robot

        Cette fenêtre permet la configuration de la calibration du robot. Cette fonction n’est pas encore complètement fonctionnelle.

        Un bouton Appliquer permet d’appliquer ces paramètres de calibration du robot et un bouton Annuler permet de fermer la fenêtre sans changer les paramètres de calibration du robot.
 

1.4.5 Fenêtre de la mise à jour du robot

        Cette fenêtre permet la configuration de la mise à jour du robot. Cela permet la mise à jour de la position, de l’état des pare-chocs ainsi que de l’état de l’énergie des piles. Par exemple, pour vérifier l’état des piles du robot, nous devons connaître le courant consommé par l'électro-aimant et en mesurant la tension aux bornes des piles, il est possible de déterminer l'état des piles. Cette façon de faire nécessite l'arrêt du robot à intervalles réguliers. Il faut toutefois que cette lecture soit faite assez souvent pour éviter que les piles ne se déchargent trop entre chaque mesure.

        À l’aide de boutons radio, il est possible de déterminer cette mise à jour pour qu’elle soit effectuée à intervalles réguliers ou à l’arrêt du robot. Des boîtes à cocher permettent de choisir si nous voulons une mise à jour de la position, de l’état des pare-chocs ou de l’état de l’énergie des piles. Des zones de texte permettent d’entrer le temps entre chaque mise à jour si l’option de la mise à jour à intervalles réguliers à été choisie.

        Un bouton Appliquer permet d’appliquer ces paramètres au logiciel et un bouton Annuler permet de fermer la fenêtre sans changer les paramètres de mise à jour.

Figure 1.16 Fenêtre de la mise à jour du robot
 

1.4.6 Fenêtre de la configuration du port série

        Cette fenêtre permet la configuration des paramètres du port série à savoir le taux de transfert (300, 600, 1200, 2400, 4800 ou 9600 bauds), le nombre de bits de données (7 ou 8), le nombre de bits d’arrêt (1 ou 2), la parité (aucune, paire ou impaire) ainsi que le port utilisé (Com1, Com2, Com3 ou Com4). L’écho et le contrôle de flux ne sont pas encore implantés.

        Un bouton Appliquer permet d’appliquer ces paramètres au logiciel et un bouton Annuler permet de fermer la fenêtre sans changer les paramètres de configuration du port série.

Figure 1.17 Fenêtre de la configuration du port série
 

1.4.7 Fenêtre de l’état des piles du port série

        Cette fenêtre permet de voir l’état des piles du port série provenant du robot et sortant de l’ordinateur. Cette fonction n’est pas encore complètement fonctionnelle.

        Les boutons Vider la pile du robot et Vider la pile de l’ordinateur permettent de vider ces piles de leur contenu et de les réinitialiser. Un bouton Fermer permet de fermer la fenêtre.
 

1.4.8 Fenêtre des commandes manuelles

        Cette fenêtre permet d’envoyer des commandes au robot via le port série. Elle comprend :

        Une zone de texte affichant la liste des commandes possibles à envoyer au robot avec l’encodage de ces commandes. Celui-ci est de la forme CAxyyyZC est le caractère de début d'une commande, A est la commande Avancer, x est la puissance de 0 à 9, et yyy est la répartition de puissance du moteur gauche en % et Z est le caractère de terminaison. Par exemple, si l’usager veut faire fonctionner le moteur gauche à 100 % et le moteur droit à 0 %, avec une puissance maximale, il devra entrer : CA9100Z. D’autres commandes sont également disponibles comme par exemple pour faire pivoter le robot.

        Une zone de texte affiche les paramètres actuels du port série à savoir le taux de transfert, le nombre de bits de données, le nombre de bits d’arrêt, la parité ainsi que le port utilisé.

        L’élément important de cette fenêtre est une zone de texte située au centre haut de la fenêtre. Celle-ci permet de passer des commandes au robot via le port série selon l’encodage expliqué ci-dessus.

        Sous cette zone de texte se situe une autre zone de texte listant toutes les commandes qui ont été envoyées au robot depuis l’ouverture du programme.

        Le bouton Ajout de la commande permet d’envoyer la commande au robot et le bouton Effacer le log permet d’effacer la zone de texte listant les dernières commandes envoyées au robot.

        Est également affiché dans la fenêtre une zone de texte montrant l’état du port série, i.e. si celui-ci est prêt à communiquer ou non.

        Une série de boutons (Avance, Recule, Gauche, Droite, Prends, Dépose) permettent de contrôler directement le robot au lieu d’entrer les commandes à la main dans la zone de texte ci-haut mentionné. Pour les boutons Avance et Recule la vitesse par défaut est de 50. Le bouton Reset permet, quant à lui, de remettre à jour les variables du robot. Le bouton Fermer permet de fermer la fenêtre.

Figure 1.18 Fenêtre des commandes manuelles

 

        La communication entre le robot et l’interface usager est possible via le lien série RS-232 du PC. La transmission ce fait sur le lien TX et la réception sur le lien RX. Il suffit de placer les données dans les registres tampons du port et celles-ci sont envoyées directement sur le lien série
 

1.4.9 Fenêtre de l’image de la caméra

        Cette fenêtre permet de voir ce que la caméra détecte de l’aire de travail après le traitement de l’image. Le robot, les pièces à aller chercher (en jaune), les obstacles à éviter (en mauve), la zone de dépôt des pièces ainsi que la zone de recharge du robot y sont montrés. Cette carte a été dessinée en respectant les dimensions et les proportions de l’aire de travail.

 

Figure 1.19 Fenêtre de l’image de la caméra

 

1.4.10 Fenêtre de l’image de la matrice indiquant le chemin du robot

        Cette fenêtre permet de voir ce que la caméra détecte de l’aire de travail après le traitement de l’image. Le robot, les pièces à aller chercher (en jaune), les obstacles à éviter (en mauve), la zone de dépôt des pièces ainsi que la zone de recharge du robot y sont montrés. En plus, elle affiche la cible (destination) que le robot doit atteindre (un petit X rouge), le chemin calculé par l’Intelligence Artificielle (en rouge) et le chemin réel parcouru par le robot (en bleu). Cette carte a été dessinée en respectant les dimensions et les proportions de l’aire de travail.
 

Figure 1.20 Fenêtre de l’image de la matrice indiquant le chemin du robot

 
1.5 Améliorations futures

        Même si l’interface usager de Peripleko est très fonctionnelle et répond adéquatement à nos besoins, il serait quand même possible de l’améliorer un temps soit peu. En voici les principaux points :
 

      1. Modification des variables utilisées dans le calcul de l’asservissement du robot
      2. Placer une flèche sur le robot (à l’écran) indiquant sa direction de déplacement
      3. Sauvegarde du chemin calculé par l’Intelligence Artificielle et de celui parcouru par le robot
      4. Possibilité de comparaison de trajets de plusieurs tests sauvegardés en mémoire
      5. Possibilité de diriger le robot à l’aide de la souris
      6. Amélioration de la gestion des obstacles
      7. Ajouter un code de Checksum qui vérifierait la somme binaire des codes envoyées, ce qui permettrait d’éviter certains problèmes de communication avec le port série
 
Retour au menu
Peripleko Technologies Inc.
2. Vision et caractéristique spécifique

 
2.1 Introduction

        Cette section du projet contient tous les aspects reliés à la position du robot et à la reconnaissance du terrain (obstacles, objets à ramasser). De plus puisque notre caractéristique spécifique est d’avoir un robot " intelligent " capable d’apprendre à aller chercher des pièces de formes différentes sur le terrain, c’est ici que tout le travail se fait. Dans un premier temps nous vous expliquerons les fonctions de base que nous devions implanter, ensuite nous expliquerons les manipulations graphiques effectuées sur les images après leur digitalisation. Finalement nous expliquerons en détail chaque fonction codée en langage C.
 

2.2 Idées de base

2.2.1 Trouver la position du robot

        Le premier objectif de la vision numérique est de permettre au système de connaître la position ainsi que l’angle du robot, car sans ces informations il est impossible de faire quoi que ce soit. Pour trouver ces informations nous utilisons les capacités de reconnaissance de formes de la librairie MIL fournie par la compagnie Matrox.

 
 

2.2.2 Trouver la position des obstacles

        Le second objectif tout aussi important consiste à repérer sur le terrain tous les obstacles pour permettre au robot de les éviter. Puisque pour nous la détection d’obstacles ne faisait pas partie d’un point qui nous voulions développer en profondeur, nous avons trouvé une façon de faire très simple. Nous ne posons sur le terrain que des obstacles noirs, donc pour le robot, tous les points du terrain qui sont sous un certain seuil de gris sont considérés comme des obstacles.

2.2.3 Trouver la position des petits cercles à ramasser

        La caractéristique que tous les robots doivent posséder est la capacité d’aller sur le terrain ramasser des petits disques et de les ramener dans une aire de déchargement spécifiée à l’avance. Pour doter notre robot de cette capacité nous avons utilisé les fonctions de reconnaissance de forme comme pour trouver la position du robot, mais cette fois nous ne cherchons pas l’angle et nous ne savons pas combien de cercles se trouvent sur le terrain donc il faut juger si ce qui est perçu comme un disque à ramasser l’est vraiment.

2.2.4 Créer et trouver un modèle quelconque

        Pour notre caractéristique spéciale nous faisons encore une fois appel aux fonctions de reconnaissance de forme, mais cette fois-ci il ne suffit pas de chercher une pièce sur le terrain, il faut enregistrer le modèle à chercher dans la mémoire de l’ordinateur. Pour se faire notre interface utilisateur possède un bouton permettant d’acquérir un nouveau modèle.
 

2.3 Contraintes

        La correction de la perspective constitue un élément clef dans notre projet. Étant donné que la caméra n’est pas directement installée au dessus de la scène, nous avons une effet de perspective dans les images numérisées. Ceci provoque un plan xy non linéaire. En corrigeant la perspective, nous pouvons retrouver un plan xy normal.

        Nous avons remarqué que l’intensité de la lumière dans le laboratoire influence les contrastes sur la scène. Ce changement d’intensité nous amène à élaborer une stratégie afin d’éviter de souffrir des variations.

        Le robot possède une hauteur non négligeable et la position de la caméra accentue cet effet. Pour localiser le robot, nous installons une flèche sur le dessus de ce dernier. Nous devons donc élaborer une correction pour que la position trouvée soit celle du robot et non la position apparente de la flèche due à la perspective.
 

2.4 Manipulations de base avec schémas et photos

 
2.4.1 Correction de perspective

        La caméra n’étant pas positionnée au-dessus du terrain l’image numérisée est déformée à cause de l’effet de perspective. Pour pouvoir trouver la position des objets sur le terrain il faut redresser cette image. Pour la corriger, nous utilisons une fonction qui permet d’étirer le haut de l’image et qui compresse le bas.

 Avant correction
 

Après correction

 

 

 2.4.2 Coupure de l'image

        L’image numérisée contient en plus du terrain pour le robot de larges bordures de chaque coté qui sont inutiles pour la vision et même nuisibles car plus l’image est grande, plus les opérations effectuées sont lentes. Pour couper l’image il suffit de copier dans un tampon plus petit la partie de l’image qui doit être conservée.

Partie conservée
 
2.4.3 Filtrage

        Les images numérisées contiennent beaucoup de bruit nuisible aux opérations de reconnaissance de formes. Pour minimiser son effet nous utilisons un filtre passe bas (une convolution 3X3, filtre " smooth ") qui à pour effet d’enlever les variations brusques de l’image. L’opération rend l’image plus floue, mais contrairement à ce que l’on pourrait penser, ça rend la reconnaissance de formes plus fiable.

2.4 Séparation binaire des tons de gris

        Pour certaines opérations il n’est pas nécessaire de conserver l’image en niveaux de gris, une image noir et blanc suffit. Donc dans ces cas nous utilisons un seuil pour déterminer si un pixel doit être marqué blanc ou noir.

Avant

Après
 

2.5 Description de chaque fonction
 

2.5.1 Allocation():

        La fonction Allocation() sert à initialiser tous les outils qui nous seront nécessaires pour le projet. Dans un premier temps, on alloue tous les paramètres par défaut pour la carte Meteor 2 et pour le système de MIL. Ensuite, on applique des intensités différentes pour le contraste et la luminosité afin de diminuer les effets de la variation de l’intensité lumineuse. Ensuite, nous allouons tous les blocs de mémoire pour recevoir les images, la correction de perspective, les résultats des recherches et les modèles à chercher. Cette fonction est appelée au tout début de notre programme.
 

2.5.2 Desallocation():

        La fonction Desallocation() sert à détruire tous les objets initialisés par la fonction Allocation. Cette fonction est appelée à la fin de notre programme.
 

2.5.3 Trouve_Robot():

        La fonction Trouve_Robot() sert à localiser le robot dans la scène. On capture une image, on corrige la perspective. Ensuite, on sépare les couleurs, tout ce qui est plus élevé que 220/255 devient blanc et le reste devient noir. On applique une convolution avec un filtre de type " smooth " pour uniformiser le plus possible l’image. On regarde si nous connaissons l’ancienne position du robot, si tel est le cas, nous appliquons une fonction de reconnaissance de formes dans un carré de 75*75 pixels par rapport à l’ancienne position du robot. Si on ne connaît pas l’ancienne position du robot ou si on ne trouve pas le robot dans notre aire de recherche diminué, on cherche dans toute la scène le robot. La reconnaissance de formes se fait par une fonction de MIL qui nous donne la position du modèle recherché ainsi que son angle. Finalement, on applique une petite formule pour corriger l’effet de perspective dû à la hauteur du robot.
 

 
2.5.4 Creer_Modele():

La fonction Creer_Modele() sert à créer un modèle qui pourra être recherché par la fonction de reconnaissance de formes. Après avoir fait les manipulations de bases sur l’image capturée, on délimite une petite région dans la scène et on créé un modèle sur le disque rigide. C’est de cette façon que seront capturés les modèles pour mettre en oeuvre notre caractéristique principale et celui du robot.
 

 

2.5.5 Chercher_Modele():

La fonction Chercher_Modele() est presque identique à Trouve_Robot(). Cependant, elle est conçue pour trouver n’importe quel modèle. Elle ne donne que la position du modèle, pas son angle.
 

2.5.6 Creer_Modele_Cercles():

La fonction Creer_Modele_Cercles ressemble à Creer_Modele, cependant, elle sert à créer les modèles utiles pour le projet, soit les petits cercles à ramasser. Le modèle est différent car la scène qui sert à créer le modèle est bien plus petite et les paramètres du modèle tiennent compte du fait qu’il n’y aura pas un seul mais bien plusieurs modèles à trouver dans la scène.
 

2.5.7 Chercher_Modele_Cercle():

La fonction Chercher_Modele_Cercle() est identique à Chercher_Modele() à l’exception que ne cherche pas un seul modèle mais bien un nombre définit par une constante. Si on recherche 12 cercles mais que nous en trouvons seulement 8, notre fonction retourne les 8 cercles trouvés.

 

2.5.8 Trouve_Obstacles():

La fonction Trouve_Obstacles() est appelée au début pour identifier les obstacles sur la scène. Après avoir corriger la perspective et appliquer un filtre " smooth ". On sépare les couleurs mais en mettant noir ce que est en dessous de 50/255. Tout ce qui est noir constitue un obstacle. On retourne un point sur deux à l’horizontale et à la verticale. Ces points serviront à créer la matrice d’obstacles.
 

2.6 Conclusion

Nos fonctions fonctionnent très bien, le seul inconvénient rencontré demeure le temps d’exécution. C’est pour cette raison que nous cherchons le robot dans une section délimité. Chercher le robot sur l’ensemble de la scène prend environ 5.2 secondes, alors qu’une recherche sur un carré de 75 pixels par 75 pixels ne prend que 0.8 secondes.

L’éclairage nous cause encore quelques petits problèmes. Le soir, la luminosité est plus faible et les objets dans le fond de la scène sont plus difficiles à détecter. Avec un peu plus de temps, nous aurions conçu des fonctions plus structurées. On aurait mis au point une classe contenant tout ce dont nous avons besoin. Nos fonctions contiendraient alors beaucoup moins de paramètres.

Bien que les librairies de MIL nous fournissent toutes les fonctions nécessaires à notre travail, nous avons investi énormément d’heures pour bien comprendre leur fonctionnement et optimiser notre façon de faire.

 
Retour au menu
3. Logiciel de contrôle du robot
 

3.1 Introduction

Le logiciel de contrôle du robot est implanté dans la mémoire RAM du micro-contrôleur. Il est responsable de l’éxécution des commandes provenant du PC, et qui sont transmises par l’intermédiaire du port série RS-232. Il est écrit en C, et compilé avec l’aide du compilateur IC. Il comporte des mécanismes pour la détection d’erreurs.

 
3.2 Description

Le programme principal est très simple. Il ne fait que recevoir la chaîne de caractères qui composent les différentes commandes disponibles pour le robot. Il utilise un protocole spécial pour recevoir les commandes. Tous les caractères transmis doivent être des lettres ou des chiffres uniquement, codés en ASCII. De cette façon, plusieurs erreurs de communication peuvent être détectées. Les commandes peuvent être envoyées en majuscules ou en minuscules.

Une fonction est disponible afin de redonner le contrôle du robot au logiciel Pcode, et ce afin de pouvoir télécharger une nouvelle version du programme.

 

 

 

3.2.1 Protocole de communication
 

Y  W  XXXXX  Z
|  |  |^^^^  |
|  |  |      Caractère de terminaison(lettre Z)
|  |  |
|  |  Paramètres de la commande (longueur variable)
|  |
|  Identification de la commande (A à F)
|
Caractère de départ(lettre Y)
 
 

3.2.2 Identification des commandes

 
A = avancer

Format : YAwxxxZ

w = puissance de 0 à 9 (9 = 100%)

xxx = répartition de puissance du moteur gauche

répartition de puissance du moteur droit = 100 - xxx
 

B = tourner
Format : YBxxxZ

xxx = angle de rotation en degrés (sens anti-horaire)
 

C = activation/désactivation de l’aimant
YC0Z = désactivation de l’aimant

YC1Z = activation de l’aimant
 

D = interrogation sur l’état des piles
YD0Z = état des piles des moteurs

YD1Z = état des piles de la carte du robot

La valeur retournée par cette commande est une puissance allant de 0 à 100%.
 

F = retour à Pcode
YFZ
 
3.3 Programme de contrôle du robot
 

 Listing complet du programme
 

 

Retour au menu
4. Communication sans fil

 
4.1 Objectif

        Effectuer la communication entre le robot et l'ordinateur sans le support d'un câble reliant ces deux éléments. À partir de ce système, nous seront capables d'envoyer et de recevoir des données venant de l'ordinateur et du robot de la même façon que le fait le lien câble.
 

4.2 Choix des composantes

        Pour réaliser notre objectif, nous avions le choix de faire la communication en utilisant soit des ondes infrarouges ou des ondes radios. Nous avons finalement opté pour les ondes radios parce qu’elles peuvent être captées avec des antennes partout dans le local peu importe la position du robot.

        Pour concevoir les modules de transmission et de réception, nous avions pensé fabriquer les modules nous-mêmes. Nous aurions utilisé une modulation AM avec une fréquence de transmission du robot différente de celle de l’ordinateur pour éviter les interférences lors de la communication. Le problème est que les fréquences que nous aurions utilisés auraient été très élevées, de l’ordre du mégahertz, ce qui aurait causé des problèmes lors de la réalisation du circuit. En effet, lorsque les fréquences sont élevées, les lois de Kirchhoff ne s’appliquent plus. Pour contourner ce problème majeur, nous avons opté pour commander des modules de transmission et de réception déjà existants.

 
4.2.1 Modules de transmission et de réception

        On utilise un module produit par la compagnie ABACOM Technologies qui s’appelle RTF-DATA-SAW 4800bps AM Transceiver Modules. Celui-ci permet de transmettre et de recevoir un signal TTL de façon "half duplex", c'est-à-dire que le transmetteur et le récepteur utilisent la même fréquence de modulation, soit 433.92 MHz. Le signal est modulé en AM, et le module fonctionne à une vitesse maximale de 4800 bps. Nous avons commandé deux modules, un qui est installé sur le robot et l'autre qui est installé sur l'ordinateur.

 
4.2.2 Choix de l’antenne

        Chaque module comporte une antenne conçue avec des fils de cuivre conventionnel. Nous avons choisi de prendre une antenne de type monopôle dont la longueur est de ¼ de la longueur d’onde utilisée. À partir de l’équation l = c/f, on voit que la longueur d’onde est l = (3*108 m/s) / (433.92 MHz) = 0.69 mètre. La longueur de l’antenne est donc d’environ l/4 = 17.28 cm, cependant, dans le guide des modules d’Abacom, il suggérait de prendre une longueur d’antenne de 16.5 cm, ce que nous avons fait.

 

Figure 1: Schéma bloc des deux modules de transmission.

 

 
 

4.3 Conception des blocs (transmission/réception) pour le robot et l’ordinateur

        Le robot émet et reçoit une onde de type RS-232 qui varie de -9V à +9V. Selon la convention du RS-232, -9 V équivaut à un niveau logique 1 et 9 V à un niveau logique 0. Cependant, les modules d’Abacom acceptent seulement une onde TTL qui varie de 0 à 5V. Nous avons dû installer un convertisseur RS-232-TTL à la sortie du port série du robot. Le convertisseur utilisé est le MAX232 de la compagnie MAXIM. Avec ce convertisseur, la sortie Tx du robot est convertie en onde TTL avant d’être modulée par le module d’Abacom et la sortie Rx du module d’Abacom est convertie en RS-232 avant d’être introduit dans l’entrée Rx du robot. Le même procédé est utilisé pour convertir le -12V et le 12V de l'ordinateur en onde TTL.
 

        Les blocs n’auraient pas été fonctionnels sans la présence des inverseurs. En effet, lorsque l’ordinateur ou le robot ne transmet pas, il émet un ‘stop bit’   d’une tension de -9V (-12V pour l'ordinateur) sur le port TX ce qui équivaut à un niveau logique égale à 1. Donc, lorsque le robot ou l’ordinateur reçoit des informations au port RX, il y a interférences avec le ‘stop bit’ qui est modulé à la même fréquence. L’inverseur permet donc de rendre le ‘stop bit’ égal à zéro avant de l’envoyer dans le module d’Abacom et un deuxième inverseur est utilisé pour ré-inverser le signal lorsqu’il est reçu.

 
Retour au menu
5. Électrotechnologie
 

Le bloc électrotechnologique comporte deux parties :

  1. la réalisation et l’alimentation de l’électro-aimant .
  2. la conception du module de surveillance des piles des moteurs et de l’électronique .
5.1 La réalisation et l’alimentation de l’électro-aimant
 

        L’électro-aimant sera réalisé à l’aide de deux bobines à milieux vide dans lesquelles une pièce d’acier en U vient s’insérer pour que le flux magnétique à l’intérieur des bobines soit canalisé par la pièce d’acier . Les deux bobines sont déjà réalisées et comporte un très grand nombre de tours de petit fil . Elles devront être alimentées par les piles qui alimentent les moteurs.

        Pour obtenir une attraction suffisante, les deux bobines devront être reliées en parallèle directement à la batterie de piles des moteurs . L’électro-aimant à une résistance d’environ 24 W , il absorbe donc un courant d’environ 375 mA sous une tension de 9 Volts . Étant donné que l’électro-aimant devra être commandé par l’électronique du robot, nous devrons utiliser une sortie numérique du robot pour commander l’aimant . La sortie utilisé est le bit 3 du port A qui est disponible sur le connecteur d’expansion du robot . Lorsque le bit sera à 1 logique, l’électro-aimant sera inactif et lorsque le bit sera à 0, il sera actif.

        Ceci implique que nous devrons concevoir un système électronique qui agira comme relais pour commander l’aimant à partir du circuit électronique basse tension et faible puissance du robot. Nous utiliserons un transistor MOSFET en commutation pour commander l’aimant .

        De plus, afin d’isoler le circuit basse puissance du robot du circuit haute puissance, nous allons utiliser un OPTO-COUPLEUR dans le but d’éviter de relier physiquement la masse des moteurs avec celle de l’électronique .

 

Circuit de commande de l’électro-aimant

 

        Les fonctions réalisant la commande de l’électro-aimant seront réalisé en IC et implanté dans le robot . Elles utiliseront l’instruction PEEK pour aller chercher la valeur inscrite sur le port A, ensuite elles feront un ‘ou’ ou un ‘et’ logique pour soit mettre le bit 3 à ‘1’ ou à ‘0’ . Enfin, elle réécriront la valeur obtenue avec l’instruction POKE pour ainsi mettre l’électro-aimant actif ou inactif .
 

5.2 La conception du module de surveillance des piles
 

        Le contrôle de l’état des piles de l’électronique du robot peut être effectué en observant la tension au borne de la batterie de piles . Étant donné que le courant demandé par l’électronique est relativement constant, nous pouvons déterminer l’état des piles en fonction de la tension au borne du module électronique du robot .

        Vue que la caractéristique de la tension d’une pile alcaline décroît de façon quasi linéaire au fur et à mesure que la pile se décharge, nous utiliserons comme approximation que la tension décroît linéairement avec la décharge de la pile . Nous indiquerons donc que les piles sont chargé à 100% lorsque la tension de la batterie est de 9 Volts ( 6 fois 1.5 Volts par piles ) et que les piles sont complètement déchargées lorsque la tension atteint 6 Volts ( 6 fois 1 Volt par pile ) . Entre ces deux valeurs extrêmes, la charge restante décroîtra linéairement avec la tension de la batterie .
 
        Pour ce qui est des piles alimentant les moteurs et l’électro-aimant, il faudra tenir compte du fait que le courant débité par les piles n’est pas constant . Une solution pour régler ce problème consisterait à vérifier l’état des piles lorsque le robot est arrêté et que l’électro-aimant est en fonction . En connaissant le courant consommé par l’électro-aimant et en mesurant la tension aux bornes de la batterie de piles, on peut ainsi déterminer l’état des piles.

        Cette façon de faire nécessite l’arrêt du robot à intervalle régulier pour vérifier l’état des piles et garder cette lecture constante pour le restant du temps . Il faut toutefois que cette lecture soit faite assez souvent pour éviter que les piles ne se déchargent trop entre chaque mesure .
 
        Étant donné que la tension d’une piles Nickel-Cadmium ne varie pas de façon linéaire au fur et à mesure que la pile se décharge , nous ne pouvons pas utiliser une simple droite pour évaluer la décharge de la batterie . La caractéristique de variation de la tension d’une pile Ni-Cd est relativement plate entre le moment où elle est chargé à 100% ( 9 volts = 7 fois 1.35 Volts par pile ) et le moment où il ne lui reste que 31.5% ( 8.4 Volts = 7 fois 1.2 Volts par pile ), nous utiliserons donc une droite avec une pente douce pour approximer la charge restante dans la batterie . Par contre, la variation de la tension est beaucoup plus brutale passée ce point et nous utilisons une droite avec une pente plus forte comme approximation de l’énergie restante dans la batterie .

        Afin de mesurer la tension des piles, nous allons utiliser deux des trois entrées analogiques du robot . En effet, ces entrées affichent un nombre numérique sur 8 bits en fonction de la tension qui leur est appliquée. Par contre, ces entrées sont limitées à une tension maximale de 5 Volts, alors que la tension de la batterie des moteurs et de l’électronique est de 9 Volts . On peut contourner ce problème en utilisant un diviseur de tension à l’entrée analogique pour ramener le tension maximale à 4.5 Volts . Pour réaliser ce diviseur de tension, nous allons utiliser deux résistances de 10 kW reliées en série entre la masse et le positif de la batteries de piles. Il suffit de relier le point entre les deux résistances à une entrée analogique du robot pour ainsi diviser par deux la tension appliquer à l’entrée analogique .
 
        Nous utiliserons l’entrée PE5 pour les piles des moteurs et l’entrée PE6 pour les piles de l’électronique, ces deux entrée sont disponibles sur le connecteur d’expansion du robot. Par la suite, on peut connaître la tension appliqué à l’entrée en utilisant la fonction analog(p) qui retourne un nombre compris entre 0 et 255 (8 bits) proportionnel à la tension appliqué à l’entrée p du robot. Nous n’avons donc qu’à multiplier ce nombre par une constante de proportionnalité pour connaître précisément la tension de la batterie connecté à l’entrée correspondante .

 
Retour au menu
6. Détermination du chemin
 

La détermination du chemin se fait en deux étapes:

  1. Création de la matrice représentant le terrain.
  2. Déduire de cette matrice un chemin optimum.
 
6.1 Création de la matrice

        Les dimensions de la matrice sont 310*240. Ces dimensions représentent la moitié de la matrice de la partie Vision. Cette dernière nous envoie les coordonnées des obstacles, du robot et de la destination pour nous permettre d’avoir le chemin théorique.

 
D’un point de vue simpliste, ce que nous devons faire c’est de délimiter les zones interdites pour le robot:

 
        Le nombre de 10 points n’est certainement pas pris au hasard. Ceci est dû au fait que le rayon du robot représente 7 points de la matrice. Nous devions tenir compte de la largeur du robot pour déterminer le chemin.
 

        Ensuite nous plaçons le robot et le point destination. S’il arrive qu’un de ces deux points se trouvent trop proche d’un obstacle, il se trouverait alors dans la zone interdite. Mais pour éviter que le programme bloque, on rend les zones immédiatement entourant ces deux points licites pour le robot.
 

6.2 Déduction du chemin optimum
 

        L’idée essentielle de l’algorithme est simple. Les points entourant immédiatement le robot sont au nombre de 8. Nous calculons la distance qui sépare chacun de ces points et le point destination. Nous trions les distances par ordre croissant. Puis, nous choisissons le point pour lequel la distance est minimale tant que ce point n’appartient à aucune zone interdite sinon nous choisirons le point suivant c’est à dire pour lequel nous la seconde plus petite distance et ainsi de suite.

        Cette méthode est robuste: le robot arrive toujours à trouver le point destination tout en évitant les obstacles. Mais selon le type d’obstacle la qualité du chemin diffère:

 
        Dans le second cas, les zones interdites forment un certain creux, ce qui amène le robot à épuiser toutes les possiblités avant d‘en sortir. Une solution pour contourner ce problème est de calculer le chemin entre le robot et la destination selon l’algorithme précédent dans les deux sens, de les comparer, de prendre les parties optimum de chacun pour former un chemin final qui ne présente pas de défauts.

        Nous avons remarquer qu’il a presque toujours des points appartenant aux deux chemins. Donc, pour comparer ces chemins, il suffit de comparer la longueur des segments compris entre deux points appartenant aux deux chemins. Le processus se répete jusqu’à ce qu’il n’y a plus de points en commun.

        Cette méthode est robuste et trouve le chemin optimum dans bien des cas.

 
Retour au menu
7. Section Intelligence

 
4 sujets seront traités:

7.1 Introduction – une orientation dynamique

7.2 Les deux algorithmes de base – décision et action

7.3 Diagramme de flux de données – une vue directe des interfaces

7.4 Détails des unités de traitement – pour davantage de détails

  
7.1 Introduction – une orientation dynamique.

        Cette section couvre la coordonnation du déplacement du robot. Elle est réalisée à l'aide d'une série de paramètres d'entrées obtenus dynamiquement. Son but est de générer les commandes à envoyer au robot (par le port série) afin d'atteindre la destination visée.

        Le résultat dans le temps de cette itération se déroule selon le principle bien connu d'action / réaction:
 

Voici les flux d'entrées / sorties détaillant le mécanisme d'orientation.

Par la vision : Un vecteur de positions des obstacles

Un vecteur d'objets
La position et l'angle courant du robot

Par la boucle: Le mode ("Que doit-on faire?")

Peut être : IDLE, Chercher_pièce, Porter_pièce, Recharge

Par le chemin: Un vecteur de positions à suivre pour se rendre à la destination courante.

Pour boucle: la puissance des moteurs

le rapport gauche/droite
un flag indiquant si la destination a été atteinte.
 

7.2 Les deux algorithmes de base – décision et action
 

    1. I. Algorithme d'orientation, coordonne l'action
    2. En fait, nous utilisons l'approche de rétroaction successive afin d'obtenir un algorithme robuste.

      Plus précisément,

      Exécution venant De boucle ...

       
      1. Si le mode a changé Alors,

      1.1- La vision nous retourne les obstacles et les objets ;

      1.2- Nous établissons une destination selon le mode ( coordonnées d'un objet, de la recharge ou du dépôt ) ;
      1.3- La fonction chemin nous trouve le meilleur chemin entre la position

      courante du robot et la destination (voir cette section pour plus de détail) ;

      Fin Si

      2. Trouve Puissance et rapport gauche/droite selon position du robot et point le plus prêt du chemin.

      3. Envoie sur le port série la commande au robot.


      4. Retour à la boucle

       

    3. II. Algorithme de suivit du chemin, coordonne la décision
Les décisions sont basées selon les angles entre :

A1- L'angle formée entre position du robot et la coordonnée suivante de celle la plus près du robot

A2- L'angle courant du robot


Notez que le chemin part toujours de la position intiale du robot et donc que le robot sera toujours très près du chemin. Cela est une condition du bon fonctionnement de cet algorithme.

Les angles sont réduit en 8 directions possibles : ç è é ê ë ì í î

En résumé,

1. Trouver le point suivant du chemin le plus prêt de notre position courante

2. La meilleur direction <-- Prendre l'angle et trouver la meilleure réduction de l'angle entre ce point et la position du robot

3. L'autre direction étant la plus près <-- Trouver la meilleure autre direction de cette réduction et trouver son poids

(facteur de proximité: près --> vers 1, loin --> 0)
4. Direction courante <-- Trouver la meilleure réduction de l'angle courant du robot

5. À l'aide d'une table de décision deux dimensions nous savons à quelle intensité nous devons tourner à gauche et à droite.

Gauche = TableGauche[ la meilleur direction , direction courante ] + Poids * TableGauche[ l'autre direction étant la plus près , direction courante ]
6. À l'aide d'une autre table de décision de une dimensions, nous savons quelle puissance attribuer aux moteurs.
Puissance = TablePuissance[ Intensité de Gauche uniformisé de 0 à 5 ]
 
7.3 Diagramme de flux de données – une vue directe des interfaces

 

Intel_Orientation()

Décide où aller et s'occuper de générer le chemin pour y arriver. Entrées:

Vision F1- Vecteur de coord. d'obstacles
F2- Vecteur de coord. d'objets
F3- Position robot et angle
Chemin F4- Chemin théorique :

Vecteur de coord. de position désiré

Boucle F5- Mode de fonctionnement

Sortie: Puissance moteur

Intel_SN_TrouveDestination()

Selon le mode et l'environnement, détermine où sera la prochaine destination (point x,y).

Entrées:
F1- Vecteur de coord. d'obstacle
F2- Vecteur de coord. d'objets
F5- Mode de fonctionnement
Sortie: F6- Destination: coord. (x,y) Intel_SN_SuivreChemin() À partir du chemin fixé, générer les commandes nécessaires pour y arriver.

Entrée:
F3- Position robot et angle
Sortie: F7- Puissance moteur

Intel_SN_Collision() Selon l'environnement et notre position, vérifie si on doit tout arrêter et recalculer le chemin à prendre.

Entrée:

F1- Vecteur de coord. d'obstacles
F3- Position robot et angle
Sortie: VRAI / FAUX

 

7.4 Détails des unités de traitement – pour davantage de détails
 

Intel_Orientation()

Interface appelée par: Boucle_Principale()

Entrée: Mode robot enumération

Erreur, IDLE, Chercher_pièce, Porter_pièce, Recharge

Sortie: Destination courante type point

Chemin théorique, type vecteur de point

Position X,Y,tétha du robot type float

But: Interface: Voit_Environnement() - Section Vision

Voit_Position() - Section Vision

Chemin_TrouveChemin() - Section Chemin

Intel_Orientation( MODE_ROBOT )

Si (Rendu) Alors,
Retourne Rendu
Sinon,
Si (MODE_ROBOT = IDLE) Alors,
PUISS = 0
Sinon
Si (MODE_ROBOT change) OU (Intel_SN_Collision(POS,ENVIRONNEMENT) = VRAI) Alors,
ENVIRONNEMENT, POS = Voit_Environnement();
DEST = Intel_SN_TrouveDestination( MODE_ROBOT, POS, ENVIRONNEMENT );
CHEMIN = Chemin_TrouveChemin( POS, DEST, ENVIRONNEMENT);
Fin_Si
POS = Voit_Position();
PUISS, GAUCHE = Intel_SN_SuivreChemin( CHEMIN, POS )
Fin_Si
Retourne PUISS, GAUCHE
Intel_SN_SuivreChemin()

Entrée: Chemin théorique, type vecteur de point

Position X,Y,tétha du robot type structure

Sortie: Puissance relative gauche type float 0 à 1

Puissance gauche + Puissance droite = 100%

Facteur de ralentissement type float 0 à 0.95

Pleine vitesse = 0%, Mode panique = 95%

But:

1. Trouver point chemin le plus prêt selon notre position X Y

2. Faire DX et DY entre robot XY et chemin XY et trouver la direction (8 choix)

3. Réduire l'angle courant du robot en direction (8 choix)

4. À l'aide de la table de décision de deux dimensions,

Gauche = TableGauche[direction voulue, direction courante], 5. À l'aide de la table de décision une dimension, Puissance = TablePuissance[ Gauche variant de 1 à 4 ], Intel_SN_TrouveDestination

Entrée: Mode robot enumération

Erreur, IDLE, Chercher_pièce, Porter_pièce, Recharge

Position X,Y,tétha du robot type structure
Environnement type structure

Sortie: Destination X,Y,tétha du robot type structure

But:

1- Soit Mode Choix Chercher_Pièce: Retourne coordonnée de l'objet le plus prêt
Choix Porter pièce: Retourne coordonnée du dépôt
Choix Recharge: Retourne coordonnée de la recharge
Choix IDLE: Retourne coordonnée du robot
Autre choix: ERREUR

Retour au menu
8. Conclusion
 

        Ce cours s'est avéré une excellente expérience de travail en équipe et nous avons appris l'importance d'avoir une bonne gestion du temps. Ce projet nous a permis d'intégrer les connaissances apprises dans les différents cours suivis jusqu'à maintenant. De plus, nous avons été confronté à des problèmes auxquels nous ferons face dans nos carrières d'ingénieurs.

        Toutefois, si nous disposions de plus de temps, notre robot aurait pu être amélioré, par contre, nous sommes très satisfaits des résultats obtenus.
 

Retour au menu
Retourner à la page principale

© 1999 Peripleko Technologies Inc.