Skaner 3D

Skaner trójwymiarowych obiektów jest jednym z tych robotów, które chciałem skonstruować od bardzo dawna, ale ciągle brakowało mi odpowiednich klocków i pomysłu na całą konstrukcję. W końcu udało mi się zebrać niezbędne elementy i po kilku nieudanych próbach powstał gotowy skaner.

Głównym elementem skanującym jest czujnik nacisku zamocowany na wysuwanym pionowo elemencie. Za jego ruch odpowiada specjalny liftarm z ząbkami na całej jego długości, niestety niedołączony do oryginalnego zestawu. Całość umieszczona jest w szynie zapewniającej odpowiednie ułożenie elementów.

Aby móc skanować trójwymiarowe przedmioty musiałem uzyskać ruch wzdłuż trzech prostopadłych osi. Za oś pionową odpowiedzialny jest ruchomy element czujnika nacisku. Za ruch wzdłuż osi X odpowiada jeżdzący wózek, podobny do tego ze zwykłego skanera. Cała oś X, wraz z wózkiem, jego torem jezdnym oraz elementem skanującym, porusza się wzdłuż osi Y. Za ten ruch odpowiadają dwa koła, na dwóch szynach po obu stronach robota. Są one tak zbudowane, żeby koła nie wypadały z właściwego toru jazdy.

Cała konstrukcja wymaga ogromnej ilości liftarmów i ze względu na to niezbędne jest dokupienie kilkunastu osobno.

Oprogramowanie robota jest banalnie proste. Wykonujemy na osi X określoną ilość skanów, przesuwamy się o jeden krok na osi Y i powtarzamy cały schemat. Podczas skanowania, jeżeli czujnik nacisku zostanie aktywowany, zapisywana jest wartość wysunięcia w dół. Jeżeli nie zostanie aktywowany przy określonym wysunięciu, powraca na swoje miejsce.

Cały cykl skanowania trwa w zależności od wybranej rozdzielczości od 5 minut do nawet 2 godzin. W dołączonym programie skanowałem po 20 kroków na osi X i po 30 na osi Y. Wydaje się niewiele, ale to 600 pomiarów i całość zajmowała równo 30 minut. Mniejsza rozdzielczość nie pozwalała dostrzec szczegółów przedmiotu. Większa natomiast dawała tylko małą poprawę jakości.

Wszystkie dane zapisywane były do tabeli, a później do pliku w pamięci NXT. Później kopiowałem je do komputera i odpowiednio obrabiałem.

Jestem bardzo zadowolony z ostatecznego efektu pracy. Robot skanował rzeczywiste przedmioty z dość dużą dokładnością. Wykonane modele wiernie odtwarzały oryginał. Zachęcam do prób podobnych konstrukcji!

Wideo

Galeria

Galeria 3D

Obrazy w tej galerii możesz oglądać jedynie przy użyciu specjalnych czerwono-niebieskich okularów. Można je nabyć w wielu sklepach internetowych za bardzo małe pieniądze.


Kod programu

//author: Krzysztof Kapusta, All rights reserved #define SENSOR S1 #define HEAD OUT_A #define AXIS_X OUT_B #define AXIS_Y OUT_C #define MAX_DOWN 420 #define MAX_X 340 #define MAX_Y 710 #define STEPS_X 20 #define STEPS_Y 30 int map[STEPS_X][STEPS_Y]; void init() { SetSensor(S1, SENSOR_TOUCH); SetSleepTimeout(30); } int scan() { int turn_state = MotorRotationCount(HEAD); OnRevReg(HEAD, 50, OUT_REGMODE_SPEED); while(!SensorBoolean(SENSOR) & turn_state-MotorRotationCount(HEAD) < MAX_DOWN); Off(HEAD); int height = turn_state-MotorRotationCount(HEAD); RotateMotor(HEAD, 50, height); return height; } int save_to_file(string name) { byte file = fopen(name, "w"); if (file == 0) { file = fopen("saved.dat", "w"); name = "saved.dat"; } if (file == 0) return 1; for (int y = 0; y<STEPS_Y; y++) { for (int x = 0; x<STEPS_X; x++) fprintf(file, "%d ", MAX_DOWN-map[x][y]); fprintf(file, "\n", NULL); } fclose(file); return 0; } task main() { init(); for (int y = 0; y < STEPS_Y; y++) { for (int x = 0; x < STEPS_X; x++) { map[x][y] = scan(); TextOut(10, LCD_LINE2, "X = "); NumOut(34, LCD_LINE2, x); TextOut(10, LCD_LINE3, "Y = "); NumOut(34, LCD_LINE3, y); TextOut(10, LCD_LINE4, "Scan "); NumOut(40, LCD_LINE4, y*STEPS_X+x); TextOut(58, LCD_LINE4, "/"); NumOut(64, LCD_LINE4, STEPS_Y*STEPS_X); NumOut(40, LCD_LINE5, ((y*STEPS_X+x)*100)/(STEPS_X*STEPS_Y)); TextOut(52, LCD_LINE5, "% done"); RotateMotor(AXIS_X, 30, MAX_X/STEPS_X); } RotateMotor(AXIS_X, -30, (MAX_X/STEPS_X)*STEPS_X); // integer math RotateMotor(AXIS_Y, 30, MAX_Y/STEPS_Y); } RotateMotor(AXIS_Y, -30, (MAX_Y/STEPS_Y)*STEPS_Y); save_to_file("scan1.dat"); }

Pokaż/ukryj cały kod

Komentarze

zatkało mnie jak zobaczyłem - jesteś mistrzem!

Dodane przez: Misiek | 2013-09-02

Niesamowite :O

Dodane przez: RedstonePL | 2013-01-16

KRZYSIO MISTRZ!!

Dodane przez: Paweł | 2012-08-21

Dodaj swój komentarz