Inhoudsopgave:

Raspberry Pi-laserscanner - Ajarnpa
Raspberry Pi-laserscanner - Ajarnpa

Video: Raspberry Pi-laserscanner - Ajarnpa

Video: Raspberry Pi-laserscanner - Ajarnpa
Video: OpenScan Raspberry Pi Controller for 3D Scanner 2024, Juli-
Anonim
Image
Image
Raspberry Pi-laserscanner
Raspberry Pi-laserscanner

De Laser Scanner is een in de Raspberry Pi ingebouwd systeemapparaat dat objecten kan digitaliseren in.obj mesh-bestanden voor reproductie met behulp van 3D-printen. Het apparaat doet dit door gebruik te maken van een lijnlaser en een geïntegreerde PiCam om computervisie uit te voeren. De laser staat 45 graden scheef ten opzichte van de laser en projecteert een felrode lijn op een verticale plak van het object. De camera detecteert de afstand van de plak tot het midden om een mesh-plak te geven. Het object wordt rondgedraaid op de roterende lade en het proces wordt herhaald totdat het volledige object is gescand. Het gegenereerde.obj-bestand wordt uiteindelijk naar de gebruiker gemaild, waardoor het systeem volledig standalone en embedded wordt.

Deze Instructable zal doornemen hoe het apparaat is gebouwd, enkele resultaten en toekomstige stappen.

Stap 1: Inspiratie

Inspiratie
Inspiratie
Inspiratie
Inspiratie

Als fervent maker ben ik al enkele jaren bezig met 3D-printen en solide modelleren. Ik heb met veel verschillende prototyping-tools gewerkt, van CNC-routers tot lasersnijders tot 3D-printers. Een apparaat dat mijn lokale makerspace nog moet kopen, is een 3D-scanner geweest - en ik kan je vertellen waarom.

De goedkopere (een paar honderd dollar) waren onbetrouwbaar, vereisten perfecte omstandigheden en produceerden nog steeds behoorlijk armoedige resultaten. De dure waren … nou ja, duur, variërend tot enkele duizenden dollars, waardoor zijn functie het in veel gevallen niet waard was. Bovendien kies ik er vaker wel dan niet voor om metingen te doen en een model helemaal opnieuw te ontwerpen dan om te gaan met het oppervlaktegaas dat uit een scan wordt gegenereerd.

Daarom wilde ik een zelfstandige budgetscanner bouwen om te zien hoe goed ik een object kon scannen met standaardcomponenten.

Na wat onderzoek te hebben gedaan, zag ik dat veel 3D-scanners een roterend platform gebruikten en vervolgens een verscheidenheid aan verschillende sensoren om de afstand vanaf het centrum te meten om een roterend model te bouwen. Veel van deze gebruikten dubbele camera's die vergelijkbaar waren met die van de Kinect. Uiteindelijk kwam ik de Yscanner tegen, een scanner met een lage resolutie die gebruik maakt van een laser. Als we kijken naar eenvoud en haalbaarheid, leek deze lasertechniek, waarbij een laser offset ten opzichte van een camera scheen om de afstand vanaf het midden te meten, een duidelijk pad voorwaarts.

Stap 2: Gereedschap en onderdelen

Onderdelen:

  • Raspberry Pi $ 35,00
  • Raspberry Pi-camera V2 $ 30,00
  • LED's, weerstanden en draden
  • 3D-printfilament
  • 12x12x0.125 houten platen
  • M3-hardware
  • Stappenmotor - $ 14
  • Lijnlaser - $ 8
  • LN298 Stappenmotor Drivers - $2.65
  • Metalen drukknop - $ 5

Gereedschap:

  • Soldeerbout
  • Lasersnijder
  • 3D-printer
  • Schroevendraaier
  • Tang

Stap 3: Ontwerp op hoog niveau

Ontwerp op hoog niveau
Ontwerp op hoog niveau
Ontwerp op hoog niveau
Ontwerp op hoog niveau

De centrale component in dit ontwerp is de lijnlaser die op een verticale plak van de objecten projecteert. Deze projectie kan worden vastgelegd op de picamera, het perspectief wordt gecorrigeerd en vervolgens gefilterd voordat de beeldverwerking plaatsvindt. Bij beeldverwerking kan de afstand tussen elk lijnsegment vanaf het midden van het object worden verzameld. In radiale coördinaten zou deze afbeelding zowel de r- als de z-componenten opleveren. De derde dimensie,, wordt dan bereikt door het object naar een nieuwe plak te draaien. Dit concept is weergegeven in de eerste figuur.

Om de hierboven beschreven acties uit te voeren, gebruikte ik een Raspberry Pi als onze centrale rekeneenheid. Ik heb een stappenmotor en een motordriver op de Pi aangesloten, aangedreven door een externe 5V-voeding en bestuurd door de GPIO-pinnen van de Pi. Een lijnlaser werd op de 3,3 V-lijn op de Pi geplaatst en een PiCam werd bevestigd aan de camera-ingang op de Pi. Ten slotte werd een eenvoudige uitgetrokken knop geïnstalleerd en een status-LED om de gebruiker aan te geven in welke staat het systeem zich bevindt. Het volledige systeem is samengevat in een systeemblokschema.

Vanaf het begin was het de bedoeling om de elektronica te huisvesten in een lasergesneden doos die bij elkaar werd gehouden met T-slots en M3-hardware. De elektronica zou aan het zicht worden onttrokken in een onderste compartiment en een deksel zou gemakkelijke toegang bieden tot het plaatsen van objecten op de roterende lade. Dit deksel is nodig om de hoeveelheid licht die in het systeem lekt te minimaliseren, omdat dit externe licht ruis kan veroorzaken in de uiteindelijke scan.

Stap 4: Hardware

Hardware
Hardware
Hardware
Hardware
Hardware
Hardware

Zoals hierboven te zien is, heb ik, voordat ik begon met lasersnijden of 3D-printen, Autodesk Fusion 360 gebruikt om een gedetailleerd 3D-model van ons ontwerp te maken. Als overzicht is het apparaat een eenvoudige doos met een deksel met lasergesneden scharnieren. Er zijn twee hoofdlagen van het apparaat: het elektronicabed en het hoofdbed, met gaten voor draden om tussen de twee lagen te lopen.

Het grootste deel van onze doos is vervaardigd met een lasersnijder, waarbij ontwerpen werden geproduceerd in Fusion 360 en gesneden op een Epilog Zing 40 W lasersnijder. Onze ontwerpen zijn weergegeven in de bovenstaande afbeeldingen. Van linksboven naar rechts, de stukken zijn het hoofdbed, het elektronicabed, twee stukken voor het deksel, het achterstuk, het voorstuk en de twee zijstukken. In het hoofdbed zijn er drie hoofduitsparingen: één voor het monteren van de stappenmotor, één om draden van de laser te leiden en één om de brede kabel van de PiCam te leiden. Het bedstuk heeft montagegaten voor het vastzetten van de Pi, breadboard en motordriver en een grotere uitsparing om toegang te krijgen tot de stappenmotor. De dekseldelen klikken eenvoudig in elkaar om het driehoekige stuk te vormen dat hierboven is te zien en het scharnier is een eenvoudige extrusie die de breedte heeft van de diameter van het gat van de zijpanelen. Het achterstuk en een van de zijstukken hebben sleuven aan de zijkant zodat de poorten van de Pi (HDMI, USB, Ethernet, Power) gemakkelijk toegankelijk zijn. De voorkant is een eenvoudig stuk waar ik uiteindelijk gaten in heb gemaakt met een handboor om de knop en LED te monteren. Zoals te zien is op alle stukken, worden onze onderdelen bij elkaar gehouden door M3-hardware met behulp van T-verbindingen en sleuven. Dit is een methode om lasergesneden stukken orthogonaal en veilig vast te houden. De vinnen van stukken zijn uitgelijnd met de sleuven van andere stukken en de T-vormige snede aan de randen geeft ruimte voor een M3-moer om erin te worden vastgelopen zonder te draaien. Hierdoor kunnen we vervolgens een M3-schroef gebruiken om de stukken aan elkaar te vergrendelen met heel weinig bewegingsruimte zonder dat de montage volledig permanent is.

Ik koos ervoor om de meeste van onze stukken met een lasersnijder te doen vanwege de snelheid en het gemak. Sommige stukken moest ik echter nog steeds 3D-printen vanwege hun 3D-geometrie die moeilijker te maken zou zijn op de snijplotter. Het eerste stuk was de lijnlaserhouder. Dit stuk moest op het hoofdbed worden gemonteerd op 45 graden van het zicht van de camera en had een gat zodat de laser er nauwsluitend in kon passen. Ik moest ook een motorsteun maken omdat de as van de motor zo lang was. De montagefrictie paste in de lasergesneden stukken en verlaagde het vlak waaraan de motor was bevestigd, zodat het roterende platform gelijk lag met het hoofdbed.

Stap 5: Elektronica

Elektronica
Elektronica

De bedradingshardware van dit project was heel eenvoudig omdat de 3D-scanner niet al te veel randapparatuur nodig had. Een motor, knop, LED, laser en camera moesten op de Pi worden aangesloten. Zoals getoond, heb ik ervoor gezorgd dat ik weerstanden in serie heb geschakeld met elke pin die we hebben gebruikt om de pinnen te beschermen. Eén GPIO-pin was bedoeld voor het regelen van de status-LED, die zou oplichten wanneer het apparaat klaar was voor gebruik en zou pulseren met PWM wanneer het apparaat in werking was. Een andere GPIO-pin was verbonden met een uitgetrokken knop, die HOOG registreerde wanneer de knop niet werd ingedrukt en LAAG wanneer de knop werd ingedrukt. Ten slotte heb ik vier GPIO-pinnen gewijd aan het aandrijven van de stappenmotor.

Omdat onze motor maar tot op zekere hoogte hoefde te stappen zonder dat de snelheid moest worden geregeld, hebben we gekozen voor een eenvoudigere stappenmotoraandrijving (L298N) die eenvoudigweg de stuurlijnen opvoert om de motoringangen te voeden. Om meer te weten te komen over het bedienen van de stappenmotoren op een zeer laag niveau, hebben we verwezen naar zowel het L298N-gegevensblad als de Arduino-bibliotheek. Stappenmotoren hebben een magnetische kern met uitstekende vingers van wisselende polariteit. De vier draden zijn omwikkeld om twee elektromagneten aan te sturen die elk om de andere tegenoverliggende vinger in de motor werken. Dus door de polariteit van de vingers te veranderen, kunnen we de stepper één stap duwen. Met deze kennis van hoe steppers op hardwareniveau werkten, konden we de steppers veel gemakkelijker aansturen. We hebben ervoor gekozen om onze stappenmotor van een 5V-voeding in het laboratorium te voorzien in plaats van de Pi vanwege het maximale stroomverbruik van ongeveer 0,8 A, wat meer is dan de Pi zou kunnen leveren.

Stap 6: Software

Software
Software
Software
Software
Software
Software
Software
Software

De software voor dit project kan worden onderverdeeld in vier hoofdcomponenten die op elkaar inwerken: beeldverwerking, motorbesturing, mesh-creatie en ingebedde functies.

Als samenvatting van de software kunnen we kijken naar het eerste cijfer. Terwijl het systeem opstart, logt de.bashrc automatisch in op de Pi en begint onze python-code uit te voeren. Het systeem laat het statuslampje branden om de gebruiker te laten weten dat het correct is opgestart en wacht op het indrukken van de knop. De gebruiker kan dan het te scannen item plaatsen en het deksel sluiten. Na het indrukken van de knop knippert de LED om de gebruiker te laten weten dat het apparaat werkt. Het apparaat maakt een lus tussen beeldverwerking en motorbesturing totdat de volledige rotatie is voltooid en alle objectgegevens zijn verzameld. Ten slotte wordt de mesh gemaakt en wordt het bestand gemaild naar een vooraf geselecteerd e-mailadres. Hierdoor wordt de cyclus opnieuw gestart en is de machine klaar om met een druk op de knop nog een scan uit te voeren.

Afbeelding verwerken

