Indholdsfortegnelse:

Raspberry Pi Laser Scanner: 9 trin (med billeder)
Raspberry Pi Laser Scanner: 9 trin (med billeder)

Video: Raspberry Pi Laser Scanner: 9 trin (med billeder)

Video: Raspberry Pi Laser Scanner: 9 trin (med billeder)
Video: DIY sonar scanner (practical experiments) 2024, Juli
Anonim
Image
Image
Raspberry Pi laserscanner
Raspberry Pi laserscanner

Laserscanneren er en Raspberry Pi -integreret systemenhed, der er i stand til at digitalisere objekter til.obj -netfiler til gengivelse ved hjælp af 3D -udskrivning. Enheden gør dette ved at bruge en line laser og en integreret PiCam til at udføre computersyn. Laseren er placeret 45 grader skråt fra laseren og projekterer en lys rød linje på et lodret stykke af objektet. Kameraet registrerer skivens afstand fra midten for at give et netskive. Objektet centrifugeres på den roterende bakke, og processen gentages, indtil hele objektet er scannet. Den genererede.obj -fil sendes endelig til brugeren, hvilket gør systemet helt selvstændigt og integreret.

Denne instruktionsbog vil gennemgå, hvordan enheden blev bygget, nogle resultater og fremtidige trin.

Trin 1: Inspiration

Inspiration
Inspiration
Inspiration
Inspiration

Som en ivrig maker har jeg været 3D -print og solid modellering i flere år nu. Jeg har arbejdet med en masse forskellige prototypeværktøjer fra CNC -routere til laserskærere til 3D -printere. En enhed, som mit lokale makerspace endnu ikke har købt, har været en 3D -scanner - og jeg kan fortælle dig hvorfor.

De billigere (et par hundrede dollars) var upålidelige, krævede perfekte forhold og frembragte stadig temmelig lurvede resultater. De dyre var… ja, dyre, lige fra flere tusinde dollars, hvilket gør dens funktion ikke værd i mange tilfælde. Oven i det vælger jeg flere gange end ikke at tage målinger og designe en model fra bunden end at beskæftige mig med overfladenettet fra en scanning.

På grund af dette ønskede jeg at bygge en budget -standalone scanner for at se, hvor godt jeg kunne scanne et objekt ved hjælp af komponenter fra hylden.

Efter at have foretaget nogle undersøgelser så jeg, at mange 3D -scannere brugte en roterende platform og derefter en række forskellige sensorer til at måle afstanden fra midten for at bygge en rotationsmodel. Mange af disse brugte dobbelte kameraer, der lignede Kinect. Jeg faldt til sidst over Yscanner, som er en scanner med lav opløsning, der bruger en laser. Ser man på enkelhed og gennemførlighed, så denne laserteknik, hvor en laser skinner forskudt i forhold til et kamera for at måle afstanden fra midten, ud som en klar vej frem.

Trin 2: Værktøjer og dele

Dele:

  • Hindbær Pi $ 35,00
  • Raspberry Pi Camera V2 $ 30,00
  • Lysdioder, modstande og ledninger
  • 3D -print filament
  • 12x12x0,125 træplader
  • M3 hardware
  • Stepper Motor - $ 14
  • Line Laser - $ 8
  • LN298 trinmotordrivere - $ 2,65
  • Metal trykknap - $ 5

Værktøjer:

  • Loddekolbe
  • Laserskærer
  • 3D printer
  • Skruetrækker
  • Tang

Trin 3: Design på højt niveau

Design på højt niveau
Design på højt niveau
Design på højt niveau
Design på højt niveau

Den centrale komponent i dette design er linjelaseren, der projekterer på et lodret stykke af objekterne. Denne projektion kunne fanges på picameraet, få sit perspektiv korrigeret og derefter filtreret før billedbehandling. Ved billedbehandling kunne afstanden mellem hvert segment af linjen fra objektets centrum opsamles. I radiale koordinater ville dette billede give både r- og z -komponenterne. Den tredje dimension, Θ, opnås derefter ved at rotere objektet til en ny skive. Dette koncept er vist i den første figur.

For at udføre de beskrevne handlinger ovenfor brugte jeg en Raspberry Pi som vores centrale computerenhed. Jeg fastgjorde en stepper motor og en motor driver til Pi, drevet af en ekstern 5V forsyning og styret af Pi's GPIO ben. En linjelaser blev sat på 3,3 V -linjen på Pi, og en PiCam blev fastgjort til kameraindgangen på Pi. Endelig blev der installeret en simpel nedtaget knap og en status -LED for at angive brugeren, hvilken tilstand systemet er i. Hele systemet er opsummeret i et systemblokdiagram.

Fra starten var det planlagt at huse elektronikken i en laserskåret boks, der blev holdt sammen med T-slots og M3-hardware. Elektronikken ville være skjult for synet i et bundrum, og et låg ville give let adgang til objektplacering på den roterende bakke. Dette låg er nødvendigt for at minimere mængden af lys, der lækker ind i systemet, da dette eksterne lys kan producere støj i den sidste scanning.

Trin 4: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Som det ses ovenfor, før jeg begyndte med laserskæring eller 3D -udskrivning, brugte jeg Autodesk Fusion 360 til at lave en detaljeret 3D -model af vores design. Som en oversigt er enheden en simpel æske med låg med laserskårne hængsler. Der er to hovedlag af enheden: elektroniksengen og hovedsengen med huller til ledninger, der kan løbe mellem de to lag.

Størstedelen af vores boks blev fremstillet med en laserskærer, hvor designs blev produceret i Fusion 360 og skåret på en Epilog Zing 40 W laserskærer. Vores designs er vist i figurerne ovenfor. Fra øverst til venstre, der bevæger sig til højre, er stykkerne hovedsengen, elektroniksengen, to stykker til låget, bagstykket, forstykket og de to sidestykker. I hovedsengen er der tre hovedafbrydelser: en til montering af trinmotoren, en til at føre ledninger fra laseren og en til at føre PiCams brede kabel. Sengestykket har monteringshuller til sikring af Pi, brødbræt og motordriver og en større afbrydelse for at få adgang til trinmotoren. Lågstykkerne klikker simpelthen sammen for at danne det trekantede stykke set ovenfor, og hængslet er en simpel ekstrudering, der er bredden på diameteren af hullet i sidebordene. Bagstykket og et af sidestykkerne har åbninger på siden, så der er let adgang til portene på Pi (HDMI, USB, Ethernet, Power). Fronten er et simpelt stykke, som jeg til sidst lavede huller i med en håndboremaskine til montering af knappen og LED'en. Som det ses på alle stykkerne, holdes vores dele sammen af M3-hardware ved hjælp af T-samlinger og slots. Dette er en metode til at holde laserskårne stykker ortogonalt og sikkert. Finerne af stykker flugter med slidserne andre stykker og det t-formede snit på kanterne giver plads til, at en M3-møtrik kan sidde fast i dem uden at spinde. Dette giver os mulighed for derefter at bruge en M3 -skrue til at låse brikkerne sammen med meget lidt vrikkerum uden at samlingen skal være helt permanent.

Jeg valgte at gøre størstedelen af vores stykker med en laserskærer på grund af dens hastighed og lethed. Jeg var dog stadig nødt til at 3D -printe nogle stykker på grund af deres 3D -geometri, der ville være sværere at oprette på kutteren. Det første stykke var line laserholderen. Dette stykke skulle monteres på hovedsengen ved 45 grader fra kameraets synspunkt og have et hul, så laseren kunne sidde tæt i friktionen. Jeg var også nødt til at oprette et motorophæng, fordi motorens aksel var så lang. Monteringsfriktionen passede ind i de laserskårne stykker og sænkede det plan, motoren var fastgjort til, så den roterende platform flugtede med hovedsengen.

Trin 5: Elektronik

Elektronik
Elektronik

Ledningshardwaren til dette projekt var meget enkel, da 3D -scanneren ikke krævede for mange eksterne enheder. En motor, knap, LED, laser og kamera skulle tilsluttes Pi. Som vist sørgede jeg for at forbinde modstande i serie med hver stift, vi brugte for at beskytte stifterne. En GPIO -pin var dedikeret til at styre status -LED'en, som ville lyse, når enheden var klar til brug og pulse med PWM, når enheden kørte. En anden GPIO-pin blev tilsluttet en udtrukket knap, der registrerede HIGH, når der ikke blev trykket på knappen og LOW, når der blev trykket på knappen. Endelig dedikerede jeg fire GPIO -ben til at køre trinmotoren.

Da vores motor kun skulle træde et vist omfang uden at kræve hastighedsregulering, valgte vi en enklere steppermotordriver (L298N), der ganske enkelt træder kontrollinjerne op for at mates ind i motorens indgange. For at lære om, hvordan man betjener steppermotorerne på et meget lavt niveau, henviste vi til både L298N -databladet og Arduino -biblioteket. Stepper motorer har en magnetisk kerne med forstyrrende fingre med skiftende polaritet. De fire ledninger er pakket ind for at styre to elektromagneter, som hver driver hver anden modstående finger i motoren. Ved at skifte fingrene polaritet er vi således i stand til at skubbe stepperen et trin. Med denne viden om, hvordan steppere fungerede fra et hardwareniveau, kunne vi meget lettere styre stepperne. Vi valgte at slukke vores steppermotor for en 5V strømforsyning i laboratoriet frem for Pi på grund af dens maksimale strømforbrug på ca. 0,8 A, hvilket er mere end Pi kunne levere.

Trin 6: Software

Software
Software
Software
Software
Software
Software
Software
Software

Softwaren til dette projekt kan opdeles i fire hovedkomponenter, der interagerer sammen: Billedbehandling, Motorstyring, Mesh Creation og Embedded Functions.

Som et resumé af softwaren kan vi se til den første figur. Når systemet starter, logger.bashrc automatisk på Pi og begynder at køre vores python -kode. Systemet lyser statusindikatoren for at lade brugeren vide, at den er startet korrekt og venter på, at der trykkes på knappen. Brugeren kan derefter placere det emne, der skal scannes, og lukke låget. Efter at have trykket på knappen pulserer LED'en for at lade brugeren vide, at enheden fungerer. Enheden vil gå mellem billedbehandling og motorstyring, indtil den fulde rotation er fuldført, og alle objektdata indsamles. Endelig oprettes masken, og filen sendes til en forudvalgt e -mail. Dette genstarter cyklussen, og maskinen er klar til at udføre en anden scanning med et tryk på en knap.

Billedbehandling

Det første, der blev implementeret, var at behandle et optaget billede for at udtrække de oplysninger, der er gemt i billedet, til en formular, der kunne bruges til at oprette en række punkter i rummet. For at gøre dette startede jeg med at tage et billede af objektet på platformen sammen med al baggrundsstøj skabt af laseren, der skinner på bagsiden af kassen og spredes. Dette billede havde to hovedproblemer i sin rå form. For det første blev objektet set i en vinkel med et forhøjet perspektiv og for det andet var der meget baggrundsstøj. Den første ting, jeg skulle gøre, var at tage højde for denne betragtningsvinkel, fordi brug af fotoet som det ikke ville tillade os at bestemme en ensartet objekthøjde. Som det ses i den anden figur, er højden af den omvendte "L" -form konsistent; På grund af at den ene side er længere end den anden, ser de ud til at have forskellige højder ved kanten tættest på seeren.

For at løse dette var jeg nødt til at omdanne arbejdsområdet i billedet til et rektangel fra den trapezformede form, det var i tidligere. For at gøre dette brugte jeg koden fra dette link, som når det får et billede og fire punkter, beskærer billedet mellem de fire punkter og transformerer det beskårne billede for at kompensere for perspektivet. Denne transformation bruger de fire punkter til at oprette et rektangel i stedet for en trapezformet form som set i den tredje figur.

Det næste problem, der skulle løses, var baggrundsstøj i form af udvendigt lys og lys, der blev reflekteret af laseren selv. For at gøre dette filtrerede jeg lyset ved hjælp af funktionen inRange () i OpenCV. Jeg satte tærsklen til kun at hente rødt lys på et bestemt niveau. For at få den korrekte værdi startede jeg med en mild tærskel og blev ved med at øge tærskelniveauet, indtil det eneste lys, der blev hentet, var laserlyset på objektet, der blev scannet. Da jeg havde dette billede, fandt jeg den lyseste pixel i hver række for at få en linje på en pixel pr. række, der grænser op til venstre side af laserlinjen. Hver pixel blev derefter konverteret til et toppunkt i 3D -rum og lagret i et array, som beskrevet i netværksoprettelsesafsnittet. Resultaterne af disse trin kan ses i den fjerde figur.

Motorstyring

Efter at have været i stand til at behandle et enkelt billede for at få udsnittet af objektet, havde jeg brug for at kunne rotere objektet for at tage et nyt billede med en anden vinkel. For at gøre dette kontrollerede jeg trinmotoren under platformen, som objektet, der scannes, sidder på. Jeg byggede et fundament for vores trinfunktion ved at oprette en variabel til at spore motorens tilstand og mikrostegning ved at skifte hver af de fire motorindgange.

Mesh CreationFor at skabe et net fra alle de behandlede billeder, var jeg først nødt til at konvertere hver hvid pixel i det behandlede billede til et toppunkt i 3D -rum. Fordi jeg samler individuelle skiver af objektet med cylindrisk symmetri, var det fornuftigt at begynde at samle cylindriske koordinater. Dette gav mening, da billedets højde kunne repræsentere z-aksen, afstanden fra midten af det roterende bord kunne repræsentere R-aksen, og trinmotorens rotation kunne repræsentere theta-aksen. Men fordi jeg lagrede vores data i cylindriske koordinater, var jeg nødt til at konvertere hver af disse hjørner til kartesiske koordinater.

Når disse hjørner blev oprettet, blev de gemt på en liste, og listen blev gemt i en anden liste, der indeholdt de toppunktlister, der blev oprettet for hvert billede, der blev taget. Når alle billederne blev behandlet og konverteret til hjørner, var jeg nødt til at vælge de hjørner, som jeg faktisk ønskede repræsenteret i det sidste net. Jeg ville have det øverste toppunkt og det nederste toppunkt til at blive inkluderet, og derefter ud fra opløsningen valgte jeg et jævnt fordelt antal hjørner til hvert billede. Fordi ikke alle toppunktlister var af samme længde, var jeg nødt til at udjævne dem ved at finde listen med det mindste antal hjørner og fjerne hjørner fra alle andre lister, indtil de alle var lige. skabe et net. Jeg valgte at formatere vores mesh efter.obj -filstandarden, da det er enkelt og 3D -printbart.

Indlejret funktion

Efter at enheden var funktionel, polerede jeg den ved at tilføje fuld integreret funktionalitet. Dette betød at fjerne tastaturet, musen og skærmen, og få den til at sende os.obj -filen trådløst efter endt behandling. For at starte ændrede jeg.bashrc -koden til automatisk at logge ind og starte hovedpython -programmet ved opstart. Dette blev gjort ved at bruge sudo raspi-config og vælge "Console Autologin" og ved at tilføje linjen "sudo python /home/pi/finalProject/FINAL.py" til /home/pi/.bashrc. Udover dette har jeg også tilføjet en knap og status -LED til brugerens input og output. Knappen lader brugeren fortælle enheden, hvornår den skal starte scanningen, og lysdioden vil fortælle brugeren maskinens tilstand. Hvis lysdioden er tændt, er enheden klar til at starte en ny scanning. Hvis lysdioden pulserer, scanner enheden i øjeblikket. Hvis lysdioden er på kontoret, er der en softwarefejl, der kræver systemgenstart. Endelig gjorde jeg det muligt for enheden at sende.obj -filen via e -mail. Dette blev gjort ved at bruge smtplib og e -mail -biblioteker. Denne evne til at sende e -mails gav os en meget bekvem og trådløs måde at levere den producerede fil til brugeren for at få adgang til på mange forskellige platforme.

Trin 7: Integration

Integration
Integration

Efter fremstilling af de forskellige stykker af enheden samlede jeg den sammen. Ovenstående figur viser i rækkefølge:

(a) samlet kasse udenfor

(b) samlet kasse inde med kamera og laser

(c) set indefra af elektronisk seng

(d) bagsiden af Pi med adgang til Pi -porte og 5V motorindgangen

e) trykknap med LED -ring og statuslys foran på enheden

Trin 8: Resultater

Resultater
Resultater
Resultater
Resultater
Resultater
Resultater
Resultater
Resultater

Laser 3D -scanneren var i stand til at scanne objekter med anstændig præcision. Objektets funktioner er tydelige og genkendelige, og delene var meget nemme at 3D -udskrive ved hjælp af en udskæringssoftware som f.eks. Repetier. Figurerne ovenfor viser nogle prøvescanninger af et stykke træ og en gummiand.

En af vores største fund og succeser, som jeg opdagede under testen, var enhedens konsistens. Gennem flere forsøg med det samme objekt kunne scanneren producere en.obj -fil, der hver især var meget ens, selvom vi ændrede objektets placering lidt. Som det ses i de tre separate scanninger, ligner de alle meget meget og fanger de samme detaljer og samme detaljeringsgrad. Jeg var generelt meget imponeret over vores systems konsistens og robusthed.

En af de variabler, jeg virkelig kunne stille ind, er scanningsopløsningen. Fordi der er 400 trin i stepperen, kan jeg vælge, hvor stor hver ΔΘ skal diktere vinkelopløsningen. Som standard har jeg vinkelopløsningen sat til 20 iterationer, hvilket betyder, at hver ramme, motoren roterer med 20 trin (400/20 = 20). Dette blev hovedsageligt valgt af hensyn til tiden - det tager cirka 45 sekunder at gennemføre en scanning på denne måde. Men hvis jeg vil have en scanning af meget højere kvalitet, kan jeg øge antallet af iterationer helt op til 400. Dette giver mange flere punkter at konstruere modellen med, hvilket giver en langt mere detaljeret scanning. Udover vinkelopløsning kan jeg også justere den lodrette opløsning, eller hvor mange forskellige punkter jeg vælger at polle langs laserskiven. For en lignende tidsinteresse har jeg denne standard indstillet til 20, men jeg kan øge den for bedre resultater. I legen med disse parametre for vinkelopløsning og rumlig opløsning var jeg i stand til at kompilere resultaterne af forskellige scanninger nedenfor i den sidste figur. Hver etiket er formateret således, at det er vinkelopløsningen x rumlig opløsning. Som det ses i standardscanningsindstillingerne, er andens funktioner genkendelige, men ikke detaljerede. Imidlertid, når jeg øger opløsningen, begynder individuelle præcise funktioner at vise, herunder øjne, næb, hale og vinger på and. Det tog cirka 5 minutter at scanne billedet med den højeste opløsning. At se denne højde af en opnåelig opløsning var en meget stor succes.

Begrænsninger

På trods af de vellykkede resultater af projektet er der stadig et par begrænsninger ved design og implementering. Med brugen af laseren kommer der mange problemer med, hvordan lyset spredes. Mange objekter, jeg forsøgte at scanne, der enten var gennemskinnelige, skinnende eller meget mørke, viste sig at være besværlige med, hvordan lyset reflekterede fra overfladen. Hvis objektet var gennemskinneligt, ville lyset blive absorberet og spredt, hvilket giver en meget støjende læsning af skiver. I skinnende og mørke genstande ville lyset enten blive reflekteret eller absorberet til det punkt, hvor det ville være svært at opfange. Fordi jeg også bruger et kamera til at fange objekters egenskaber, er dets sansning begrænset af dets sigtelinje, hvilket betyder, at konkave objekter og skarpe vinkler ofte blokeres af andre dele af objektet. Dette er vist i vores eksempel på gummiand, da halen undertiden vil miste sin krumning i scanningen. Kameraet kan også kun detektere overfladestrukturer, hvilket betyder, at huller eller indre geometrier ikke kan fanges. Dette er imidlertid også et almindeligt problem, som mange andre scanningsløsninger har.

Næste skridt

Selvom jeg var tilfreds med resultaterne af vores projekt, var der et par ting, der kunne implementeres for at gøre det bedre. For det første kan scanningsopløsningen i den aktuelle tilstand kun ændres ved at ændre de hårdt kodede opløsningsvariabler i vores kode. For at gøre projektet mere indlejret kan der inkluderes et opløsningspotentiometer, så brugeren kan ændre opløsningen uden at skulle tilslutte en skærm og tastatur til scanneren. Derudover opretter scanneren billeder, der nogle gange kan se ujævne ud. For at løse dette kunne maskeudglatningsteknikker implementeres for at udjævne uregelmæssigheder og hårde hjørner. Endelig fandt jeg ud af, at pixelkoordinater ikke ligger godt ind i den virkelige verden. De masker, jeg skabte, var 6 til 7 gange større end det faktiske objekt. I fremtiden ville det være en fordel at implementere en måde at skalere masker på, så de er mere præcise i forhold til objektets reelle størrelse.

Trin 9: Ressourcer

Jeg har inkluderet koden, STL -filer til udskrivning og DXF -filer til skæring til hele projektet.

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

Første præmie i Raspberry Pi Contest 2020

Anbefalede: