Taula de continguts:

Escàner làser Raspberry Pi: 9 passos (amb imatges)
Escàner làser Raspberry Pi: 9 passos (amb imatges)

Vídeo: Escàner làser Raspberry Pi: 9 passos (amb imatges)

Vídeo: Escàner làser Raspberry Pi: 9 passos (amb imatges)
Vídeo: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, De novembre
Anonim
Image
Image
Escàner làser Raspberry Pi
Escàner làser Raspberry Pi

Làser Scanner és un dispositiu del sistema incrustat de Raspberry Pi capaç de digitalitzar objectes en fitxers de malla.obj per reproduir-los mitjançant la impressió 3D. El dispositiu fa això mitjançant la utilització d’un làser de línia i una PiCam integrada per realitzar visions per ordinador. El làser se situa a 45 graus del làser i projecta una línia vermella brillant sobre una llesca vertical de l’objecte. La càmera detecta la distància de la llesca del centre per donar una llesca de malla. L'objecte es fa girar a la safata giratòria i es repeteix el procés fins que s'escaneja l'objecte complet. El fitxer.obj generat s'envia finalment per correu electrònic a l'usuari, cosa que fa que el sistema sigui totalment independent i incrustat.

Aquest instructable us explicarà com es va construir el dispositiu, alguns resultats i passos futurs.

Pas 1: inspiració

Inspiració
Inspiració
Inspiració
Inspiració

Com a creador àvid, he estat impressió 3D i modelat sòlid des de fa uns quants anys. He treballat amb moltes eines de prototipat diferents, des d’encaminadors CNC fins a talladors làser i impressores 3D. Un dispositiu que el meu makerspace local encara no ha comprat ha estat un escàner 3D, i us puc explicar per què.

Els més econòmics (uns quants centenars de dòlars) no eren fiables, requerien unes condicions perfectes i, tot i així, produïen resultats força cutres. Les cares eren … bé, cares, fins a diversos milers de dòlars, cosa que fa que la seva funció no valgui la pena en molts casos. A més, més de les vegades opto per prendre mesures i dissenyar un model des de zero que tractar de la malla superficial generada a partir d’una exploració.

Per això, volia crear un escàner autònom de pressupostos per veure fins a quin punt podia escanejar un objecte utilitzant els components del prestatge.

Després de fer algunes investigacions, vaig veure que molts escàners 3D utilitzaven una plataforma giratòria i, a continuació, diversos sensors diferents per mesurar la distància del centre per tal de construir un model de rotació. Molts d'aquests utilitzaven càmeres dobles similars a la del Kinect. Finalment vaig topar amb el Yscanner, que és un escàner de baixa resolució que utilitza un làser. Si mirem la simplicitat i la viabilitat, aquesta tècnica làser, en què un làser es compensa amb relació a una càmera per mesurar la distància del centre, semblava un camí clar cap endavant.

Pas 2: eines i peces

Parts:

  • Raspberry Pi 35,00 dòlars
  • Raspberry Pi Camera V2 30,00 $
  • LEDs, resistències i cables
  • Filament d’impressió 3D
  • 12x12x0.125 xapes de fusta
  • Maquinari M3
  • Motor pas a pas: 14 dòlars
  • Làser de línia: 8 dòlars
  • Controladors de motor pas a pas LN298: 2,65 dòlars
  • Polsador de metall: 5 dòlars

Eines:

  • Soldador
  • Tallador làser
  • Impressora 3D
  • Tornavís
  • Alicates

Pas 3: disseny d'alt nivell

Disseny d’alt nivell
Disseny d’alt nivell
Disseny d’alt nivell
Disseny d’alt nivell

El component central d’aquest disseny és el làser de línia que es projecta sobre una llesca vertical dels objectes. Aquesta projecció es podria capturar a la càmera fotogràfica, es pot corregir la seva perspectiva i filtrar-la abans de processar la imatge. En el processament d'imatges, es podria recollir la distància entre cada segment de la línia des del centre de l'objecte. En coordenades radials, aquesta imatge donaria tant els components r com z. La tercera dimensió, Θ, s’aconsegueix girant l’objecte cap a un nou segment. Aquest concepte es mostra a la primera figura.

Per realitzar les accions descrites anteriorment, he utilitzat un Raspberry Pi com a unitat central d’informàtica. He connectat un motor pas a pas i un controlador de motor al Pi, alimentat per un subministrament extern de 5V i controlat pels pins GPIO del Pi. Es va posar un làser de línia a la línia de 3,3 V del Pi i es va connectar una PiCam a l'entrada de la càmera del Pi. Finalment, es va instal·lar un simple botó desplegable i un LED d'estat per indicar a l'usuari en quin estat es troba el sistema. El sistema complet es resumeix en un diagrama de blocs del sistema.

Des del principi, es va planejar allotjar l'electrònica en una caixa de tall per làser agrupada amb ranures en T i maquinari M3. L’electrònica quedaria oculta a la vista en un compartiment inferior i una tapa permetria un fàcil accés a la col·locació d’objectes a la safata giratòria. Aquesta tapa és necessària per minimitzar la quantitat de llum que fuig al sistema, ja que aquesta llum externa pot produir soroll en l'exploració final.

Pas 4: maquinari

Maquinari
Maquinari
Maquinari
Maquinari
Maquinari
Maquinari

Com es va veure més amunt, abans de començar a tallar amb làser o a la impressió 3D, utilitzava Autodesk Fusion 360 per fer un model 3D detallat del nostre disseny. Com a visió general, el dispositiu és una caixa senzilla amb una tapa amb frontisses tallades per làser. Hi ha dues capes principals del dispositiu: el llit electrònic i el llit principal, amb forats perquè els cables passin entre les dues capes.

La majoria de la nostra caixa es va fabricar amb un tallador làser, amb dissenys produïts a Fusion 360 i tallats en un tallador làser Epilog Zing de 40 W. Els nostres dissenys es mostren a les figures anteriors. Des de la part superior esquerra movent-se cap a la dreta, les peces són el llit principal, el llit electrònic, dues peces per a la tapa, la part posterior, la part davantera i les dues peces laterals. Al llit principal, hi ha tres retalls principals: un per muntar el motor pas a pas, un per encaminar els cables des del làser i un per encaminar l’ample cable de la PiCam. La peça del llit té orificis de muntatge per assegurar el controlador del Pi, la placa i el motor i un retall més gran per accedir al motor pas a pas. Les peces de la tapa s’ajunten simplement per formar la peça triangular que es veu més amunt i la frontissa és una extrusió simple que és l’amplada del diàmetre del forat de les taules laterals. La part posterior i una de les peces laterals tenen ranures al lateral perquè es pugui accedir fàcilment als ports del Pi (HDMI, USB, Ethernet, Power). La part frontal és una peça senzilla que finalment he fet forats amb un trepant manual per muntar el botó i el LED. Com es veu a totes les peces, les nostres peces es mantenen juntes mitjançant el maquinari M3 mitjançant juntes en T i ranures. Aquest és un mètode per mantenir les peces tallades amb làser de forma ortogonal i segura. Les aletes de les peces s’alineen amb les ranures d’altres peces i el tall en forma de t a les vores donen espai perquè s’embussi una femella M3 sense girar. Això ens permet utilitzar un cargol M3 per bloquejar les peces amb molt poc espai de moviments sense que el muntatge sigui completament permanent.

Vaig triar fer la majoria de les nostres peces amb un tallador làser per la seva rapidesa i facilitat. Tot i això, encara havia d’imprimir en 3D algunes peces a causa de la seva geometria 3D que seria més difícil de crear al tallador. La primera peça va ser el suport làser de línia. Aquesta peça s’havia de muntar al llit principal a 45 graus de la vista de la càmera i tenia un forat de manera que el làser pogués incloure-hi una fricció ajustada. També vaig haver de crear un muntatge del motor perquè l’eix del motor era molt llarg. La fricció del muntatge s'adaptava a les peces tallades amb làser i baixava el pla al qual s'adheria el motor de manera que la plataforma giratòria estigués a nivell del llit principal.

Pas 5: electrònica

Electrònica
Electrònica

El maquinari de cablejat d’aquest projecte era molt senzill, ja que l’escàner 3D no requeria massa perifèrics. Cal connectar un motor, un botó, un LED, un làser i una càmera al Pi. Com es mostra, em vaig assegurar de connectar les resistències en sèrie amb cada pin que vam utilitzar per protegir els pins. Un pin GPIO es dedicava al control del LED d'estat, que s'encenia quan el dispositiu estava llest per utilitzar-se i polsava amb PWM quan el dispositiu funcionava. Es va connectar un altre pin GPIO a un botó desplegable, registrant HIGH quan no es premia el botó i LOW quan es premia el botó. Per últim, vaig dedicar quatre pins GPIO a conduir el motor pas a pas.

Com que el nostre motor només havia de trepitjar un cert grau sense necessitat de controlar la velocitat, vam optar per un controlador de motor pas a pas més senzill (L298N) que simplement augmentés les línies de control per alimentar-se a les entrades del motor. Per obtenir informació sobre com operar els motors pas a pas a un nivell molt baix, ens hem referit tant al full de dades L298N com a la biblioteca Arduino. Els motors pas a pas tenen un nucli magnètic amb dits penetrants de polaritat alterna. Els quatre cables s’emboliquen per controlar dos electroimants que alimenten cada dit oposat del motor. Així, en canviar la polaritat dels dits, podem empènyer el pas a pas un pas. Amb aquest coneixement de com funcionaven els steppers des d’un nivell de maquinari, vam poder controlar els steppers amb molta més facilitat. Vam optar per apagar el motor pas a pas d’una font d’alimentació de 5V al laboratori en lloc del Pi, a causa del seu consum de corrent màxim d’aproximadament 0,8 A, que és més del que podria proporcionar el Pi.

Pas 6: programari

Programari
Programari
Programari
Programari
Programari
Programari
Programari
Programari

El programari d’aquest projecte es pot dividir en quatre components principals que interactuen junts: processament d’imatges, control del motor, creació de malla i funcions incrustades.

Com a resum del programari, podem veure la primera figura. Quan arrenca el sistema, el.bashrc inicia sessió automàticament al Pi i comença a executar el nostre codi python. El sistema il·lumina el llum d’estat per fer saber a l’usuari que s’ha arrencat correctament i espera que es premi el botó. A continuació, l'usuari pot col·locar l'element que es vol escanejar i tancar la tapa. Després de prémer el botó, el LED polsa per fer saber a l'usuari que el dispositiu funciona. El dispositiu farà un bucle entre el processament d’imatges i el control del motor fins que es completi la rotació completa i es recopilin totes les dades de l’objecte. Finalment, es crea la malla i el fitxer s’envia per correu electrònic a un correu electrònic preseleccionat. Això reinicia el cicle i la màquina està preparada per realitzar una altra exploració amb només prémer un botó.

Processament d'imatge

El primer que es va implementar va ser processar una imatge capturada per tal d’extreure la informació emmagatzemada a la imatge en un formulari que es podria utilitzar per crear una matriu de punts a l’espai. Per fer-ho, vaig començar fent una fotografia de l'objecte a la plataforma juntament amb tot el soroll de fons creat pel làser que brilla a la part posterior de la caixa i es dispersa. Aquesta imatge tenia dos problemes principals en la seva forma crua. En primer lloc, l'objecte es veia amb un angle amb una perspectiva elevada i, en segon lloc, hi havia molt soroll de fons. El primer que havia de fer era tenir en compte aquest angle de visió, ja que fer servir la foto tal qual no ens permetria determinar una alçada d’objecte consistent. Com es veu a la segona figura, l’alçada de la forma “L” cap per avall és constant; no obstant això, a causa que un costat és més llarg que l'altre, sembla que tenen diferents altures a la vora més propera a l'espectador.

Per solucionar-ho, vaig haver de transformar l’espai de treball de la imatge en un rectangle a partir de la forma trapezoïdal en què es trobava anteriorment. Per fer-ho, he utilitzat el codi que proporciona aquest enllaç, que quan se’ls dóna una imatge i quatre punts, retalla la imatge entre els quatre punts i transforma la imatge retallada per compensar la perspectiva. Aquesta transformació utilitza els quatre punts per crear un rectangle en lloc d’una forma de tipus trapezoide, tal com es veu a la tercera figura.

El següent problema que calia resoldre era el del soroll de fons en forma de llum exterior i la llum reflectida pel mateix làser. Per fer-ho he filtrat la llum mitjançant la funció inRange () d'OpenCV. He establert el llindar per agafar la llum vermella només a un nivell determinat. Per obtenir el valor correcte, vaig començar amb un llindar indulgent i vaig anar augmentant el nivell del llindar fins que l’única llum que es captava era la llum làser de l’objecte que s’escanejava. Un cop tenia aquesta imatge, vaig trobar el píxel més brillant de cada fila per obtingueu una línia d’un píxel per fila que voreja la part més esquerra de la línia làser. A continuació, cada píxel es va convertir en un vèrtex en espai 3D i es va emmagatzemar en una matriu, tal com es descriu a la secció de creació de malla. Els resultats d’aquests passos es poden veure a la quarta figura.

Control del motor

Després de poder processar amb èxit una sola imatge per obtenir la porció de l'objecte, havia de poder girar l'objecte per fer una nova imatge amb un angle diferent. Per fer-ho, vaig controlar el motor pas a pas sota la plataforma on s’assenta l’objecte que s’està escanejant. Vaig construir una base de la nostra funció de pas creant una variable per fer un seguiment de l’estat del motor i el pas de micro alternant cadascuna de les quatre entrades del motor.

Creació de malla Per crear una malla a partir de totes les imatges processades, primer havia de convertir cada píxel blanc de la imatge processada en un vèrtex a l’espai 3D. Com que estic recollint talls individuals de l’objecte amb simetria cilíndrica, tenia sentit començar a recollir coordenades cilíndriques. Això tenia sentit ja que l’alçada de la imatge podia representar l’eix z, la distància des del centre de la taula giratòria podria representar l’eix R i la rotació del motor pas a pas podria representar l’eix teta. No obstant això, com que emmagatzemava les nostres dades en coordenades cilíndriques, vaig haver de convertir cadascun d’aquests vèrtexs en coordenades cartesianes.

Un cop es van crear aquests vèrtexs, es van emmagatzemar en una llista i la llista es va emmagatzemar en una altra llista que contenia les llistes de vèrtex creades per a cada imatge capturada. Un cop processades totes les imatges i convertides en vèrtexs, vaig haver de seleccionar els vèrtexs que realment volia representar a la malla final. Volia que s’incloguessin el vèrtex superior i el vèrtex inferior i, a continuació, basant-me en la resolució, vaig escollir un nombre de vèrtex espaiat uniformement per utilitzar per a cada imatge. Com que no totes les llistes de vèrtexs tenien la mateixa longitud, les vaig haver d’equilibrar trobant la llista amb el menor nombre de vèrtexs i eliminant els vèrtexs de totes les altres llistes fins que fossin totes uniformes. crear una malla. Vaig triar formatar la nostra malla segons el fitxer.obj estàndard, ja que és senzill i imprimible en 3D.

Funció incrustada

Després que el dispositiu fos funcional, el vaig afegir afegint una funcionalitat integrada completa. Això significava eliminar el teclat, el ratolí i el monitor, i que ens enviés el fitxer.obj sense fils després d’acabar el processament. Per començar, he canviat el codi.bashrc per iniciar la sessió automàticament i iniciar el programa python principal en iniciar-se. Això es va fer utilitzant sudo raspi-config i seleccionant "Console Autologin" i afegint la línia "sudo python /home/pi/finalProject/FINAL.py" a /home/pi/.bashrc. A més d'això, també ha afegit un botó i un LED d'estat per a l'entrada i sortida de l'usuari. El botó permetria a l'usuari indicar al dispositiu quan ha de començar a escanejar i el LED indicaria a l'estat de la màquina. Si el LED està encès, el dispositiu està a punt per iniciar una nova exploració. Si el LED intermitent, el dispositiu s’està escanejant actualment. Si el LED és ofimàtic, hi ha un error de programari que demana un reinici del sistema. Per últim, vaig habilitar el dispositiu per enviar el fitxer.obj per correu electrònic. Això es va fer mitjançant l'ús de les biblioteques smtplib i de correu electrònic. Aquesta possibilitat d’enviar correus electrònics ens va proporcionar una forma molt còmoda i sense fils de lliurar el fitxer produït a l’usuari perquè accedeixi a moltes plataformes diferents.

Pas 7: integració

Integració
Integració

Després de fabricar les diverses peces del dispositiu, les vaig muntar. La figura anterior mostra per ordre:

(a) caixa muntada a l'exterior

(b) caixa muntada a l'interior amb càmera i làser

(c) vista interior del llit electrònic

(d) part posterior del Pi amb accés als ports Pi i l'entrada del motor de 5 V.

(e) polsador amb anell LED i llum d'estat a la part frontal del dispositiu

Pas 8: Resultats

Resultats
Resultats
Resultats
Resultats
Resultats
Resultats
Resultats
Resultats

L’escàner làser 3D va poder escanejar objectes amb una precisió decent. Les funcions dels objectes són distintes i reconeixibles i les parts eren molt fàcils d’imprimir en 3D mitjançant un programari de segmentació com Repetier. Les figures anteriors mostren algunes mostres de mostra d’un tros de fusta i un ànec de goma.

Un dels nostres majors descobriments i èxits que vaig descobrir durant les proves va ser la consistència del dispositiu. Al llarg de diverses proves del mateix objecte, l’escàner va poder produir un fitxer.obj que era molt semblant cada vegada, fins i tot si vam alterar lleugerament la ubicació de l’objecte. Com es veu a les tres exploracions separades, totes tenen un aspecte molt similar, capturant els mateixos detalls i la mateixa quantitat de detalls. En general, em va impressionar molt la consistència i la robustesa del nostre sistema.

Una de les variables que he estat capaç de sintonitzar és la resolució dels escaneigs. Com que hi ha 400 passos al pas a pas, puc escollir la mida de cada ΔΘ per dictar la resolució angular. Per defecte, tinc la resolució angular en 20 iteracions, és a dir, que cada quadre, el motor gira 20 passos (400/20 = 20). Aquesta opció es va escollir principalment per l'interès del temps: es triga uns 45 segons a completar una exploració d'aquesta manera. Tanmateix, si vull una exploració de molta més qualitat, puc augmentar el nombre d’iteracions fins a 400. Això dóna molts més punts per construir el model, cosa que permet fer una exploració molt més detallada. A més de la resolució angular, també puc ajustar la resolució vertical o quants punts diferents tinc per sondejar al llarg de la part del làser. Per un interès temporal similar, tinc aquest valor per defecte definit en 20, però puc augmentar-lo per obtenir millors resultats. En jugar amb aquests paràmetres de resolució angular i resolució espacial, vaig poder compilar els resultats de diferents exploracions a continuació a la darrera figura. Cada etiqueta té un format tal que sigui la resolució angular x la resolució espacial. Com es veu a la configuració d’escaneig per defecte, les funcions de l’ànec es poden reconèixer però no es detallen. No obstant això, a mesura que augmento la resolució, comencen a aparèixer característiques precises individuals, inclosos els ulls, el bec, la cua i les ales de l'ànec. La imatge amb més resolució va trigar uns 5 minuts a escanejar-se. Veure aquest màxim d’una resolució assolible va ser un èxit molt gran.

Limitacions

Tot i els resultats reeixits del projecte, encara hi ha algunes limitacions en el disseny i la implementació. Amb l’ús del làser apareixen molts problemes relacionats amb la dispersió de la llum. Molts objectes que vaig intentar escanejar translúcids, brillants o molt foscos van resultar problemàtics amb la manera com la llum es reflectia a la superfície. Si l’objecte fos translúcid, la llum s’absorbiria i es dispersaria, cosa que provocaria una lectura molt sorollosa de les llesques. En objectes brillants i foscos, la llum es reflectiria o seria absorbida fins al punt que seria difícil de captar. A més, com que faig servir una càmera per capturar les característiques dels objectes, la seva visió està limitada per la seva visió, cosa que significa que els objectes còncaus i els angles nítids sovint estan bloquejats per altres parts de l’objecte. Això es mostra en el nostre exemple d'ànec de goma, ja que la cua de vegades perdrà la curvatura en l'exploració. La càmera també només pot detectar estructures superficials, cosa que significa que no es poden capturar forats ni geometries internes. Tot i això, aquest és un problema comú que també tenen moltes altres solucions d’escaneig.

Propers passos

Tot i que estava satisfet amb els resultats del nostre projecte, hi havia algunes coses que es podrien implementar per millorar-lo. Per començar, en l’estat actual, la resolució d’escaneig només es pot canviar canviant les variables de resolució codificades al nostre codi. Per fer el projecte més incrustat, es podria incloure un potenciòmetre de resolució perquè l'usuari pogués canviar la resolució sense haver d'endollar un monitor i un teclat a l'escàner. A més, l’escàner crea imatges que de vegades poden semblar irregulars. Per solucionar-ho, es podrien implementar tècniques de suavitzat de malla per suavitzar irregularitats i cantonades dures. Per últim, vaig trobar que les coordenades de píxels no s’escalen bé al món real. Les malles que vaig crear eren de 6 a 7 vegades més grans que l'objecte real. En el futur seria avantatjós implementar una manera d’escalar les malles perquè siguin més exactes a la mida real de l’objecte.

Pas 9: Recursos

He inclòs el codi, fitxers STL per imprimir i fitxers DXF per tallar durant la totalitat del projecte.

Concurs de gerds Pi 2020
Concurs de gerds Pi 2020
Concurs de gerds Pi 2020
Concurs de gerds Pi 2020

Primer premi del concurs Raspberry Pi 2020

Recomanat: