Journal Eloark, mon nouveau robot hybride Raspberry Pi & Arduino écrit en Python

38
30
août
2014

Bonjour cher journal,

J'ai commencé il y a quelques temps un nouveau projet de robotique reposant sur mes jouets préférés : Arduino et Raspberry. L'idée m'est venue après avoir construit mon premier robot. Celui-ci évitait alors remarquablement bien les murs et gazouillait trois voix différentes (Claptrap, R2D2, tourelles de Portal), au gré des interactions avec ses capteurs. Mais il lui manquait une dimension : un système d'exploitation.

Avec un Raspberry Pi, me voilà en capacité de gérer n'importe quel périphérique USB (wifi, micro, webcam, thermomètre, extension d'espace disque, souris traînée derrière pour mesurer vitesse/déplacement …), dont un Arduino ! Et comment faire pour alimenter un Raspberry Pi en mobilité me demanderez-vous ? À l'aide d'une batterie USB de rechargement de smartphones.

C'est là que ça devient intéressant, l'animal peut être logé n'importe où : dans un robot aspirateur, dans une voiture radio commandée, dans un vieux bateau de modélisme au fond du grenier, bref tout ce qui contient des moteurs et des servos.

Actuellement, mon projet est une interface Web avec deux joysticks virtuels qui fait des appels en Ajax dans une boucle infinie sur un serveur en Python/Bottlepy qui transmet ainsi les paramètres à l'Arduino. J'ai en fond de page un retour du stream vidéo de la webcam.

Eloark, robot Meccano

Vous aimez les nimages ? Vous appréciez peut être aussi les clips : https://www.youtube.com/watch?v=nVi4I85nvws

Selon votre choix, la plateforme choisie peut ou non déjà contenir une batterie pour alimenter la partie "puissance" et des capteurs. J'ai fait le choix de ne munir la mienne d'aucun capteur car j'aimerais faire la reconnaissance de l'environnement immédiat avec la bibliothèque de traitement d'image OpenCV.

J'ai été sympa, je vous ai fait la version courte. Si ce genre de projet vous intéresse, j'ai écrit un article qui résume toutes mes recherches courantes.

J'ai publié les sources sous licence CeCILL-B, je suis preneur de toute remarque, idée nouvelle et revue de code !

