Skaner 3D oparty na Arduino i Processing

Skaner 3D oparty na Arduino i Processing

Czym jest skaner 3D?

Skaner brył jest urządzeniem stosowanym do zapisywania geometrii fizycznych obiektów w pamięci komputera. Znajduje to zastosowanie np. w muzealnictwie – do archwizacji (od malutkich eksponatów do całych budynków); w medycynie, np. do niezwykle precyzyjnego dopasowania protez; w laboratoriach (badania zużycia) i zakładach produkcyjnych (odtwarzanie części do której brak dokumentacji). Ostatnio pojawiają się również zastosowania w marketingu. Skaner zdejmuje wymiary osoby i poleca pasujące rozmiary ubrań czy tworzy wizualizacje – wreszcie koniec z przymierzaniem!

Skanery brył dzielą się ze względu na zasadę działania. Dwie podstawowe to metody:

  • optyczna
  • stykowa

Różnią się między sobą prędkością procesu skanowania jak i dokładnością. Mniej dokładne, ale szybsze, metody optyczne polegają na oświetleniu obiektu światłem i pomiarze odchyleń od oczekiwanego kształtu wzorcowego. Źródłem światła może być np. laser punktowy, laser liniowy, projektor (tzw. skanowanie światłem strukturalnym). Wolniejsza, ale bardziej precyzyjna jest metoda stykowa. W metodzie stykowej, maszyna współrzędnościowa robi serię pomiarów poprzez dosunięcie ramienia z czujnikiem do obiektu i zarejestrowanie pozycji punktu styku poprzez odczytanie wartości położenia z enkoderów liniowych/obrotowych.

Dobór metody zależy też od materiału, z jakiego wytworzony jest skanowany obiekt. Metody optyczne nie nadają się do materiałów przejrzystych i mocno błyszczących, metodami stykowymi nie powinno się skanować obiektów z materiałów elastycznych.

Uproszczona zasada działania

Opisanie wszystkich metod jest zadaniem na dobrą pracę naukową, dlatego skupię się na zasadzie działania mojego skanera, wykorzystującego laser liniowy.

Obiekt, umieszczony na obrotowej platformie, oświetlony jest laserem liniowym. Pod kątem ok. 30stopni w stosunku do osi optycznej lasera znajduje się kamera (kąt alpha). Kamera obserwuje odkształcenie się linii lasera na obiekcie, przeliczając je na dystans oświetlonego punktu od osi obrotu. Ze względu na to, że jest to dopiero początkowa wersja skanera, pomijam takie rzeczy jak punktowość samego czujnika ccd w kamerze, zniekształcenia na układzie optycznym, błędy wprowadzane przez złej jakości laser.

Kamera wykonuje serię zdjęć wokół obiektu, każde zdjęcie robione jest co stały kąt. W moim wypadku wykonywane jest 120 zdjęć wokół obiektu, co oznacza że na każdym kolejnym zdjęciu obiekt jest obrócony o kolejne 360 stopni / 120 = 3 stopnie. Na rysunku oznaczone jest jako fi. Program następnie, wiersz po wierszu, szuka najjaśniejszego piksela. Następnie, gdy piksel taki zostanie znaleziony mierzony jest dystans b pomiędzy nim środkiem obrazu. Wynik, w pikselach, zmieniany jest na milimetry. Współczynnik ilości pikseli odpowiadającym jednemu milimetrowi dla danej odległości kamery od osi obrotu zmierzyłem sobie wcześniej. Następnie za pomocą prostej trygonometrii zamieniam obliczoną odległość b i stały kąt pomiędzy kamerą a laserem na odległość danego punktu od osi obrotu:

sinus(alpha) = b / ro

ro = b / sinus(alpha)

W ten sposób dostaję współrzędne punktu w tzw. walcowym układzie współrzędnych. W układzie walcowym każdy punkt opisany jest za pomocą trzech parametrów

P = (odległość od osi obrotu, kąt między rzutem punktu a osią x, wysokość)

Czyli to co już zostało oznaczone: P = (ro, fi, z)

W programach CAD czy podobnych graficznych, częściej jednak jest wykorzystywany klasyczny, znany ze szkoły, kartezjański układ współrzędnych, w którym każdy punkt wygląda tak:

P = (odległość od początku układ wzdłuż osi X, wzdłuż osi Y, wzdłuż osi Z)

czyli P = (x, y, z)

Należy wykonać więc konwersję współrzędnych z układu walcowego do kartezjańskiego. Na szczęście to też jest bardzo proste.

x = ro * cos( fi )

y = ro * sin( fi )

z = z

I tak dla każdego zdjęcia.

Jak mówiłem – nie jest to komplet obliczeń, jest to wersja bardzo uproszczona.

Kurczę, rozpisałem się.

Elementy składowe

  • Arduino wraz z Arduino IDE
  • Processing IDE
  • LEGO
  • silnik krokowy
  • driver silnika krokowego wraz ze źródłem zasilania do niego
  • laser liniowy
  • kamera internetowa
  • Meshlab

Pierwsze co należy zrobić, to przemyśleć ogólną budowę i kształt samej platformy, sposób mocowania kamery i lasera, mocowanie silnika, sprzężenie silnika z przekładniami lego. Mi udało się to zrobić bez niszczenia klocków.

Silnik krokowy

Wykorzystałem silnik krokowy od starej drukarki OKI. Silnik ten jest silnikiem bipolarnym o 4 wyprowadzeniach, posiada 48 kroków na obrót, napięcie pracy 3,7V, prąd pobierany przy moim zastosowaniu to ok 200-250mA podczas ruchu. Silnik ma zintegrowaną przekładnię o przełożeniu 6:1.

Do wyprowadzeń silnika przylutowałem 4-żyłową taśmę, do drugiego końca każdego z przewodów po goldpinie – dzięki temu bez problemu mogę łączyć silnik ze sterownikiem.

Zębatkę przekładni zdjąłem i wywierciłem w niej 6 otworów, które odpowiadają ułożeniu otworów w kole pasowym z lego. Połączyłem to za pomocą 6 osiek o długości „3”.

Zdjęcie pochodzi z internetu, mój silnik jest bardzo podobny,  ale nie identyczny.

Driver i zasilacz

Zasilacz to klasyczna aplikacja układu LM317 w postaci zasilacza regulowanego. Schemat załączam, poza tym można znaleźć go w datasheet samego układu. Dodaję też rysunek płytki gotowy do termotransferu. Za pomocą potencjometru należy ustalić napięcie wymagane dla silnika. LM317 w obudowie TO220 może zapewnić maksymalny prąd na poziomie 1,5A, należy mieć to na uwadze.

Do sterowania samym silnikiem wykorzystuję kostkę L293D – są to 2 mostki H zintegrowane w jednej obudowie, o wydajności prądowej maks. 600mA na kanał. Jak pisałem silnik pobiera nie więcej niż 250mA, więc taka konfiguracja jest dla mnie absolutnie wystarczająca.

W podstawowej wersji kostka wykorzystuje 4 porty mikrokontrolera oraz piny +5V i GND. Jednak po dodaniu mniejszej płytki z 2 tranzystorami, można zredukować ilość potrzebnych portów o 2. Szczegóły można znaleźć w tutorialach arduino i na stronie http://www.tigoe.com/pcomp/code/circuits/motors/stepper-motors/

Wzory płytek, wykaz elementów,  schematy:

mostek h

zasilacz

Platforma obrotowa

Silnik zamknięty w obudowie z lego praktycznie nie ma możliwości ruchu. Znów uniknąłem konieczności wiercenia czy klejenia (żaden klocek nie ucierpiał). Za pomocą gumki recepturki, silnik połączony jest mechaniczne z przekładnią. Przełożenie na kołach pasowych wynosi 1:1. Sama przekładnia złożona jest z zębatek o niewielkim luzie o przełożeniu 20:12. Dzięki temu uzyskałem całkowite przełożenie z silnika na paltformę 10:1 (6 1 20/12 : 1). A to oznacza że na jeden pełny obrót platformy potrzeba 10 obrotów silnika krokowego.

Sama platforma natomiast jest zrobiona z pękniętego koła lego (z osadzeniem krzyżowym) i płyty CD, sklejonych (osiowo!) klejem na ciepło. Do samej płyty przyklejony, za pomocą taśmy dwustronnej, został zielony papier. Wygląda to równo i elegancko. Reszta na zdjęciach.