Het eerste dat werd geïmplementeerd, was het verwerken van een vastgelegde afbeelding om de informatie die in de afbeelding was opgeslagen, te extraheren in een vorm die kon worden gebruikt om een reeks punten in de ruimte te creëren. Om dit te doen, begon ik met het maken van een foto van het object op het platform, samen met al het achtergrondgeluid dat werd gecreëerd door de laser die op de achterkant van de doos scheen en zich verspreidde. Deze foto had twee hoofdproblemen in zijn ruwe vorm. Ten eerste werd het object vanuit een hoek bekeken met een verhoogd perspectief en ten tweede was er veel achtergrondgeluid. Het eerste dat ik moest doen, was rekening houden met deze kijkhoek, omdat we met de foto zoals deze niet in staat zou zijn om een consistente objecthoogte te bepalen. Zoals te zien is in de tweede afbeelding, is de hoogte van de omgekeerde "L" -vorm consistent; maar omdat de ene kant langer is dan de andere, lijken ze verschillende hoogtes te hebben aan de rand die zich het dichtst bij de kijker bevindt.

Om dit op te lossen, moest ik de werkruimte in de afbeelding transformeren in een rechthoek van de trapeziumvorm die het eerder had. Om dit te doen, heb ik de code van deze link gebruikt, die wanneer een afbeelding en vier punten wordt gegeven, de afbeelding tussen de vier punten bijsnijdt en de bijgesneden afbeelding transformeert om het perspectief te compenseren. Deze transformatie gebruikt de vier punten om een rechthoek te creëren in plaats van een trapeziumvorm zoals te zien is in de derde afbeelding.

Het volgende probleem dat moest worden opgelost, was dat van achtergrondgeluid in de vorm van licht van buiten en licht dat door de laser zelf werd gereflecteerd. Om dit te doen heb ik het licht gefilterd met behulp van de inRange() functie van OpenCV. Ik heb de drempel ingesteld om alleen rood licht op te vangen op een bepaald niveau. Om de juiste waarde te krijgen, begon ik met een soepele drempel en bleef het drempelniveau verhogen totdat het enige licht dat werd opgevangen het laserlicht was op het object dat werd gescand. Toen ik deze afbeelding eenmaal had, vond ik de helderste pixel in elke rij om krijg een lijn van één pixel per rij die grenst aan de meest linkse kant van de laserlijn. Elke pixel werd vervolgens geconverteerd naar een hoekpunt in 3D-ruimte en opgeslagen in een array, zoals beschreven in het gedeelte over het maken van mesh. De resultaten van deze stappen zijn te zien in de vierde figuur.

Motorbesturing

Nadat ik met succes een enkele afbeelding had kunnen verwerken om de plak van het object te krijgen, moest ik het object kunnen draaien om een nieuwe foto met een andere hoek te maken. Om dit te doen, bestuurde ik de stappenmotor onder het platform waarop het te scannen object zit. Ik heb een basis gelegd voor onze stapfunctie door een variabele te creëren om de toestand van de motor en microstepping te volgen door elk van de vier motoringangen te wisselen.

Mesh Creation Om een mesh te maken van alle verwerkte afbeeldingen, moest ik eerst elke witte pixel in de verwerkte afbeelding converteren naar een hoekpunt in de 3D-ruimte. Omdat ik individuele plakjes van het object met cilindrische symmetrie verzamel, was het logisch om cilindrische coördinaten te verzamelen. Dit was logisch omdat de hoogte van de afbeelding de z-as zou kunnen vertegenwoordigen, de afstand van het midden van de roterende tafel de R-as zou kunnen vertegenwoordigen en de rotatie van de stappenmotor de theta-as zou kunnen vertegenwoordigen. Omdat ik onze gegevens echter in cilindrische coördinaten had opgeslagen, moest ik elk van deze hoekpunten omzetten in cartesische coördinaten.

Nadat deze hoekpunten waren gemaakt, werden ze opgeslagen in een lijst en deze lijst werd opgeslagen in een andere lijst die de hoekpuntenlijsten bevatte die voor elke vastgelegde afbeelding waren gemaakt. Nadat alle afbeeldingen waren verwerkt en geconverteerd naar hoekpunten, moest ik de hoekpunten selecteren die ik eigenlijk in de uiteindelijke mesh wilde weergeven. Ik wilde dat het bovenste hoekpunt en het onderste hoekpunt werden opgenomen en vervolgens koos ik op basis van de resolutie een gelijkmatig verdeeld aantal hoekpunten om voor elke afbeelding te gebruiken. Omdat niet alle vertexlijsten even lang waren, moest ik ze gelijk maken door de lijst met het kleinste aantal hoekpunten te vinden en hoekpunten uit alle andere lijsten te verwijderen totdat ze allemaal even lang waren. Met de gemaakte hoekpuntenlijsten kon ik nu maak een net. Ik heb ervoor gekozen om onze mesh op te maken volgens de.obj-bestandsstandaard, omdat deze eenvoudig en 3D-afdrukbaar is.