Tcho !

  • # matériel

    Posté par (page perso) . Évalué à 3.

    tu aurais de bonnes adresses pour acheter un peu tout le matériel ?

    Je reviens de rue Montgallet ou j'aurais pensé trouver au passage un arduino voire un raspberry pi voire des clés usb avec tout un os à brancher sur sa télé et autres « gadgets » et en fait non o_O (j'ai peut-être mal regardé).

    Ton robot se déplace-t-il de manière autonome (d'un point A à un point B, en évitant les obstacles et en connaissant son environnement) ou c'est toi qui le guide ?

    Bravo en tout cas, il a l'air prêt à recevoir plein de nouvelles fonctionnalités sympathiques :-)

    • [^] # Re: matériel

      Posté par (page perso) . Évalué à 5.

      Je suis étudiant : j'achète tout en une seule fois sur Amazon quand c'est possible. Pas ou peu de frais de ports, si j'ai un imprévu retour à l'envoyeur et mon compte est recrédité.

      Dans un premier temps mon projet vise à le contrôler moi même par l'intermédiaire de l'interface web. Plus tard elle ne servira qu'à recevoir le stream vidéo et ce dernier sera étudié pour diriger le robot automatiquement.

      En effet j'ai plein d'idées ! J'ai zieuté les précédents projets qui ont été postés ici et ailleurs, Bleuette l'hexapode, J.O.H.N.N.Y 5 (plus proche du type de plateforme que je cherche a obtenir), il y a de beaux projets créatifs qui inspirent.

    • [^] # Re: matériel

      Posté par . Évalué à 3.

      Je leur ai déjà fait de la pub : MC Hobby
      C'est des gens sérieux, si c'est marqué en stock => c'est vrai
      Si tu as des questions ils répondent et pour couronner le tout le Wiki est impressionnant

      • [^] # Re: matériel

        Posté par . Évalué à 3.

        Je confirme, et pour les débutants anglophobes leur wiki permet de bien commencer ….

  • # FxOS

    Posté par (page perso) . Évalué à 2.

    Oh Oh, z'ai cru voir un Geeksphone Peak (sous FirefoxOS) ;-)

    • [^] # Re: FxOS

      Posté par (page perso) . Évalué à 2.

      On peut être à peu près sûr que tout ce qui tourne dessus tournera mieux ailleurs :P

  • # Beau boulot

    Posté par . Évalué à 2.

    Beau boulot,
    j'ai commencé un truc similaire, mais mes lacunes en électronique me ralentissent …
    avec des conclusions identiques aux tiennes :
    le couple Raspberry + Arduino est génial.
    Pyfirmata pour piloter l'arduino qui dispose de PWM correcte.

    J'ai commencé à regarder du coté de OpenCV pour 2 raisons :
    - gérer le flux videos avec python
    - faire de la reconnaissance de forme
    As tu avancé sur la maitrise de cet outil ?
    J'ai un peu du mal a trouver des exemples simples

    Par contre si cela peu aider les apprentis roboticien, voici un lien qui permet de commander des moteurs plus puissants comme des moteurs de perceuse base de gamme (pour 10 euros : moteur + batterie + chargeur)

    cela fonctionne et c'est de la que j'ai compris qu'il fallait utiliser le pwm de l'arduino et pas celui du rapsberry.

    Merci pour toutes les infos, je vais finir la lecture de ton site :)

    • [^] # Re: Beau boulot

      Posté par (page perso) . Évalué à 1. Dernière modification le 31/08/14 à 11:17.

      Nop, pour le moment j'ai juste regardé comment OpenCV permettait de sortir l'information :
      - écriture d'une image sur le disque
      - écriture d'un clip sur le disque (il faut attendre la fin du clip pour pouvoir l'utiliser)
      - aperçu en live dans une fenêtre qu'OpenCV gère en interne
      - écriture dans la sortie standard, c'est cette dernière possibilité qui est intéressante

      Firmata est l'alternative de Nanpy, mais à priori moins "balèze" (j'ai linké un comparatif dans mon article). Déjà il n'y a pas d'implémentation client de référence en Python, et les 4 qui existent ne sont soit pas à jour, soit ont une syntaxe éloignée de la lib standard Arduino ce qui est dommage. J'ai parlé un peu avec le dev de Nanpy, il est disponible et sympa.

    • [^] # Re: Beau boulot

      Posté par . Évalué à 3.

      Pour OpenCV, de mémoire il existe des exemples simples en C, dans lesquels il est facile (mais alors, très facile) de virer le superflu.

      Celui-ci par exemple, pour la détection de visages.
      Après, pour coder en python (chacun ses défauts héhé) je pense que ça ne doit pas être trop difficile à adapter. Et si jamais un dev C++ passe dans le coin, petit conseil: ne surtout pas essayer d'utiliser le binding C++ d'openCV, c'est juste un coup à être emmerdé avec des comportements étranges ou des fonctions mal documentées (alors que la version C est, elle, bien documentée).

  • # J.O.H.N.N.Y 5 feels alive!

    Posté par (page perso) . Évalué à 4.

    Je suis le créateur de Johnny et il a pas mal évolué. J'ai acheté un beaglebone Black (BBB) et branché une webcam. Je me suis lancé en C++ pour des raisons matérielles liées aux limitations du BBB. Pour le moment il reconnaît les visages, joue différents sons et explore son environnement de manière autonome. L'Arduino est maître de la motricité lorsque le robot explore mais devient esclave du BBB à travers la liaison série lorsqu'un visage est détecté. Le code est loin d'être parfait et il faudra que je réalise aussi une petite vidéo. Ton projet de robot parlant m'avait beaucoup impressionné à l'époque car il correspondait à peut prêt à ce que je voulais faire. Je m'en suis finalement tiré avec un buzzer par manque de place et de matériel. Ton nouveau projet est très original et très bien parti visiblement. Félicitations et qui sait, peut-être qu'un jour nous surprendrons nos robots s'envoyer des messages à l'aide de Salut à Toi.

    • [^] # Re: J.O.H.N.N.Y 5 feels alive!

      Posté par (page perso) . Évalué à 2.

      Pour le langage j'avais peur que le Python traînasse un peu trop, mais finalement le load average est correct et le traitement d'image se fera via OpenCV qui est écrit en langage compilé. Je ne sais pas si le BBB dispose d'accélération matérielle pour un codec vidéo quelconque ?

      Drôle d'implémentation :) Tu as presque deux programmes identiques pour la partie pilotage, l'une en C/arduino l'autre en C++ ? Comment déclenches tu le switch et la reprise d'un programme à l'autre ?

      Mon nouveau projet parlera aussi, mais en temps et en heure, ça me parait secondaire à ce stade. Diriger un robot sans capteurs sera plus complexe, mais reconnaître des visages comme tu l'as fait (pour les suivre par exemple) est beaucoup plus intéressant.

      Alors si je trouve le pilotage de drone à distance bof intéressant car l'intelligence est déportée, voir deux robots autonomes communiquer est une idée de projet très très très attractive !

      • [^] # Re: J.O.H.N.N.Y 5 feels alive!

        Posté par (page perso) . Évalué à 3.

        J'étais aussi parti en python mais cela ne marchait pas en essayant d'adapter les différents exemples trouvés sur internet. En effet, la résolution maximale de ma webcam (640x480) est trop élevée pour le bus USB du BBB. Il faut soit récupérer des images compressées directement (à l'aide des programmes de Lemon Difficult ou rester en 320x240. J'ai préféré la deuxième solution car c'est mon premier programme C++, que je n'y connais pas grand chose et que ça marche. En mode explorateur, l'Arduino a la main et se promène dans la pièce. Régulièrement, il regarde si il a reçu l'instruction via la liaison série pour basculer sur le mode esclave. Lorsque le robot n'a plus détecté de visage depuis un moment, il envoie l'ordre au robot de retourner dans le mode explorateur. Le problème est que la version d'OpenCV installée sur le BBB ne gère pas l'API qui permet de reconnaître les visages pour l'instant, il ne peut que les détecter (j'ai été imprécis dans mon premier message). En plus, le plus gros défaut du BBB est de n'avoir qu'un seul port USB utilisable. Je peux brancher un câble Ethernet mais il ne pourra pas communiquer via le wifi. Il n'y aura pas de messages olé olé pour tout de suite :-).

        Lorsque mon robot sera opérationnel, je posterai ici un journal dans le ton du précédent pour détailler un peu plus l'évolution du projet et fournir le code correspondant. Je suis chimiste et aucune expérience de programmation évoluée. Je découvre tout en même temps et c'est probablement pour ça que mes choix peuvent surprendre. :-)

        Encore bravo pour ton robot très sympa!

      • [^] # Re: J.O.H.N.N.Y 5 feels alive!

        Posté par (page perso) . Évalué à 2.

        Pour reconnaître des visages en utilisant OpenCV sur Raspberry Pi, le site suivant est recommandé: http://thinkrpi.wordpress.com/magic-mirror/ . En 20 mn, tu peux épater tes amis et ta famille (si tu as suffisamment de photos pour faire la partie apprentissage des visages.

  • # Puisqu'on parle de robots :-)

    Posté par (page perso) . Évalué à 4.

    Je me permets aussi de présenter ma création elle aussi à base de Raspberry Pi + Arduino (et pilotage via application iOS) : https://goddess-gate.com/projects/fr/raspi/raspiduinorover (et https://github.com/aboudou/raspiduinorover pour le code / ressources)

    Pour la communication Raspi <--> Arduino, j'ai fait le choix du protocole I2C, et pour iOS <--> Raspi, un protocole TCP basique pour les commandes / retours d'infos, et un flux MJPEG pour le retour vidéo.

    Prochaine étape prévue, mettre en place un système de recharge de la batterie en induction avec une station de recharge dédiée pour éviter tout fil à la patte.

    Bref, c'est sympa de voir que pour un problème donné (pilotage distant et retour vidéo), il y a autant de solutions que de réalisateurs, ça permet de piocher de bonnes idées un peu partout :)

    • [^] # Re: Puisqu'on parle de robots :-)

      Posté par (page perso) . Évalué à 2.

      Je vois que ton projet a environ 6 mois, est-ce que ton appli native iOS aurait pu être remplacée par une appli web selon toi ? Ou certaines choses n'auraient pas encore été supportées ?

      Pour l'I²C, j'ai eu du mal à trouver des documentations claires. Je sais que le Pi et l'Arduino en ont (pins 0 et 1 pour RX/TX sur Arduino c'est bien ça ?) J'ai regardé ton module i2ccom.py c'est propre :) Le module smbus est propre au Raspberry ou bien ?

      Et oui c'est vrai que quand on se lance sans avoir été trop influencé avant, on arrive à une solution naturellement un peu unique, le cocktail dépend de nos choix technologiques.

      • [^] # Re: Puisqu'on parle de robots :-)

        Posté par (page perso) . Évalué à 3.

        Oui, je pense qu'une appli web aurait été possible, avec un autre serveur côté Raspi. Après, j'étais passé via du TCP direct parce que je savais faire, tout simplement :-)

        I2C sur l'Arduino, ce sont les pins A4 / A5 (bibliothèque Wire), D0 / D1 sont les pins pour la communication série (bibliothèque Serial). Le module smbus lié est un module Python à installer en plus, mais il n'est pas spécifique Raspi, il gère juste les communications I2C en général (donc pour toute machine ayant un ou plusieurs bus I2C - voir http://www.acmesystems.it/i2c ).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.