Tartalomjegyzék:

Raspberry Pi lézerszkenner: 9 lépés (képekkel)
Raspberry Pi lézerszkenner: 9 lépés (képekkel)

Videó: Raspberry Pi lézerszkenner: 9 lépés (képekkel)

Videó: Raspberry Pi lézerszkenner: 9 lépés (képekkel)
Videó: Электрический или водяной полотенцесушитель? Что выбрать? Установка. #25 2024, Július
Anonim
Image
Image
Raspberry Pi lézeres szkenner
Raspberry Pi lézeres szkenner

A lézerszkenner egy Raspberry Pi beágyazott rendszerkészülék, amely 3D objektumok segítségével képes objektumokat digitalizálni.obj mesh fájlokká, hogy azok reprodukálhatók legyenek. A készülék ezt egy lézer és egy integrált PiCam segítségével végzi el a számítógépes látás végrehajtásához. A lézer 45 fokos ferdén helyezkedik el a lézertől, és fényes piros vonalat vetít a tárgy egyik függőleges szeletére. A kamera érzékeli a szelet középpontjától való távolságát, így hálószeletet kap. Az objektumot a forgó tálcára centrifugálják, és a folyamatot addig ismételik, amíg a teljes objektum beolvasásra nem kerül. A létrehozott.obj fájlt végül e -mailben elküldjük a felhasználónak, így a rendszer teljesen önálló és beágyazott lesz.

Ez az útmutató leírja az eszköz felépítését, néhány eredményt és a jövőbeni lépéseket.

1. lépés: Inspiráció

Ihlet
Ihlet
Ihlet
Ihlet

Lelkes gyártóként több éve foglalkozom 3D nyomtatással és szilárd modellezéssel. Rengeteg különböző prototípus -készítő eszközzel dolgoztam, a CNC routerektől a lézervágókon át a 3D nyomtatókig. Az egyik eszköz, amelyet a helyi gyártótér még nem vásárolt, egy 3D szkenner volt - és meg tudom mondani, miért.

Az olcsóbbak (néhány száz dollár) megbízhatatlanok voltak, tökéletes feltételeket igényeltek, és így is elég kopott eredményeket produkáltak. A drágák… nos, drágák, több ezer dollárig terjedtek, ezért sok esetben nem éri meg funkcióját. Ráadásul többször is úgy döntök, hogy méréseket végzek és tervezek egy modellt a semmiből, mint a szkennelés során keletkező felszíni hálóval.

Emiatt egy önálló költségvetési szkennert szerettem volna létrehozni, hogy lássam, mennyire tudok szkennelni egy objektumot a polcon lévő alkatrészek használatával.

Némi kutatás után láttam, hogy sok 3D -s szkenner forgó platformot, majd különféle érzékelőket használt a középponttól való távolság mérésére egy forgó modell létrehozásához. Ezek közül sokan kettős kamerákat használtak, mint a Kinect. Végül az Yscannerre bukkantam, amely egy alacsony felbontású szkenner, amely lézert használ. Az egyszerűséget és a megvalósíthatóságot tekintve ez a lézertechnika, amelyben a lézert a fényképezőgéphez képest eltolva fényvisszaveréssel mérik a központtól való távolságot, tiszta útnak tűnt.

2. lépés: Eszközök és alkatrészek

Alkatrészek:

  • Raspberry Pi 35,00 USD
  • Raspberry Pi kamera V2 30,00 USD
  • LED -ek, ellenállások és vezetékek
  • 3D nyomtatási szál
  • 12x12x0,125 falap
  • M3 hardver
  • Léptetőmotor - 14 dollár
  • Vonal lézer - 8 dollár
  • LN298 léptetőmotor -meghajtók - 2,65 dollár
  • Fém nyomógomb - 5 dollár

Eszközök:

  • Forrasztópáka
  • Lézervágó
  • 3d nyomtató
  • Csavarhúzó
  • Fogó

3. lépés: Magas szintű tervezés

Magas szintű tervezés
Magas szintű tervezés
Magas szintű tervezés
Magas szintű tervezés

Ennek a kialakításnak a központi eleme a vonal lézer, amely a tárgyak függőleges szeletére vetül. Ez a vetítés rögzíthető a picamerán, kijavítható a perspektívája, majd szűrhető a képfeldolgozás előtt. A képfeldolgozás során össze lehet gyűjteni a vonal egyes szegmensei közötti távolságot az objektum középpontjától. Sugárirányú koordinátákban ez a kép mind az r, mind a z komponenst eredményezné. A harmadik dimenziót, az then -t az objektum új szeletre forgatásával érjük el. Ez a koncepció az első ábrán látható.

A fent leírt műveletek végrehajtásához egy Raspberry Pi -t használtam központi számítástechnikai egységünkként. Csatlakoztattam egy léptetőmotort és egy motorvezérlőt a Pi -hez, külső 5 V -os tápellátással és a Pi GPIO csapjaival vezérelve. Vonalas lézert helyeztek a Pi 3,3 V -os vonalára, és egy PiCam -et rögzítettek a Pi kamera bemenetére. Végül egy egyszerű lehúzott gombot telepítettek, és egy állapotjelző LED jelzi a felhasználónak, hogy a rendszer milyen állapotban van. A teljes rendszert a rendszer blokkdiagramja foglalja össze.

A kezdetektől fogva azt tervezték, hogy az elektronikát egy lézervágó dobozban helyezik el, amelyet T-hornyokkal és M3 hardverrel együtt tartanak. Az elektronika elrejtődik a szem elől az alsó rekeszben, és a fedél lehetővé teszi a tárgyak könnyű elhelyezését a forgó tálcán. Ez a fedél azért szükséges, hogy minimálisra csökkentse a rendszerbe szivárgó fény mennyiségét, mivel ez a külső fény zajt okozhat a végső vizsgálat során.

4. lépés: Hardver

Hardver
Hardver
Hardver
Hardver
Hardver
Hardver

Amint fentebb látható, a lézervágás vagy a 3D nyomtatás megkezdése előtt az Autodesk Fusion 360 -at használtam, hogy részletes 3D -s modellt készítsünk a tervezésről. Összefoglalva: a készülék egy egyszerű doboz, fedéllel, lézerrel vágott csuklópántokkal. A készüléknek két fő rétege van: az elektronikai ágy és a főágy, lyukakkal a két réteg közötti vezetékek számára.

Dobozunk nagy része lézervágóval készült, a tervek a Fusion 360 -ban készültek, és Epilog Zing 40 W -os lézervágón vágták. Terveinket a fenti ábrák mutatják. A bal felső saroktól jobbra haladva a darabok a főágy, az elektronikai ágy, két darab a fedélhez, a hátsó, az elülső és a két oldalsó darab. A főágyban három fő kivágás található: az egyik a léptetőmotor felszerelésére, egy a vezetékek vezetésére a lézerből, a másik pedig a PiCam széles kábelének vezetésére. Az ágydarab rögzítőfuratokkal rendelkezik a Pi, a kenyérlap és a motor meghajtójának rögzítéséhez, valamint egy nagyobb kivágással a léptetőmotorhoz. A fedődarabok egyszerűen összecsukódnak, hogy a fent látható háromszög alakú darabot képezzék, és a csuklópánt egyszerű extrudálás, amely az oldallapok lyukának átmérőjének szélessége. A hátsó rész és az egyik oldalsó részen rések vannak, így a Pi portjai (HDMI, USB, Ethernet, Power) könnyen hozzáférhetők. Az előlap egy egyszerű darab, amelyet végül kézi fúróval lyukaztam a gomb és a LED rögzítéséhez. Amint az összes darabon látható, alkatrészeinket az M3 hardver tartja össze T-ízületek és rések segítségével. Ez a módszer a lézervágott darabok ortogonális és biztonságos rögzítésére szolgál. A darabok bordái egybeesnek a többi darab hornyával, és a t-alakú vágás a széleken helyet biztosít egy M3-as anya csavarásához. Ez lehetővé teszi, hogy ezután egy M3 -as csavarral rögzítsük a darabokat nagyon kevés mozgó helyiséggel anélkül, hogy a szerelvény teljesen állandó lenne.

