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.
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 :
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
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.
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.
1.4.1.3 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 %.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 CAxyyyZ où C 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.
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.
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.
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 :
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.
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.
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.
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.
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| | |^^^^ |
3.2.2 Identification des commandes
A = avancer
B = tournerFormat : YAwxxxZw = puissance de 0 à 9 (9 = 100%)
xxx = répartition de puissance du moteur gauche
répartition de puissance du moteur droit = 100 - xxx
C = activation/désactivation de l’aimantFormat : YBxxxZxxx = angle de rotation en degrés (sens anti-horaire)
D = interrogation sur l’état des pilesYC0Z = désactivation de l’aimantYC1Z = activation de l’aimant
F = retour à PcodeYD0Z = état des piles des moteursYD1Z = état des piles de la carte du robot
La valeur retournée par cette commande est une puissance allant de 0 à 100%.
3.3 Programme de contrôle du robotYFZ
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.
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.
Le bloc électrotechnologique comporte deux parties :
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 .
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 .
La détermination du chemin se fait en deux étapes:
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:
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:
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.
4 sujets seront traités:
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
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.
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.
le rapport gauche/droite
un flag indiquant si la destination a été atteinte.
7.2 Les deux algorithmes de base – décision
et action
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.
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()
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ée:
F3- Position robot et angle
Sortie: F7- Puissance moteur
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
Position X,Y,tétha du robot type float
Voit_Position() - Section Vision
Chemin_TrouveChemin() - Section Chemin
Intel_Orientation( MODE_ROBOT )
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:
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,
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:
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.