Innehållsförteckning:

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

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

Video: Raspberry Pi laserskanner: 9 steg (med bilder)
Video: How to connect Neato XV-11 Lidar to Raspberry Pi 2 or 3 with ROS 2024, Juli
Anonim
Image
Image
Raspberry Pi laserskanner
Raspberry Pi laserskanner

Laserskannern är en inbyggd Raspberry Pi -enhet som kan digitalisera objekt till.obj -nätfiler för reproduktion med 3D -utskrift. Enheten gör detta genom att använda en linjelaser och en integrerad PiCam för att utföra datorsyn. Lasern är placerad 45 grader snett från lasern och projicerar en ljusröd linje på en vertikal skiva av objektet. Kameran detekterar skivans avstånd från mitten för att ge en maskskiva. Objektet snurras på det roterande facket och processen upprepas tills hela objektet skannas. Den genererade.obj -filen skickas slutligen till användaren, vilket gör systemet helt fristående och inbäddat.

Denna instruktionsbok går igenom hur enheten byggdes, några resultat och framtida steg.

Steg 1: Inspiration

Inspiration
Inspiration
Inspiration
Inspiration

Som en ivrig tillverkare har jag varit 3D -utskrift och solid modellering i flera år nu. Jag har arbetat med många olika prototyper från CNC -routrar till laserskärare till 3D -skrivare. En enhet som min lokala tillverkare ännu inte har köpt har varit en 3D -skanner - och jag kan berätta varför.

De billigare (några hundra dollar) var opålitliga, krävde perfekta förhållanden och gav fortfarande ganska illa resultat. De dyra var … ja, dyra, upp till flera tusen dollar, vilket gör att dess funktion inte är värd det i många fall. Utöver det väljer jag fler gånger än inte att ta mätningar och designa en modell från grunden än att hantera ytnätet som genereras från en skanning.

På grund av detta ville jag bygga en fristående budgetskanner för att se hur bra jag kunde skanna ett objekt med hjälp av komponenter från hyllan.

Efter att ha gjort några undersökningar såg jag att många 3D -skannrar använde en roterande plattform och sedan en mängd olika sensorer för att mäta avstånd från mitten för att bygga en rotationsmodell. Många av dessa använde dubbla kameror som liknade Kinect. Så småningom snubblade jag på Yscanner som är en lågupplöst skanner som använder en laser. Titta på enkelhet och genomförbarhet, denna laserteknik, där en laser lyser förskjuten i förhållande till en kamera för att mäta avstånd från centrum, såg ut som en klar väg framåt.

Steg 2: Verktyg och delar

Delar:

  • Raspberry Pi $ 35,00
  • Raspberry Pi Camera V2 $ 30,00
  • Lysdioder, motstånd och ledningar
  • 3D -utskriftstråd
  • 12x12x0,125 träplåtar
  • M3 hårdvara
  • Stegmotor - $ 14
  • Line Laser - $ 8
  • LN298 stegmotordrivrutiner - $ 2,65
  • Tryckknapp i metall - $ 5

Verktyg:

  • Lödkolv
  • Laserskärare
  • 3d skrivare
  • Skruvmejsel
  • Tång

Steg 3: Design på hög nivå

Design på hög nivå
Design på hög nivå
Design på hög nivå
Design på hög nivå

Den centrala komponenten i denna design är linjelasern som projicerar på en vertikal skiva av föremålen. Denna projektion kan fångas upp på fotokameran, få sitt perspektiv korrigerat och sedan filtreras före bildbehandling. Vid bildbehandling kan avståndet mellan varje segment av linjen från objektets mitt samlas in. I radiella koordinater skulle denna bild ge både r- och z -komponenterna. Den tredje dimensionen, Θ, uppnås sedan genom att rotera objektet till en ny skiva. Detta koncept visas i den första figuren.

För att utföra de beskrivna åtgärderna ovan använde jag en Raspberry Pi som vår centrala beräkningsenhet. Jag kopplade en stegmotor och en motorförare till Pi, driven av en extern 5V -strömförsörjning och styrs av Pi: s GPIO -stift. En linjelaser sattes på 3,3 V -linjen på Pi och en PiCam var ansluten till kamerainmatningen på Pi. Slutligen installerades en enkel nedtagen knapp och en status -LED för att indikera för användaren i vilket tillstånd systemet är. Hela systemet sammanfattas i ett systemblockdiagram.