Ingebedde functie

Nadat het apparaat functioneel was, heb ik het gepolijst door volledige ingebouwde functionaliteit toe te voegen. Dit betekende dat het toetsenbord, de muis en de monitor moesten worden verwijderd en dat het ons het.obj-bestand draadloos moest sturen nadat de verwerking was voltooid. Om te beginnen heb ik de.bashrc-code gewijzigd om automatisch in te loggen en het hoofdprogramma van Python te starten bij het opstarten. Dit werd gedaan door sudo raspi-config te gebruiken en "Console Autologin" te selecteren en door de regel "sudo python /home/pi/finalProject/FINAL.py" toe te voegen aan /home/pi/.bashrc. een knop en status-LED toegevoegd voor gebruikersinvoer en -uitvoer. Met de knop kan de gebruiker het apparaat vertellen wanneer het moet beginnen met scannen en de LED geeft de gebruiker de status van het apparaat aan. Als de LED brandt, is het apparaat klaar om een nieuwe scan te starten. Als de LED pulseert, is het apparaat momenteel aan het scannen. Als de LED op kantoor is, is er een softwarefout, waardoor het systeem opnieuw moet worden opgestart. Ten slotte heb ik het apparaat ingeschakeld om het.obj-bestand via e-mail te verzenden. Dit werd gedaan met behulp van de smtplib- en e-mailbibliotheken. Deze mogelijkheid om e-mails te verzenden, gaf ons een zeer handige en draadloze manier om het geproduceerde bestand aan de gebruiker te bezorgen voor toegang op veel verschillende platforms.

Stap 7: Integratie

integratie
integratie

Nadat ik de verschillende onderdelen van het apparaat had gemaakt, heb ik het in elkaar gezet. Bovenstaande figuur toont in volgorde:

(a) buiten gemonteerde doos;

(b) binnen gemonteerde doos met camera en laser

(c) binnenaanzicht van elektronicabed

(d) achterkant van de Pi met toegang tot Pi-poorten en de 5V-motoringang

(e) drukknop met LED-ring en statuslampje aan de voorkant van het apparaat

Stap 8: Resultaten

Resultaten
Resultaten
Resultaten
Resultaten
Resultaten
Resultaten
Resultaten
Resultaten

De laser 3D-scanner was in staat om objecten met behoorlijke precisie te scannen. De kenmerken van de objecten zijn duidelijk en herkenbaar en de onderdelen waren zeer eenvoudig te 3D-printen met behulp van een slicing-software zoals Repetier. Bovenstaande figuren tonen enkele voorbeeldscans van een stuk hout en een badeendje.

Een van onze grootste bevindingen en successen die ik tijdens het testen ontdekte, was de consistentie van het apparaat. Tijdens meerdere proeven van hetzelfde object was de scanner in staat om een .obj-bestand te produceren dat elke keer erg op elkaar leek, zelfs als we de plaatsing van het object enigszins hadden gewijzigd. Zoals te zien is in de drie afzonderlijke scans, lijken ze allemaal erg op elkaar en leggen ze dezelfde details en dezelfde hoeveelheid detail vast. Ik was over het algemeen erg onder de indruk van de consistentie en robuustheid van ons systeem.

Een van de variabelen die ik echt heb kunnen afstemmen, is de resolutie van de scans. Omdat er 400 stappen in de stepper zitten, kan ik kiezen hoe groot elke ΔΘ is om de hoekresolutie te dicteren. Standaard heb ik de hoekresolutie ingesteld op 20 iteraties, wat betekent dat elk frame de motor 20 stappen roteert (400/20 = 20). Hier is vooral voor gekozen in het belang van de tijd - het duurt ongeveer 45 seconden om op deze manier een scan te voltooien. Als ik echter een scan van veel hogere kwaliteit wil, kan ik het aantal iteraties tot 400 verhogen. Dit geeft veel meer punten om het model mee te construeren, wat zorgt voor een veel gedetailleerdere scan. Naast de hoekresolutie kan ik ook de verticale resolutie aanpassen, of hoeveel verschillende punten ik kies om langs de laserplak te pollen. Voor een vergelijkbare interesse in tijd heb ik deze standaard ingesteld op 20, maar ik kan deze verhogen voor betere resultaten. Door te spelen met deze parameters van hoekresolutie en ruimtelijke resolutie, kon ik de resultaten van verschillende scans hieronder verzamelen in de laatste afbeelding. Elk label is zo opgemaakt dat het de hoekresolutie x ruimtelijke resolutie is. Zoals te zien is in de standaard scaninstellingen, zijn de kenmerken van de eend herkenbaar maar niet gedetailleerd. Echter, naarmate ik de resolutie verhoog, beginnen individuele precieze kenmerken zichtbaar te worden, waaronder de ogen, snavel, staart en vleugels van de eend. Het scannen van de afbeelding met de hoogste resolutie duurde ongeveer 5 minuten. Het zien van dit hoogtepunt van een haalbare resolutie was een zeer groot succes.

Beperkingen

Ondanks de succesvolle resultaten van het project, zijn er nog enkele beperkingen aan het ontwerp en de uitvoering. Met het gebruik van de laser komen veel problemen met de manier waarop het licht wordt verspreid. Veel objecten die ik probeerde te scannen en die ofwel doorschijnend, glanzend of erg donker waren, bleken hinderlijk voor de manier waarop het licht van het oppervlak weerkaatste. Als het object doorschijnend was, zou het licht worden geabsorbeerd en verspreid, wat een zeer luidruchtige aflezing van plakjes zou opleveren. In glanzende en donkere objecten zou het licht ofwel worden gereflecteerd of geabsorbeerd tot een punt dat moeilijk op te vangen zou zijn. Bovendien, omdat ik een camera gebruik om de kenmerken van objecten vast te leggen, wordt de waarneming ervan beperkt door de gezichtslijn, wat betekent dat holle objecten en scherpe hoeken vaak worden geblokkeerd door andere delen van het object. Dit wordt weergegeven in ons voorbeeld van een badeend, omdat de staart soms zijn kromming verliest in de scan. De camera kan ook alleen oppervlaktestructuren detecteren, wat betekent dat gaten of interne geometrieën niet kunnen worden vastgelegd. Dit is echter een veelvoorkomend probleem dat ook veel andere scanoplossingen hebben.

Volgende stappen

Hoewel ik blij was met de resultaten van ons project, waren er een paar dingen die konden worden geïmplementeerd om het beter te maken. Om te beginnen, in de huidige staat, kan de scanresolutie alleen worden gewijzigd door de hardgecodeerde resolutievariabelen in onze code te wijzigen. Om het project meer ingebed te maken, zou een resolutiepotentiometer kunnen worden opgenomen, zodat de gebruiker de resolutie kan wijzigen zonder een monitor en toetsenbord op de scanner aan te sluiten. Bovendien maakt de scanner afbeeldingen die er soms gekarteld uit kunnen zien. Om dit op te lossen, kunnen mesh smoothing-technieken worden geïmplementeerd om onregelmatigheden en harde hoeken glad te strijken. Ten slotte ontdekte ik dat pixelcoördinaten niet goed in de echte wereld worden geschaald. De mazen die ik heb gemaakt waren 6 tot 7 keer groter dan het eigenlijke object. In de toekomst zou het voordelig zijn om een manier te implementeren om meshes te schalen, zodat ze nauwkeuriger zijn voor de werkelijke grootte van het object.

Stap 9: Bronnen

Ik heb de code, STL-bestanden om af te drukken en DXF-bestanden voor het snijden voor het hele project bijgevoegd.

Raspberry Pi-wedstrijd 2020
Raspberry Pi-wedstrijd 2020
Raspberry Pi-wedstrijd 2020
Raspberry Pi-wedstrijd 2020

Eerste prijs in de Raspberry Pi-wedstrijd 2020

Aanbevolen: