Bagels, robots et aventures dans le métro : part 2

bagel with overlay of detection dimensions
Bagel detection
Estimated reading time: 6 minutes

Plongée dans le hackathon Viam d’ACN, inspiré de la ville de Montréal.

(Deuxième partie d’une série de deux articles. Vous pouvez lire la partie 1 ici).

J’apprécie tellement plus mon Roomba maintenant”

Flo Herra-Vega, CEO and CTO, AlleyCorp Nord

Lundi 23 mai 2023. Jour du hackathon

Les participants ont créé un compte Viam, ont demandé l’accès à notre organisation et ont tenté de se connecter aux robots via ssh. Cependant, la plupart des tâches ont été accomplies via le SDK Viam avec les informations d’identification accessibles via l’application Viam, où les deux rovers et le grand bras avaient été mis à disposition. La plupart des participants ont utilisé le SDK Python, mais un rebelle a choisi Golang.

Ingénieur logiciel au travail, code de débogage.

La ligne verte

Nous avons tracé une « simulation de métro » sur le sol à l’aide de ruban adhésif vert.

Malheureusement, le code du tutoriel utilisait une version obsolète de la bibliothèque Viam. Mais nous avons réussi à la mettre à jour pour faire fonctionner notre robot.

Notre premier défi a été d’affiner la sensibilité du détecteur vert. Nous avons sélectionné la couleur à partir d’une image prise par la robocam et ajusté la teinte en conséquence. Avant que nous n’apprenions à recadrer numériquement les images afin d’ignorer le bruit de fond, le robot a fini par porter un chapeau en forme d’assiette en papier, à la grande joie de tous. Finalement, le robot a réussi à suivre la ligne d’un bout à l’autre.

Julien vérifiant la vue de la caméra du rover sur l'itinéraire, via son ordinateur portable.
Julien vérifiant la vue de la caméra du rover sur l’itinéraire.

Pour indiquer visuellement les stations d’arrêt, nous avons d’abord utilisé des post-its roses. Nous avons défini la teinte rose dans le service de vision du détecteur de couleurs. Cependant, nous avons rencontré un problème : l’appareil photo ne démarrait pas. Après quelques manipulations, nous avons découvert que la température de la teinte choisie était trop proche de celle des couleurs non détectées (blanc, gris et noir). En sélectionnant une teinte plus proche du rouge, nous avons finalement détecté les post-its.

Deux ingénieures logiciels se sont concentrés sur leurs ordinateurs portables sous la supervision d'un responsable.
Les hackathons sont difficiles mais vraiment amusants quand les choses fonctionnent enfin.

Nous avons été confrontés à un problème d’ « arrêt prématuré », le robot confondant les teintes roses sur la moquette brune pour des stations. Nous avons surmonté ce problème en augmentant le seuil de taille pour la détection. Mais cela a provoqué un nouveau problème : lorsque le robot était sur le point d’arriver à la station, le marqueur sortait partiellement de l’image et la partie dans l’image n’était pas assez grande pour déclencher la détection. Pour résoudre ce problème, nous avons décidé d’utiliser des marqueurs de station bleus, afin d’augmenter le contraste avec la moquette.

Un problème subsistait : la station d’arrêt était parfois détectée à une légère distance de la station réelle. Pour résoudre ce problème, nous avons mis en place une machine à états.

Notre robot porte un chapeau en assiette en carton.
Notre robot a fini par porter un chapeau en assiette en carton…

Une machine à états pour les arrêts de metro

Nous avons défini nos états : drive, approach, station, et bagel.

Dans l’état drive, le robot suit la ligne verte tout en recherchant des bagels et des stations. Lors de la détection d’un bagel, il entre dans l’état bagel. Si une station est détectée, il passe à l’état approach.

Dans l’état bagel, nous prenons le temps de réfléchir à la gloire des bagels avant de revenir à l’état drive. Nous avons dû retirer manuellement le bagel du cadre, sinon la session de contemplation recommençait immédiatement.

L’état approach fonctionne de la même manière que l’état drive. Le robot cherche toujours des bagels, mais la détection de la station est inversée. Nous attendons qu’une station ne soit plus détectée, en supposant que cela indique que nous sommes au-dessus de la station, et entrons dans l’état station.

L’état station est une brève pause accompagnée par les mélodies harmonieuses du STM, suivie d’un retour à l’état drive.

Si aucune ligne ou station n’est détectée pendant trois cycles consécutifs, le robot se perd et cesse de fonctionner. Nous avons ensuite ajouté un état lost où le robot tente de localiser la piste pendant un nombre déterminé de cycles avant d’abandonner.

La mascotte de notre entreprise, Nordy, fait une balade amusante sur le rover.
La mascotte de notre entreprise, Nordy, fait une balade amusante sur le rover.

Son

Nous avons configuré un haut-parleur Bluetooth pour qu’il fonctionne avec chacun des rovers. Nous avions deux sons personnalisés : le carillon du métro à jouer aux arrêts, et la sirène du chasse-neige de Montréal à jouer lorsque le deuxième rover se déplace dans la pièce. Nous avons réussi à jouer le son via la ligne de commande et en utilisant des bibliothèques python exécutées à partir du raspberry pi.

Pour jouer des sons sur le rover via le SDK tout en exécutant les scripts du rover depuis nos ordinateurs portables, nous avons essayé d’écrire un service de son à appeler via viam-server. Nous avons rencontré quelques problèmes car viam-server n’avait pas accès aux bibliothèques que nous avions installées sur le pi, mais il n’y avait pas de documentation claire sur ces limitations, ni de configurations par défaut pour les haut-parleurs ou le son. Nous avons également rencontré des problèmes avec l’implémentation des modules personnalisés, ce qui nous a obligés à quitter manuellement un service en panne pour éviter que le système entier ne tombe en panne.

Détection du bagel

Viam permet d’ajouter des services « détecteurs » qui utilisent un modèle ML pour renvoyer les boîtes englobantes des objets identifiés. Voici comment nous avons fait fonctionner ce service :

En tant qu’ingénieurs ML pleins de ressource, nous avons cherché des modèles de vision par ordinateur pré-entraînés dans le bon format (Tensorflow Lite ! aka ‘model.tflite’). TF Hub avait un petit EfficientNet, parfait pour les RPI. Entraîné sur l’ensemble de données COCO, ce modèle comportait des étiquettes pour les beignets, les gâteaux et les pizzas, les proches parents culinaires du bagel ! Les détails sont disponibles pour un réglage fin.

  • Nous avons créé un modèle avec l’interface utilisateur de Viam et téléchargé les poids (conseil : faites correspondre le nom du modèle et le nom du fichier !).
  • Sous l’onglet Services, nous avons créé un modèle pouvant se connecter aux poids du modèle.
  • Nous avons conçu un service de vision qui tire parti de ce modèle ML (en clair : Modèle → modèle ML → Service de vision avec le modèle ML).
  • Nous avons ajouté la transformation de la caméra pour tracer les boîtes englobantes et voilà, un détecteur de bagels instantané !
Bagel with overlay of sensory dimensions for robotics
Bagel detection

Prochains objectifs

Nous avons beaucoup d’idées pour des projets futurs, comme faire fonctionner le bras Yahboom, configurer nos bras/servos personnalisés, créer une ligne de commande personnalisée en tant que service, et créer des composants personnalisés tels qu’un capteur de température.

Du point de vue du projet, nous aimerions avoir un Pi de bureau dédié, que nous pourrions continuer à améliorer pour en faire un petit assistant.

Pour en savoir plus sur la façon dont votre organisation pourrait intégrer la robotique et l’apprentissage automatique, contactez-nous pour voir comment nous pouvons vous aider!

Merci à Michelle King et Hailey Ellbogen pour la logistique événementielle.

Merci aussi à Arnaud Fosso Pouangue, Becks Simpson, Brock Jenken, Eren Bilgin, Julien Blin, Kim Phan, Ksenia Nadkina, Louis-Philippe Perron, Mona Ghassemi, Raphael Souza, et Rob Linton pour leur participation à l’événement et pour avoir contribué par leurs notes à ce billet de blog.

Notre code : https://github.com/AlleyCorpNord/viam-rover