Kamera

Miałem tylko dość słabą kamerę Creative Webcam Vista. Więc wyboru nie miałem żadnego, musiałem ją zastosować. Jest przymocowana do platformy za pomocą lego oczywiście.

Laser liniowy

Najpodlejszej jakości wskaźnik laserowy z bazaru oraz szklany walec w charakterze soczewki walcowej tworzą moduł lasera liniowego. Takie szklane patyczki stosowane są w pracowniach chemicznych/laboratoriach i za cholerę nie pamiętam jak się toto nazywa. Na końcach założone koszulki termokurczliwe dla zabezpieczenia przed ostrymi krawędziami szkła.

Arduino

Leonardo. Kupiony parę miesięcy temu w nettigo.pl.

W sumie arduino nie ma za dużo do roboty, kod też jest wyjątkowo prosty. Za pomocą połączenia Serial procesor odbiera komendy od programu napisanego w processingu i obraca talerz o zadany kąt. No i świeci diodą oczywiście.

Processing

Processing jest środowiskiem programistycznym, na bazie którego powstało arduino. Bardzo podobna składnia, prosty interfejs i dobra współpraca z ardu to ważne cechy. Sporo bibliotek i dobra ich dokumentacja (w jęz. angielskim) ułatwia zabawę np. z kamerą.

Pierwsze co należy zrobić to doinstalować bibliotekę GSVideo: http://gsvideo.sourceforge.net/ instrukcja jest na stronie.

Zasady działania kodu nie będę opisywał ponownie, powiem tylko że ze względów różnych, w tej wersji, operacja skanowania jest podzielona na dwie pętle: robienie zdjęć oraz obliczenia. Wynik zapisywany jest w pliku *.asc w katalogu projektu procesinga.

Aha. Interfejs na razie jest bardzo ubogi a właściwie go nie ma. Niemniej,  skany się zapisują.

Skanowanie

Film:

Na razie brak jest podglądu na żywo skanowania, więc do ustawiania kamery używam przykładu GettingStartedWithCaptureWin z katalogu przykładów biblioteki GSVideo.

Następnie zostaje tylko włączyć zasilanie, włączyć laser i nacisnąć Run w IDE processing.

Film jest w słabej jakości. Nic na to nie poradzę, nie mam żadnej innej kamery ponad telefon.

Chmura punktów

Chmura jest wynikiem działania skanera. Są to wczytane punkty zorientowane w przestrzeni. Do działania z chmurami nadaje się program Meshlab, ale u mnie zachowuje się dość niestabilnie. Trochę mi to przeszkadza w przerobieniu chmury na bryłę, ale jestem chyba coraz bliżej oczekiwanego efektu. Gotową bryłę można zapisać jako plik stereolitografii *.stl i wydrukować na drukarce 3D.  Otrzymana chmura przedstawia obiekt odbity względem początku układu współrzędnych.  Otrzymaną chmurę można zobaczyć poniżej, ale nie jest to dokładnie ta sama co na screenach. Jest to późniejszy skan, wykonany po drobnej przebudowie skanera i w dzień, więc ma trochę szumów (niepotrzebnych wierzchołków).

skan

Do zrobienia

Zdecydowanie wkrótce należy:

  • Ulepszenia kodu, m.in. wskazywanie miejsca gdzie Z=0, dzięki temu bryła nie będzie odbita względem punktu P = (o, 0, 0)
  • Dopisanie jakiegoś prostego interfejsu
  • Wbudowana kalibracja kamery i lasera
  • i jeszcze parę…

Pomysły co można ulepszyć:

  • odwrócić kamerę o 90 stopni, w efekcie zwiększy się ilość warstw
  • lepszy laser liniowy, bez poświaty
  • zastosowanie kamery HD, a może jakiejś cyfrowej lustrzanki?

Angielska wersja artykułu umieszczona została na instructables.com, polecam zerknąć: http://www.instructables.com/id/Lets-cook-3D-scanner-based-on-Arduino-and-Proces/

I to chyba było by na tyle.

Ocena: 4.75/5 (głosów: 52)

Podobne posty

32 komentarzy do “Skaner 3D oparty na Arduino i Processing

Odpowiedz

anuluj

Masz uwagi?