Från början var det planerat att hysa elektroniken i en laserskärad låda som hålls ihop med T-spår och M3-hårdvara. Elektroniken skulle vara dold för syn i ett bottenfack och ett lock skulle möjliggöra enkel åtkomst till föremålsplacering på det roterande facket. Detta lock är nödvändigt för att minimera mängden ljus som läcker in i systemet, eftersom detta externa ljus kan producera buller i den sista skanningen.

Steg 4: Hårdvara

Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara
Hårdvara

Som jag såg ovan, innan jag började laserskärning eller 3D -utskrift, använde jag Autodesk Fusion 360 för att göra en detaljerad 3D -modell av vår design. Som en översikt är enheten en enkel låda med lock med laserskurna gångjärn. Det finns två huvudlager på enheten: elektronikbädden och huvudbädden, med hål för ledningar att löpa mellan de två lagren.

Majoriteten av vår låda tillverkades med en laserskärare, med konstruktioner som tillverkades i Fusion 360 och skärs på en Epilog Zing 40 W laserskärare. Våra mönster visas i figurerna ovan. Uppifrån till vänster som rör sig till höger är bitarna huvudbädden, elektroniksängen, två delar för locket, bakstycket, framstycket och de två sidostyckena. I huvudbädden finns tre huvudavstängningar: en för montering av stegmotorn, en för att leda ledningar från lasern och en för att leda PiCams breda kabel. Sängstycket har monteringshål för att säkra Pi, brödbräda och motorförare och en större avstängning för att komma åt stegmotorn. Locket bitar snäpper ihop helt enkelt för att bilda den triangulära delen sett ovan och gångjärnet är en enkel extrudering som är bredden på diametern på hålet på sidoplattorna. Bakstycket och en av sidostyckena har slitsar på sidan så att portarna på Pi (HDMI, USB, Ethernet, Power) enkelt kan nås. Framsidan är en enkel bit som jag så småningom gjorde hål i med en handborr för att montera knappen och lysdioden. Detta är en metod för att hålla laserskurna bitar ortogonalt och säkert. Styckfenorna ligger i linje med spåren andra bitar och det t-formade snittet på kanterna ger plats för att en M3-mutter kan fastna i dem utan att snurra. Detta gör att vi sedan kan använda en M3 -skruv för att låsa bitarna tillsammans med väldigt lite vickrum utan att enheten måste vara helt permanent.

Jag valde att göra majoriteten av våra bitar med en laserskärare på grund av dess hastighet och lätthet. Men jag var fortfarande tvungen att 3D -skriva ut några bitar på grund av deras 3D -geometri som skulle vara svårare att skapa på skäraren. Det första stycket var linjelaserhållaren. Denna bit skulle monteras på huvudbädden i 45 grader från kamerans syn och ha ett hål så att lasern kan få friktion att passa in i den. Jag var också tvungen att skapa ett motorfäste eftersom motoraxeln var så lång. Monteringsfriktionen passade in i laserskurna bitar och sänkte planet som motorn var fäst vid så att den roterande plattformen låg i linje med huvudbädden.

Steg 5: Elektronik

Elektronik
Elektronik

Kablarna för detta projekt var mycket enkla eftersom 3D -skannern inte krävde för många kringutrustning. En motor, knapp, LED, laser och kamera behövde anslutas till Pi. Som visas såg jag till att ansluta motstånd i serie med varje stift som vi använde för att skydda stiften. En GPIO -pin var avsedd att styra status -LED: n, som skulle tändas när enheten var klar att användas och pulsera med PWM när enheten var i drift. En annan GPIO-stift var ansluten till en uppdragen knapp, som registrerade HÖG när knappen inte trycktes in och LÅG när knappen trycktes in. Slutligen tillägnade jag fyra GPIO -stift för att driva stegmotorn.

