Hackathon KanoRobot : une mascotte pour Kanoma

Quel merveilleux timing que celui de lancer un hackathon en février 2020 ! En commençant par l’appel à idées l’an dernier, les grands enfants que nous sommes avaient été inspirés :

  • « On a des voitures télécommandées ? » Forcément après le succès du Meetup de Tugdual Grall avec les AnkiOverdrive branchées sur un Kafka…
  • « Qu’importe le sujet je veux faire du Kotlin et du Rust »
  • « C’est compliqué de faire de l’IA pendant un hackathon ? »
  • « On pourrait tester les Lego Mindstorm ? »

Et puis, ….. la crise du Covid est venue remettre quelque peu en cause notre volonté d’organiser une journée où 20 développeurs se réuniraient pour coder jusqu’au bout de la nuit…

Avance-rapide : 18 mois plus tard

Kanorobot est là ! C’est le modèle R3Dev4 de Lego Mindstorm v3

La boite de Lego ne tenait plus en place… Évidemment, la boite n’est pas restée scellée pendant 18 mois. Il a fallu tester, s’assurer que chaque moteur et chaque capteur étaient fonctionnels, préparer le terrain un minimum. Mais les bases étaient posées, nous allions préparer la nouvelle mascotte de Kanoma, notre Kanorobot !!
Nous avons investi dans une boîte de Lego Mindstorm v3. Le choix des Lego Mindstorm s’est fait suite à la découverte d’ev3dev : c’est un OS basé sur Linux-Debian qui s’installe sur un Raspberry Pi, et qui permet de prendre le contrôle des moteurs et capteurs Mindstorm via diverses API. Les langages supportés sont nombreux (Python, Java, Go, Rust, JS et bien d’autres)

La préparation

Pour être sûr de pouvoir coder sereinement lors de cette journée, quelques prérequis étaient nécessaires :

  • acheter le matériel nécessaire (Lego Mindstorm, Carte MicroSD, dongle Wifi, dongle Bluetooth, piles, Lego Dots pour la déco)
  • monter un premier modèle Lego Mindstorm : choix
  • flasher la carte SD et installer ev3dev
  • établir la connexion SSH et lancer les HelloWorlds Java et Python
  • tester les moteurs et comment exécuter du Java et du Python
    • Un premier projet Java de type HelloWorld a été poussé : https://github.com/pclainchard/ev3devJavaSamples
    • Un second projet pour tester le déploiement d’un SpringBoot basique qui a échoué (450 secondes de temps de démarrage, puis crash du Raspberry…)
    • Une classe Python pour tester les capteurs de proximité et de lumière
Test de moteurs

Le jour J

Plusieurs sujets de secours avaient été préparés, mais nous avons voulu nous concentrer sur la création de cette mascotte. Afin de respecter les distances sanitaires, la Team s’est répartie en petits groupes, avec chacun ses responsabilités, et ses technos à tester. Bonus : lors du kick-off de la journée, une rapide présentation Lobe.ai a été faite. Cette solution développée par Microsoft permet de s’initier au Machine Learning et de créer des modèles TensorFlow très facilement. Les équipes se sont donc organisées de façon à pouvoir travailler chacun sur sa brique.

  • Une équipe en charge de la création d’un modèle d’IA
  • Une équipe Front qui mette à disposition un site pour contrôler le robot
  • Une équipe Back en charge de développer le proxy Front/Back et les méthodes exposées
  • Une équipe Back chargée de coder l’interface avec les moteurs Lego Mindstorm
  • Une équipe Bonus pour remonter un nouveau modèle, car celui monté précédemment ne laissait pas libre les ports USB nécessaires pour brancher le dongle Wifi ou Bluetooth…
Un nouveau modèle en urgence…

Création d’un modèle d’intelligence artificielle avec Lobe.ai

Coté Front

Avec Lobe.ai nous avons entraîné un modèle pour qu’il soit capable d’identifier quelques actions clefs de notre Tribu (« C’est la mêlée », « La cloche de la réussite », « Nathalie s’est fait ghoster », « Aperooooo »). Chaque action pourra ensuite être liée à une routine exécutée sur le robot.
Pour simplifier l’apprentissage, nous avons préparé quatre icônes sur quatre couleurs distinctes.
La création du modèle peut se faire en important un lot d’images pour chaque Label, ou bien se faire en live avec une webcam. Nous avons utilisé cette seconde méthode pour avoir environ 150 photos pour chaque catégorie, puis lancé un apprentissage « rapide ». Lorsqu’une photo est mal identifiée, on peut corriger corriger le Label pour guider l’apprentissage.
Lorsque nous avons été satisfait des premiers tests, nous avons exporté un model TensorFlow.js. Ce modèle est compatible avec la WebApp développée par la Team Front.

Développement du Front

Lobe.ai met à disposition une application de démonstration faite en React.
Nous avons décidé de surcharger cette application pour permettre d’appeler les fonctions du Robot.

L’application a été déployée sur Netlify en faisant le lien direct avec notre projet Gitlab : https://kanorobot.netlify.app

  • L’onglet par défaut permet d’exécuter les commandes simples, et de tester la fonctionnalité « Text-to-speach » du BrickPi
  • L’onglet « Kamera » permet de charger l’application WebStarter de Lobe qui utilise votre caméra pour identifier les icônes apprises par notre modèle TensorFlow.js

Développement du Proxy

Une API Node.js fait le proxy entre le Front et le Robot, appelle les services exposés par KanoRobi, et à terme enverra et recevra des Webhooks Slack. Quelques tests ont été réalisés pour également appeler les API du KanoMiroir (le second projet de Hackathon 2021 chez Kanoma !! 🤩 )

Le proxy entre le Front et le Raspberry BrickPi

Développement du Back

Pour prendre le contrôle des moteurs Lego Mindstorm, nous avons testé plusieurs langages (Java, Python, JS), pour retenir le Python. Des exemples d’implémentations sont disponibles sur GitHub (ici) et nous ont permis de rentrer dans le détail des commandes qui peuvent être exécutées.

En revanche, il ne faut pas se le cacher, c’est bien sûr la partie la plus complexe. Avant de pouvoir faire faire la danse du ventre à notre petit robot, il faut bien comprendre le fonctionnement des moteurs et des capteurs.

L’API Back déployée sur le Raspberry BrickPI

Une API Flask en Python permet d’interagir avec les moteurs du robot R3Dev4. Après analyse, il aurait peut être été plus pertinent de se baser sur l’API WebControlledTank (comme par exemple dans le programme « EV3D4WebControl.py »). A tester dans un avenir proche !

Chaque moteur et capteur du robot connecté à la base Lego Mindstorm est configuré dans la classe Python principale. Après avoir bindé le port sur lequel il est branché (4 ‘in’ pour les capteurs, 4 ‘out’ pour les moteurs), on peut les contrôler et les utiliser. Pour chaque besoin, chaque fonction, il suffit ensuite de décrire le comportement de tous les moteurs. Par exemple, une fonction “avancer” permet d’effectuer une rotation des deux moteurs de type “Roue”, et d’effectuer des rotations selon des paramètres définis (nombre de rotation, vitesse, etc).

Nous avons commencé à développer plusieurs fonctions permettant d’interagir avec ces moteurs et capteurs mais nous n’en sommes qu’aux prémices de ce que peut devenir le Kanomabot ! 

Ce qu’il reste à faire

Comme pour tout hackathon, nous avons été pris par le temps, une partie du code est du Quick&Dirty, mais le plus important était de passer une super journée. Pour finaliser le projet, quelques actions seront encore nécessaires :

  • Tester la chaine complète Front React > Back NodeJS > Robot LEGO en réglant les problématiques de réseau local/web
  • Déployer le projet Proxy proprement, en variabilisant nos URLs dans les variables de CI/CD
  • Corrections/Améliorations ergonomie de l’IHM
  • Optimisation de la reconnaissance d’images / Gestion d’envoi des commandes (Timeout/Sleep) : actuellement l’appli émet des messages en continu dès qu’une icône est reconnue. Il faudrait pouvoir mettre la reconnaissance en pause dès qu’une certitude de 100% est atteinte
  • Bonus : Gestion de l’authentification via compte Google Kanoma

Vivement la prochaine étape !!! 🚀🌌

S’abonner
Notifier de
guest
2 Commentaires
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] Le KanoRobot, une histoire de Legos visiblement mais je ne vous en dit pas plus. Je vous laisse le plaisir de découvrir l’article sur le sujet, c’est ici. […]

trackback

[…] Kanorobot 👀 […]