czwartek, 4 kwietnia 2013

Mission Accomplished

Tak więc udało się. Po wielu dniach męki i wyniszczania swojego organizmu udało nam się w końcu osiągnąć cel. Zbudowaliśmy robota który w końcu gra w kółko i krzyżyk. No może nie do końca kółko i krzyżyk. Raczej kwadrat i punkt. Ale i tak jest fajnie. 

Na początku pragnę przeprosić, że długo nic nie wrzucałem. Po prostu zwykły brak czasu, przygotowania świąteczne, nawał nauki w szkole. Teraz materiały powinny pojawiać się regularniej. Niedługo spodziewajcie się kolejnych części kursów. Btw. Zdjęcia poniżej dzięki uprzejmości kolegi Szymona. Zapraszam na jego fotobloga (o ile kiedyś go stworzy ;P).

Programiści przy pracy. Ok 3 w nocy (czy też może już nad ranem).
Podsumujmy może jednak  sam projekt. Zabawa z klockami trwała około 2 tyg, przy czym za samego robota, na poważnie, zabraliśmy się dopiero po tygodniu. Pracowaliśmy nad nim na wolnych lekcjach, i możemy się poszczycić tym, że nareszcie chodzi.

Konstrukcja oparta jest na trzech silnikach oraz dwóch czujnikach, które sterowane są z komputera. Komunikacja pomiędzy komputerem a kontrolerem NXT oparta jest na systemie Bluetooth. Kod programu został stworzony przy wykorzystaniu dwóch narzędzi. Kompilatora języka C++ z dołączoną darmową biblioteką NXT++, oraz dedykowanego oprogramowania dołączonego do zestawu Lego Mindstroms.
Nasze dziecko <3.

Co się tyczy konstrukcji. Dwa silniki odpowiadają za pozycję ramienia do którego dołączony jest czujnik koloru i pisak. Jeden obraca ramieniem w prawo i lewo, a drugi przesuwa robota do przodu i do tyłu. Trzeci służy do podnoszenia i opuszczania pisaka. Dzięki niemu można postawić tę symboliczną kropkę. 

Na ramieniu znajduje się także czujnik, służący do odczytania  koloru który się pod nim znajduje, mianowicie, jeśli jest różny od białego lub czarnego, to funkcja sprawdzająca kolor zwraca wartość odpowiednią dla pola zajętego przez przeciwnika. Ta wartość jest później wpisywana do tablicy przechowującej obecną sytuację na planszy. Robot posiada jeszcze czujnik dotyku, który informuje o zakończeniu ruchu gracza. Po zamalowaniu kwadratu należy go nacisnąć.
Próby zamalowania kwadratu ;).

Odnośnie kodu. Jest on podzielony na odpowiednie pliki, w zależności od przeznaczenia funkcji tam się znajdujących. Np.: funkcja gry Kółko i Krzyżyk, funkcja odczytywania wartości, rysowania itp.

W tym momencie muszę jednak poddać krytyce bibliotekę NXT++, gdyż przysporzyła nam wiele kłopotów. Mianowicie problemem była obsługa silnika za pomocą podawania kątów. Gdy wywoływaliśmy powodującą przesunięcie o 10 stopni w lewo, później dwa razy w prawo i znowu w lewo, to za pierwszym razem wszystko działało. Aczkolwiek drugie wywołanie tych poleceń skutkowało nieprzewidywalnymi posunięciami o całkowicie losowe (przynajmniej dla ludzi) kąty. Po wielu próbach nakazania tym funkcjom by pracowały jak należy, zmuszeni byliśmy na zmianę podejścia. Gdyż kąt o który ramię miało się przesuwać był stały, postanowiliśmy zrobić przesunięcia ramienia o zadefiniowaną już wcześniej wartość za pomocą dedykowanego, klockowego oprogramowania. Przesunięcia te nazwaliśmy odpowiednio: left, right, backward i forward. Następnie utworzyliśmy z nich podprogramy, które zostały wysłane na urządzenie NXT. Z kodu C++, następowało jedynie wywołanie ich. Pozwoliło nam to na przebrnięcie przez ten problem na około. Nie było to dla nas zbyt satysfakcjonujące lecz gonił nas czas. Pamiętajcie, że następnego dnia, o 9 rano trzeba było już się pokazać z gotowym, w pełni sprawnym robotem.
Ramię podczas pracy.


Samo kółko i krzyżyk zostało przez nas zrobione w sposób najprostszy z możliwych. Nasz algorytm sumował wartości w pionie, poziomie i w poprzek. Pole zajęte przez gracza miało wartość 5, przez robota 1 a puste 0. Odpowiednie wyniki (np. 10) informowały robota o tym, czy gracz zbliża się do wygranej, czy też jest możliwości wygrania tej partii przez robota itd. Na podstawie tego trzeba było tylko ustalić odpowiednie priorytety ruchów. Zależało nam na tym, aby można było z nim wygrać, więc nie bawiliśmy się (przynajmniej jeszcze wtedy) w przewidywanie ruchów, gdyż nie to było naszym celem.



Dnia 19 marca o godzinie 9:30, robot nasz rozpoczął swój chrzest bojowy, który przeszedł z wynikiem bardzo dobrym. Przegrał tylko 4 razy, ani razu się nie pomylił czy też zaciął. Doprowadził nawet do remisu z panią reporter lokalnej telewizji, która przyjechała zrobić materiał na temat dni otwartych naszej szkoły.  Co do samego LEGO Mindstroms, to uważam, że jest ono świetną zabawką, która pozwala na poznanie podstawowych zasad budowy robotów, przy minimalnych wręcz szkodach spowodowanych przepalaniem tranzystorów lub innych elementów. Tylko pamiętajcie, jeśli macie zamiar pokazać swojego robota publicznie, to zacznijcie go robić jakiś miesiąc wcześniej. Zarywanie nocy by tylko działał nie jest tego warte. ;) Niedługo spodziewajcie się filmiku z pracy.

Brak komentarzy:

Prześlij komentarz

Pamiętaj aby Twoje komentarze były zawsze kulturalne i zgodne z obowiązującą Netykietą. Nie przeklinaj, nie obrażaj i nie wyzywaj innych użytkowników. PS: Nie karm troli.