Úgy döntöttem, hogy darabjaink nagy részét lézervágóval készítem a gyorsasága és egyszerűsége miatt. Azonban még mindig 3D -ben kellett nyomtatnom néhány darabot a 3D geometriájuk miatt, amelyeket nehezebb lenne a vágón létrehozni. Az első darab a vonal lézer tartó volt. Ezt a darabot a fényképezőgép látószögétől 45 fokban a főágyra kellett felszerelni, és olyan lyukkal kell rendelkeznie, hogy a lézer szorosan súrlódni tudjon. Egy motortartót is létre kellett hoznom, mert a motor tengelye olyan hosszú volt. A rögzítési súrlódás illeszkedett a lézervágott darabokhoz, és leengedte a motort rögzítő síkot úgy, hogy a forgó platform egy szintben legyen a főággyal.

5. lépés: Elektronika

Elektronika
Elektronika

Ennek a projektnek a kábelezési hardvere nagyon egyszerű volt, mivel a 3D szkenner nem igényelt túl sok perifériát. Motort, gombot, LED -et, lézert és kamerát kellett csatlakoztatni a Pi -hez. Amint az ábrán látható, gondoskodtam arról, hogy az ellenállásokat sorba kössük minden általunk használt tűvel, hogy megvédjük a csapokat. Az egyik GPIO érintkezőt az állapotjelző LED vezérlésére szánták, amely akkor világít, amikor a készülék készen áll a használatra, és pulzál a PWM -mel, amikor az eszköz működik. Egy másik GPIO csap csatlakozott egy felhúzott gombhoz, amely a HIGH értéket regisztrálja, amikor a gombot nem nyomták meg, és a LOW gombot, amikor a gombot megnyomta. Végül négy GPIO csapot szenteltem a léptetőmotor meghajtására.

Mivel motorunknak csak bizonyos mértékig kellett lépnie a sebesség szabályozása nélkül, ezért egy egyszerűbb léptetőmotor -meghajtót (L298N) választottunk, amely egyszerűen felfelé lépteti a vezérlővonalakat, és a motor bemeneteibe táplálkozik. A léptetőmotorok nagyon alacsony szintű működtetésének megismeréséhez az L298N adatlapra és az Arduino könyvtárra hivatkoztunk. A léptetőmotorok mágneses maggal rendelkeznek, váltakozó polaritású ujjakkal. A négy vezeték két elektromágnes vezérlésére van tekercselve, amelyek mindegyik a motor minden másik ellenkező ujját táplálja. Így az ujjak polaritásának átkapcsolásával képesek vagyunk egy lépéssel eltolni a léptetőt. Ezzel a tudással, hogy a léptetők hogyan dolgoztak hardver szintről, sokkal könnyebben tudtuk irányítani a léptetőket. Úgy döntöttünk, hogy léptetőmotorunkat 5 V -os tápegységről kapcsoljuk ki a laborban, nem pedig a Pi -t, mivel a maximális áramfelvétele körülbelül 0,8 A, ami több, mint a Pi.

6. lépés: Szoftver

Szoftver
Szoftver
Szoftver
Szoftver
Szoftver
Szoftver
Szoftver
Szoftver

A projekt szoftvere négy fő összetevőre bontható, amelyek kölcsönhatásba lépnek egymással: Képfeldolgozás, Motorvezérlés, Háló létrehozása és Beágyazott funkciók.

A szoftver összefoglalásaként az első ábrára tekinthetünk. A rendszer indításakor a.bashrc automatikusan bejelentkezik a Pi -be, és elkezdi futtatni a python kódunkat. A rendszer felgyújtja az állapotjelző lámpát, hogy jelezze a felhasználónak, hogy megfelelően indult, és várja a gombnyomást. A felhasználó ezután elhelyezheti a beolvasandó elemet, és bezárhatja a fedelet. A gomb megnyomása után a LED villog, jelezve a felhasználónak, hogy a készülék működik. A készülék a képfeldolgozás és a motorvezérlés között ciklusban marad, amíg a teljes forgatás be nem fejeződik, és az összes objektumadat össze nem gyűlik. Végül létrejön a háló, és a fájl elküldésre kerül egy előre kiválasztott e -mail címre. Ez újraindítja a ciklust, és a készülék készen áll egy újabb vizsgálat elvégzésére egy gombnyomással.

Képfeldolgozás

Az első dolog, amit megvalósítottak, egy rögzített kép feldolgozása volt, hogy a képen tárolt információkat kivonhassák egy olyan formába, amely felhasználható a térbeli pontsor létrehozásához. Ehhez először azzal kezdtem, hogy lefényképeztem a peronon lévő tárgyat a háttérzajjal együtt, amelyet a lézer a doboz hátoldalára ragyogva eloszlatott. Ennek a képnek nyers formában két fő problémája volt. Először is, az objektumot szögben, emelkedett perspektívával szemlélték, másodszor pedig sok a háttérzaj. Az első dolog, amit meg kellett tennem, számításba kellett vennem ezt a látószöget, mert a fotó jelenlegi használata nem teszi lehetővé az objektumok egységes magasságának meghatározását. Amint a második ábrán látható, a fejjel lefelé fordított „L” alak magassága következetes; azonban mivel egyik oldala hosszabb, mint a másik, úgy tűnik, hogy különböző magasságúak a nézőhöz legközelebb eső szélén.

Ennek kijavításához a kép munkaterületét téglalappá kellett alakítanom abból a trapéz alakból, amelyben korábban volt. Ehhez a link által biztosított kódot használtam, amely kép és négy pont megadása esetén a képet a négy pont közé vágja, és a kivágott képet átalakítja a perspektíva kompenzálása érdekében. Ez az átalakítás a négy pont felhasználásával egy téglalapot hoz létre a trapéz típusú alakzat helyett, amint az a harmadik ábrán látható.

A következő megoldandó probléma a háttérzaj volt, külső fény formájában, és a lézer által visszavert fény. Ehhez leszűrtem a fényt az OpenCV inRange () függvényével. Úgy állítottam be a küszöböt, hogy csak egy bizonyos szinten vegye fel a piros lámpát. A helyes érték eléréséhez engedékeny küszöbértékkel kezdtem, és folyamatosan növeltem a küszöbszintet, amíg az egyetlen fényt a szkennelt objektum lézerfénye nem vette fel. Miután megkaptam ezt a képet, minden sorban megtaláltam a legfényesebb pixelt kapjon soronként egy képpontnyi vonalat, amely a lézervonal bal szélét határolta. Ezután minden pixelt 3D -s térben csúcsmá alakítottak át, és egy tömbben tároltak, a háló létrehozásának szakaszában leírtak szerint. E lépések eredményei a negyedik ábrán láthatók.

Motorvezérlés

Miután sikerült egyetlen képet sikeresen feldolgoznom, hogy megkapjam az objektum szeletét, el kellett tudnom forgatni az objektumot, hogy új képet készítsek más szögben. Ehhez a léptetőmotort vezéreltem a platform alatt, amelyen a szkennelt objektum ül. Lépésfunkciónk alapját úgy építettem fel, hogy létrehoztam egy változót, amely nyomon követi a motor állapotát, és a mikromotoros lépést a négy motorbemenet mindegyikének átkapcsolásával.

Háló létrehozása Ahhoz, hogy az összes feldolgozott képből hálót hozzunk létre, először a feldolgozott kép minden egyes fehér pixelét 3D térben lévő csúcsmá kellett alakítanom. Mivel a tárgy egyes szeleteit hengeres szimmetriával gyűjtöm, értelmes volt elkezdeni a hengeres koordináták gyűjtését. Ennek volt értelme, mivel a kép magassága a z tengelyt, a forgó asztal középpontjától való távolság az R tengelyt, a léptetőmotor forgása pedig a théta tengelyt jelentheti. Mivel azonban adatainkat hengeres koordinátákban tároltam, ezeket a csúcsokat át kellett alakítanom derékszögű koordinátákká.

Miután ezeket a csúcsokat létrehozták, azokat egy listában tárolták, és a listát egy másik listában tárolták, amely tartalmazza az egyes rögzített képekhez létrehozott csúcslistákat. Miután az összes képet feldolgoztuk és csúcsokká alakítottuk, ki kellett választanom azokat a csúcsokat, amelyeket ténylegesen szerettem volna megjeleníteni az utolsó hálóban. Azt akartam, hogy a felső és az alsó csúcs szerepeljen, majd a felbontás alapján egyenletesen elosztott csúcsokat választottam ki minden képhez. Mivel nem minden csúcslista volt azonos hosszúságú, ezeket ki kellett egyenlítenem azzal, hogy megkerestem a legkisebb számú csúcsot tartalmazó listát, és eltávolítottam a csúcsokat az összes többi listából, amíg azok párosak lettek. A létrehozott csúcslistákkal most már tudtam hálót hozzon létre. Úgy döntöttem, hogy a hálónkat az.obj fájl szabvány szerint formázom, mivel egyszerű és 3D -ben nyomtatható.

Beágyazott funkció

Miután a készülék működőképes volt, a teljes beágyazott funkció hozzáadásával csiszoltam. Ez azt jelentette, hogy eltávolítottuk a billentyűzetet, az egeret és a monitort, és vezeték nélkül elküldhettük a.obj fájlt a feldolgozás befejezése után. Kezdésként megváltoztattam a.bashrc kódot, hogy automatikusan bejelentkezzek és elindítsam a fő python programot indításkor. Ezt a sudo raspi-config használatával és a „Console Autologin” kiválasztásával, valamint a „sudo python /home/pi/finalProject/FINAL.py” sor hozzáadásával adták meg a /home/pi/.bashrc. fájlhoz. hozzáadott egy gombot és állapotjelző LED -et a felhasználói be- és kimenethez. A gomb segítségével a felhasználó megmondhatja a készüléknek, mikor kell elkezdeni a szkennelést, a LED pedig a gép állapotát. Ha a LED világít, a készülék készen áll egy új vizsgálat megkezdésére. Ha a LED pulzál, a készülék éppen szkennel. Ha a LED irodai, akkor szoftverhiba történt, amely a rendszer újraindítását kéri. Végül engedélyeztem a készüléknek, hogy elküldje az.obj fájlt e -mailben. Ez az smtplib és az e -mail könyvtárak használatával történt. Ez az e -mailek küldésének lehetősége nagyon kényelmes és vezeték nélküli módot biztosított számunkra, hogy eljuttassuk a létrehozott fájlt a felhasználóhoz, hogy hozzáférhessen számos különböző platformhoz.

7. lépés: Integráció

Integráció
Integráció

A készülék különböző darabjainak gyártása után összeszereltem. A fenti ábra sorrendben mutatja:

a) kívülről összeszerelt doboz

b) belül összeszerelt doboz kamerával és lézerrel

c) az elektronikai ágy belső nézete

(d) a Pi hátsó részén, hozzáféréssel a Pi portokhoz és az 5 V -os motorbemenethez

e) nyomógomb LED gyűrűvel és állapotjelző lámpával a készülék elején

8. lépés: Eredmények

Eredmények
Eredmények
Eredmények
Eredmények
Eredmények
Eredmények
Eredmények
Eredmények

A lézeres 3D szkenner tisztességes pontossággal képes volt tárgyakat szkennelni. Az objektumok jellemzői megkülönböztethetők és felismerhetők, és az alkatrészeket nagyon könnyű volt 3D -ben nyomtatni egy szeletelő szoftverrel, mint például a Repetier. A fenti ábrákon egy fadarab és egy gumi kacsa néhány mintaleképezése látható.

A tesztelés során felfedezett egyik legnagyobb megállapításunk és sikerünk az eszköz konzisztenciája volt. Ugyanazon objektum többszöri kísérletezése során a szkenner képes volt előállítani egy.obj fájlt, amely minden alkalommal nagyon hasonló volt, még akkor is, ha kissé megváltoztattuk az objektum elhelyezését. Amint az a három külön vizsgálat során látható, mindegyik nagyon hasonlónak tűnik, ugyanazokat a részleteket és ugyanannyi részletet rögzíti. Összességében nagyon lenyűgözött rendszerünk következetessége és robusztussága.

