L’idée
Détecter en 3D, la position à 360° et la hauteur de ce qui entoure un robot, sur une portée de moins de 3 mètres sans avoir à faire aucun réglage compliqué. L’objectif est de fiabiliser la détection des robots avec une installation simplifiée pour tout le monde et de le rendre compatible Lego Mindstorm (ev3dev).
Le problème
Recevoir les positions détectées tout autour d’un robot (x,y) ou (angle, distance) avec une période de rafraichissement de moins de 250 ms est un défi. Il est facile d’avoir la distance ou l’angle de l’objet détecté, mais les 2 en même temps sont plus difficiles à obtenir et aussi à miniaturiser, encore plus si on rajoute une dimension de hauteur (3D).
L’installation dans le robot ne doit pas être compliquée et ainsi que le réglage du dispositif. Les systèmes embarquant un moteur, un miroir, un laser professionnel, sont aussi très encombrants et difficile à fabriquer, surtout en DIY (Do It Yourself).
L’objectif est de détecter, soit ce qui s’approche du robot, soit un objet particulier, tel qu’une balise posée sur un autre robot. On doit savoir si ca marche bien ou non très facilement via un retour d’information instantanée (et non pas uniquement du log en mode développeur).
L’histoire
Il existe quelques solutions sur le marché, et la plupart utilise des Lidars. Seulement l’utilisation d’un LiDAR possède certes des avantages de précision mais aussi pas mal d’inconvénients tels que:
- Le prix, un lidar professionnel est un budget important (généralement >2000€)
- L’angle mort, et donc on ne peut voir qu’une partie (généralement devant le robot)
- Les réglages d’assiette nécessaires
- Il y a toujours qu’une seule assiette de detection
- La mécanique utilisée avec un moteur et un laser qui tourne
Ces Lidars n’étant pas très accessibles pour des jeunes équipes de robotique, j’ai donc cherché une solution pour pallier aux inconvénients d’un LIDAR professionnel et rendre plus accessible ce type de détection.
J’ai créé un premier concept avec un moteur de CDROM et un simple laser classe 1 (laser IFM) qui permettait de détecter une balise catadioptre 3M. Les calculs étaient effectués avec une Arduino Micro, peu puissante, mais on avait prouvé que c’était suffisant. Cela fonctionnait bien en terme de détection d’angle (à l’aide d’un capteur infra rouge donnant le départ du tour du moteur). La technique pour calculer la distance fût de connaitre la largeur de la balise et d’en déduire les timing de détection. Cependant le réglage d’assiette afin de respecter les alignements horizontaux demandait trop de temps, mais étaient indispensables pour détecter de façon fiable à moins d’un mètre.
Voir la vidéo tout en base de cette page
En résumé, c’était extrêmement difficile et pénible de maintenir cette fiabilité, surtout en mode “Rush”. Dès que le robot était en maintenance entre les matchs, il fallait tout régler une nouvelle fois, et vous pouvez imaginer la galère.
Ensuite, nous avons découvert les détecteurs ToF (Time Of Flight), qui sont utilisé dans les téléphones portables pour le focus des appareils photos.
J’ai testé les différentes versions de détecteurs ToF. Après une multitudes de tests et d’idées, j’en ai trouvé une qui fonctionne finalement correctement, avec le bon modèle de ToF qui convient le mieux. La disposition associée a dû être extrêmement optimisée afin d’atteindre nos principaux objectifs et hypothèses, à savoir:
- Une vue à 360° sur une distance maximum de 3m,
- une actualisation rapide des données, inférieure à une période de 200 ms si possible,
- un réglage simple et unique lors de la programmation, mais automatique pendant les préparations des matchs de la coupe de robotique,
- Détecter sur plusieurs zones en hauteur, ou connaitre la hauteur de détection,
- sur cette position, on n’est pas au millimètre, une résolution de 3 ou 4 centimètres par pallier n’est pas trop grave.
- un mode de debug et une visualisation instantanée.
Fonctionnement
La première version (version actuelle) permet déjà de détecter 2 types de chose:
- N’importe quel objet sur un rayon de 80cm (du blanc ou du noir),
- une ou plusieurs balises créées en film réfléchissant micro-prismatique (permet de faire une balise cylindrique, tout en gardant une très bonne distance de détection).
La particularité intéressante est la zone de détection en hauteur. Actuellement, pour respecter la fréquence de rafraichissement imposée, il n’y a que 2 zones de hauteur, la partie inférieure au capteur, et la partie supérieure. Il sera possible dans une prochaine version de connaitre plus précisément ce nouveau paramètre de hauteur de ce qui est détecté (16 zones possibles en contre partie de la diminution de la fréquence de rafraichissement).
L’affichage sur les panneaux de LED affiche soit un point vert par zone, pour les objets détectés, soit le logo PM-ROBOTIX pour chaque balise catadioptre détectées.
Un mode permet de détecter si on veut toucher la balise avec 2 mains, et permet d’afficher un texte pour le moment. D’autres options sont en cours de test.
Ce module communique en I2C et est donc compatible avec du Lego Mindstorm ou un Raspberry Pi ou toute autre carte électronique qui possède un port I2C.
Les bénéfices et les avantages
- Fiabilité de détection sur une distance d’1,20 mètres avec perturbation lumineuse et IR.
- Détection sur 360° sans angle mort mécanique.
- Rapidité de traitement: Acquisition des données toutes les 200ms, soit 5Hz, avec calculs, mise à jour de l’affichage, et transmission incluses.
- Compatible avec EV3dev.org (Lego Mindstorm).
- Affichage sur bandes de LED ou panneaux de LED en option (module interchangeable à l’avenir).
- Installation facile sans réglage d’assiette important.
- Résolution de 1 cm sur moins d’un 1 m et de 2,5 cm sur 2 m.
- Laser classe 1, sans danger, à condition de les utiliser dans leurs conditions raisonnables prévisibles.
- Visualisation instantanée avec LED/Panneaux de LED.
- Taille réduite à un cylindre de 10 cm de diamètre (10 cm de hauteur avec panneaux de LED ou 4 cm de hauteur minimum avec une bande de LED).
- Socle imprimable en impression 3D.
- Réception des données avec une interface I2C (3V3,ou 5V)(commandes et données filtrées et calculées) ou SERIE (données brutes).
- Composants facilement remplaçables.
- Ajout d’un paramètre de hauteur; actuellement 2 zones de hauteur de détection sont configurées, et l’objectif est de connaître la hauteur précise.
- Coût moins onéreux qu’un Lidar professionnel.
- Le coût matériel du premier prototype ci-dessous est estimé à 360€ (ToF) + 40€ (Teensy 4.1) + 20€ (connecteurs électroniques) + 15€ (3D filaments) = 435€ (+180€ de panneaux de Leds en option).
Résultats
Photos
Démonstration du concept
Composition
Une Teensy 4.1 pour avoir assez d’entrées/sorties, facilement remplaçable en cas de problème.
Beaucoup de ToF vl53l1x (Pololu) sur une connexion à 5 fils chacun.
Carter en impression 3D PLA.
Beaucoup de fils et encore des fils 😉
Un programme en C++ qui gère la configuration spécifique de chaque ToF, la synchronisation des données, le traitement de calcul ainsi que l’affichage du résultat sur les LEDs. Tout est sur Github au fur et à mesure des développements.
Une architecture de connexion et de placement optimisée (diffusion ultérieure des explications techniques détaillées).
Beaucoup de conception 2D et 3D sur Fusion 360 (diffusion ultérieure des explications techniques détaillées).
Futures améliorations et upgrades
Je travaille actuellement sur la 2ème version pour créer un module PlugAndPlay le plus simple possible. L’objectif est de permettre d’être utilisé très facilement par d’autres avec plusieurs options d’affichage LED suivant le budget, ainsi que la compatibilité avec ev3dev, peut-être avec ces options en DIY.
Le bloc sera par défaut sans LED, et il sera possible de plugger le module led souhaité.
Effectuer des tests plus poussés afin de qualifier les perturbations éventuelles et augmenter la fiabilité si plusieurs balises sont utilisées au même endroit.
Une autre amélioration sera de donner plus précisément la hauteur de détection de l’objet pour avoir pleinement cette nouvelle dimension dans les données et donc ce que l’on peut appeler la 3D.