Il s'agit d'un robot d'exploration qui a vocation de devenir autonome (comme une grande partie des robots ).
Le projet s'articule sur 3 composants : une base mobile, un "cerveau" et un "observateur de résultat" (je les détaille un peu plus bas). Cela se fera a base Arduino et d'Android.
La base mobile est un DFRobot 4WD (plateforme a 4 roues motrices... mais seulement deux dans la realité), celle-ci se voit équipé d'une carte micro-contrôleur DFRobot Roméo v1.0, associé à un module DFRobot Bluetooth v3, 4 switchs de distance, une tourelle tilt/pan ou est logé le "cerveau" (avec deux servos moteurs).
Le cerveau est un téléphone mobile HTC Désire qui communiquera avec la plateforme via Bluetooth. Celui-ci est solidaire de la plateforme mobile (en haut de la tourelle mobile). Sa camera servira à la reconnaissance et l'analyse du territoire (soft en cours de développement, basé sur la détection de lignes et de reconstruction 3d en temps-réel si c'est possible), il sera aussi le transmetteur des informations à l'"observateur" (streaming audio/video, prise de photos) via Wi-Fi. Pour info, HTC a supprimé le profil SPP (Serial Port Protocol) du firmware officiel (froyo 2.2), le téléphone a donc été rooté et une version de Cyanogen 7.1.0 R1 a été installée (Gingerbread 2.3.4).
L'observateur est, dans le cas présent, une tablette Acer A500 (Honeycomb 3.2, mais pourrait etre tout autre appareil mobile sous Android avec un écran large) qui sera connectable via Wi-Fi au cerveau. Il recevra les informations (positions, capteurs, flux video) mais pourra, bien sur, prendre le pas sur le commandement du robot.
Ou en suis-je actuellement sur le projet ? La plateforme mobile est assemblé, les switches réglés, la communication avec le cerveau est établie ainsi que la communication entre le cerveau et l'observateur. Le cerveau ne sert pour le moment que de relai de commande depuis l'observateur. en parallèle, je continu mon travail sur la détection des lignes (algorithme choisi est une simplification de l'algo "RANSAC"... une autre voie est la transformée de Hough). Qui reste encore a faire : le streaming audio/video et l'envoi des photos du cerveau vers (qui sont stocké sur le portable pour le moment). Matériellement, je prévois encore une amélioration majeur : l'ajout d'un capteur de distance a ultrason (type DFRobot URM04) qui serait solidaire et orienté dans le sens de la camera (pour la reconstruction 3d). Et bien sur, l'IA reste entièrement a faire Maintenant, je ne suis pas sur que le HTC Désire soit assez puissant pour tout faire à la fois... c'est donc aussi un défi a ce niveau là
Dans un premier temps, je finalise le "remote control" entre le cerveau et l'observateur (streaming video en priorité). Puis je reprends le dev sur la reconnaissance de territoire. Et ensuite l'IA...
...
Pour la reconstruction 3D, je ne compte pas utiliser de librairie ou de soft déjà existant... c'est clair que certaines librairies existent déjà, et répondrait partiellement a ce que je pense faire (comme OpenCV, qui implémentent la transformée de Hough pour la detection des lignes dans une image ou les SIFT point d'intérêt d'une image). Mais, le but est de tout faire "a la main" (sinon c'est pas drôle ).
Donc, grosso modo, l'idée est de se baser sur l'omographie entre deux images. On utilise plutôt ce type d'algo dans le sens inverse en réalité augmentée (repéré un modèle 2d dans un image, et ensuite extrapoler sa position 3d), ou dans la creation des panoramas a partir d'images multiples. Je connais l'angle entre les deux images, grace aux servos de la tourelle et/ou au capteur d'angles et/ou au gyroscope du portable, et je devrais avoir une estimation de la distance grâce a un capteur de distance. Je m'aide des lignes droites (dans un monde industrialisé comme le notre, les lignes droites abondent) et des croisements de ces lignes comme point de "référence". A partir de là, faire une estimation de la profondeur devrait ne pas être trop compliqué et donc d'ensuite d'en extraire les volumes (on le fait dans les moteurs 3d, grâce à l'inversement de la perspective).
Bon, par contre, apparemment, l'idée du sonar n'est pas si bonne... donc, je vais me rabattre sur un capteur IR ou laser. L'idée du capteur de distance est juste d'estimer la distance de certains points détectes par le RANSAC, donc d'orienté la tourelle dans la direction du "point" d'avoir la distance... et ainsi de suite (le robot etant statique a ce moment la). Lorsque l’environnement virtuel de l'endroit ou ce situe le robot a été établi, celui-ci repart vers a un autre endroit et refait le scan autour de lui... tant qu'il n'est pas environnement connu, il est en mode détection.
Pour le stockage de l’environnement, je pense partir sur un monde représenté en voxel.
Les algos de reconstruction 3d existent deja a partir de l'extraction de point d’intérêt (SIFT, SURF) ou la détection de point de fuite...
C'est l'idée générale... reste à la concrétiser ^^
...
Un petit update pour monter l'avancement du projet. La première version appelé RemoteControl. Une application Android qui prends le contrôle a distance de Roby via Bluetooth. Roby est désormais équipé d'un kit Bluetooth et d'un capteur de distance Infrarouge (malheureusement défectueux ) accroché à la tourelle.
J'attends un nouveau Sharp GP2Y0A02YK (20 à 150cm) de pied ferme pour continuer a travailler sur le "radar" en voxel. J'ai aussi commandé un sonar Ultrasonique SeeedStudio qui sera lui aussi placer sur la tourelle (3cm a 6m).
Voila un screenshot de l'interface A gauche : le virtualpad de commande du corps de Roby Au centre : la distance du capteur IR (en cm) A droite : le virtualpad de commande de la tourelle
Prochaine étape : Une application Android tournant sur l'observateur qui reliera en Wifi le smartphone, accroché dans sa magnifique tourelle en carton (bientôt refaite en alu et plexiglas).
... Dans ce qui se voit : - une interface remanié : plus complète, gestion de la vitesse des moteurs, la tourelle est contrôlée par un "pad analogique" - le scanning : via deux modes en ligne et en mode radar avec deux options. Un point de scan est la moyenne de 5 prises de capteur à 5 ms d'intervalle, 25ms au total plus le temps de déplacement de la tourelle. Le mode en ligne scanne la ligne d'horizon (1 dimension). Le mode radar scanne un zone (2 dimensions). Option "1/2" de la surface de fonctionnement : l'amplitude de la tourelle passe de 160° a 70° horizontalement, et de 60° a 35° verticalement; Option "Qik" qui scanne par pas de 5° à la place de 1°, ce qui permet d’être beaucoup plus rapide en scanner mais moins précis à l'affichage. Le dégrade de bleu indique la profondeur (de 30 a 150cm, bleu vers noir), le gris indique la limite minimum atteinte par le capteur IR. - les switches s'affichent lorsqu'ils rencontrent un obstacle à moins de 15cm (une zone rouge aux quatres coins s'affiche selon les switches affectés).
Dans ce qui ne se voit pas : - la stack protocolaire BlueTooth entièrement revu (plus sur en cas d'interference ou de perte de données partielles) - amélioration du core arduino (ajout du code de scan et du code de déplacement non utilisé pour le moment)
Je ne release pas les sources pour le moment : il reste encore deux ou trois bugs au niveau de l'interface et dans le core arduino. Voila deux screenshots pour faire patienter
La même scène vue par : le mode "scan en ligne" rapide le mode "radar" rapide :
Pour la suite (version 0.3), je vais ajouté le sonar pour avoir une distance jusqu’à 6 mètres (dès que la mesure de l'IR sera plus grande que 130cm, hop je switche sur le sonar... moins précis et moins rapide). Et finir l’odomètre basé sur le temps d'activité des moteurs de propulsion (malheureusement pas très précis car dépendant de l’énergie disponible des piles).
Et lorsque que tout sera stabilisé, je passerai enfin au module "Cerveau + Observateur" (avec un peu de chance ^^).
J'en profite pour demander si quelqu'un sait comment faire pour connaitre le niveau des piles a partir de la carte DFRobot Romeo. Ou si il y a un montage facile a faire pour avoir le status de l’énergie disponible. J'envisage de passer sur une batterie type "modélisme" ou batterie de téléphone portable à la place des 5 piles de 1.5v. Est-ce qu'il est préférable de garder les piles pour l'alimentation des moteurs et un batterie pour les servos et la carte contrôleur ? ou trois batteries ?
...
Le scan radar angle large détaillé (Le plus "impressionnant" et le plus complet : 8 minutes et 45 secondes de scan) Le meme scan en rapide (on saut de 5 en 5 pour la prise de captation en hauteur et en largeur : soit x25 moins "précis"... temps 45 secondes) Le scanline plan large détaille (40 secondes) Le scanline large rapide (12 secondes)
le scan radar angle court détaille (6 minutes) le scan radar rapide (30 secondes) le scanline détaille (9 secondes) le scanline rapide (4 secondes)
...
J'ai fait plusieurs changement sur la base Arduino du robot : - la première modification, la plus notable pour un oeil averti, "exit la tête en carton, et bonjour la tête en plexy". Le tout est nettement plus rigide et permet de faire des scans radar plus précis. La tourelle mobile (la tête donc) reçoit en plus un capteur UltraSon SeeedStudio qui permet maintenant d'avoir une estimation de distance jusqu'à 6 mètres. J'ai gardé le capteur IR beaucoup plus précis et rapide pour les distances entre 25cm et 140cm. - la caisse du robot a été remaniée elle aussi. j'ai supprimé les switchs InfraRouge de devant et remplacer par un capteur IF, j'ai déplace l'un de ces switchs vers l'arriére (qui compte maintenant 3 switchs IR). - J'ai suivi le conseil de BlackTemplar en ajoutant des encodeurs sur les roues avant (maintenant je connais la distance parcourue par le robot), ainsi qu'en ajoutant une boussole (avec accéléromètre) ce qui me permet de savoir dans quelle direction pointe la caisse du robot. - j'ai aussi ajouté un LCD 2x20 pour des diagnostiques internes (sans avoir a connecter le téléphone par Bluetooth). - et le problème d'alimentation a été réglé par l'ajout d'une batterie supplémentaire dédiée aux servos.
Encore quelques évolutions matérielles sont au programme : - une seconde tête en plexy va être réaliser pour recevoir le téléphone et donc de pouvoir utiliser les images de la camera ainsi que les capteurs (GPS...) de celui-ci. - le capteur IR frontal devrait etre changer par un capteur à portée plus courte (comme le GP2D120 IR Sharp de 4 à 30 cm ou le GP2Y0A21YK0F de 10 a 80cm... actuellement c'est un GP2Y0A02YK0F de 30 à 150cm qui est utilisé). - trouver une boussole I2C plus réactive que celle que j'ai prise (Deventech CPMS10, qui est trop lente à mon gout, presque 2 secondes pour avoir un "cap" fiable, peut être dût à un problème d’étalonnage).
A part quelque soudures pour améliorer les liaisons (carte bluetooth) et protéger les encodeurs (le bumper avant de la caisse ne rentre plus, il faut supprimer les pins en soudant directement), je pense que je "tiens", grosso-modo, la base matériel du robot (de toute façon, je suis arriver au bout de toutes les entrées de la carte Roméo ).
Grâce aux encodeurs et à la boussole, j'ai tout ce qu'il faut pour commencer le logiciel de cartographie et de la partie AI qui rendra le robot autonome !