Az egyik változó, amit igazán tudtam hangolni, a szkennelések felbontása. Mivel a léptetőben 400 lépés van, kiválaszthatom, hogy mekkora ΔΘ diktálja a szögfelbontást. Alapértelmezés szerint a szögfelbontás 20 iterációra van állítva, vagyis minden keretben a motor 20 lépéssel forog (400/20 = 20). Ezt elsősorban az idő érdekében választottuk - körülbelül 45 másodpercig tart az ilyen típusú szkennelés. Ha azonban sokkal jobb minőségű szkennelést szeretnék, akár 400 -ig is növelhetem az iterációk számát. Ez sokkal több pontot ad a modell felépítéséhez, ami sokkal részletesebb vizsgálatot tesz lehetővé. A szögfelbontáson kívül a függőleges felbontást is beállíthatom, vagy azt, hogy hány különböző pontot választok a lézerszeletek mentén. Hasonló időbeli érdeklődés miatt ezt az alapértelmezett értéket 20 -ra állítottam, de növelhetem a jobb eredmények érdekében. A szögfelbontás és a térbeli felbontás ezen paramétereivel való játék során az utolsó ábrán össze tudtam állítani a különböző szkennelések eredményeit. Minden címke úgy van formázva, hogy a szögfelbontás x térbeli felbontás legyen. Amint az az alapértelmezett szkennelési beállításokból látható, a kacsa jellemzői felismerhetők, de nem részletesek. A felbontás növelésével azonban az egyéni pontos jellemzők kezdenek megjelenni, beleértve a kacsán lévő szemeket, csőrt, farkat és szárnyakat. A legnagyobb felbontású kép beolvasása körülbelül 5 percet vett igénybe. Látni ezt a magas, elérhető megoldást, nagyon nagy siker volt.

Korlátozások

A projekt sikeres eredményei ellenére a tervezés és a megvalósítás még mindig korlátozott. A lézer használatával sok probléma merül fel a fény eloszlatásával. Számos, áttetsző, fényes vagy nagyon sötét tárgy, amelyeket megpróbáltam beolvasni, problémásnak bizonyult azzal kapcsolatban, hogy a fény hogyan tükröződik le a felületről. Ha a tárgy áttetsző lenne, a fény elnyelődne és szétszóródna, ami nagyon zajos leolvasást eredményezne. A fényes és sötét tárgyakban a fény vagy visszaverődik, vagy elnyelődik olyan mértékben, hogy nehezen fogható fel. Továbbá, mivel kamerát használok a tárgyak tulajdonságainak rögzítésére, érzékelését korlátozza a látómezeje, ami azt jelenti, hogy a homorú tárgyakat és az éles szögeket gyakran blokkolják a tárgy más részei. Ez látható a gumikacsa példánkban, mivel a farok néha elveszíti görbületét a vizsgálat során. A kamera csak a felszíni szerkezeteket képes észlelni, ami azt jelenti, hogy lyukakat vagy belső geometriákat nem lehet rögzíteni. Ez azonban gyakori probléma, amely sok más szkennelési megoldásnál is fennáll.

Következő lépések

Bár elégedett voltam projektünk eredményeivel, volt néhány dolog, amit végre lehetett hajtani, hogy jobb legyen. Kezdetnek a jelenlegi állapotban a szkennelési felbontás csak a kódunk kemény kódolású felbontási változóinak megváltoztatásával változtatható meg. A projekt beágyazottabbá tétele érdekében fel lehet használni egy felbontási potenciométert, így a felhasználó megváltoztathatja a felbontást anélkül, hogy monitorot és billentyűzetet kellene csatlakoztatnia a szkennerhez. Ezenkívül a szkenner olyan képeket hoz létre, amelyek néha szaggatottnak tűnhetnek. Ennek kijavítására hálósimítási technikákat lehet alkalmazni a szabálytalanságok és a zord sarkok elsimítására. Végül azt találtam, hogy a pixelkoordináták nem illeszkednek jól a valós világhoz. Az általam létrehozott háló 6-7 -szer nagyobb volt, mint a tényleges objektum. A jövőben előnyös lenne a szemek méretezésének módját megvalósítani, hogy azok pontosabbak legyenek az objektum valós méretéhez képest.

9. lépés: Erőforrások

A projekt egészéhez mellékeltem a kódot, a nyomtatáshoz használt STL fájlokat és a vágáshoz szükséges DXF fájlokat.

Raspberry Pi verseny 2020
Raspberry Pi verseny 2020
Raspberry Pi verseny 2020
Raspberry Pi verseny 2020

Első díj a Raspberry Pi versenyen 2020

Ajánlott: