lunedì 5 settembre 2016

DIY - Realizzare uno scanner 3D con Arduino (alta risoluzione a basso costo)

Perché dovrei realizzare uno scanner 3D?
Diversi sono i motivi che mi spingono a farlo tra cui quello di realizzare dei busti a tutto tondo per poi fresarli su legno con il quarto asse, realizzare una specie di fotografia in 3D.

La fresatrice l'ho costruita, il quarto asse pure, quello che mi manca per raggiungere lo scopo è un modello 3D della figura e l'unico modo per ottenerlo è con uno scanner 3D.
Tempo fa avevo tentato di realizzare il modello 3D di un busto con il sensore Kinect ma purtroppo ha una scarsa qualità e i dettagli più piccoli di 15 mm vanno perduti.

Non ho di certo intenzione di comprarmi uno scanner da 600 euro ma con pochi componenti è possibile realizzarselo da soli.



Documentandomi un pò ho scoperto che ci sono diverse tecniche per ottenere un modello 3D e quella più economica è la fotogrammetria.
In pratica consiste nel dare in pasto ad un software una sequenza di immagini, possibilmente in alta risoluzione. C'è chi utilizza una webcam ma ritengo sia molto meglio una reflex (per chi ne possiede una ovviamente).

Componenti necessari per realizzare uno scanner 3D

Avendo a disposizione una Fujifilm Finepix S9500 ho pensato di adibirla allo scopo.
Essendo il software a fare tutto il "lavoro sporco" non resta che concentrarsi sulla qualità delle immagini.


Arduino servirà solo per gestire il movimento di un sistema rotante e di scattare le immagini.
Quasi tutte le fotocamere hanno un ingresso per gestire lo scatto remoto ed anche la mia Finepix tramite il protocollo RR-80.

Ho ordinato su Ebay un cavetto RR-80


Infine serve una scheda Arduino, un driver pololu A4988, un motore stepper, un relè, un pezzo di piastra millefori e qualche morsettiera da saldare.




Lo schema di collegamento dei componenti è molto semplice.





Sketch Arduino - download

In sostanza Arduino dovrà eseguire 2 operazioni ripetute.
  1. Ruotare il motore di un dato numero di gradi
  2. Azionare il relè per far eseguire lo scatto alla fotocamera

Ho scritto un breve sketch per poter pilotare i componenti sia con due pulsanti che a linea di comando tramite stringhe passate via console seriale; 
ad esempio se volessi fare scatti ogni 10° basta digitare "scan-10" oppure scan-20 = scatti ogni 20°.
Ho aggiunto anche altri comandi per poter fare il timelapse escludendo la rotazione del motore specificando nel comando quanti scatti fare e dopo quanti secondi uno dall'altro.

clicca qui per scaricare lo sketch per Arduino.

Nota bene: E' necessario caricare nelle librerie di Arduino il componente AccelStepper scaricabile gratuitamente da questo link.


Preparazione supporto girevole

Per scansionare un volto dovrebbe essere la camera a doversi muovere ed il soggetto a rimanere fermo ma prima vorrei testare tutto il sistema su oggetti piccoli e capire qual'è il dettaglio minimo catturabile.

Mi sono costruito un disco graduato con un foro di fissaggio al motore stepper.









Ho calibrato gli step del motore con i gradi incisi sul disco ed ho iniziato a fare la prima scansione di un giocattolo di mia figlia.




Acquisizione immagini

Ho eseguito una scansione con scatti ogni 10° e tutte le immagini le ho date in pasto ad un software di fotogrammetria chiamato Agisoft Photoscan che è possibile scaricare in modalità demo.




Elaborazione con Agisoft Photoscan







I dettagli del modello sono molto precisi nonostante abbia scattato le foto in condizioni di poca luce ed anche con una lieve sfocatura.

Per aumentare i dettagli sarà sufficiente eseguire scatti anche in altre angolazioni.

Box Elettronica

Per contenere i pochi compomenti elettronici ho realizzato una scatola in multistrati da 10 mm sulla quale ho inciso con il laser le indicazioni dei led e pulsanti.
L'ho fatta abbastanza capiente perchè all'interno di essa ci metterò anche un alimentatore per il motore stepper.



Avevo dei vecchi componenti (interruttori, pulsanti, led) inutilizzati che ho riciclato ed il tutto ha preso un leggero stile vintage.






Risoluzione infinita...

Il bello di utilizzare la tecnica della fotogrammetria è che si possono ottenere risoluzioni molto alte perché dipende solo dall'ottica della fotocamera che si utilizza.

Ho provato a scansionare un oggetto molto piccolo con l'opzione macro ed il risultato è andato ben oltre le mie aspettative.


36 scatti ogni 10°
Uno dei 36 scatti


Allineamento delle immagini

Creazione (manuale) delle maschere di contorno per una migliore elaborazione

Generazione della nuvola di punti

Elaborazione finale della mesh dalla nuvola di punti

Alcune immagini






The next Step: Ottenere un modello 3D di un volto...

Per riuscire a fare la scansione dei volti non resta altro da fare che costruire un meccanismo rotante tramite il motore stepper che possa far ruotare la fotocamera e dal lato opposto un pannello di sfondo di colore verde.

Per ora è tutto, seguirà un aggiornamento.
Grazie per la lettura.