Innholdsfortegnelse:

Raspberry Pi laserskanner: 9 trinn (med bilder)
Raspberry Pi laserskanner: 9 trinn (med bilder)

Video: Raspberry Pi laserskanner: 9 trinn (med bilder)

Video: Raspberry Pi laserskanner: 9 trinn (med bilder)
Video: How To Flash Android 9 Pie on Raspberry Pi 3 system image 2024, Juli
Anonim
Image
Image
Raspberry Pi laserskanner
Raspberry Pi laserskanner

Laserskanneren er en innebygd Raspberry Pi -enhet som kan digitalisere objekter til.obj -mesh -filer for reproduksjon ved hjelp av 3D -utskrift. Enheten gjør dette ved å bruke en linjelaser og en integrert PiCam for å utføre datasyn. Laseren er plassert 45 grader skrå fra laseren og projiserer en lys rød linje på en vertikal skive av objektet. Kameraet oppdager skivens avstand fra midten for å gi en maskebit. Objektet sentrifugeres på den roterende skuffen og prosessen gjentas til hele objektet er skannet. Den genererte.obj -filen sendes endelig til brukeren, noe som gjør systemet helt frittstående og innebygd.

Denne instruksen vil gå gjennom hvordan enheten ble bygget, noen resultater og fremtidige trinn.

Trinn 1: Inspirasjon

Inspirasjon
Inspirasjon
Inspirasjon
Inspirasjon

Som en ivrig produsent har jeg vært 3D -utskrift og solid modellering i flere år nå. Jeg har jobbet med mange forskjellige prototypeverktøy fra CNC -rutere til laserskjærere til 3D -skrivere. En enhet som mitt lokale produksjonsområde ennå ikke har kjøpt, har vært en 3D -skanner - og jeg kan fortelle deg hvorfor.

De billigere (noen få hundre dollar) var upålitelige, krevde perfekte forhold, og ga fremdeles ganske slitte resultater. De dyre var… vel, dyre, opp til flere tusen dollar, noe som gjør funksjonen ikke verdt det i mange tilfeller. På toppen av det, flere ganger enn ikke, velger jeg å ta målinger og designe en modell fra bunnen av enn å håndtere overflatenettet generert fra en skanning.

På grunn av dette ønsket jeg å bygge en frittstående budsjettskanner for å se hvor godt jeg kunne skanne et objekt ved hjelp av hyllekomponenter.

Etter å ha gjort noen undersøkelser, så jeg at mange 3D -skannere brukte en roterende plattform og deretter en rekke forskjellige sensorer for å måle avstand fra sentrum for å bygge en rotasjonsmodell. Mange av disse brukte doble kameraer som ligner på Kinect. Til slutt snublet jeg over Yscanner som er en lavoppløselig skanner som bruker laser. Når vi ser på enkelhet og gjennomførbarhet, så denne laserteknikken, der en laser skinner offset i forhold til et kamera for å måle avstand fra sentrum, ut som en klar vei fremover.

Trinn 2: Verktøy og deler

Deler:

  • Raspberry Pi $ 35,00
  • Raspberry Pi Camera V2 $ 30,00
  • Lysdioder, motstander og ledninger
  • 3D -filament
  • 12x12x0,125 treplater
  • M3 maskinvare
  • Stepper Motor - $ 14
  • Line Laser - $ 8
  • LN298 trinnmotordrivere - $ 2,65
  • Trykknapp i metall - $ 5

Verktøy:

  • Loddejern
  • Laserskjærer
  • 3D -skriver
  • Skrujern
  • Tang

Trinn 3: Design på høyt nivå

Design på høyt nivå
Design på høyt nivå
Design på høyt nivå
Design på høyt nivå

Den sentrale komponenten i dette designet er linjelaseren som projiserer på et vertikalt stykke av objektene. Denne projeksjonen kan fanges på picamera, få perspektivet korrigert og deretter filtrert før bildebehandling. Ved bildebehandling kan avstanden mellom hvert segment av linjen fra midten av objektet samles inn. I radiale koordinater vil dette bildet gi både r- og z -komponentene. Den tredje dimensjonen, Θ, oppnås deretter ved å rotere objektet til et nytt stykke. Dette konseptet er vist i den første figuren.

For å utføre de beskrevne handlingene ovenfor, brukte jeg en Raspberry Pi som vår sentrale dataenhet. Jeg festet en stepper motor og en motor driver til Pi, drevet av en ekstern 5V forsyning og styrt av Pi's GPIO pins. En linjelaser ble satt på 3,3 V -linjen på Pi og en PiCam ble festet til kamerainngangen på Pi. Til slutt ble en enkel nedtrekksknapp installert og en status -LED for å indikere for brukeren hvilken tilstand systemet er i. Hele systemet er oppsummert i et systemblokkdiagram.

Fra starten var det planlagt å huse elektronikken i en laserskåret boks holdt sammen med T-spor og M3-maskinvare. Elektronikken ville være skjult for synet i et bunnrom og et lokk ville gi enkel tilgang til objektplassering på den roterende skuffen. Dette lokket er nødvendig for å minimere mengden lys som lekker ut i systemet, ettersom dette eksterne lyset kan produsere støy i den siste skanningen.

Trinn 4: Maskinvare

Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare
Maskinvare

Som sett ovenfor, før jeg begynte med laserskjæring eller 3D -utskrift, brukte jeg Autodesk Fusion 360 til å lage en detaljert 3D -modell av designet vårt. Som en oversikt er enheten en enkel eske med lokk med laserskårne hengsler. Det er to hovedlag av enheten: elektronisk seng og hovedseng, med hull for ledninger som kan løpe mellom de to lagene.

Majoriteten av boksen vår ble produsert med en laserskjærer, med design som ble produsert i Fusion 360 og kuttet på en Epilog Zing 40 W laserskjærer. Våre design er vist i figurene ovenfor. Øverst til venstre som beveger seg til høyre, er brikkene hovedsengen, elektronikksengen, to stykker for lokket, bakstykket, frontstykket og de to sidestykkene. I hovedsengen er det tre hovedutkoblinger: en for montering av trinnmotoren, en for å føre ledninger fra laseren og en for å føre PiCams brede kabel. Sengestykket har monteringshull for å feste Pi, brødbrett og motordriver og en større avbrudd for å få tilgang til trinnmotoren. Lokkstykkene klikker sammen ganske enkelt for å danne det trekantede stykket sett ovenfor, og hengslet er en enkel ekstrudering som er bredden på diameteren på hullet på sideplatene. Bakstykket og et av sidestykkene har spor på siden slik at portene til Pi (HDMI, USB, Ethernet, Power) lett kan nås. Fronten er et enkelt stykke som jeg til slutt lagde hull i med en håndbor for å montere knappen og LED. Som sett på alle brikkene, holdes våre deler sammen av M3-maskinvare ved hjelp av T-ledd og spor. Dette er en metode for å holde laserskårne stykker ortogonalt og sikkert. Finnenes stykker er på linje med sporene andre stykker og det t-formede snittet på kantene gir plass til at en M3-mutter kan sette seg fast i dem uten å spinne. Dette gjør at vi deretter kan bruke en M3 -skrue til å låse brikkene sammen med veldig lite vrikkerom uten at monteringen skal være helt permanent.

Jeg valgte å gjøre flertallet av våre brikker med en laserskærer på grunn av hastigheten og brukervennligheten. Imidlertid måtte jeg fortsatt 3D -skrive ut noen stykker på grunn av deres 3D -geometri som ville være vanskeligere å lage på kutteren. Det første stykket var linjelaserholderen. Dette stykket skulle monteres på hovedsengen i 45 grader fra kameraets sikt og ha et hull slik at laseren kunne passe godt inn i friksjonen. Jeg måtte også lage et motorfeste fordi motorens aksel var så lang. Monteringsfriksjonen passet inn i laserskårne stykker og senket planet som motoren var festet til slik at den roterende plattformen var i flukt med hovedsjiktet.

Trinn 5: Elektronikk

Elektronikk
Elektronikk

Kabelmaskinvaren til dette prosjektet var veldig enkel ettersom 3D -skanneren ikke krevde for mange eksterne enheter. En motor, knapp, LED, laser og kamera måtte kobles til Pi. Som vist sørget jeg for å koble motstander i serie med hver pinne vi brukte for å beskytte pinnene. En GPIO -pinne var dedikert til å kontrollere status -LED, som ville lyse når enheten var klar til bruk og pulse med PWM når enheten var i drift. En annen GPIO-pinne ble koblet til en opptrukket knapp, som registrerte HIGH når knappen ikke ble trykket og LOW når knappen ble trykket. Til slutt dedikerte jeg fire GPIO -pinner til å drive trinnmotoren.

Siden motoren vår bare måtte gå en viss grad uten å kreve kontroll over hastigheten, valgte vi en enklere steppermotordriver (L298N) som ganske enkelt trapper opp kontrolllinjene for å mates inn i motorens innganger. For å lære om hvordan du bruker trinnmotorene på et veldig lavt nivå, refererte vi til både L298N -databladet og Arduino -biblioteket. Steppermotorer har en magnetisk kjerne med forstyrrende fingre med vekslende polaritet. De fire ledningene er pakket inn for å styre to elektromagneter som hver driver hver annen motstående finger i motoren. Dermed, ved å bytte polaritet på fingrene, er vi i stand til å skyve stepper et trinn. Med denne kunnskapen om hvordan steppere fungerte fra maskinvarenivå, klarte vi å kontrollere stepperne mye lettere. Vi valgte å slå av steppermotoren fra en 5V strømforsyning i laboratoriet i stedet for Pi på grunn av maksimal strømforbruk på omtrent 0,8 A, som er mer enn Pi kunne levere.

Trinn 6: Programvare

Programvare
Programvare
Programvare
Programvare
Programvare
Programvare
Programvare
Programvare

Programvaren for dette prosjektet kan deles inn i fire hovedkomponenter som samhandler sammen: Bildebehandling, Motorstyring, Mesh Creation og Embedded Functions.

Som et sammendrag av programvaren kan vi se til den første figuren. Når systemet starter opp, logger.bashrc seg automatisk inn i Pi og begynner å kjøre python -koden vår. Systemet lyser opp statuslampen for å gi brukeren beskjed om at den er startet opp riktig og venter på knappetrykket. Brukeren kan deretter plassere elementet som skal skannes og lukke lokket. Etter å ha trykket på knappen pulserer LED -en for å gi brukeren beskjed om at enheten fungerer. Enheten vil gå mellom bildebehandling og motorstyring til full rotasjon er fullført og alle objektdata er samlet inn. Til slutt opprettes masken og filen sendes til en forhåndsvalgt e -post. Dette starter syklusen på nytt og maskinen er klar til å utføre en ny skanning med et tastetrykk.

Bildebehandling

Det første som ble implementert var å behandle et fanget bilde for å trekke ut informasjonen som er lagret i bildet til et skjema som kan brukes til å lage en rekke punkter i rommet. For å gjøre dette, begynte jeg med å ta et bilde av objektet på plattformen sammen med all bakgrunnsstøyen som ble skapt av laseren som skinner på baksiden av esken og sprer seg. Dette bildet hadde to hovedproblemer i sin råform. For det første ble objektet sett i en vinkel med et forhøyet perspektiv og for det andre var det mye bakgrunnsstøy. Det første jeg trengte å gjøre var å ta hensyn til denne synsvinkelen fordi bruk av bildet som det ikke ville tillate oss å bestemme en konsistent objekthøyde. Som sett i den andre figuren er høyden på den opp -ned "L" -formen konsistent; På grunn av at den ene siden er lengre enn den andre, ser det ut til at de har forskjellige høyder på kanten nærmest betrakteren.

For å fikse dette, måtte jeg transformere arbeidsområdet i bildet til et rektangel fra den trapesformede formen det var i tidligere. For å gjøre dette brukte jeg koden fra denne lenken, som når den får et bilde og fire poeng, beskjærer bildet mellom de fire punktene og transformerer det beskårne bildet for å kompensere for perspektivet. Denne transformasjonen bruker de fire punktene til å lage et rektangel i stedet for en form av en trapezform, sett i den tredje figuren.

Det neste problemet som måtte løses var bakgrunnsstøy i form av utvendig lys og lys som reflekteres av laseren selv. For å gjøre dette filtrerte jeg lyset ved hjelp av inRange () -funksjonen til OpenCV. Jeg satte terskelen til å bare hente rødt lys på et visst nivå. For å få den riktige verdien, begynte jeg med en mild terskel og fortsatte å øke terskelnivået til det eneste lyset som ble hentet, var laserlyset på objektet som ble skannet. Da jeg hadde dette bildet, fant jeg den lyseste pikslen i hver rad for å få en linje på en piksel per rad som grenser til venstre mest side av laserlinjen. Hver piksel ble deretter konvertert til et toppunkt i 3D -rom og lagret i en matrise, som beskrevet i seksjonen for opprettelse av masker. Resultatene av disse trinnene kan sees i den fjerde figuren.

Motor kontroll

Etter å ha vært i stand til å behandle et enkelt bilde for å få et stykke av objektet, trengte jeg å kunne rotere objektet for å ta et nytt bilde med en annen vinkel. For å gjøre dette kontrollerte jeg trinnmotoren under plattformen som objektet som ble skannet sitter på. Jeg bygde et grunnlag for vår trinnfunksjon ved å lage en variabel for å spore tilstanden til motoren og mikrostepping ved å veksle hver av de fire motorinngangene.

For å lage et maske fra alle de behandlede bildene, måtte jeg først konvertere hver hvit piksel i det behandlede bildet til et toppunkt i 3D -rom. Fordi jeg samler individuelle skiver av objektet med sylindrisk symmetri, var det fornuftig å begynne å samle sylindriske koordinater. Dette var fornuftig ettersom høyden på bildet kunne representere z-aksen, avstanden fra midten av det roterende bordet kunne representere R-aksen, og rotasjonen av trinnmotoren kunne representere theta-aksen. Men fordi jeg lagret dataene våre i sylindriske koordinater, måtte jeg konvertere hver av disse toppunktene til kartesiske koordinater.

Når disse hjørnene ble opprettet, ble de lagret i en liste og listen ble lagret i en annen liste som inneholdt toppunktlistene som ble opprettet for hvert bilde som ble tatt. Når alle bildene var behandlet og konvertert til hjørner, måtte jeg velge hjørnene som jeg faktisk ønsket representert i den siste masken. Jeg ville at toppunktet og det nedre toppunktet skulle inkluderes, og deretter basert på oppløsningen valgte jeg et jevnt fordelt antall hjørner for hvert bilde. Fordi ikke alle toppunktlistene var like lange, måtte jeg utjevne dem ved å finne listen med det minste antallet hjørner og fjerne hjørner fra alle andre lister til de var alle like. Med toppunktlistene som ble opprettet, kunne jeg nå lage et maske. Jeg valgte å formatere vårt maske etter.obj -filstandarden ettersom det er enkelt og 3D -utskrivbart.

Innebygd funksjon

Etter at enheten var funksjonell, polerte jeg den ved å legge til full innebygd funksjonalitet. Dette betydde å fjerne tastaturet, musen og skjermen, og få den til å sende oss.obj -filen trådløst etter endt behandling. For å starte endret jeg.bashrc -koden for å automatisk logge på og starte hovedpython -programmet ved oppstart. Dette ble gjort ved å bruke sudo raspi-config og velge “Console Autologin” og ved å legge til linjen “sudo python /home/pi/finalProject/FINAL.py” til /home/pi/.bashrc. I tillegg til dette har jeg også lagt til en knapp og status -LED for brukerens input og output. Knappen lar brukeren fortelle enheten når den skal starte skanningen, og LED -en vil fortelle brukeren om maskinens tilstand. Hvis lysdioden er på, er enheten klar til å starte en ny skanning. Hvis LED -en pulserer, skanner enheten for øyeblikket. Hvis lysdioden er på kontoret, er det en programvarefeil som krever systemstart. Til slutt gjorde jeg det mulig for enheten å sende.obj -filen via e -post. Dette ble gjort ved å bruke smtplib- og e -postbibliotekene. Denne muligheten til å sende e -post ga oss en veldig praktisk og trådløs måte å levere den produserte filen til brukeren for å få tilgang til på mange forskjellige plattformer.

Trinn 7: Integrasjon

Integrering
Integrering

Etter å ha produsert de forskjellige delene av enheten, monterte jeg den sammen. Figuren over viser i rekkefølge:

(a) montert eske utenfor

(b) montert eske inne med kamera og laser

(c) innsiden av elektronisk seng

(d) baksiden av Pi med tilgang til Pi -porter og 5V motorinngang

(e) trykknapp med LED -ring og statuslys foran på enheten

Trinn 8: Resultater

Resultater
Resultater
Resultater
Resultater
Resultater
Resultater
Resultater
Resultater

Laser 3D -skanneren var i stand til å skanne objekter med anstendig presisjon. Objektets funksjoner er tydelige og gjenkjennelige, og delene var veldig enkle å 3D -skrive ut ved hjelp av en skjæreprogramvare som Repetier. Figurene ovenfor viser noen prøveskanninger av et treverk og en gummi -and.

En av våre største funn og suksesser som jeg oppdaget under testing var enhetens konsistens. Gjennom flere forsøk på det samme objektet, var skanneren i stand til å produsere en.obj -fil som var veldig veldig lik hver gang, selv om vi endret plasseringen av objektet litt. Som sett i de tre separate skanningene, ser de alle veldig like ut, og fanger de samme detaljene og samme detaljmengden. Jeg var generelt veldig imponert over systemets konsistens og robusthet.

En av variablene jeg virkelig klarte å stille inn er oppløsningen på skanningene. Fordi det er 400 trinn i stepperen, kan jeg velge hvor stor hver ΔΘ skal diktere vinkeloppløsningen. Som standard har jeg vinkeloppløsningen satt til 20 iterasjoner, noe som betyr at hver ramme, motoren roterer med 20 trinn (400/20 = 20). Dette ble valgt hovedsakelig av interesse - det tar omtrent 45 sekunder å fullføre en skanning på denne måten. Men hvis jeg vil ha en skanning av mye høyere kvalitet, kan jeg øke antall iterasjoner helt opp til 400. Dette gir mange flere punkter å konstruere modellen med, noe som gir en mye mer detaljert skanning. I tillegg til vinkeloppløsningen, kan jeg også justere den vertikale oppløsningen, eller hvor mange forskjellige punkter jeg velger å polle langs laserskiven. For en lignende tidsinteresse har jeg denne standarden satt til 20, men jeg kan øke den for bedre resultater. Når jeg lekte med disse parametrene for vinkeloppløsning og romlig oppløsning, var jeg i stand til å kompilere resultatene av forskjellige skanninger nedenfor i den siste figuren. Hver etikett er formatert slik at den er vinkeloppløsningen x romlig oppløsning. Som vist i standard skanneinnstillinger, er andens funksjoner gjenkjennelige, men ikke detaljerte. Imidlertid, når jeg øker oppløsningen, begynner individuelle presise funksjoner å vise, inkludert øyne, nebb, hale og vinger på anda. Det tok omtrent 5 minutter å skanne bildet med den høyeste oppløsningen. Å se dette høye i en oppnåelig oppløsning var en veldig stor suksess.

Begrensninger

Til tross for de vellykkede resultatene av prosjektet, er det fortsatt noen få begrensninger ved design og implementering. Med bruk av laseren kommer det mange problemer med hvordan lyset sprer seg. Mange objekter jeg prøvde å skanne som enten var gjennomskinnelige, skinnende eller veldig mørke, viste seg å være plagsomme med hvordan lyset reflekterte fra overflaten. Hvis objektet var gjennomskinnelig, ville lyset bli absorbert og spredt, noe som gir en veldig støyende lesning av skiver. I skinnende og mørke gjenstander ville lyset enten reflekteres eller absorberes til det punktet det ville være vanskelig å fange opp. Fordi jeg bruker et kamera for å fange funksjonene til objekter, er dens sansning begrenset av siktlinjen, noe som betyr at konkave objekter og skarpe vinkler ofte blir blokkert av andre deler av objektet. Dette er vist i vårt gummiandeksempel, da halen noen ganger mister krumningen i skanningen. Kameraet kan også bare oppdage overflatestrukturer, noe som betyr at hull eller indre geometrier ikke kan fanges opp. Dette er imidlertid et vanlig problem som mange andre skanneløsninger også har.

Neste skritt

Selv om jeg var fornøyd med resultatene av prosjektet vårt, var det noen få ting som kunne implementeres for å gjøre det bedre. For det første, i nåværende tilstand, kan skanneoppløsningen bare endres ved å endre de hardkodede oppløsningsvariablene i koden vår. For å gjøre prosjektet mer innebygd, kan et potensiometer for oppløsning inkluderes slik at brukeren kan endre oppløsningen uten å måtte koble til en skjerm og et tastatur til skanneren. I tillegg lager skanneren bilder som noen ganger kan se ujevne ut. For å fikse dette kan maskeutjevningsteknikker implementeres for å jevne ut uregelmessigheter og harde hjørner. Til slutt fant jeg ut at pikselkoordinater ikke kommer godt inn i den virkelige verden. Maskene jeg skapte var 6 til 7 ganger større enn det faktiske objektet. I fremtiden vil det være fordelaktig å implementere en måte å skalere masker på slik at de er mer nøyaktige i forhold til objektets virkelige størrelse.

Trinn 9: Ressurser

Jeg har inkludert koden, STL -filer for utskrift og DXF -filer for kutting for hele prosjektet.

Raspberry Pi Contest 2020
Raspberry Pi Contest 2020
Raspberry Pi Contest 2020
Raspberry Pi Contest 2020

Førstepremie i Raspberry Pi Contest 2020

Anbefalt: