Table des matières:

Scanner laser Raspberry Pi : 9 étapes (avec photos)
Scanner laser Raspberry Pi : 9 étapes (avec photos)

Vidéo: Scanner laser Raspberry Pi : 9 étapes (avec photos)

Vidéo: Scanner laser Raspberry Pi : 9 étapes (avec photos)
Vidéo: DIY Laser Scanner with TfMini and Raspberry Pi | ROS Tutorial for beginners #7 2024, Juillet
Anonim
Image
Image
Scanner laser Raspberry Pi
Scanner laser Raspberry Pi

Le Laser Scanner est un dispositif de système embarqué Raspberry Pi capable de numériser des objets dans des fichiers de maillage.obj pour la reproduction à l'aide de l'impression 3D. L'appareil le fait en utilisant un laser linéaire et une PiCam intégrée pour effectuer une vision par ordinateur. Le laser est positionné à 45 degrés de travers par rapport au laser et projette une ligne rouge vif sur une tranche verticale de l'objet. La caméra détecte la distance de la tranche par rapport au centre pour donner une tranche de maillage. L'objet est tourné sur le plateau rotatif et le processus est répété jusqu'à ce que l'objet entier soit numérisé. Le fichier.obj généré est finalement envoyé par courrier électronique à l'utilisateur, ce qui rend le système entièrement autonome et intégré.

Ce Instructable expliquera comment l'appareil a été construit, quelques résultats et les étapes futures.

Étape 1: Inspiration

Inspiration
Inspiration
Inspiration
Inspiration

En tant que maker passionné, je pratique l'impression 3D et la modélisation solide depuis plusieurs années maintenant. J'ai travaillé avec de nombreux outils de prototypage différents, des routeurs CNC aux découpeuses laser en passant par les imprimantes 3D. Un appareil que mon makerspace local n'a pas encore acheté est un scanner 3D - et je peux vous dire pourquoi.

Les moins chers (quelques centaines de dollars) n'étaient pas fiables, nécessitaient des conditions parfaites et produisaient toujours des résultats assez miteux. Les plus chères étaient… eh bien, chères, allant jusqu'à plusieurs milliers de dollars, ce qui fait que sa fonction n'en vaut pas la peine dans de nombreux cas. En plus de cela, la plupart du temps, je choisis de prendre des mesures et de concevoir un modèle à partir de zéro plutôt que de traiter le maillage de surface généré à partir d'un scan.

Pour cette raison, je voulais construire un scanner autonome économique pour voir à quel point je pouvais numériser un objet à l'aide de composants standard.

Après avoir fait quelques recherches, j'ai vu que de nombreux scanners 3D utilisaient une plate-forme rotative, puis une variété de capteurs différents pour mesurer la distance par rapport au centre afin de construire un modèle de rotation. Beaucoup d'entre eux utilisaient deux caméras similaires à celle de la Kinect. Je suis finalement tombé sur l'Yscanner qui est un scanner basse résolution utilisant un laser. En termes de simplicité et de faisabilité, cette technique laser, dans laquelle un laser est décalé par rapport à une caméra pour mesurer la distance par rapport au centre, ressemblait à un chemin clair vers l'avant.

Étape 2: Outils et pièces

Les pièces:

  • Framboise Pi 35,00 $
  • Caméra Raspberry Pi V2 30,00 $
  • LED, résistances et fils
  • Filament d'impression 3D
  • Feuilles de bois 12x12x0.125
  • Matériel M3
  • Moteur pas à pas - 14 $
  • Laser ligne - 8 $
  • Pilotes de moteur pas à pas LN298 - 2,65 $
  • Bouton-poussoir en métal - 5 $

Outils:

  • Fer à souder
  • Découpeur laser
  • Imprimante 3D
  • Tournevis
  • Pinces

Étape 3: Conception de haut niveau

Conception de haut niveau
Conception de haut niveau
Conception de haut niveau
Conception de haut niveau

Le composant central de cette conception est la ligne laser qui se projette sur une tranche verticale des objets. Cette projection pourrait être capturée sur la piccamera, avoir sa perspective corrigée, puis filtrée avant le traitement de l'image. Dans le traitement d'image, la distance entre chaque segment de la ligne du centre de l'objet pourrait être collectée. En coordonnées radiales, cette image produirait à la fois les composantes r et z. La troisième dimension,, est ensuite obtenue en faisant pivoter l'objet vers une nouvelle tranche. Ce concept est illustré dans la première figure.

Pour effectuer les actions décrites ci-dessus, j'ai utilisé un Raspberry Pi comme unité de calcul centrale. J'ai attaché un moteur pas à pas et un pilote de moteur au Pi, alimentés par une alimentation externe 5V et contrôlés par les broches GPIO du Pi. Un laser de ligne a été placé sur la ligne 3,3 V du Pi et une PiCam a été connectée à l'entrée de la caméra du Pi. Enfin, un simple bouton abaissé a été installé et une LED d'état pour indiquer à l'utilisateur dans quel état se trouve le système. Le système complet est résumé dans un schéma fonctionnel du système.

Dès le départ, il était prévu de loger l'électronique dans un boîtier découpé au laser maintenu par des rainures en T et du matériel M3. L'électronique serait cachée à la vue dans un compartiment inférieur et un couvercle permettrait un accès facile au placement d'objets sur le plateau rotatif. Ce couvercle est nécessaire afin de minimiser la quantité de lumière qui fuit dans le système, car cette lumière externe peut produire du bruit lors du balayage final.

Étape 4: Matériel

Matériel
Matériel
Matériel
Matériel
Matériel
Matériel

Comme vu ci-dessus, avant de commencer la découpe laser ou l'impression 3D, j'ai utilisé Autodesk Fusion 360 pour créer un modèle 3D détaillé de notre conception. En résumé, l'appareil est une simple boîte avec un couvercle avec des charnières découpées au laser. Il y a deux couches principales de l'appareil: le lit électronique et le lit principal, avec des trous pour que les fils passent entre les deux couches.

La majorité de notre boîte a été fabriquée avec une découpeuse laser, les motifs étant produits dans Fusion 360 et découpés sur une découpeuse laser Epilog Zing 40 W. Nos conceptions sont illustrées dans les figures ci-dessus. En partant du haut à gauche vers la droite, les pièces sont le lit principal, le lit électronique, deux pièces pour le couvercle, la pièce arrière, la pièce avant et les deux pièces latérales. Dans le lit principal, il y a trois découpes principales: une pour monter le moteur pas à pas, une pour acheminer les fils du laser et une pour acheminer le câble large de la PiCam. La pièce de lit a des trous de montage pour fixer le Pi, la planche à pain et le pilote de moteur et une découpe plus grande pour accéder au moteur pas à pas. Les pièces du couvercle s'emboîtent simplement pour former la pièce triangulaire vue ci-dessus et la charnière est une simple extrusion qui correspond à la largeur du diamètre du trou des panneaux latéraux. La pièce arrière et l'une des pièces latérales ont des fentes sur le côté afin que les ports du Pi (HDMI, USB, Ethernet, Power) soient facilement accessibles. L'avant est une pièce simple dans laquelle j'ai finalement percé des trous avec une perceuse à main pour monter le bouton et la LED. Comme on le voit sur toutes les pièces, nos pièces sont maintenues ensemble par du matériel M3 à l'aide de joints en T et de fentes. Il s'agit d'une méthode de maintien des pièces découpées au laser de manière orthogonale et sécurisée. Les ailettes des pièces s'alignent avec les fentes des autres pièces et la coupe en forme de T sur les bords permet à un écrou M3 de s'y coincer sans tourner. Cela nous permet ensuite d'utiliser une vis M3 pour verrouiller les pièces ensemble avec très peu de marge de manœuvre sans que l'assemblage soit totalement permanent.

J'ai choisi de faire la majorité de nos pièces avec une découpeuse laser en raison de sa rapidité et de sa facilité. Cependant, je devais encore imprimer en 3D certaines pièces en raison de leur géométrie 3D qui serait plus difficile à créer sur le cutter. La première pièce était le support laser ligne. Cette pièce devait être montée sur le lit principal à 45 degrés de la vue de la caméra et avoir un trou de sorte que le laser puisse s'y insérer par friction. J'ai également dû créer un support de moteur parce que l'arbre du moteur était si long. Le montage par friction s'insère dans les pièces découpées au laser et abaisse le plan auquel le moteur est attaché de telle sorte que la plate-forme rotative affleure le lit principal.

Étape 5: Électronique

Électronique
Électronique

Le câblage matériel de ce projet était très simple car le scanner 3D ne nécessitait pas trop de périphériques. Un moteur, un bouton, une LED, un laser et une caméra devaient être connectés au Pi. Comme indiqué, je me suis assuré de connecter des résistances en série avec chaque broche que nous avons utilisée afin de protéger les broches. Une broche GPIO était dédiée au contrôle de la LED d'état, qui s'allumait lorsque l'appareil était prêt à être utilisé et pulsait avec PWM lorsque l'appareil fonctionnait. Une autre broche GPIO était connectée à un bouton tiré vers le haut, enregistrant HIGH lorsque le bouton n'était pas enfoncé et LOW lorsque le bouton était enfoncé. Enfin, j'ai dédié quatre broches GPIO à l'entraînement du moteur pas à pas.

Étant donné que notre moteur n'avait à avancer que dans une certaine mesure sans nécessiter de contrôle de la vitesse, nous avons opté pour un pilote de moteur pas à pas plus simple (L298N) qui intensifie simplement les lignes de commande pour alimenter les entrées du moteur. Pour savoir comment faire fonctionner les moteurs pas à pas à un niveau très bas, nous nous sommes référés à la fois à la fiche technique L298N et à la bibliothèque Arduino. Les moteurs pas à pas ont un noyau magnétique avec des doigts perçants de polarité alternée. Les quatre fils sont enroulés pour contrôler deux électro-aimants qui alimentent chacun un doigt opposé dans le moteur. Ainsi, en inversant la polarité des doigts, nous pouvons pousser le stepper d'un pas. Avec cette connaissance du fonctionnement des steppers au niveau matériel, nous avons pu contrôler les steppers beaucoup plus facilement. Nous avons choisi d'alimenter notre moteur pas à pas à partir d'une alimentation 5V en laboratoire plutôt que du Pi en raison de sa consommation de courant maximale d'environ 0,8 A, ce qui est plus que ce que le Pi pourrait fournir.

Étape 6: Logiciel

Logiciel
Logiciel
Logiciel
Logiciel
Logiciel
Logiciel
Logiciel
Logiciel

Le logiciel de ce projet peut être divisé en quatre composants principaux qui interagissent ensemble: traitement d'image, contrôle moteur, création de maillage et fonctions intégrées.

Pour résumer le logiciel, nous pouvons nous tourner vers le premier chiffre. Au démarrage du système, le.bashrc se connecte automatiquement au Pi et commence à exécuter notre code python. Le système allume le voyant d'état pour indiquer à l'utilisateur qu'il a été démarré correctement et attend que le bouton appuie. L'utilisateur peut alors placer l'article à numériser et fermer le couvercle. Après avoir appuyé sur le bouton, la LED clignote pour informer l'utilisateur que l'appareil fonctionne. L'appareil bouclera entre le traitement d'image et le contrôle du moteur jusqu'à ce que la rotation complète soit terminée et que toutes les données d'objet soient collectées. Enfin, le maillage est créé et le fichier est envoyé par e-mail à un e-mail présélectionné. Cela redémarre le cycle et la machine est prête à effectuer un autre balayage en appuyant sur un bouton.

Traitement d'image

La première chose mise en œuvre a été de traiter une image capturée afin d'extraire les informations stockées dans l'image sous une forme qui pourrait être utilisée pour créer un tableau de points dans l'espace. Pour ce faire, j'ai commencé par prendre une photo de l'objet sur la plate-forme avec tout le bruit de fond créé par le laser éclairant le dos de la boîte et se dispersant. Cette image avait deux problèmes principaux dans sa forme brute. Premièrement, l'objet était vu sous un angle avec une perspective élevée et deuxièmement, il y avait beaucoup de bruit de fond. La première chose que je devais faire était de tenir compte de cet angle de vue car l'utilisation de la photo telle quelle ne nous permettrait pas de déterminer une hauteur d'objet cohérente. Comme le montre la deuxième figure, la hauteur de la forme en « L » à l'envers est cohérente; cependant, du fait qu'un côté est plus long que l'autre, ils semblent avoir des hauteurs différentes au bord le plus proche du spectateur.

Pour résoudre ce problème, j'ai dû transformer l'espace de travail de l'image en un rectangle à partir de la forme trapézoïdale dans laquelle il se trouvait auparavant. Pour ce faire, j'ai utilisé le code fourni par ce lien, qui lorsqu'on lui donne une image et quatre points, recadre l'image entre les quatre points et transforme l'image recadrée pour compenser la perspective. Cette transformation utilise les quatre points pour créer un rectangle au lieu d'une forme de type trapèze comme le montre la troisième figure.

Le problème suivant à résoudre était celui du bruit de fond sous forme de lumière extérieure et de lumière réfléchie par le laser lui-même. Pour ce faire, j'ai filtré la lumière à l'aide de la fonction inRange() d'OpenCV. J'ai réglé le seuil pour ne capter la lumière rouge qu'à un certain niveau. Pour obtenir la valeur correcte, j'ai commencé avec un seuil clément et j'ai continué à augmenter le niveau de seuil jusqu'à ce que la seule lumière captée soit la lumière laser sur l'objet numérisé. Une fois que j'ai eu cette image, j'ai trouvé le pixel le plus lumineux de chaque rangée pour obtenez une ligne d'un pixel par ligne qui borde le côté le plus à gauche de la ligne laser. Chaque pixel a ensuite été converti en un sommet dans l'espace 3D et stocké dans un tableau, comme décrit dans la section de création de maillage. Les résultats de ces étapes peuvent être vus dans la quatrième figure.

Contrôle moteur

Après avoir réussi à traiter une seule image pour obtenir la tranche de l'objet, je devais pouvoir faire pivoter l'objet pour prendre une nouvelle photo avec un angle différent. Pour ce faire, j'ai contrôlé le moteur pas à pas sous la plate-forme sur laquelle se trouve l'objet numérisé. J'ai construit les bases de notre fonction pas à pas en créant une variable pour suivre l'état du moteur et le micropas en basculant chacune des quatre entrées du moteur.

Création de maillagePour créer un maillage à partir de toutes les images traitées, j'ai d'abord dû convertir chaque pixel blanc de l'image traitée en un sommet dans l'espace 3D. Parce que je collecte des tranches individuelles de l'objet avec une symétrie cylindrique, il était logique de commencer à collecter des coordonnées cylindriques. Cela avait du sens car la hauteur de l'image pouvait représenter l'axe z, la distance depuis le centre de la table tournante pouvait représenter l'axe R et la rotation du moteur pas à pas pouvait représenter l'axe thêta. Cependant, comme j'ai stocké nos données en coordonnées cylindriques, j'ai dû convertir chacun de ces sommets en coordonnées cartésiennes.

Une fois ces sommets créés, ils étaient stockés dans une liste et ladite liste était stockée dans une autre liste qui contenait les listes de sommets créées pour chaque image capturée. Une fois toutes les images traitées et converties en sommets, je devais sélectionner les sommets que je voulais réellement représenter dans le maillage final. Je voulais que le sommet supérieur et le sommet inférieur soient inclus, puis, en fonction de la résolution, j'ai choisi un nombre de sommets régulièrement espacés à utiliser pour chaque image. Parce que toutes les listes de sommets n'avaient pas la même longueur, j'ai dû les égaliser en trouvant la liste avec le plus petit nombre de sommets et en supprimant les sommets de toutes les autres listes jusqu'à ce qu'elles soient toutes paires. Avec les listes de sommets créées, j'étais maintenant capable de créer un maillage. J'ai choisi de formater notre maillage selon la norme de fichier.obj car il est simple et imprimable en 3D.

Fonction intégrée

Une fois l'appareil fonctionnel, je l'ai peaufiné en ajoutant des fonctionnalités intégrées complètes. Cela impliquait de retirer le clavier, la souris et le moniteur, et de nous faire envoyer sans fil le fichier.obj après avoir terminé le traitement. Pour commencer, j'ai modifié le code.bashrc pour me connecter automatiquement et lancer le programme python principal au démarrage. Cela a été fait en utilisant sudo raspi-config et en sélectionnant "Console Autologin" et en ajoutant la ligne "sudo python /home/pi/finalProject/FINAL.py" à /home/pi/.bashrc. En plus de cela, j'ai également ajout d'un bouton et d'une LED d'état pour l'entrée et la sortie de l'utilisateur. Le bouton permettrait à l'utilisateur de dire à l'appareil quand commencer à numériser et la LED indiquerait à l'utilisateur l'état de la machine. Si la LED est allumée, l'appareil est prêt à démarrer une nouvelle analyse. Si la LED clignote, l'appareil est en train de scanner. Si la LED est office, il y a une erreur logicielle, appelant à un redémarrage du système. Enfin, j'ai autorisé l'appareil à envoyer le fichier.obj par e-mail. Cela a été fait en utilisant les bibliothèques smtplib et email. Cette capacité d'envoyer des e-mails nous a donné un moyen très pratique et sans fil de livrer le fichier produit à l'utilisateur pour y accéder sur de nombreuses plates-formes différentes.

Étape 7: Intégration

L'intégration
L'intégration

Après avoir fabriqué les différentes pièces de l'appareil, je l'ai assemblé. La figure ci-dessus montre dans l'ordre:

(a) boîte assemblée à l'extérieur

(b) boîte assemblée à l'intérieur avec caméra et laser

(c) vue intérieure du lit électronique

(d) à l'arrière du Pi avec accès aux ports Pi et à l'entrée du moteur 5V

(e) bouton-poussoir avec anneau LED et voyant d'état à l'avant de l'appareil

Étape 8: Résultats

Résultats
Résultats
Résultats
Résultats
Résultats
Résultats
Résultats
Résultats

Le scanner laser 3D était capable de numériser des objets avec une précision décente. Les caractéristiques des objets sont distinctes et reconnaissables et les pièces étaient très faciles à imprimer en 3D à l'aide d'un logiciel de découpage tel que Repetier. Les figures ci-dessus montrent quelques exemples de scans d'un morceau de bois et d'un canard en caoutchouc.

L'une de nos plus grandes découvertes et réussites que j'ai découvertes lors des tests a été la cohérence de l'appareil. Au cours de plusieurs essais du même objet, le scanner a pu produire un fichier.obj très très similaire à chaque fois, même si nous avons légèrement modifié le placement de l'objet. Comme on le voit dans les trois scans séparés, ils se ressemblent tous, capturant les mêmes détails et la même quantité de détails. Dans l'ensemble, j'ai été très impressionné par la cohérence et la robustesse de notre système.

L'une des variables que j'ai vraiment pu régler est la résolution des scans. Comme il y a 400 pas dans le stepper, je peux choisir la taille de chaque pour dicter la résolution angulaire. Par défaut, j'ai la résolution angulaire définie sur 20 itérations, ce qui signifie qu'à chaque image, le moteur tourne de 20 pas (400/20 = 20). Ceci a été choisi principalement dans l'intérêt du temps - il faut environ 45 secondes pour terminer une analyse de cette façon. Cependant, si je veux un scan de bien meilleure qualité, je peux augmenter le nombre d'itérations jusqu'à 400. Cela donne beaucoup plus de points pour construire le modèle, ce qui permet un scan beaucoup plus détaillé. En plus de la résolution angulaire, je peux également ajuster la résolution verticale ou le nombre de points différents que je choisis d'interroger le long de la tranche laser. Pour un intérêt similaire dans le temps, j'ai cette valeur par défaut fixée à 20 mais je peux l'augmenter pour de meilleurs résultats. En jouant avec ces paramètres de résolution angulaire et de résolution spatiale, j'ai pu compiler les résultats des différents scans ci-dessous dans la dernière figure. Chaque étiquette est formatée de telle sorte qu'elle corresponde à la résolution angulaire x la résolution spatiale. Comme on le voit dans les paramètres de numérisation par défaut, les caractéristiques du canard sont reconnaissables mais pas détaillées. Cependant, à mesure que j'augmente la résolution, des caractéristiques précises commencent à apparaître, notamment les yeux, le bec, la queue et les ailes du canard. L'image à la résolution la plus élevée a pris environ 5 minutes à numériser. Voir ce haut d'une résolution réalisable a été un très grand succès.

Limites

Malgré les résultats positifs du projet, il existe encore quelques limitations de la conception et de la mise en œuvre. Avec l'utilisation du laser, il y a beaucoup de problèmes avec la façon dont la lumière se disperse. De nombreux objets que j'ai essayé de numériser qui étaient soit translucides, brillants ou très sombres se sont avérés gênants avec la façon dont la lumière se réfléchissait sur la surface. Si l'objet était translucide, la lumière serait absorbée et dispersée, ce qui rendrait la lecture des tranches très bruyante. Dans les objets brillants et sombres, la lumière serait soit réfléchie, soit absorbée au point qu'elle serait difficile à capter. De plus, comme j'utilise un appareil photo pour capturer les caractéristiques des objets, sa détection est limitée par sa ligne de visée, ce qui signifie que les objets concaves et les angles vifs sont souvent bloqués par d'autres parties de l'objet. Ceci est montré dans notre exemple de canard en caoutchouc car la queue perdra parfois sa courbure lors du balayage. La caméra ne peut également détecter que les structures de surface, ce qui signifie que les trous ou les géométries internes ne peuvent pas être capturés. Cependant, il s'agit d'un problème courant que de nombreuses autres solutions de numérisation ont également.

Prochaines étapes

Bien que j'étais satisfait des résultats de notre projet, il y avait quelques choses qui pourraient être mises en œuvre pour l'améliorer. Pour commencer, dans l'état actuel, la résolution de numérisation ne peut être modifiée qu'en modifiant les variables de résolution codées en dur dans notre code. Pour rendre le projet plus intégré, un potentiomètre de résolution pourrait être inclus afin que l'utilisateur puisse modifier la résolution sans avoir à brancher un moniteur et un clavier sur le scanner. De plus, le scanner crée des images qui peuvent parfois sembler irrégulières. Pour résoudre ce problème, des techniques de lissage de maillage pourraient être mises en œuvre pour lisser les irrégularités et les angles durs. Enfin, j'ai trouvé que les coordonnées des pixels ne s'adaptent pas bien au monde réel. Les maillages que j'ai créés étaient 6 à 7 fois plus grands que l'objet réel. À l'avenir, il serait avantageux de mettre en œuvre une méthode de mise à l'échelle des maillages afin qu'ils soient plus précis par rapport à la taille réelle de l'objet.

Étape 9: Ressources

J'ai inclus le code, les fichiers STL pour l'impression et les fichiers DXF pour la découpe pour l'intégralité du projet.

Concours Raspberry Pi 2020
Concours Raspberry Pi 2020
Concours Raspberry Pi 2020
Concours Raspberry Pi 2020

Premier prix du concours Raspberry Pi 2020

Conseillé: