|
|
Fonctionnement physique du robot
Lors de l'analyse physique du fonctionnement du robot, nous fûmes confrontés à certains
problèmes. Entre autres, nous n'étions pas capables de faire bouger notre robot. Cela
était dû au fait qu'il y avait une défectuosité physique de l'alimentation des
moteurs. La solution à ce problème fut de changer le robot. Un autre robot nous fut donc
remis.
Ayant un robot fonctionnant bien, nous avons pu faire bouger le robot : le faire avancer, reculer et tourner. Celui-ci fonctionne en mode puissance, i.e. qu'il peut avancer et tourner en même temps.
Interface graphique du logiciel
L'interface graphique du logiciel est réalisée à l'aide des MFC de Windows dans l'interface de développement Visual C++ 5.0.
Aperçu de
L'interface graphique permet à l'utilisateur d'entrer des commandes au clavier pour commander le robot. Ce mode sera très utile pour le déverminage. Il existe un mode manuel/automatique. Le mode manuel permet à l'usager de commander le robot et le mode automatique de laisser l'AI (intelligence artificielle) guider le robot. En mode manuel, l'interface envoie directement les commandes au port série. En mode automatique, les commandes sont envoyées au Noyau, la boucle principale du système, qui elle-même les enverra au port série.
Aperçu de
L'interface recevra du robot (via le port série) l'énergie dépensée pour le chemin
actuel, l'énergie totale restante ainsi que les informations provenant des capteurs du
robot. L'interface recevra de la boucle principale la position (X,Y) actuelle du robot,
son angle actuel, le nombre d'objets ramassés, la destination finale du chemin et le
chemin à parcourir pour aller chercher un objet.
L'interface affichera l'image provenant directement de la caméra, l'image traitée par le traitement d'image incluant le chemin décidé par l'algorithme, les informations provenant du robot, les informations provenant des algorithmes, les boutons permettant de passer des commandes au robot (avance, recule, gauche, droite, prends, dépose, reset, calibration) et les commandes se trouvant dans la pile FIFO du port série. L'interface permet également une configuration du port série.
Le principal problème survenu jusqu'à maintenant dans le développement de l'interface graphique est sans contredit l'apprentissage de la programmation Windows avec les MFC. De bons livres de référence ainsi que la prise de conseils auprès de collègues connaissant les MFC fût la solution au problème. Les principaux problèmes que nous allons rencontrer d'ici la réalisation du projet est la coordination des entrées/sorties avec la boucle principale (le Noyau) ainsi que la réalisation de la communication avec le port série.
Pour les transmissions RF, on utilise un module produit par la compagnie
ABACOMTechnologies. Celui-ci permet de transmettre et de recevoir un signal RS-232 de
façon "halfduplex , c'est-à-dire que le transmetteur et le récepteur
utilisent la même fréquence, 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
sera installé sur le robot et l'autre qui sera installé sur l'ordinateur. Pour le
moment, les modules ne sont pas encore arrivés.
Chaque module comportera une antenne unique pour la réception et la transmission. Ce sera donc des monopôles donc la longueur est du quart de la longueur d'onde. À une fréquence de 433.92 MHz, on aura donc des antennes longues de 17.28 cm.
Lorsque nous aurons les modules, il y aura certaines précautions à prendre pour éviter que du bruit ou des interférences perturbent la communication entre le robot et l'ordinateur. Tout d'abord, nous allons filtrer le signal envoyé et l'alimentation avec un filtre passe-bas pour être sûr qu'il n'y aient plus de fréquences élevées qui viennent troubler notre signal. Ensuite, on installera un blindage métallique autour de notre carte comprenant le transmetteur et le ré cepteur.
Vu que les modules de communication envoient un signal TTL, il faudra convertir les signaux RS-232 é mis par l'ordinateur et le robot en format TTL et l'inverse. Pour ce faire, nous utiliserons des convertisseur MAX232 de la compagnie Maxim. Une autre solution qui pourrait être envisagée pour la conversion serait d'utiliser des circuits simples comprenant un amplificateur opé rationnel et des diodes.
Dernièrement, il nous reste quelques points mineurs à vérifier concernant la carte du robot où sera installé le modulateur et le transmetteur. Premiè rement le brochage utilisé sur celle-ci, et la faç on dont la carte est alimentée. Un autre point à clarifier est le protocole à utiliser pour diminuer la vitesse de transmission du robot de 9600 bauds à 4800 bauds.
Notre tâche est de fournir au noyau de notre logiciel les fonctions pour localiser le robot dans l'environnement, trouver les obstacles et trouver les objets. Le développement des fonctions se fait dans l'environnement C++ à l'aide des librairies de tratement d'images MIL de Matrox.
Après avoir acqui les images, nous appliquons une correction de perspective et nous découpons l'image pour ne conserver que la partie délimitée par l'aire de travail.
Pour trouver les obstacles, nous effectuons une séparation des couleurs. Notre convention tient compte que tout ce qui est blanc constitue un obstacle. Nous mettons en oeuvre des mesures pour que seul les obtacles soient blanc. Nous renvoyons un vecteur contenant un point sur quatre de l'image pour que le noyau puisse créer une matrice d'obstacles.
Pour trouver les objets, d'une forme d'un disque d'environ 2 cm de diamètre de couleur noir, on applique une séparation des couleurs et à l'aide des algorithmes de reconnaissance de formes, on identifie leur position. On retourne un vecteur contenant les coordonnées au noyau.
Pour trouver le robot, on utilise les algorithmes de reconnaissance de formes. On retourne sa position et l'angle et qu'il fait suivant une référence.
Présentement, la fonction pour trouver les obstacles est complétée. En ce qui concerne les objets et le robot, nous éprouvons quelques difficultés avec les fonctions de reconnaissance de formes. Quand nous maîtriserons ces dernières, il nous restera à globaliser notre code pour qu'il puisse bien s'interfacer au noyau.
Section caractéristique principale
Notre robot à la capacité d'apprendre à reconnaître différentes formes et à les ramasser sur le terrain. Pour ce faire, on fait une acquisition du modèle à n'importe quel instant à l'aide de l'interface. Ensuite, le robot va chercher la pièce en question et la rapporte. Cette caractéristique principale est quelque peu différente de notre première car le concept du casse-tête est un peu vague et notre robot ne possède pas une préçision suffisante pour exécuter correctement ses tâches.
Le bloc électrotechnologique comporte deux parties :
la réalisation et l'alimentation de l'électro-aimant.
la conception du module de surveillance des piles des moteurs et de l'électronique.
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é par les piles qui alimentent les moteurs. Pour obtenir une attraction suffisante, les deux bobines devront être reliées en parallèle directement à la source de tension des moteurs. L'électro-aimant à une résistance d'environ 24 (, elle 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 devront utiliser un bit de sortie du robot pour commander l'aimant. Lorsque le bit sera à 0, l'électro-aimant sera inactif et lorsque le bit sera à 1, il sera actif. Ceci implique que nous devront 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 pourrons utiliser un transistor en commutation pour commander l'aimant.
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 et connu , nous pouvons déterminer l'état des piles en fonction de la tension au borne du module électronique du robot. On doit donc connaître le courant absorbé par l'électronique et la caractéristique de la tension d'une pile déchargé par ce courant.
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écharge trop entre chaque mesure.
Une des grandes difficulté de se système est de mesurer la tension et de l'afficher numériquement dans l'ordinateur. Une solution pour régler ce problème est d'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 est de 9 Volts. On peut contourner se problème en utilisant un diviseur de tension à l'entrée analogique pour ramener le tension maximale à 5 Volts. 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.
Génération de la matrice des lignes de niveau et détermination du meilleur chemin
L'étape de la matrice a été réalisé. C'est à dire que pour un obstacle donné, on place autour de lui des lignes de niveau décroissantes. Ces lignes de niveau tiennent compte bien sûr des limites du terrain : les niveaux ne doivent pas dépasser les bordures du terrain.
Maintenant, il reste à déterminer le meilleur chemin à partir de cette matrice déjà créée.
On pourrait faire en sorte que le robot choisisse les points de la matrice qui ont des bas niveaux mais c'est une méthode qu'il faut affiner car elle ne peut être fonctionnelle avec la plupart des situations. Nous pensons qu'il faut d'abord affiner encore un peu la matrice avant de laisser le robot faire son algorithme.
Descripion des traitements individuels :
Intel_Orientation()
10% 7 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()
0% 2 Selon le mode et l'environnement, détermine où sera la prochaine destination (point x,y).
Entrées :
F1- Vecteur de coord. d'obstacles
F2- Vecteur de coord. d'objets
F2- Vecteur de coord. d'objets
F5- Mode de fonctionnement
Sortie:
F6- Destination: coord. (x,y)
Intel_SN_SuivreChemin()
5% 3 À 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()
10% 1 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
Détails des algoritmes
Section Intelligence, (Intel)
Interface Haut niveau: Intel_Orientation()
Interface Appelé par: Boucle_Principale()
Intel_Orientation()
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 :
Algorithme à déterminer selon les structures définitves des données
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 :
Algorithme à déterminer selon les structures définitves des données
Intel_SN_Collision()
Entrée: Environnement type structure
Position X,Y,tétha du robot type structure
Sortie: VRAI : Collision effective ou imminente!
FAUX : keep it cool
But :
Algorithme Trivial
Retourner à la page principale
© 1999 Peripleko Technologies Inc.