Eftersom vår motor bara var tvungen att kliva en viss utsträckning utan att behöva kontrollera hastigheten, valde vi en enklare stegmotordrivrutin (L298N) som helt enkelt kliver upp styrledningarna för att matas in i motorns ingångar. För att lära oss hur man använder stegmotorerna på en mycket låg nivå hänvisade vi till både L298N -databladet och Arduino -biblioteket. Stegmotorer har en magnetkärna med störande fingrar med alternerande polaritet. De fyra trådarna är inslagna för att styra två elektromagneter som var och en driver varannat motstående finger i motorn. Således, genom att byta polaritet hos fingrarna, kan vi trycka steget ett steg. Med denna kunskap om hur stegmaskiner fungerade från en hårdvarunivå kunde vi styra stepparna mycket lättare. Vi valde att stänga av vår stegmotor från en 5V strömförsörjning i labbet snarare än Pi på grund av dess maximala strömförbrukning på cirka 0,8 A, vilket är mer än Pi kunde leverera.

Steg 6: Programvara

programvara
programvara
programvara
programvara
programvara
programvara
programvara
programvara

Programvaran för detta projekt kan delas upp i fyra huvudkomponenter som samverkar med varandra: bildbehandling, motorstyrning, skapande av nät och inbäddade funktioner.

Som en sammanfattning av programvaran kan vi se till den första siffran. När systemet startar loggar.bashrc automatiskt in på Pi och kör vår pythonkod. Systemet tänder statuslampan för att låta användaren veta att den har startats korrekt och väntar på knapptryckningen. Användaren kan sedan placera objektet som ska skannas och stänga locket. Efter att ha tryckt på knappen pulserar lysdioden för att låta användaren veta att enheten fungerar. Enheten går mellan bildbehandling och motorstyrning tills hela rotationen är klar och all objektdata samlas in. Slutligen skapas nätet och filen skickas via e -post till ett förvalda e -postmeddelande. Detta startar om cykeln och maskinen är redo att utföra en ny skanning med ett knapptryck.

Bildbehandling

Det första som implementerades var att bearbeta en fångad bild för att extrahera informationen som lagras i bilden till en form som kan användas för att skapa en rad punkter i rymden. För att göra detta började jag med att ta en bild av föremålet på plattformen tillsammans med allt bakgrundsbrus som skapades av lasern som lyser på baksidan av lådan och sprids. Denna bild hade två huvudproblem i sin råa form. Först sågs objektet i en vinkel med ett förhöjt perspektiv och för det andra var det mycket bakgrundsbrus. Det första jag behövde göra var att ta hänsyn till denna betraktningsvinkel eftersom att använda bilden som den inte skulle tillåta oss att bestämma en enhetlig objekthöjd. Som framgår av den andra figuren är höjden på den uppochnedvända”L” -formen konsekvent; på grund av att den ena sidan är längre än den andra verkar de ha olika höjder vid kanten närmast betraktaren.

För att åtgärda detta var jag tvungen att omvandla arbetsytan i bilden till en rektangel från den trapetsformade formen som den tidigare var i. För att göra detta använde jag koden från denna länk, som när den ges en bild och fyra punkter, beskär bilden mellan de fyra punkterna och omvandlar den beskurna bilden för att kompensera för perspektivet. Denna transformation använder de fyra punkterna för att skapa en rektangel istället för en trapetsform som ses i den tredje figuren.

Nästa problem som behövde lösas var bakgrundsbrus i form av yttre ljus och ljus som reflekterades av lasern själv. För att göra detta filtrerade jag ljuset med funktionen inRange () i OpenCV. Jag satte tröskeln för att bara få upp rött ljus på en viss nivå. För att få rätt värde började jag med en lätt tröskel och höjde tröskelnivån tills det enda ljuset som plockades upp var laserljuset på objektet som skannades. När jag hade den här bilden hittade jag den ljusaste pixeln i varje rad för att få en rad med en pixel per rad som gränsar till vänster på sidan av laserlinjen. Varje pixel konverterades sedan till en hörnpunkt i 3D -utrymme och lagrades i en array, som beskrivs i maskskapningsavsnittet. Resultaten av dessa steg kan ses i den fjärde figuren.

Motor kontroll

Efter att ha lyckats bearbeta en enda bild för att få objektets bit, behövde jag kunna rotera objektet för att ta en ny bild med en annan vinkel. För att göra detta kontrollerade jag stegmotorn under plattformen som objektet som skannas sitter på. Jag byggde en grund för vår stegfunktion genom att skapa en variabel för att spåra motorns tillstånd och mikrosteg genom att växla var och en av de fyra motoringångarna.

För att skapa ett nät av alla bearbetade bilder, var jag först tvungen att konvertera varje vit pixel i den bearbetade bilden till en toppunkt i 3D -utrymme. Eftersom jag samlar enskilda skivor av objektet med cylindrisk symmetri, var det vettigt att börja samla cylindriska koordinater. Detta var meningsfullt eftersom bildens höjd kunde representera z-axeln, avståndet från mitten av det roterande bordet kunde representera R-axeln och stegmotorns rotation kunde representera theta-axeln. Men eftersom jag lagrade våra data i cylindriska koordinater, var jag tvungen att konvertera vart och ett av dessa hörn till kartesiska koordinater.

När dessa hörn skapades lagrades de i en lista och listan lagrades i en annan lista som innehöll toppunktlistorna som skapades för varje bild som togs. När alla bilderna hade bearbetats och konverterats till hörn var jag tvungen att välja de hörn som jag faktiskt ville representera i det sista nätet. Jag ville att toppunkten och den nedre punkten skulle inkluderas och sedan baserat på upplösningen valde jag ett jämnt fördelat antal hörn för varje bild. Eftersom inte alla hörnlistor var lika långa, var jag tvungen att jämna ut dem genom att hitta listan med det minsta antalet hörn och ta bort hörn från alla andra listor tills de var alla jämna. Med de skapade hörnlistorna kunde jag nu skapa ett nät. Jag valde att formatera vårt nät med.obj -filstandarden eftersom det är enkelt och 3D -utskrivbart.

Inbäddad funktion

Efter att enheten fungerade polerade jag den genom att lägga till full inbäddad funktionalitet. Detta innebar att ta bort tangentbordet, musen och bildskärmen och att den skulle skicka oss.obj -filen trådlöst efter avslutad bearbetning. För att starta ändrade jag.bashrc -koden för att automatiskt logga in och starta huvudpythonprogrammet vid start. Detta gjordes genom att använda sudo raspi-config och välja "Console Autologin" och genom att lägga till raden "sudo python /home/pi/finalProject/FINAL.py" till /home/pi/.bashrc. Utöver detta har jag också lagt till en knapp och status -LED för användarinmatning och -utgång. Knappen låter användaren berätta för enheten när han ska börja skanna och lysdioden skulle berätta för användaren om maskinens tillstånd. Om lysdioden lyser är enheten redo att starta en ny skanning. Om lysdioden pulserar skannar enheten för närvarande. Om lysdioden är på kontoret uppstår ett programvarufel som kräver systemstart. Slutligen gjorde jag det möjligt för enheten att skicka.obj -filen via e -post. Detta gjordes med hjälp av smtplib- och e -postbiblioteken. Denna förmåga att skicka mejl gav oss ett mycket bekvämt och trådlöst sätt att leverera den producerade filen till användaren för åtkomst på många olika plattformar.

Steg 7: Integration

Integration
Integration

Efter att ha tillverkat de olika delarna av enheten monterade jag ihop den. Bilden ovan visar i ordning:

(a) monterad låda utanför

(b) monterad låda inuti med kamera och laser

(c) insidan av elektroniksängen

(d) baksidan av Pi med tillgång till Pi -portar och 5V motoringång

(e) tryckknapp med LED -ring och statuslampa på enhetens framsida

Steg 8: Resultat

Resultat
Resultat
Resultat
Resultat
Resultat
Resultat
Resultat
Resultat

Laser 3D -skannern kunde skanna objekt med anständig precision. Objektets funktioner är distinkta och igenkännliga och delarna var mycket enkla att 3D -skriva ut med hjälp av en skärningsprogramvara som Repetier. Siffrorna ovan visar några provskanningar av en träbit och en gummianka.

En av våra största fynd och framgångar som jag upptäckte under testningen var enhetens konsistens. Under flera försök med samma objekt kunde skannern producera en.obj -fil som var väldigt lika varje gång, även om vi ändrade placeringen av objektet något. Som framgår av de tre separata skanningarna ser de alla väldigt lika ut och fångar samma detaljer och samma mängd detaljer. Jag var överlag mycket imponerad av vårt systems konsistens och robusthet.

En av de variabler jag verkligen kunde ställa in är upplösningen på skanningarna. Eftersom det finns 400 steg i steget kan jag välja hur stor varje ΔΘ ska diktera vinkelupplösningen. Som standard har jag vinkelupplösningen inställd på 20 iterationer, vilket betyder att varje ram, motorn roterar med 20 steg (400/20 = 20). Detta valdes främst av tidens intresse - det tar cirka 45 sekunder att slutföra en skanning på detta sätt. Men om jag vill ha en skanning av mycket högre kvalitet kan jag öka antalet iterationer ända upp till 400. Detta ger många fler punkter att konstruera modellen med, vilket ger en mycket mer detaljerad genomsökning. Förutom vinkelupplösning kan jag också justera den vertikala upplösningen, eller hur många olika punkter jag väljer att polla längs laserskivan. För ett liknande tidsintresse har jag den här standardinställningen till 20 men jag kan öka den för bättre resultat. När jag lekte med dessa parametrar för vinkelupplösning och rumsupplösning kunde jag sammanställa resultaten av olika skanningar nedan i den sista figuren. Varje etikett är formaterad så att det är vinkelupplösningen x rumslig upplösning. Som framgår av standardskanningsinställningarna är ankan funktioner igenkännbara men inte detaljerade. Men när jag ökar upplösningen börjar individuella exakta funktioner att visa, inklusive ögon, näbb, svans och vingar på ankan. Bilden med högsta upplösning tog cirka 5 minuter att skanna. Att se detta höga av en uppnåelig upplösning var en mycket stor framgång.

Begränsningar

Trots projektets framgångsrika resultat finns det fortfarande några begränsningar av design och implementering. Med användningen av lasern kommer många problem med hur ljuset sprids. Många objekt jag försökte skanna som var antingen genomskinliga, glänsande eller mycket mörka visade sig besvärliga med hur ljuset reflekterades från ytan. Om föremålet var genomskinligt skulle ljuset absorberas och spridas, vilket ger en mycket bullrig avläsning av skivor. I glänsande och mörka föremål skulle ljuset antingen reflekteras eller absorberas till den punkt där det skulle vara svårt att ta upp. Eftersom jag använder en kamera för att fånga egenskaper hos objekt begränsas dess avkänning av siktlinjen, vilket innebär att konkava föremål och skarpa vinklar ofta blockeras av andra delar av objektet. Detta visas i vårt exempel på gummiand, eftersom svansen ibland tappar sin krökning i skanningen. Kameran kan också bara detektera ytstrukturer vilket innebär att hål eller inre geometrier inte kan fångas. Detta är dock ett vanligt problem som många andra skanningslösningar också har.

Nästa steg

Även om jag var nöjd med resultatet av vårt projekt, fanns det några saker som kunde genomföras för att göra det bättre. Till att börja med, i det aktuella läget, kan skanningsupplösningen endast ändras genom att ändra de hårdkodade upplösningsvariablerna i vår kod. För att göra projektet mer inbäddat kan en upplösningspotentiometer inkluderas så att användaren kan ändra upplösningen utan att behöva ansluta en bildskärm och tangentbord till skannern. Dessutom skapar skannern bilder som ibland kan se ojämna ut. För att fixa detta kan nätutjämningstekniker implementeras för att jämna ut oegentligheter och hårda hörn. Slutligen upptäckte jag att pixelkoordinaterna inte är så bra in i den verkliga världen. Maskorna jag skapade var 6 till 7 gånger större än det verkliga föremålet. I framtiden skulle det vara fördelaktigt att implementera ett sätt att skala maskor så att de är mer exakta till objektets verkliga storlek.

Steg 9: Resurser

Jag har inkluderat koden, STL -filer för utskrift och DXF -filer för att klippa för hela projektet.

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

Första priset i Raspberry Pi Contest 2020

Rekommenderad: