Sommario:

Scanner laser Raspberry Pi: 9 passaggi (con immagini)
Scanner laser Raspberry Pi: 9 passaggi (con immagini)

Video: Scanner laser Raspberry Pi: 9 passaggi (con immagini)

Video: Scanner laser Raspberry Pi: 9 passaggi (con immagini)
Video: DIY Raspberry Pi Spectrometer NEW SOFTWARE! 2024, Dicembre
Anonim
Image
Image
Scanner laser Raspberry Pi
Scanner laser Raspberry Pi

Il Laser Scanner è un dispositivo di sistema embedded Raspberry Pi in grado di digitalizzare oggetti in file mesh.obj per la riproduzione utilizzando la stampa 3D. Il dispositivo esegue questa operazione utilizzando un laser di linea e una PiCam integrata per eseguire la visione artificiale. Il laser è posizionato a 45 gradi di traverso rispetto al laser e proietta una linea rossa brillante su una fetta verticale dell'oggetto. La fotocamera rileva la distanza della fetta dal centro per dare una fetta di mesh. L'oggetto viene filato sul vassoio rotante e il processo viene ripetuto fino alla scansione dell'intero oggetto. Il file.obj generato viene infine inviato via email all'utente, rendendo il sistema completamente autonomo e integrato.

Questo Instructable illustrerà come è stato costruito il dispositivo, alcuni risultati e i passaggi futuri.

Passaggio 1: ispirazione

Ispirazione
Ispirazione
Ispirazione
Ispirazione

Come appassionato creatore, mi occupo di stampa 3D e modellazione solida da diversi anni. Ho lavorato con molti strumenti di prototipazione diversi, dai router CNC ai laser cutter alle stampanti 3D. Un dispositivo che il mio spazio di produzione locale deve ancora acquistare è stato uno scanner 3D - e posso dirti perché.

Quelli più economici (poche centinaia di dollari) erano inaffidabili, richiedevano condizioni perfette e producevano comunque risultati piuttosto scadenti. Quelli costosi erano… beh, costosi, fino a diverse migliaia di dollari, il che rendeva la sua funzione in molti casi non degna di nota. Inoltre, il più delle volte, scelgo di prendere le misure e progettare un modello da zero piuttosto che occuparmi della mesh superficiale generata da una scansione.

Per questo motivo, volevo creare uno scanner autonomo economico per vedere quanto bene potevo scansionare un oggetto utilizzando componenti standard.

Dopo aver fatto alcune ricerche, ho visto che molti scanner 3D utilizzavano una piattaforma rotante e quindi una varietà di sensori diversi per misurare la distanza dal centro al fine di costruire un modello rotazionale. Molti di questi utilizzavano una doppia fotocamera simile a quella del Kinect. Alla fine mi sono imbattuto in Yscanner, uno scanner a bassa risoluzione che utilizza un laser. Guardando alla semplicità e alla fattibilità, questa tecnica laser, in cui un laser viene illuminato in offset rispetto a una telecamera per misurare la distanza dal centro, sembrava un chiaro percorso in avanti.

Passaggio 2: strumenti e parti

Parti:

  • Raspberry Pi $ 35,00
  • Fotocamera Raspberry Pi V2 $ 30.00
  • LED, resistori e fili
  • Filamento per stampa 3D
  • 12x12x0.125 fogli di legno
  • Hardware M3
  • Motore passo-passo - $ 14
  • Laser di linea - $ 8
  • Driver del motore passo-passo LN298 - $ 2,65
  • Pulsante in metallo - $5

Utensili:

  • Saldatore
  • Taglio laser
  • stampante 3d
  • Cacciavite
  • Pinze

Passaggio 3: progettazione di alto livello

Design di alto livello
Design di alto livello
Design di alto livello
Design di alto livello

Il componente centrale di questo design è il laser di linea che proietta su una fetta verticale degli oggetti. Questa proiezione potrebbe essere catturata sulla picamera, avere la sua prospettiva corretta e quindi filtrata prima dell'elaborazione dell'immagine. Nell'elaborazione delle immagini, è possibile raccogliere la distanza tra ciascun segmento della linea dal centro dell'oggetto. In coordinate radiali, questa immagine produrrebbe entrambe le componenti r e z. La terza dimensione,, viene quindi ottenuta ruotando l'oggetto su una nuova fetta. Questo concetto è mostrato nella prima figura.

Per eseguire le azioni sopra descritte, ho utilizzato un Raspberry Pi come unità di elaborazione centrale. Ho collegato un motore passo-passo e un driver del motore al Pi, alimentato da un alimentatore esterno da 5 V e controllato dai pin GPIO del Pi. Un laser di linea è stato posizionato sulla linea da 3,3 V sul Pi e una PiCam è stata collegata all'ingresso della telecamera sul Pi. Infine, è stato installato un semplice pulsante abbassato e un LED di stato per indicare all'utente in che stato si trova il sistema. L'intero sistema è riassunto in uno schema a blocchi del sistema.

Fin dall'inizio, è stato pianificato di alloggiare l'elettronica in una scatola tagliata al laser tenuta insieme da slot a T e hardware M3. L'elettronica sarebbe nascosta alla vista in uno scomparto inferiore e un coperchio consentirebbe un facile accesso al posizionamento degli oggetti sul vassoio rotante. Questo coperchio è necessario per ridurre al minimo la quantità di luce che penetra nel sistema, poiché questa luce esterna può produrre rumore nella scansione finale.

Passaggio 4: hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Come visto sopra, prima di iniziare il taglio laser o la stampa 3D, ho utilizzato Autodesk Fusion 360 per creare un modello 3D dettagliato del nostro progetto. In sintesi, il dispositivo è una semplice scatola con coperchio con cerniere tagliate al laser. Ci sono due strati principali del dispositivo: il letto dell'elettronica e il letto principale, con fori per il passaggio dei cavi tra i due strati.

La maggior parte della nostra scatola è stata prodotta con un laser cutter, con progetti prodotti in Fusion 360 e tagliati su un laser cutter Epilog Zing da 40 W. I nostri design sono mostrati nelle figure sopra. Dall'alto a sinistra spostandosi a destra, i pezzi sono il letto principale, il letto dell'elettronica, due pezzi per il coperchio, il pezzo posteriore, il pezzo anteriore e i due pezzi laterali. Nel letto principale ci sono tre aperture principali: una per il montaggio del motore passo-passo, una per instradare i cavi dal laser e una per instradare l'ampio cavo della PiCam. Il pezzo del letto ha fori di montaggio per fissare il Pi, la breadboard e il driver del motore e un ritaglio più grande per accedere al motore passo-passo. I pezzi del coperchio si incastrano semplicemente per formare il pezzo triangolare visto sopra e la cerniera è una semplice estrusione che è la larghezza del diametro del foro delle assi laterali. La parte posteriore e uno dei pezzi laterali hanno slot sul lato in modo che le porte del Pi (HDMI, USB, Ethernet, alimentazione) siano facilmente accessibili. La parte anteriore è un pezzo semplice che alla fine ho praticato con un trapano a mano per montare il pulsante e il LED. Come visto su tutti i pezzi, le nostre parti sono tenute insieme dall'hardware M3 utilizzando giunti a T e fessure. Questo è un metodo per tenere i pezzi tagliati al laser in modo ortogonale e sicuro. Le alette dei pezzi si allineano con le fessure degli altri pezzi e il taglio a forma di t sui bordi dà spazio a un dado M3 per essere incastrato in essi senza ruotare. Questo ci consente di utilizzare una vite M3 per bloccare i pezzi insieme con pochissimo spazio di manovra senza che l'assemblaggio sia completamente permanente.

Ho scelto di fare la maggior parte dei nostri pezzi con un laser cutter per la sua velocità e facilità. Tuttavia, dovevo ancora stampare in 3D alcuni pezzi a causa della loro geometria 3D che sarebbe stata più difficile da creare con la fresa. Il primo pezzo è stato il supporto laser di linea. Questo pezzo doveva essere montato sul letto principale a 45 gradi dalla visuale della telecamera e avere un foro in modo che il laser potesse adattarsi perfettamente all'attrito. Ho anche dovuto creare un supporto motore perché l'albero del motore era così lungo. L'attrito del supporto si è inserito nei pezzi tagliati al laser e ha abbassato il piano a cui era collegato il motore in modo tale che la piattaforma rotante fosse a filo con il letto principale.

Passaggio 5: elettronica

Elettronica
Elettronica

L'hardware di cablaggio di questo progetto è stato molto semplice in quanto lo scanner 3D non ha richiesto troppe periferiche. Un motore, un pulsante, un LED, un laser e una telecamera dovevano essere collegati al Pi. Come mostrato, mi sono assicurato di collegare i resistori in serie con ogni pin che abbiamo usato per proteggere i pin. Un pin GPIO era dedicato al controllo del LED di stato, che si accendeva quando il dispositivo era pronto per essere utilizzato e pulsava con PWM quando il dispositivo era in funzione. Un altro pin GPIO è stato collegato a un pulsante sollevato, registrando ALTO quando il pulsante non è stato premuto e BASSO quando è stato premuto il pulsante. Infine, ho dedicato quattro pin GPIO al pilotaggio del motore passo-passo.

Poiché il nostro motore doveva solo aumentare di una certa misura senza richiedere il controllo della velocità, abbiamo optato per un driver del motore passo-passo più semplice (L298N) che aumenta semplicemente le linee di controllo per alimentare gli ingressi del motore. Per sapere come far funzionare i motori passo passo a un livello molto basso, abbiamo fatto riferimento sia alla scheda tecnica L298N che alla libreria Arduino. I motori passo-passo hanno un nucleo magnetico con dita sporgenti di polarità alternata. I quattro fili sono avvolti per controllare due elettromagneti che alimentano ciascuno ogni altro dito opposto nel motore. Quindi, cambiando la polarità delle dita, siamo in grado di spingere lo stepper di un passo. Con questa conoscenza di come funzionavano gli stepper a livello hardware, siamo stati in grado di controllare gli stepper molto più facilmente. Abbiamo scelto di alimentare il nostro motore passo-passo da un alimentatore da 5 V in laboratorio piuttosto che dal Pi a causa del suo assorbimento di corrente massimo di circa 0,8 A, che è più di quanto il Pi potesse fornire.

Passaggio 6: software

Software
Software
Software
Software
Software
Software
Software
Software

Il software per questo progetto può essere suddiviso in quattro componenti principali che interagiscono tra loro: elaborazione delle immagini, controllo motore, creazione mesh e funzioni integrate.

Come riassunto del software, possiamo guardare alla prima figura. All'avvio del sistema,.bashrc accede automaticamente al Pi e inizia a eseguire il nostro codice Python. Il sistema accende la spia di stato per informare l'utente che è stato avviato correttamente e attende la pressione del pulsante. L'utente può quindi posizionare l'elemento da scansionare e chiudere il coperchio. Dopo aver premuto il pulsante, il LED lampeggia per informare l'utente che il dispositivo sta funzionando. Il dispositivo eseguirà un ciclo tra l'elaborazione dell'immagine e il controllo del motore fino al completamento della rotazione completa e alla raccolta di tutti i dati dell'oggetto. Infine, viene creata la mesh e il file viene inviato tramite e-mail a un'e-mail preselezionata. Questo riavvia il ciclo e la macchina è pronta per eseguire un'altra scansione premendo un pulsante.

Elaborazione delle immagini

La prima cosa implementata è stata l'elaborazione di un'immagine acquisita per estrarre le informazioni memorizzate nell'immagine in una forma che potrebbe essere utilizzata per creare una serie di punti nello spazio. Per fare ciò, ho iniziato scattando una foto dell'oggetto sulla piattaforma insieme a tutto il rumore di fondo creato dal laser che brilla sul retro della scatola e si disperde. Questa immagine aveva due problemi principali nella sua forma grezza. In primo luogo, l'oggetto è stato visto da un'angolazione con una prospettiva elevata e, in secondo luogo, c'era molto rumore di fondo. La prima cosa che dovevo fare era tenere conto di questo angolo di visione perché usare la foto così com'è non ci avrebbe permesso di determinare un'altezza dell'oggetto coerente. Come si vede nella seconda figura, l'altezza della forma a “L” capovolta è consistente; tuttavia, poiché un lato è più lungo dell'altro, sembrano avere altezze diverse sul bordo più vicino allo spettatore.

Per risolvere questo problema, ho dovuto trasformare l'area di lavoro nell'immagine in un rettangolo dalla forma trapezoidale in cui si trovava in precedenza. Per fare ciò, ho utilizzato il codice fornito da questo collegamento, che quando viene fornita un'immagine e quattro punti, ritaglia l'immagine tra i quattro punti e trasforma l'immagine ritagliata per compensare la prospettiva. Questa trasformazione utilizza i quattro punti per creare un rettangolo invece di una forma di tipo trapezoidale come mostrato nella terza figura.

Il problema successivo da risolvere era quello del rumore di fondo sotto forma di luce esterna e luce riflessa dal laser stesso. Per fare ciò ho filtrato la luce utilizzando la funzione inRange() di OpenCV. Ho impostato la soglia per rilevare solo la luce rossa a un certo livello. Per ottenere il valore corretto, ho iniziato con una soglia clemente e ho continuato ad aumentare il livello di soglia fino a quando l'unica luce rilevata era la luce laser sull'oggetto scansionato. Una volta ottenuta questa immagine, ho trovato il pixel più luminoso in ogni riga per ottenere una linea di un pixel per riga che confina con il lato più a sinistra della linea laser. Ogni pixel è stato quindi convertito in un vertice nello spazio 3D e archiviato in un array, come descritto nella sezione relativa alla creazione della mesh. I risultati di questi passaggi sono visibili nella quarta figura.

Controllo del motore

Dopo essere stato in grado di elaborare con successo una singola immagine per ottenere la fetta dell'oggetto, avevo bisogno di essere in grado di ruotare l'oggetto per scattare una nuova foto con un'angolazione diversa. Per fare ciò, ho controllato il motore passo-passo sotto la piattaforma su cui si trova l'oggetto da scansionare. Ho costruito le fondamenta della nostra funzione di stepping creando una variabile per tracciare lo stato del motore e microstepping attivando ciascuno dei quattro input del motore.

Creazione della mesh Per creare una mesh da tutte le immagini elaborate, ho dovuto prima convertire ogni pixel bianco nell'immagine elaborata in un vertice nello spazio 3D. Poiché sto raccogliendo singole sezioni dell'oggetto con simmetria cilindrica, aveva senso iniziare a raccogliere coordinate cilindriche. Ciò aveva senso in quanto l'altezza dell'immagine potrebbe rappresentare l'asse z, la distanza dal centro della tavola rotante potrebbe rappresentare l'asse R e la rotazione del motore passo-passo potrebbe rappresentare l'asse theta. Tuttavia, poiché ho archiviato i nostri dati in coordinate cilindriche, ho dovuto convertire ciascuno di questi vertici in coordinate cartesiane.

Una volta che questi vertici sono stati creati, sono stati archiviati in un elenco e tale elenco è stato archiviato in un altro elenco che conteneva gli elenchi di vertici creati per ogni immagine catturata. Una volta che tutte le immagini sono state elaborate e convertite in vertici, ho dovuto selezionare i vertici che volevo effettivamente rappresentati nella mesh finale. Volevo che il vertice superiore e il vertice inferiore fossero inclusi e quindi, in base alla risoluzione, ho scelto un numero uniforme di vertici da utilizzare per ogni immagine. Poiché non tutti gli elenchi di vertici erano della stessa lunghezza, ho dovuto uniformarli trovando l'elenco con il minor numero di vertici e rimuovendo i vertici da tutti gli altri elenchi fino a quando non erano tutti pari. Con gli elenchi di vertici creati ora ero in grado di creare una rete. Ho scelto di formattare la nostra mesh con lo standard del file.obj in quanto è semplice e stampabile in 3D.

Funzione incorporata

Dopo che il dispositivo era funzionante, l'ho perfezionato aggiungendo funzionalità integrate complete. Ciò significava rimuovere la tastiera, il mouse e il monitor e inviarci in modalità wireless il file.obj dopo aver terminato l'elaborazione. Per iniziare, ho cambiato il codice.bashrc per accedere automaticamente e avviare il programma python principale all'avvio. Ciò è stato fatto utilizzando sudo raspi-config e selezionando "Console Autologin" e aggiungendo la riga "sudo python /home/pi/finalProject/FINAL.py" a /home/pi/.bashrc. aggiunto un pulsante e un LED di stato per l'input e l'output dell'utente. Il pulsante consente all'utente di dire al dispositivo quando avviare la scansione e il LED indica all'utente lo stato della macchina. Se il LED è acceso, il dispositivo è pronto per iniziare una nuova scansione. Se il LED lampeggia, il dispositivo sta eseguendo la scansione. Se il LED è Office, c'è un errore software, che richiede il riavvio del sistema. Infine, ho abilitato il dispositivo a inviare il file.obj tramite e-mail. Ciò è stato fatto utilizzando le librerie smtplib e email. Questa capacità di inviare e-mail ci ha fornito un modo molto comodo e wireless per consegnare il file prodotto all'utente per l'accesso su molte piattaforme diverse.

Passaggio 7: integrazione

Integrazione
Integrazione

Dopo aver realizzato i vari pezzi del dispositivo, l'ho assemblato insieme. La figura sopra mostra in ordine:

(a) scatola assemblata all'esterno

(b) scatola assemblata all'interno con fotocamera e laser

(c) vista interna del letto dell'elettronica

(d) parte posteriore del Pi con accesso alle porte Pi e all'ingresso del motore 5V

(e) pulsante con anello LED e spia di stato nella parte anteriore del dispositivo

Passaggio 8: risultati

Risultati
Risultati
Risultati
Risultati
Risultati
Risultati
Risultati
Risultati

Lo scanner laser 3D è stato in grado di scansionare oggetti con una precisione decente. Le caratteristiche degli oggetti sono distinte e riconoscibili e le parti erano molto facili da stampare in 3D utilizzando un software di slicing come Repetier. Le figure sopra mostrano alcune scansioni di esempio di un pezzo di legno e una paperella di gomma.

Uno dei nostri maggiori risultati e successi che ho scoperto durante i test è stata la coerenza del dispositivo. Durante più prove dello stesso oggetto, lo scanner è stato in grado di produrre un file.obj ogni volta molto simile, anche se abbiamo leggermente modificato la posizione dell'oggetto. Come si vede nelle tre scansioni separate, sembrano tutte molto simili, catturando gli stessi dettagli e la stessa quantità di dettagli. Nel complesso sono rimasto molto colpito dalla coerenza e dalla robustezza del nostro sistema.

Una delle variabili che sono riuscito davvero a mettere a punto è la risoluzione delle scansioni. Poiché ci sono 400 passi nello stepper, posso scegliere quanto grande ciascuno per dettare la risoluzione angolare. Per impostazione predefinita, ho la risoluzione angolare impostata su 20 iterazioni, il che significa che ogni frame, il motore ruota di 20 passi (400/20 = 20). Questo è stato scelto principalmente nell'interesse del tempo: occorrono circa 45 secondi per completare una scansione in questo modo. Tuttavia, se voglio una scansione di qualità molto più elevata, posso aumentare il numero di iterazioni fino a 400. Questo dà molti più punti con cui costruire il modello, rendendo la scansione molto più dettagliata. Oltre alla risoluzione angolare, posso anche regolare la risoluzione verticale o quanti punti diversi scelgo di interrogare lungo la fetta laser. Per un interesse simile nel tempo, ho impostato questo valore predefinito su 20 ma posso aumentarlo per risultati migliori. Giocando con questi parametri di risoluzione angolare e risoluzione spaziale, sono stato in grado di compilare i risultati di diverse scansioni di seguito nell'ultima figura. Ogni etichetta è formattata in modo tale che sia la risoluzione angolare x la risoluzione spaziale. Come visto nelle impostazioni di scansione predefinite, le caratteristiche dell'anatra sono riconoscibili ma non dettagliate. Tuttavia, quando aumento la risoluzione, iniziano a mostrare le singole caratteristiche precise, inclusi gli occhi, il becco, la coda e le ali dell'anatra. La scansione dell'immagine con la risoluzione più alta ha richiesto circa 5 minuti. Vedere questo livello di risoluzione realizzabile è stato un grande successo.

Limitazioni

Nonostante i risultati positivi del progetto, ci sono ancora alcune limitazioni nella progettazione e nell'implementazione. Con l'uso del laser arrivano molti problemi con il modo in cui la luce si disperde. Molti oggetti che ho provato a scansionare che erano traslucidi, lucidi o molto scuri si sono rivelati problematici con il modo in cui la luce si rifletteva sulla superficie. Se l'oggetto fosse traslucido, la luce verrebbe assorbita e dispersa, creando una lettura molto rumorosa delle fette. Negli oggetti lucidi e scuri, la luce sarebbe riflessa o assorbita al punto che sarebbe difficile da captare. Inoltre, poiché sto usando una fotocamera per catturare le caratteristiche degli oggetti, il suo rilevamento è limitato dalla sua linea di vista, il che significa che gli oggetti concavi e gli angoli acuti sono spesso bloccati da altre parti dell'oggetto. Questo è mostrato nel nostro esempio di paperella di gomma poiché la coda a volte perde la sua curvatura durante la scansione. La fotocamera può anche rilevare solo le strutture superficiali, il che significa che i fori o le geometrie interne non possono essere catturati. Tuttavia, questo è un problema comune che hanno anche molte altre soluzioni di scansione.

Prossimi passi

Sebbene fossi soddisfatto dei risultati del nostro progetto, c'erano alcune cose che potevano essere implementate per renderlo migliore. Per cominciare, allo stato attuale, la risoluzione di scansione può essere modificata solo modificando le variabili di risoluzione codificate nel nostro codice. Per rendere il progetto più integrato, potrebbe essere incluso un potenziometro di risoluzione in modo che l'utente possa modificare la risoluzione senza dover collegare un monitor e una tastiera allo scanner. Inoltre, lo scanner crea immagini che a volte possono sembrare frastagliate. Per risolvere questo problema, potrebbero essere implementate tecniche di livellamento della mesh per appianare le irregolarità e gli angoli duri. Infine, ho scoperto che le coordinate dei pixel non si adattano bene al mondo reale. Le maglie che ho creato erano da 6 a 7 volte più grandi dell'oggetto reale. In futuro sarebbe vantaggioso implementare un modo per ridimensionare le mesh in modo che siano più precise rispetto alle dimensioni reali dell'oggetto.

Passaggio 9: risorse

Ho incluso il codice, i file STL per la stampa e i file DXF per il taglio per l'intero progetto.

Concorso Raspberry Pi 2020
Concorso Raspberry Pi 2020
Concorso Raspberry Pi 2020
Concorso Raspberry Pi 2020

Primo Premio al Raspberry Pi Contest 2020

Consigliato: