Opis symulatora - Wydział Elektroniki, Telekomunikacji i Informatyki
Transkrypt
Opis symulatora - Wydział Elektroniki, Telekomunikacji i Informatyki
Gdańsk 11.02.2006 Serwer symulacji gry robotów w piłkę nożną (liga MiroSot FIRA) Politechnika Gdańska wydział: Elektroniki Telekomunikacji i Informatyki mgr inż. Piotr Fiertek Katedra Systemów Automatyki [email protected] Spis treści: 1. Wstęp 3 2. Zasada działania serwera symulacji 3 3. Rozmiar boiska, piłki, robotów oraz dodatkowych obiektów boiska 5 4. Model robotów i piłki 6 5. Symulacja toru pomiarowego 7 6. Komunikacja serwera z programami sterującymi 8 6.1. Implementacja programu sterującego w postaci biblioteki DLL 8 6.2. Komunikacja z programem sterującym za pomocą protokołu UDP 9 7. Opis interfejsu 10 7.1. Okno główne serwera symulacji 10 7.2. Okno „Ustawienie komunikacji” 12 7.3. Okno „Ustawienia symulacji” 13 7.4. Okno „Ustawienie obiektow na boisku” 17 7.5. Okno „Ustawienia zapisu wynikow symulacji” 19 7.6. Okno „Parametry gry” 20 7.7. Okno podglądu symulacji – wizualizacja gry 21 7.8. Podgląd zarejestrowanych wyników symulacji 24 Dodat. A Plik nagłówkowy biblioteki DLL dla gracza 1 26 Dodat. B Opis komunikacji pomiędzy programem sterującym a serwerem symulacji 27 2 1. Wstęp Przedstawiony w tym dokumencie program ma za zadanie symulację gry robotów w piłkę nożną. Nawiązuje on do rozgrywek w lidze MiroSot organizacji FIRA (Federation of International Robosoccer Association) (www.fira.net). W lidze tej roboty (7,5cm x 7,5cm x 7,5cm) grają na boisku o rozmiarze 150cm x 130cm. Mecz jest rozgrywany przez dwie drużyny. W skład każdej drużyny wchodzą trzy roboty oraz komputer z systemem wizyjnym (framegraber oraz kamera umieszczona nad boiskiem) (rys.1). System wizyjny ma za zadanie obserwować sytuację na boisku i dzięki odpowiednio napisanemu oprogramowaniu do obróbki obrazu, określać położenie i orientację kątową poszczególnych zawodników oraz położenie piłki. Uzyskane dane przekazywane są następnie do aplikacji odpowiedzialnej za sterowanie robotami. Programy sterujące po przeanalizowaniu otrzymanych danych wyznaczają sygnały sterujące, które następnie drogą radiową przesyłane są do robotów. Rys. 1. Rozgrywki robotów w piłkę nożną w lidze MiroSot organizacji FIRA W celu umożliwienia łatwego tworzenia i testowania programów sterujących pracujących w wyżej opisanym środowisku, stworzony został serwer symulacji naśladujący środowisko gry robotów w piłkę nożną. Opisany serwer symulacji zastępuje rzeczywiste boisko, roboty, piłkę, system wizyjny oraz kanał komunikacji radiowej między komputerem a robotami. Programy sterujące otrzymują od serwera informację na temat stanu symulowanej gry (położenie i orientacja kątowa robotów, położenie piłki, czas wirtualny, stan gry) jednocześnie mają możliwość wpływania na przebieg gry poprzez wysyłanie sygnałów sterujących do poszczególnych robotów. Dodatkowo serwer symulacji umożliwia umieszczenie na boisku dodatkowych obiektów takich jak: skrzynie, ściany oraz słupy. Dodatkowe obiekty umożliwiają rozszerzenie repertuaru zadań jakie mogą wykonywać roboty w stworzonym środowisku symulacyjnym (np. przejechanie przez labirynt, współpraca dwóch robotów w celu przepchnięcia ciężkiej skrzyni). 2. Zasada działania serwera symulacji Serwer symulacji składa się z następujących części: 1. moduł symulacji odpowiedzialny za odwzorowanie zachowania robotów i piłki na boisku 2. mechanizmy komunikacji między modułem symulacji a programami sterującymi 3. interfejs użytkownika 4. moduł edycji położenia obiektów na boisku 5. moduł wizualizacji symulacji Mechanizmy komunikacji między serwerem symulacji a programami sterującymi opisane zostały w punkcie szóstym. Interfejs użytkownika, moduł edycji położenia obiektów na boisku oraz moduł wizualizacji symulacji opisany jest w punkcie siódmym. Działanie serwera symulacji obrazowo przedstawione jest na rysunku 2. Najważniejszą częścią serwera jest moduł symulacji, który odpowiada za odtworzenie zachowania się symulowanych obiektów na boisku. Moduł ten uruchamiany jest w oddzielnym wątku i pracuje równolegle z programami sterującymi (jeśli programy sterujące łączą się z symulatorem poprzez protokół UDP). Z punktu widzenia kontroli czasu wirtualnego symulacji możliwe są dwa tryby pracy. W trybie pierwszym symulacja działa ze stałą długością dT kroku symulacji1. W trybie drugim długość kroku symulacji jest dynamicznie dostosowywana do prędkości komputera tak, aby zmiana wirtualnego 1 Krok symulacji dT wynika z dyskretnego charakteru obliczeń symulacji i oznacza dyskretyzację osi czasu – różnicę czasu pomiędzy kolejnymi stanami opisującymi sytuacje na boisku. 3 czas symulacji odpowiadała rzeczywistej zmianie czasu systemowego. W drugim trybie pracy serwer symulacji synchronizuje się z czasem rzeczywistym nakładając rygorystyczne ograniczenia czasowe na pracę programów sterujących. Przekazanie sytuacji na boisku Wizualizacja Symulacja Sterowanie zastąpienie rzeczywistości zastąpienie komputera Symulacja i sterowanie Przekazanie nowych poleceń Symulacja Gracz 2 Gracz 1 Rys. 2. Symulacja gry robotów na jednym i na kilku komputerach Przedstawiony na rysunku 2 blok o nazwie „Sterowanie” reprezentuje dołączony do serwera symulacji program sterujący. Program ten może być dołączony w postaci odpowiednio napisanej biblioteki DLL. W takim przypadku program sterujący jest automatycznie uruchamiany w momencie rozpoczęcia symulacji. Możliwa jest również implementacja modułu sterującego w postaci odrębnego programu, komunikującego się z serwerem symulacji za pomocą protokołu UDP. W drugim przypadku możliwe jest uruchomienie programów sterujących na innych komputerach, połączonych ze sobą za pomocą sieci TCP/IP. Dane do programów sterujących (oraz wywoływanie funkcji sterujących w przypadku sterowników zaimplementowanych w bibliotekach DLL) wysyłane są cyklicznie z okresem zdefiniowanym w ustawieniach symulacji. Dla układu sterowania współpracującego z systemem wizyjnym w laboratorium obiektów ruchomych w Katedrze Systemów Automatyki na Politechnice Gdańskiej, okres pracy sterownika wynosi 33,33ms (kamera wysyła obrazy z częstością 30 klatek/s). Siły działające pomiędzy obiektami znajdującymi się na boisku wyznaczane są na podstawie odbicia sprężystego (rys.3). W metodzie tej traktujemy każdą ścianę (banda boiska, bok robota) jak układ sprężyn oddziałujących na punkt materialny siłą proporcjonalną do głębokości zagłębiania się tego punktu w ścianie. Wykorzystanie metody odbicia sprężystego do wyznaczania oddziaływań pomiędzy poszczególnymi obiektami pozwoliło na stworzenie symulacji pozwalającej uwzględnić skomplikowany kształt boiska oraz robotów. Kosztem przyjętego rozwiązania jest konieczność wykonywania obliczeń przy małej długości kroku symulacji dT oraz pojawienie się dodatkowego parametru modelu, współczynnika sprężystości ścian. Mała wartość tego współczynnika pozwala na zastosowanie dłuższego kroku symulacji kosztem częściowego wnikania robotów w obszar ścian boiska oraz obszar innych robotów. Duża wartość współczynnika sprężystości powoduje że ściany są bardziej „sztywne” lecz ze względu na powstające błędy numeryczne pociąga to konieczność zmniejszenia długości kroku symulacji dT (zwiększenia liczby wykonywanych obliczeń). F FX FY r r d F d x,y x 1 ,y1 dla d < r → F = k⋅(r-d) Rys. 3. Symulacja odbicia bazująca na metodzie odbicia sprężystego 4 Aby zmiana wirtualnego czas symulacji odpowiadała rzeczywistej zmianie czasu systemowego (symulacja pracuje w czasie rzeczywistym) wprowadzony został mechanizm dynamicznej zmiany długości kroku symulacji dT. W tym celu wyznaczana jest liczba obliczonych kroków symulacji w przeciągu ściśle określonego czasu kontrolnego równego 10ms (wykorzystane zostało przerwanie zegarowe o dokładności 1ms). Na tej podstawie wyznaczana jest taka wartość długości kroku symulacji dT aby czas wirtualny symulacji podążał za czasem rzeczywistym lub aby prędkość zmiany czasu wirtualnego odpowiadała prędkości zmiany czasu rzeczywistego. Zmniejszenie czasu potrzebnego do obliczenia jednego kroku symulacji → → zwiększenie liczby obliczonych kroków symulacji → zmniejszenie dT Zwiększenie czasu potrzebnego do obliczenia jednego kroku symulacji → → zmniejszenie liczby obliczonych kroków symulacji → zwiększenie dT Czas wykonania jednego kroku symulacji silnie zależy od liczby symulowanych obiektów. Ponieważ na wolniejszych komputerach ustalona długość kroku symulacji dT może być zbyt duża z punktu widzenia dokładności obliczeń, wprowadzono ograniczenie na długość kroku symulacji dT równe 0,4ms. W takim przypadku czas wirtualny symulacji nie będzie nadążać za czasem rzeczywistym i z punktu widzenia użytkownika, wirtualny czas symulacji jest spowolniony w stosunku do czasu rzeczywistego komputera. 3. Rozmiar boiska, piłki, robotów oraz dodatkowych obiektów boiska Rozmiary boiska, piłki i robotów zostały ustawiony na stałe i odpowiadają małej lidze robotów MiroSot organizacji FIRA (rys.4). Promień piłki wynosi 2,135cm. Parametr „w” oznacza zagłębienie z przodu i z tyłu robota służące do prowadzenia piłki (rys.1). Zagłębienie to ma wpływ na sposób oddziaływania robota na piłkę i piłki na robota, nie jest natomiast „widziane” przez inne roboty oraz ściany boiska. Głębokość zagłębienia służącego do prowadzenia piłki może być regulowana i mieści się w granicach od 0 do 2,135cm. Głębokość równa 0cm oznacza brak zagłębienia do prowadzenia piłki. Dla każdego robota parametr ten może być ustalany niezależnie. Symulator umożliwia umieszczenie na boisku dodatkowych obiektów nie występujących podczas gry robotów w piłkę. Dodatkowymi obiektami boiska są: skrzynie, słupy i ściany. Umożliwiają one urozmaicenie zadań, jakie może wykonywać robot w środowisku symulacyjnym. Wymiary i położenie każdego z dodatkowych obiektów można ustawiać niezależnie. Skrzynie i ściany opisywane są przez: położenie, orientację kątową, szerokość i długość. Słupy opisane są przez: położenie i promień słupa. Y d e y' f c c b (0,0) a w X f f x' a w b ściany boiska f Rozmiary boiska: Rozmiary robota a = 65cm, b = 75cm, c = 20cm, d = 10cm, e = 7cm. f = 7,5cm w = 0cm; 2,135cm 5 y' a y' R b b x' x' a Rozmiary skrzyń: a = 4cm; 100cm Rozmiary ścian: a = 1cm; 5cm Rozmiary słupa b = 4cm; 100cm R = 0,5cm; 2,5cm b = 4cm; 200cm Rys. 4. Kształt i rozmiary boiska, robotów oraz dodatkowych obiektów takich jak skrzynie, ściany i słupy. 4. Model robotów i piłki Piłka symulowana jest przez punkt materialny o określonej masie i promieniu oddziaływania na otoczenie. Nie jest modelowany ruch obrotowy piłki a tym samym wszelkie efekty związane z podkręceniem piłki. Współczynnik oporu ruchu piłki określa wartość siły tarcia wiskotycznego (proporcjonalnego do prędkości liniowej piłki) działającego na poruszającą się piłkę. Wartość siły tarcia dynamicznego i statycznego (proporcjonalnego do masy piłki) określona jest przez współczynniki tarcia statycznego i dynamicznego. Robot symulowany jest przez obiekt materialny posiadający określone wymiary, masę oraz moment bezwładności. Opory ruchu reprezentowane są przez tarcie wiskotyczne ruchu linowego (siła skierowana przeciwnie do kierunku ruchu robota) oraz ruchu obrotowego (moment siły skierowany przeciwnie do kierunku ruchu obrotowego robota). Napęd pochodzący od kół robota symulowany jest poprzez pojawienie się odpowiedniej siły oraz momentu siły o takiej wartości, aby w stanie ustalonym robot uzyskał wymaganą prędkość liniową i obrotową. Odpowiednia wartość siły (dla ruchu liniowego) oraz momentu siły (dla ruchu obrotowego) jest uzyskiwana poprzez porównanie wymaganej prędkości robota z współczynnikiem tarcia wiskotycznego. Przyjęty model robota oznacza, że robot opisany jest modelem pierwszego rzędu z opóźnieniem. Opóźnienie występujące w kanale pomiarowym (czas potrzebny na akwizycję i przetworzenie obrazu) oraz w kanale sterującym (czas potrzebny na wyznaczenie sygnału sterującego oraz przesłanie go drogą radiową do robota) symulowane jest przez włączenie opóźnienia (o jeden cykl pracy sterownika) w wysłaniu aktualnych danych do programów sterujących. y y' x' α yr xr x Rys. 5. Parametry wysyłane do programów sterujących określające położenie robota, skrzyni i ściany (położenie x, y oraz orientacja kątowa α). Osie x’ i y’ określają lokalny układ odniesienia robota (robot porusza się wzdłuż osi y’). 6 5. Symulacja toru pomiarowego Rzeczywiste położenie robota na boisku określone jest przez wektor Pr (t ) = [xr (t ) [ Programy sterujące robotami otrzymują wektor Pp (t ) = x p (t ) ] yr (t ) α r (t )]. y p (t ) α p (t ) , który otrzymujemy z wektora Pr (t ) po przepuszczeniu go przez blok symulujący błędy pomiarowe występujące w kanale sprzężenia wizyjnego. Y ∆α αr Yp αp ∆R Yr ∆θ Xr Xp X Rys. 6. Błąd pomiaru położenia i orientacji kątowej robota. Przejście wektora Pr (t ) w wektor Pp (t ) opisuje następujący układ równań: ⎡ x p (t ) ⎤ ⎡ xr (t ) + ∆R ⋅ cos(α r (t ) + ∆θ ) + w p ⋅ n(t ) ⎤ ⎢ ⎥ ⎢ ⎥ ⎢ y p (t ) ⎥ = ⎢ yr (t ) + ∆R ⋅ sin (α r (t ) + ∆θ ) + w p ⋅ n(t ) ⎥ ⎢α p (t )⎥ ⎣⎢α r (t ) + α c + α A ⋅ sin (α r (t ) + αθ ) + wk ⋅ n(t )⎦⎥ ⎣ ⎦ [1] ⎛⎛ 5 ⎞ ⎞ n(t ) = w ⋅ ⎜⎜ ⎜ ∑ δ (1) ⎟ − 2,5 ⎟⎟ ⎠ ⎝ ⎝ i =1 ⎠ [2] gdzie δ (1) oznacza zmienną losową o rozkładzie jednorodnym w przedziale od 0 do 1. Wartość parametru „w” została tak dobrana aby odchylenie standardowe zmiennej losowej n(t) w przybliżeniu wynosiło 1 (w = 1,5526). Dla każdego elementu wektora Pp (t ) , składnik n(t) generowany jest niezależnie. Parametry ∆R, ∆θ, αc, αA, αθ, wp oraz wk są parametrami wpisywanymi w oknie edycji parametrów modelu robota (rys.17) i oznaczają: ∆R, ∆θ – stały błąd pomiaru położenia robota związany z niedokładnym zdefiniowaniem maski robota w programie realizującym przetwarzanie obrazu (rys.6) wp – losowy składnik błędu położenia robota, odchylenie standardowe od średniej αc – stały błąd pomiaru orientacji kątowej robota związany z niedokładnym zdefiniowaniem maski robota w programie realizującym przetwarzanie obrazu αA, αθ – stały błąd pomiaru orientacji kątowej robota związany z jego aktualną orientacją kątową. Składnik ten został wprowadzony w związku z danymi pomiarowymi uzyskanymi podczas pomiarów dokładności wyznaczania orientacji kątowej robota2 (rys.7). wk – losowy składnik błędu orientacji kątowej robota, odchylenie standardowe od średniej 2 Badanie systemu wizyjnego będącego na wyposażeniem laboratorium obiektów ruchomych (Katedra Systemów Automatyki, Politechnika Gdańska wydział ETI) polegało na ustawieniu robota na specjalnie przygotowanej planszy a następnie rejestrowaniu wskazań położenia robota uzyskanego z systemu wizyjnego. Uzyskane wyniki (dla kilku testowanych algorytmów) przedstawione są na rysunku siódmym. Oś x przedstawia rzeczywistą orientację kątową robota, na osi y przedstawiony jest stały składnik błędu orientacji kątowej robota. Uzyskane wyniki mogą zależeć od przyjętego algorytmu rozpoznawania obrazu, parametrów oświetlenia boiska oraz specyfiki urządzeń wchodzących w skład systemu wizyjnego. Sinusoidalny składnik stałego błędu orientacji kątowej robota może być wyłączony poprzez przyjęcie αA = 0. 7 Pattern with main blue blob and one supporting blob 5 Pattern with main blue blob and one supporting blob 1,6 1,4 4 1,2 3 Error [degree] Error [degree] 1 2 1 0,8 0,6 0 0,4 -1 0,2 0 -2 0 50 100 150 200 250 300 0 350 50 100 a) Color 512x512 Color 1024x1024 Grey 512x512 Grey 1024x1024 150 200 250 300 350 Robot orientation [degree] Robot orientation [degree] b) Color 512x512 Color 1024x1024 Grey 512x512 Grey 1024x1024 Rys. 7. a) stały składnik błędu wyznaczania orientacji kątowej robota w zależności od rzeczywistej orientacji kątowej robota b) składnik losowy błędu wyznaczania orientacji kątowej robota 6. Komunikacja serwera z programami sterującymi Do serwera symulacji dołącza się program sterujący robotami na dwa różne sposoby. Możliwe jest zaimplementowanie stworzonych algorytmów sterowania w postaci dołączanej do serwera biblioteki DLL oraz stworzenie oddzielnego programu komunikującego się z serwerem symulacji za pomocą protokołu UDP. Dane wysyłane do programów sterujących zawierają opis położenia i orientacji kątowej robotów oraz położenie piłki. Jeżeli wymagana jest znajomość prędkości piłki i robotów, wielkości te muszą być aproksymowane na podstawie kilku ostatnich pomiarów (otrzymanych danych). Rozkazy wysyłane do robotów są w postaci wymaganej prędkości liniowej i obrotowej robota. Złożenie tych dwóch prędkości pozwala na ruch robota wzdłuż linii prostej, obrót w miejscu lub jazdę po łuku. Bardziej złożone zachowanie robota (np. dojazd robota do określonego punktu) muszą być implementowane w ramach programu sterującego. 6.1. Implementacja programu sterującego w postaci biblioteki DLL W celu umożliwienia przesyłania danych pomiędzy serwerem symulacji a programem sterującym należy w bibliotece DLL stworzyć odpowiednie zmienne i ich reprezentacje udostępnić na zewnątrz biblioteki. Ponadto należy stworzyć i udostępnić serwerowi symulacji funkcje, które będą wywoływane podczas uruchamiania serwera, uruchamiania symulacji, zatrzymywania symulacji oraz podczas każdego cyklu sterowania. Odpowiedni plik nagłówkowy zawierający definicję zmiennych oraz udostępnianych funkcji znajduje się w pliku „Dane_opis1_dll.h” oraz „Dane_opis2_dll.h”. Plik pierwszy odnosi się do definicji biblioteki DLL zawierającej program sterujący robotami drużyny pierwszej. Odpowiednio plik drugi odnosi się do definicji biblioteki DLL zawierającej program sterujący robotami drużyny drugiej. Wymienione pliki są częścią kodu źródłowego szkieletu bibliotek DLL dołączonych do serwera symulacji. Biblioteki (jak również serwer symulacji) zostały napisane w języku C++ w kompilatorze Builder 6.0. Szkielet biblioteki DLL służy do szybkiej implementacji algorytmów sterowania bez potrzeby samodzielnego tworzenia biblioteki oraz mechanizmów komunikacji między programem sterującym a serwerem symulacji od podstaw. Przykład stworzenia prostego programu sterującego robotem na bazie istniejącego szkieletu biblioteki DLL został przedstawiony w oddzielnym dokumencie. Nazwy funkcji i zmiennych w obu bibliotekach są identyczne za wyjątkiem cyfr „1” i „2”, które identyfikują przypisanie funkcji i zmiennych do drużyny 1 lub 2. Opis funkcji, które powinny być zdefiniowane w bibliotece DLL: Inicjuj_ster1_dll(); - Funkcja ta jest wywoływana podczas uruchamiania serwera symulacji i może być wykorzystana do inicjacji programu sterującego (np. odczyt parametrów sterownika z pliku). Przy prostych algorytmach sterowania funkcję tę można zostawić pustą. Start_ster1_dll(); - Funkcja ta jest wywoływana jeden raz na początku symulacji i może być wykorzystana do inicjacji sterownika lub też w razie potrzeby do uruchomienia oddzielnego wątku sterowania. Wątek ten może pracować jednocześnie z głównym wątkiem symulacji i asynchronicznie wpływać na przebieg procesu sterowania robotami. Ponieważ wątek symulacji jest uruchomiony z priorytetem Lower, wątek sterowania musi być uruchomiony z priorytetem Lower lub niższym. Jeśli istnieje taka potrzeba, w funkcji Start_ster1_dll() można zarezerwować pamięć pod zmienne, które będą wykorzystywane później przez 8 program sterujący. W prostych algorytmach sterowania funkcję tą najczęściej można pozostawić pustą lub umieścić w niej polecenie wyświetlenia wiadomości w oknie komunikatów serwera symulacji. Stop_ster1_dll(); - Funkcja ta jest wywoływana w momencie zatrzymania wykonywania symulacji. Można ją wykorzystać do zamknięcia oddzielnego wątku sterowania jeśli taki został wcześniej utworzony oraz do zwolnienia zarezerwowanej przez program sterujący pamięci. W prostych algorytmach sterowania funkcja ta najczęściej będzie funkcją pustą. Krok_ster1_dll(); - Funkcja ta jest wywoływana w każdym kroku pracy sterownika i powinna zawierać implementację algorytmów sterowania robotami. Przed wywołaniem funkcji Krok_ster1_dll(); aktualizowana jest zawartość bloku danych dostępnego pod adresem Dane1_dll, w którym dostępna jest informacja dotycząca położenia robotów i piłki, aktualnego stanu gry, położenia i rozmiaru dodatkowych obiektów boiska, liczby strzelonych goli oraz przydziału robotów do danej drużyny. Prawidłowo napisana funkcja Krok_ster1_dll(); powinna na podstawie otrzymanego stanu gry odpowiednio wypełnić blok danych pod adresem Rozkazy1_dll, który przechowuje rozkazy wysyłane do robotów. Opis struktury bloku danych dostępnych pod adresami Dane1_dll i Rozkazy1_dll umieszczony jest w pliku ‘Dane_opis.h’ (struktura bloków danych jest identyczna z komunikacją z serwerem symulacji za pomocą protokołu UDP). Opis zmiennych, które powinny być zadeklarowane w bibliotece DLL: char __export *Dane1_dll; Wskaźnik do bloku danych wypełnianego przez serwer symulacji, przechowującego informacje o stanie obiektów na boisku. char __export *Rozkazy1_dll; Wskaźnik do bloku danych wypełnianego przez program sterujący. Umieszczane są w nim rozkazy do robotów. Maksymalny rozmiar bloku wynosi 512 bajtów. bool __export dane1_dll_zapis; // Dane1_dll w trakcie zapisu, ustawiane przez symulacje bool __export dane1_dll_odczyt; // Dane1_dll w trakcie odczytu, ustawiane przez sterownik bool __export nowe_dane1_dll; // czy dane opisujące sytuacje na boisku były aktualizowane Zmienne służące do synchronizacji zapisu i odczytu z bloku Dane1_dll. Synchronizacja dostępu do bloku danych została wprowadzona z powodu potencjalnej możliwości jednoczesnego zapisu i odczytu danych przez wątek symulacji i wątek sterowania. W momencie gdy wątek symulacji chce zaktualizować zawartość bloku Dane1_dll, ustawia wartość zmiennej dane1_dll_zapis na true i sprawdza zawartość zmiennej dane1_dll_odczyt. Jeżeli zmienna dane1_dll_odczyt ma wartość false, wątek symulacji aktualizuje zawartość bloku Dane1_dll a następnie ustawia wartość zmiennej dane1_dll_zapis na false oraz zmiennej nowe_dane1_dll na true. Po odczycie zawartości bloku Dane1_dll sterownik może ustawić wartość zmiennej nowe_dane1_dll na false, dzięki czemu będzie mógł później sprawdzić czy pojawiły się nowe dane dotyczące położenia robotów i piłki na boisku. Opisany mechanizm ma zastosowanie tylko w momencie uruchomienia oddzielnego wątku sterowania pracującego równolegle względem głównego wątku symulacji. bool __export rozkazy1_dll_zapis; // Rozkazy1_dll w trakcie zapisu, ustawiane przez sterownik bool __export rozkazy1_dll_odczyt; // Rozkazy1_dll w trakcie odczytu, ustawiane przez symulacje bool __export nowe_rozkazy1_dll; // czy dane opisujące rozkazy do robotów były aktualizowane Zmienne służące do synchronizacji zapisu i odczytu z bloku Rozkazy1_dll. Obsługa synchronizacji dostępu przebiega analogicznie do obsługi synchronizacji dostępu do bloku Dane1_dll. bool __export wiadomosc1_dll_wysw; Zmienna informuje serwer symulacji, że należy wyświetlić wiadomość tekstową w oknie komunikatów. Treść wiadomości znajduje się w tablicy wiadomosc1_dll[], długość wiadomości określa zmienna wiadomosc1_dll_dlugosc. Długość wyświetlanej wiadomości nie może przekraczać 256 znaków. Po wyświetleniu wiadomości w oknie komunikatów, wartość zmiennej jest z powrotem ustawiana na false. char __export wiadomosc1_dll[256]; // Wiadomość która ma być wyświetlona w oknie symulacji int __export wiadomosc1_dll_dlugosc; // Liczba znaków w wiadomości 6.2. Komunikacja z programem sterującym za pomocą protokołu UDP Komunikacja pomiędzy programem sterującym a serwerem symulacji za pomocą protokołu UDP polega na przesyłaniu bloków danych o ściśle zdefiniowanej ramce. W jednej ramce danych można umieścić kilka rodzajów bloków danych. Opis ramki oraz możliwych do przesłania bloków danych znajduje się w pliku ‘Dane_opis.h’ oraz umieszczony jest w dodatku B. Do serwera symulacji został dołączony kod źródłowy prostego programu sterującego, komunikującego się z serwerem symulacji za pomocą protokołu UDP. Program został stworzony w języku C++ za pomocą kompilatora Builder 6.0 i do komunikacji przez UDP używa komponentu NMUDP znajdującego się w pasku FastNet kompilatora Builder. Komponent ten dostępny jest w wersji Professional i Enterprise. Przykład implementacji 9 prostego algorytmu sterowania bazującego na dołączonym programie przedstawiony został w oddzielnym dokumencie. Dzięki zastosowaniu komunikacji za pomocą protokołu UDP możliwe jest sterowanie robotami z programu napisanego w języku innym niż C++ lub w innym środowisku programistycznym niż Builder 6.0. 7. Opis interfejsu Poniżej znajduje się rozpisane menu serwera symulacji. W dalszej części znajduje się szczegółowy opis interfejsu użytkownika oraz opcji programu. Menu Program Autor Wyjscie Otwarcie okna z informacją na temat autora programu Wyjście z programu Wizualizacja Otworz Otwarcie okna wizualizacji symulacji (podgląd gry) Zamknięcie okna wizualizacji symulacji (podgląd gry) Zamknij Rejestracja Podglad Zwolnij pamiec Otworz z pliku Zapisz do pliku BIN Zapisz do pliku TXT Ustawienia Komunikacja Symulacja Ustaw obiekty Rejestracja Parametry GRY Otwarcie okna podglądu zarejestrowanych trajektorii piłki i robotów Zwolnienie zajmowanej pamięci przeznaczonej na zapamiętanie trajektorii robotów Odczyt zarejestrowanych wcześniej trajektorii z pliku binarnego Zapis zarejestrowanych trajektorii do pliku binarnego Zapis zarejestrowanych trajektorii do pliku tekstowego Otwarcie okna konfiguracji komunikacji serwera symulacji z programami sterującymi Otwarcie okna konfiguracji parametrów symulacji oraz początkowego stanu robotów Edycja położenia i rozmiaru obiektów znajdujących się na boisku Otwarcie okna konfiguracji rejestracji zmiennych symulacji (trajektorii piłki i robotów) Edycja parametrów sterujących przebiegiem gry Odczytaj z pliku Odczyt ustawień serwera symulacji z pliku Zapisz do pliku Zapisz jako Zapis ustawień serwera symulacji do pliku (aktualnie wybrany plik) Zapis ustawień serwera symulacji do pliku (z podaniem nazwy pliku) Rys. 8. Opis menu serwera symulacji gry robotów w piłkę nożną. 7.1. Okno główne serwera symulacji Rysunek 9 przedstawia widok okna głównego symulacji. W oknie tym przedstawiony jest stan najważniejszych zmiennych symulacji, stan komunikacji między serwerem symulacji a programami sterującymi i wizualizacją, okno komunikatów otrzymywanych od programów sterujących, nazwy drużyn oraz okno ręcznego wysyłania sygnału sterującego do poszczególnych robotów. Opis poszczególnych elementów znajdujących się w oknie głównym programu: menu – menu programu umożliwia dostęp do okien edycji ustawień symulacji, podglądu zarejestrowanych trajektorii robotów oraz okna wizualizacji gry. Struktura menu przedstawiona jest na rysunku 8. czas wirtualny symulacji – wartość zmiennej symulacji reprezentującej czas. stan gry – wartość zmiennej reprezentującej stan gry. ‘0’ – zatrzymanie gry; ‘100’ – powrót robotów na pozycje startowe; ‘190’ – wszystkie roboty znajdują się w pozycjach startowych; ‘200’ – gra. l.goli 1, l.goli 2 – liczba goli strzelonych odpowiednio przez drużynę pierwszą i drugą. Trz[s] – wartość zmiennej przechowującej rzeczywisty czas w sekundach liczony od momentu uruchomienia symulacji. dT[ms] – długość kroku symulacji w ms. Maksymalna wartość długości kroku symulacji wynosi 0,4ms. W zależności od ustawień, długość kroku symulacji może być stała lub zmieniać się dynamicznie w celu nadążania wirtualnego czasu symulacji za czasem rzeczywistym Trz. 10 l. petli – liczba kroków symulacji wykonanych w określonym odcinku czasu równym 10ms. Wyświetlona wartość l.petli pochodzi z wyjścia filtru cyfrowego filtrującego rzeczywistą liczbę wykonanych operacji. Stąd wskazywana wartość nie jest liczbą całkowitą. Na podstawie wartości l.petli wyznaczana jest odpowiednia wartość zmiennej dT. Obie zmienne są wyświetlane w celu przedstawienia informacji, czy komputer posiada wystarczającą moc obliczeniową do symulowania grupy robotów w czasie rzeczywistym. Vz[m/s],Wz[rad/s] – przedstawiają wartość sygnału zadającego każdego robota. Dane/s – Ile razy na sekundę są wysyłane informacje dotyczące stanu gry (położenie robotów i piłki) do programów sterujących i modułu wizualizacji gry. Wartość tej zmiennej mówi nam czy symulacja przebiega bez zakłóceń czy też jest przerywana przez inne programy. Z prawej strony znajdują się wskaźniki stanu komunikacji. Kolor żółty oznacza nawiązanie komunikacji z programem sterującym lub z podstawowym modułem wizualizacji. Kolor czerwony oznacza brak połączenia. Liczba dolaczonych programow wizualizacji – liczba zalogowanych programów wizualizacji z pominięciem wizualizacji głównej (której adres IP i numer portu jest jawnie wpisany w oknie ustawień komunikacji). W momencie gdy uruchomiony zostanie serwer symulacji w trybie wizualizacji, pod podany w oknie komunikacji adres serwera symulacji, z częstością 4 razy na sekundę, wysyłana jest paczka danych informująca o pojawieniu się programu wizualizacji. Jeżeli uruchomiony serwer symulacji odbierze sygnał logowania wizualizacji, umieszcza adres nadawcy w dynamicznie tworzonej liście adresów i rozpoczyna wysyłanie danych o stanie gry do wizualizacji. Nazwy drużyn – Nazwy drużyn otrzymane od dołączonych programów sterujących. W momencie uruchomienia symulacji gry, do programów sterujących wysyłane jest zapytanie o nazwę drużyny. Gdy programy sterujące podadzą nazwę drużyny, jest ona wyświetlana w oknie głównym serwera symulacji oraz jest przesyłana do programów wizualizacji gry. Jeżeli program sterujący nie poda nazwy drużyny, przyjmowane są standardowe nazwy: „Druzyna 1” oraz „Druzyna 2”. Nazwa drużyny nie może być dłuższa niż 24 znaki. okno komunikatów – w oknie tym wyświetlane są komunikaty tekstowe wysyłane przez programy sterujące. Komunikaty mogą mieć charakter pomocniczy i mogą informować programistę w jakim stanie znajduje się obecnie program sterujący lub mogą służyć do identyfikacji autorów uruchomionego programu sterującego. menu liczba goli strzelonych przez drużynę pierwszą czas wirtualny symulacji liczba goli strzelonych przez drużynę drugą stan gry wskaźnik czasu rzeczywistego liczony od rozpoczęcia symulacji włączenie/wyłączenie podglądu sygnałów sterujących czas jednego kroku symulacji liczba pętli wykonanych w czasie kontrolnym zadana prędkość liniowa numer robota (sterowanie ręczne) zadana prędkość liniowa (sterowanie ręczne) zadana prędkość obrotowa zadana prędkość obrotowa (sterowanie ręczne) wysłanie sygnału sterującego (sterowanie ręczne) liczba wysłań informacji o stanie na boisku do programów sterujących w ciągu ostatniej sekundy sygnalizacja włączenia rejestracji włączenie/wyłączenie rejestracji liczba aktualnie zalogowanych programów do wizualizacji gry sygnalizacja komunikacji z graczem 2 sygnalizacja komunikacji z graczem 1 sygnalizacja komunikacji z wizualizacją nazwy drużyn okno komunikatów start/stop symulacji wyjście z programu czyszczenie okna komunikatów powrót robotów na pozycje startowe wznowienie gry zatrzymanie gry (pauza) przejście o jeden krok do przodu Rys. 9. Okna główne serwera symulacji. 11 Rejestracja – przycisk ręcznego włączenia i wyłączenia rejestracji zmiennych symulacji. Włączenie rejestracji symulacji sygnalizowane jest jasnozielonym kolorem znacznika znajdującego się z prawej strony przycisku Rejestracja. Ręczne sterowanie rejestracją możliwe jest przy włączonej odpowiedniej opcji w oknie ustawień rejestracji. Zapełnienie pamięci, zarezerwowanej dla potrzeb rejestracji zmiennych symulacji, spowoduje zatrzymanie rejestracji. Ponowne włączenie rejestracji nie będzie możliwe aż do momentu zwolnienia przydzielonej pamięci. Wyślij – przycisk wysłania sygnału zadającego do robota określonego w polu Nr robota. Zadana prędkość liniowa i obrotowa określona jest odpowiednio w polach V[+/-100%] i W[+/-100%]. Prędkości podane są w procentach i odnoszą się do zdefiniowanych maksymalnych prędkości podanych jako parametry modelu robota w oknie Ustawienia symulacji. Roboty numerowane są od 1 do 12. Czysc – przycisk służący do wyczyszczenia okna komunikatów. Powrót robotów na pozycje startowe – przycisk z rysunkiem domku służy do poinformowania symulatora o konieczności przesunięcia robotów i piłki na pozycje startowe. W trakcie wykonywania tej operacji nie jest zmieniany czas gry ani liczba strzelonych goli. Funkcja ta jest przydatna podczas rozgrywki w celu wyjścia z impasu, z którym roboty nie potrafią sobie samodzielnie poradzić (np. zablokowanie piłki w rogu boiska). Zatrzymanie gry – naciśnięcie tego przycisku powoduje zamrożenie symulacji oraz pojawienie się dwóch dodatkowych przycisków: ‘wznowienie gry’ oraz ‘przejście o jeden krok do przodu’. Pierwszy z przycisków powoduje pełne wznowienie symulacji. Drugi powoduje wznowienie symulacji tylko do momentu wysłania danych do programów sterujących i ponowne zatrzymanie gry. Tryb ten oznacza pracę krokową symulatora i służy do testowania programów sterujących. 7.2. Okno „Ustawienie komunikacji” Rysunek 10 przedstawia okno ustawień komunikacji między serwerem symulacji a programami sterującymi oraz między serwerem symulacji a modułem wizualizacji symulacji. Okno to składa się z dwóch części. W części pierwszej można ustalić adres IP komputera na którym uruchomiony jest program sterujący oraz port pod jaki serwer symulacji ma wysyłać informację o stanie robotów na boisku. Adres „127.0.0.1” jest adresem lokalnym komputera. Wpisując taki adres IP programy sterujące mogą być uruchomione na tym samym komputerze co serwer symulacji. W tym przypadku musimy się upewnić czy wszystkie programy mają inny numer portu. numer portu serwera symulacji / wizualizacji (protokół UDP) adres IP gracza 1 (protokół UDP) adres IP gracza 2 (protokół UDP) numer portu gracza 1 (protokół UDP) adres IP wizualizacji lub serwera symulacji w zależności od wybranego trybu pracy programu (protokół UDP) numer portu gracza 2 (protokół UDP) numer portu wizualizacji / serwera symulacji (protokół UDP) ustalenie sposobu podłączenia z programami sterującymi (biblioteka DLL / protokół UDP) ustawienie trybu pracy programu serwer symulacji/wizualizacja ustalenie czy wizualizacja gry ma być lokalna czy na innym komputerze (UDP) ustalenie tempa wysyłania danych do wizualizacji (normalne tempo lub dwa razy szybsze) czy do graczy ma być wysyłana ramka podstawowa czy rozszerzona (przechowująca opis dodatkowych obiektów boiska: ściany, słupy, skrzynie) czy wysyłać dane do wizualizacji podczas włączonej pauzy zamknięcie okna i wprowadzenie zmian zamknięcie okna bez wprowadzania zmian Rys. 10. Okno edycji ustawień dotyczących komunikacji. W drugiej części okna, klikając na niebieski napis, ustalamy sposób komunikacji serwera symulacji z programem sterującym oraz wizualizacją. Ustalany jest też tryb pracy programu. Jeśli z prawej strony wyświetlony jest napis „Protokol UDP”, serwer symulacji komunikuje się z programem sterującym przez protokół UDP. Pojawienie się napisu „Biblioteka DLL”, oznacza, że uruchomiony będzie program sterujący umieszczony w bibliotece DLL. Ustawienie opcji Rysuj na „Podgląd lokalny” oznacza, że wizualizacja symulacji odbywa się tylko w oknie podglądu symulacji. Gdy opcja Rysuj ustawiona jest na „Protokol UDP”, wizualizacja gry może odbywać się w oknie podglądu symulacji jak i w oddzielnym programie połączonym z serwerem symulacji za pomocą protokołu UDP. W takim przypadku wizualizacja gry może odbywać się również na innych komputerach. Ustawienie trybu pracy symulacji na „Serwer symulacji” powoduje, że program pracuje jako serwer symulacji. Ustawienie trybu pracy na „Wizualizacja” przełącza program w tryb wizualizacji. W trybie tym program nie uruchamia wątku symulacji tylko czeka na dane otrzymane z serwera symulacji i na ich podstawie przedstawia stan gry w oknie podglądu symulacji. 12 Następna opcja służy do zwiększenia częstotliwości wysyłania danych do wizualizacji. Możliwe jest normalne tempo, w którym program wizualizacji otrzymuje dane z serwera z taką samą częstotliwością jak programy sterujące lub przyśpieszone tempo, w którym wizualizacja otrzymuje aktualne dane dwukrotnie częściej niż programy sterujące. Opcja ta ma zapewnić płynność odtwarzania gry w momencie, gdy chcemy aby programy sterujące pracowały z mniejszą częstotliwością niż standardowe 30 cykli na sekundę. Następna opcja służy do wymuszenia wysyłania danych do wizualizacji podczas włączonej pauzy. W normalnych warunkach, podczas pauzy czas wirtualny się nie zmienia i dane do programów sterujących oraz do wizualizacji nie są wysyłane. Oznacza to, że obraz w oknie wizualizacji również nie jest odświeżany. Ostatnia opcja służy do wyboru rodzaju bloku danych opisującego sytuację na boisku, wysyłanego do programów sterujących i wizualizacji. Wersja podstawowa zakłada wysyłanie bloków danych o numerach 1 i 2 (Dodatek B) (wysyłana jest tylko informacja o położeniu robotów i piłki). Wersja rozszerzona powoduje, że wysyłane będą bloki danych o numerach 3 i 4 (Dodatek B) (uwzględniające zmienną liczbę robotów na boisku oraz dodatkowe obiekty boiska takie jak skrzynie, ściany i słupy). Wciśnięcie przycisku Zmien spowoduje zatwierdzenie wprowadzonych zmian i zamknięcie okna. Przycisk Zamknij powoduje zamknięcie okna bez zatwierdzenia wprowadzonych zmian. 7.3. Okno „Ustawienia symulacji” Rysunek 11 przedstawia okno edycji parametrów symulacji oraz ustawień pracy programu sterującego. Okno składa się z dwóch części. Z lewej strony znajdują się zakładki w których umieszczone są parametry symulacji dotyczące boiska, modelu piłki oraz początkowego położenia piłki. Poniżej znajdują się parametry opisujące pracę programu sterującego. W prawej części okna znajdują się zakładki w których umieszczone są wszystkie informacje dotyczące robotów, skrzyń, ścian i słupów. Parametry symulacji przechowywane są w pliku „ustawien.sym”. Skasowanie tego pliku powoduje przywrócenie standardowych wartości parametrów programu. liczba ścian liczba robotów liczba słupów liczba skrzyń aktualnie wybrany obiekt (robot, skrzynia, ściana, słup) wybór przydziału robota do danej drużyny wybór rodzaju edytowanego obiektu parametry opisujące model obiektu i oddziaływanie między obiektem a otoczeniem parametry opisujące model piłki początkowy stan piłki początkowy stan obiektu (położenie, orientacja kątowa, prędkość) parametry pracy serwera symulacji i układu sterowania poprzedni obiekt następny obiekt powielenie ustawień dotyczących wybranego obiektu na pozostałe obiekty zamknięcie okna z wprowadzeniem zmian zamknięcie okna bez wprowadzenia zmian Rys. 11. Okno edycji parametrów symulacji i ustawień układu sterowania. Opis poszczególnych elementów znajdujących się w oknie ustawień symulacji: Liczba robotow – liczba robotów znajdujących się na boisku. Maksymalna liczba robotów wynosi 12. Liczba skrzyn – liczba skrzyń znajdujących się na boisku. Maksymalna liczba skrzyń wynosi 6. Liczba scian – liczba ścian znajdujących się na boisku. Maksymalna liczba ścian wynosi 40. Liczba slupow – liczba słupów znajdujących się na boisku. Maksymalna liczba słupów wynosi 10. 13 Parametry definiujące pracę układu sterowania: Okres pracy sterownika [ms] – ustalenie okresu pracy sterownika w ms. Czas ten definiuje nam przerwę pomiędzy kolejnym wysłaniem danych do programów sterujących oraz uruchomieniem sterowników zdefiniowanych w bibliotece DLL. Długość okresu pracy sterownika może być ustawiona w zakresie od 10ms do 0,5s. Staly krok symulacji [ms] – zaznaczenie tej opcji powoduje wyłączenie mechanizmu nadążania wirtualnego czasu symulacji za czasem rzeczywistym i przyjęcie stałej długości kroku symulacji. Stałą długość kroku symulacji wprowadza się w polu edycji znajdującym się z prawej strony opcji Staly krok symulacji [ms].Wprowadzona długość kroku symulacji nie może być większa niż 0,4ms. Sledzenie czasu rzeczywistego – zaznaczenie tej opcji powoduje włączenie mechanizmu nadążania wirtualnego czasu symulacji za czasem rzeczywistym. Wyłączenie tej opcji powoduje, że symulator stara się tak ustawić długość kroku symulacji aby szybkość zmiany czasu wirtualnego odpowiadała szybkości zmian czasu systemowego (rzeczywistego). W momencie gdy serwer symulacji pracuje bez zakłóceń, różnica pomiędzy włączeniem i wyłączeniem śledzenia czasu rzeczywistego jest praktycznie niezauważalna. Widoczna różnica działania pojawia się, gdy z jakiegoś powodu proces symulacji zostaje spowolniony i czas rzeczywisty znacząco ‘wyprzedzi’ czas wirtualny symulacji. Gdy opcja śledzenia czasu rzeczywistego jest wyłączona i przyczyna spowolnienia działania symulacji zniknie, czas wirtualny jest zwiększany w tempie zmian czasu rzeczywistego, utrzymując stałą różnicę miedzy czasem rzeczywistym a wirtualnym. Gdy opcja śledzenia czasu jest włączona, czas wirtualny niejako ‘dogania’ czas rzeczywisty stopniowo zmniejszając różnicę między czasem rzeczywistym i wirtualnym. Opoznienie w torze pom. – ustawienie tej opcji powoduje, że dane o sytuacji na boisku wysyłane są do programów sterujących z opóźnieniem równym okresowi pracy sterownika. W przeciwnym wypadku programy sterujące otrzymują najświeższe dane dotyczące położenia piłki i robotów. Ustawienie tej opcji pozwala nam włączać i wyłączać opóźnienie w torze pomiarowym. Praca synchroniczna – ustawienie tej opcji powoduje, że rozkazy wysyłane do robotów aktualizowane są zawsze na początku cyklu sterowania. Ustawienie tej opcji pozwala nam zagwarantować stałe opóźnienie w torze sterowania. Wyłączenie tej opcji powoduje, że rozkazy wysyłane do robotów są aktualizowane natychmiast po otrzymaniu ich od programu sterującego. Przycisk Zmień powoduje zatwierdzenie wprowadzonych zmian. Przeprowadzana jest kontrola położenia obiektów i sprawdzenie czy nie nachodzą na siebie. Jeżeli dwa obiekty nachodzą na siebie, wyświetlany jest odpowiedni komunikat i losowane jest nowe położenie obiektu, gwarantujące odseparowanie od siebie tych obiektów. Nie jest sprawdzana kontrola poprawności wszystkich parametrów modelu boiska, piłki i robotów. Dlatego też należy zachować ostrożność podczas wprowadzania zmian oraz zaleca się przed ich wprowadzeniem zapisać aktualne ustawienia w oddzielnym pliku. Parametry symulacji przechowywane są w pliku „ustawien.sym”. Skasowanie tego pliku powoduje przywrócenie standardowych ustawień programu. Przycisk Zamknij powoduje zamknięcie okna bez zatwierdzenia wprowadzonych zmian. Parametry związane z modelem piłki umieszczone są w zakładce „Pilka” (rys.12). W zakładce tej możliwa jest edycja następujących parametrów: Masa pilki – masa piłki [kg]. Wspolczynnik oporu ruchu pilki – współczynnik oporu ruchu postępowego odpowiedzialny za zmniejszanie się prędkości piłki [N⋅s/m] (tarcie wiskotyczne, proporcjonalne do prędkości piłki). Wspol. tarcia dynamicznego – współczynnik tarcia dynamicznego [N/kg] (nie włączone). Wspol. tarcia statycznego – współczynnik tarcia statycznego [N/kg] (nie włączone). Odchyl. standard. polozenia pilki – Odchylenie standardowe sygnału zakłócającego dodanego do położenia piłki [2]. Poz.X i Poz. Y – początkowe położenie środka piłki w osi x i y [m], środek układu współrzędnych znajduje się w środku boiska (rys. 4). Pr.Vx i Pr.Vy – prędkość piłki w osi x i y [m/s]. Parametry związane z modelem ścian boiska umieszczone są w zakładce „Sciany boiska” (rys.13). W zakładce tej możliwa jest edycja następujących parametrów: Wspolcz. sprezyst. scian boiska – współczynnik sprężystości wykorzystywany przy wyznaczaniu sił działających między boiskiem a punktem materialnym znajdującym się w obszarze oddziaływania ścian boiska [N/m]. Duża wartość współczynnika powoduje, że ściany boiska są bardziej sztywne, mała wartość współczynnika powoduje że rozpędzony robot może na chwile wbić się w głąb ściany. 14 Wspolczynnik tarcia przy odbiciu – współczynnik tarcia wiskotycznego, związanego z siłą nacisku jaki wywiera na ścianę punkt materialny, poruszający się równolegle do płaszczyzny ściany. Strata energii przy odbiciu – współczynnik straty energii przy odbiciu, 0 – oznacza odbicie idealnie sprężyste, 1- uderzenie w którym tracone jest 100% energii kinetycznej związanej z prędkością prostopadłą do ściany boiska. Wspol. tarcia dynamicznego – współczynnik tarcia dynamicznego [N/kg], siła działająca na punkt materialny znajdujący się w obszarze oddziaływania ściany i poruszający się równolegle do ściany (nie włączone). Wspol. tarcia statycznego – współczynnik tarcia statycznego [N/kg], siła działająca na punkt materialny znajdujący się w obszarze oddziaływania ściany i poruszający się równolegle do płaszczyzny ściany (nie włączone). masa piłki współczynnik oporu ruchu liniowego piłki (tarcie wiskotyczne – proporcjonalne do prędkości) współczynnik tarcia dynamicznego współczynnik tarcia statycznego odchylenie standardowe sygnału szumu nałożonego na sygnał położenia piłki początkowy stan piłki (położenie i prędkość) Rys. 12. Zakładka edycji parametrów modelu piłki współczynnik sprężystości ścian boiska współczynnik tarcia przy odbiciu się innych obiektów od ścian boiska strata energii kinetycznej podczas odbicia się od ściany boiska współczynnik tarcia dynamicznego współczynnik tarcia statycznego Rys. 13. Zakładka edycji parametrów modelu ścian boiska Rysunek 14 przedstawia widok zakładki „Powierzchnia boiska” zawierającej parametry rozszerzonego modelu boiska. Ponieważ model ten nie jest jeszcze zaimplementowany, nie będzie szerzej omówiony. uwzględnienie nierówności powierzchni boiska w modelu ruchu piłki i robotów wysokość lewego górnego rogu boiska względem poziomu odniesienia wysokość prawego górnego rogu boiska względem poziomu odniesienia wysokość lewego dolnego rogu boiska względem poziomu odniesienia wysokość prawego dolnego rogu boiska względem poziomu odniesienia współczynnik sztywności powierzchni boiska współczynnik sztywności powierzchni boiska Rys. 14. Zakładka edycji parametrów rozszerzonego modelu boiska Parametry modelu każdego robota ustawiane są niezależnie i są umieszczone w zakładkach „Param. podst”, „Param. rozszerz” i „Bledy pomiarowe”. W pierwszej zakładce (rys.15) umieszczone są parametry podstawowe robota (rozdz.4), w drugiej (rys.16) parametry rozszerzone (jeszcze nie zaimplementowane) i w ostatniej (rys.17) parametry związane z modelowaniem zakłóceń pojawiających się w kanale sprzężenia zwrotnego (rozdz.5). Przełączanie się pomiędzy poszczególnymi robotami odbywa się za pomocą klawiszy Nast. i Poprz. Przycisk Powiel powoduje przypisanie ustawień aktualnie edytowanego obiektu pozostałym. W momencie wyboru innego rodzaju obiektu do edycji (skrzynia, ściana lub słup), odpowiednie pola w pierwszej zakładce „Param. podst” zostaną wyłączone oraz zmieni się oznaczenie dwóch pól związanych z edycją rozmiaru obiektu. Wysyłane do programów sterujących położenie skrzyń, ścian i słupów nie jest obarczone błędem pomiarowym, w związku z czym pozostałe dwie zakładki nie są aktywne. 15 Druzyna 1 – klikając w pole przydziału robota, przypisujemy wybranego robota do drużyny pierwszej lub drugiej. Masa robota – masa robota [kg]. Moment bezwladnosci – moment bezwładności robota [kg⋅m2]. Wspolcz. sprezyst. scian robota – współczynnik sprężystości wykorzystywany przy wyznaczaniu sił działających między robotem a punktem materialnym znajdującym się w obszarze oddziaływania robota [N/m]. Wspolcz. oporu ruchu liniowego – współczynnik oporu postępowego odpowiedzialny za zmniejszanie się prędkości robota, jest również wykorzystywany do przeliczenia sygnału sterującego podanego w postaci wymaganej prędkości liniowej, na siłę napędową pochodzącą od kół robota [N⋅s/m]. Wspolcz. oporu ruchu obrotow. – współczynnik oporu ruchu obrotowego odpowiedzialny za zmniejszanie się prędkości obrotowej robota (tarcie wiskotyczne), jest również wykorzystywany do przeliczenia sygnału sterującego podanego w postaci wymaganej prędkości obrotowej, na moment obrotowy pochodzący od różnicy prędkości obrotowej obu kół robota [N⋅m⋅s/rad]. Wspolczynnik tarcia przy odbiciu – współczynnik tarcia związany z siłą nacisku jaki wywiera punkt materialny na ścianę robota. Strata energii przy odbiciu – współczynnik straty energii przy odbiciu, 0 – oznacza odbicie idealnie sprężyste, 1 – uderzenie w którym jest tracone 100% energii kinetycznej związanej z prędkością prostopadłą do ściany robota. Maksymalna predkosc liniowa – maksymalna prędkość robota [m/s]. Sygnał sterujący prędkością postępową robota podany jest w procentach względem maksymalnej prędkości liniowej robota. Maksymalna predkosc obrotowa – maksymalna prędkość obrotowa [rad/s]. Sygnał sterujący prędkością obrotową robota podany jest w procentach względem maksymalnej prędkości obrotowej robota. Wciecie na prowadz. pilki [cm] – wcięcie z przodu i z tyłu robota (rys. 4) mające pomóc w prowadzeniu piłki przez robota. Wcięcie równe zero oznacza brak wcięcia na prowadzenie piłki. W takim przypadku robot jest idealnym sześcianem o boku 7,5cm. Maksymalna głębokość wcięcia wynosi 2,135cm i jest równa promieniowi piłki. Poz.X, Poz.Y i Kat – początkowe położenie środka robota w osi x i y [m] oraz jego orientacja kątowa [rad]. Pr.Vx, Pr.Vy i Pr.kat. – początkowa prędkość robota w osi x i y [m/s] oraz jego prędkość obrotowa [rad/s]. masa obiektu moment bezwładności obiektu współczynnik sprężystości ścian obiektu współczynnik oporu ruchu liniowego (tarcie wiskotyczne – proporcjonalne do prędkości) współczynnik oporu ruchu obrotowego (tarcie wiskotyczne – proporcjonalne do prędkości) współczynnik tarcia przy odbiciu się innych obiektów od ścian definiowanego obiektu strata energii kinetycznej podczas odbicia się od ściany definiowanego obiektu maksymalna prędkość liniowa i obrotowa robota głębokość wcięcia na prowadzenie piłki początkowy stan obiektu (położenie, orientacja kątowa, prędkość) Rys. 15. Zakładka edycji parametrów podstawowych robota, skrzyni, ściany i słupa Parametry modelu kanału pomiarowego położenia robota (rys.17): Odchyl. standard. polozenia robota, Odch.stand. wskazan orient. kat. – odchylenie standardowe sygnału zakłócającego dodanego do położenia robota oraz orientacji kątowej robota [1] (parametry wp i wk). Stale przesuniecie: promien, Stale przesuniecie: kat – stały błąd pomiaru położenia robota związany z niedokładnym zdefiniowaniem maski robota w programie realizującym przetwarzanie obrazu (parametry ∆R i ∆θ). Staly blad orientacji katowej rob. – stały błąd pomiaru orientacji kątowej robota związany z niedokładnym zdefiniowaniem maski robota w programie realizującym przetwarzanie obrazu (parametr αc). Ampl. stalego bledu orient. Kat., Przes. kat. stalego bledu orient. – stały błąd pomiaru orientacji kątowej robota związany z jego aktualną orientacją kątową. Składnik ten został wprowadzony w związku z danymi pomiarowymi uzyskanymi podczas pomiarów dokładności wyznaczania orientacji kątowej robota (parametry αA, αθ). 16 włączenie rozszerzonego modelu robota maksymalna prędkość kół robota rozstaw kół robota promień kół robota współczynnik tarcia wiskotycznego (proporcjonalnego do prędkości) współczynnik tarcia dynamicznego współczynnik tarcia statycznego transmitancja prędkości kół robota transmitancja prędkości kół robota transmitancja prędkości kół robota opóźnienie transportowe występujące w modelu robota Rys. 16. Zakładka edycji parametrów rozszerzonego modelu robota odchylenie standardowe sygnału szumu nałożonego na sygnał położenia robota odchylenie standardowe sygnału szumu nałożonego na sygnał orientacji kątowej robota składnik stałego błędu położenia robota: promień (współrzędne biegunowe) składnik stałego błędu położenia robota: kąt (współrzędne biegunowe) składnik błędu orientacji kątowej robota: wartość stała składnik błędu orientacji kątowej robota: amplituda sinusoidy składnik błędu orientacji kątowej robota: przesunięcie fazowe sinusoidy Rys. 17. Zakładka edycji parametrów modelu kanału pomiarowego położenia robota 7.4. Okno „Ustawienie obiektow na boisku” Okno „Ustawienie obiektow na boisku” (rys.18) służy do edycji położenia początkowego obiektów na boisku. W oknie tym możemy rozmieścić na boisku roboty, skrzynie, ściany i słupy. Określić ich orientację kątową (roboty, skrzynie, ściany) oraz ustalić ich rozmiary (skrzynie, ściany, słupy). Okno edycji położenia obiektów składa się z dwóch części, z okna podglądu oraz z panelu sterującego umieszczonego po lewej stronie. W oknie podglądu narysowane są ściany boiska, roboty, skrzynie i słupy. Wszystkie ściany oznaczone są kolorem czarnym, skrzynie kolorem brązowym, słupy kolorem ciemno niebieskim, piłka kolorem pomarańczowym a roboty kolorem ciemno żółtym oraz niebieskim. Kolor ciemnożółty zarezerwowany jest dla robotów należących do drużyny pierwszej, kolor niebieski dla robotów należących do drużyny drugiej. Niezależnie od rodzaju, aktualnie wybrany obiekt rysowany jest kolorem czerwonym. Kliknięcie lewym przyciskiem myszki wewnątrz okna podglądu spowoduje wybranie obiektu do edycji. Wybierany jest obiekt, którego środek leży najbliżej wybranego punktu. Kliknięcie prawym przyciskiem myszki spowoduje przesunięcie edytowanego obiektu do wybranego punktu. W obu przypadkach, aktualizowane są odpowiednie pola edycyjne znajdujące się z lewej strony okna. W panelu sterującym znajdują się przyciski służące do poruszania się po oknie podglądu, zwiększenie lub zmniejszenie obrazu, wybór rodzaju edytowanego obiektu, pola edycyjne, przyciski zmiany rozmiaru i orientacji kątowej obiektu. Umieszczone tam pola edycyjne odpowiadają aktualnie wybranemu obiektowi. l.robotow – pole edycyjne określające liczbę obiektów danego rodzaju na boisku. Jeżeli wybrany jest inny rodzaj obiektów, nazwa pola edycyjnego ulega zmianie (np. l.skrzyn). Robot 1 – napis określający rodzaj oraz numer aktualnie edytowanego obiektu. Rodzaj edytowanego obiektu możemy zmienić w polu wyboru rodzaju obiektu, numer edytowanego obiektu możemy zmienić za pomocą przycisków „Poprz.” i „Nast.”. Wyboru obiektu do edycji możemy również dokonać klikając myszką w oknie podglądu (lewy przycisk myszki). 17 Zm. – przycisk powodujący aktualizację zmian wprowadzonych w polach edycyjnych położenia i rozmiaru obiektu Poz.x, Poz.y – położenie środka obiektu, współrzędne podane są w metrach, (rozdz.3) Kat[st] – orientacja kątowa obiektu [°] Szer., Dlug. – szerokość i długość obiektu [m], dla słupa podajemy promień słupa [m] zwiększanie/zmniejszanie powiększenia poruszanie podglądu po boisku dodatkowe ściany boiska powrót do widoku całego boiska wybór rodzaju edytowanego obiektu liczba obiektów danego typu piłka wprowadzenie zmian nazwa obiektu słupy położenie i orientacja kątowa obiektu szerokość obiektu (promień – dla słupa) skrzynie długość obiektu wybór poprzedniego i następnego obiektu pole zmiany położenia i rozmiaru obiektu ściany boiska zamknięcie okna bez wprowadzania zmian roboty wprowadzenie zmian i zamknięcie okna (testowane jest nachodzenie obiektów na siebie) Rys. 18. Widok okna edycji położenia i rozmiaru obiektów. piłka przesunięcie obiektu zwiększenie/zmniejszenie orientacji kątowej obiektu słupy skrzynie wyzerowanie orientacji kątowej obiektu roboty zwiększenie/zmniejszenie szerokości obiektu zwiększenie/zmniejszenie długości obiektu dodatkowe ściany boiska ściana boiska Rys. 19. Znaczenie przycisków zmiany położenia i rozmiaru obiektów oraz widok sceny pochodzącej z modułu wizualizacji gry odpowiadający ustawieniu obiektów przedstawionemu na rys. 18. 18 W celu ułatwienia obsługi edytora położenia obiektów zdefiniowane zostały następujące skróty klawiszowe: Przycisk ‘L’ – przesunięcie podglądu w lewo, klawisz skrótu [ A ] Przycisk ‘P’ – przesunięcie podglądu w prawo, klawisz skrótu [ D ] Przycisk ‘G’ – przesunięcie podglądu w górę, klawisz skrótu [ W ] Przycisk ‘D’ – przesunięcie podglądu w dół, klawisz skrótu [ Z ] Przycisk ‘Z’ – powrót ustawień podglądu do wartości początkowej (widok całego boiska), klawisz skrótu [ S ] Przycisk ‘+’ – zwiększenie powiększenia podglądu, klawisz skrótu [ + ] Przycisk ‘–‘ – zmniejszenie powiększenia podglądu, klawisz skrótu [ – ] Przycisk Poprz. – przełączenie się na niższy numer edytowanego obiektu, klawisz skrótu [ < ] Przycisk Nast. – przełączenie się na wyższy numer edytowanego obiektu, klawisz skrótu [ > ] Przycisk Zmień – zapamiętanie wprowadzonych zmian i zamknięcie okna Przycisk Zamknij – zamknięcie okna bez wprowadzania zmian Klawisz [ T ] – przesunięcie wybranego obiektu w górę Klawisz [ F ] – przesunięcie wybranego obiektu w lewo Klawisz [ G ] – przesunięcie wybranego obiektu w prawo Klawisz [ V ] – przesunięcie wybranego obiektu w dół Klawisz [ U ] – zwiększenie kąta obrotu wybranego obiektu Klawisz [ H ] – wyzerowanie kąta obrotu wybranego obiektu Klawisz [ B ] – zmniejszenie kąta obrotu wybranego obiektu Klawisz [ K ] – zmniejszenie szerokości wybranego obiektu Klawisz [ O ] – zwiększenie szerokości wybranego obiektu Klawisz [ L ] – zmniejszenie długości wybranego obiektu Klawisz [ P ] – zwiększenie szerokości wybranego obiektu 7.5. Okno „Ustawienia zapisu wynikow symulacji” Rysunek 20 przedstawia widok okna ustawień dotyczących rejestracji wyników symulacji. Okno składa się z dwóch części. Po lewej stronie okna możemy ustalić maksymalną liczbę rejestrowanych rekordów oraz czas włączenia rejestracji. Z prawej strony możemy wybrać zmienne, które będą rejestrowane. Zarejestrowane dane można zapisać w postaci tekstowej w celu późniejszej analizy danych w MatLabie lub w Excelu. Dane również mogą być zapisane w postaci binarnej w celu ich późniejszego odczytu i podglądu zarejestrowanych trajektorii. Zarejestrowane trajektorie można obejrzeć w oknie „Podgląd zarejestrowanych wynikow symulacji” (rys. 27). Czas poczatkowy [s] – gdy nie jest włączone ręczne wyzwalanie rejestracji, czas ten określa moment włączenia rejestracji zmiennych symulacji. Maksymalna liczba rekordów – zmienna ta określa maksymalną liczbę rekordów danych, jaka może być zapamiętana. Wielkość tej zmiennej wiąże się z ilością wolnej pamięci potrzebnej na zapamiętanie odpowiedniej liczby rekordów. Dzielnik – wartość dzielnika określa ile razy będą zarejestrowane dane w jednym okresie pracy sterownika. Jeżeli wartość dzielnika wynosi 1, dane są rejestrowane w momencie wysyłania danych do programów sterujących. Jeżeli wartość dzielnika wynosi n, okres rejestracji danych jest n razy krótszy niż okres pracy sterownika. Rejestracja danych jest wtedy synchronizowana do okresu pracy sterownika tak, aby zagwarantować rejestracje danych w momencie wysyłania danych do programów sterujących. Dzięki temu możemy zarejestrować i podejrzeć co działo się z robotem pomiędzy kolejnymi momentami pracy sterownika. Maksymalna wartość dzielnika wynosi 10. Liczba rejestrowanych skrzyn – dla ilu trajektorii skrzyń będzie rezerwowana pamięć. Jeżeli wartość tego pola jest mniejsza od liczby skrzyń umieszczonych na boisku, część trajektorii skrzyń nie będzie rejestrowana. Czas zapisu – na podstawie maksymalnej liczby rekordów, wartości dzielnika oraz długości okresu pracy sterownika wyznaczany jest całkowity czas rejestracji zmiennych symulacji. Czas koncowy – na podstawie wartości czasu początkowego i czasu zapisu wyznaczany jest czas zakończenia rejestracji danych. Podana wartość ma sens jedynie w przypadku wyłączenia ręcznego wyzwalania rejestracji. Liczba zarejestr. rekordow – liczba aktualnie zarejestrowanych rekordów. Rozmiar jednego rekordu – rozmiar jednego rekordu wyznaczony na podstawie wybranych do rejestracji zmiennych symulacji. Potrzebna pamiec – ilość pamięci potrzebnej do zapamiętania maksymalnej liczby rekordów. Ilosc wolnej pamieci, Wielkosc pamieci – ilość wolnej pamięci oraz rozmiar całkowitej pamięci RAM. Reczne wlaczenie rejestracji – ręczne włączenie rejestracji (rys. 9). Nadpisywanie – włączenie nadpisywania rekordów w momencie wypełnienia całej pamięci przeznaczonej na rejestracje zmiennych symulacji. 19 Rejestracja dodatk. obiektow boiska – rejestracja początkowego ustawienia dodatkowych obiektów boiska (skrzynie, ściany i słupy). Rejestracja polozenia pilki – rejestracja położenia piłki (rzeczywiste położenie piłki). Rejestracja polozenia pilki – pomiar – rejestracja położenia piłki (położenie piłki przesyłane do programów sterujących – po dodaniu sygnału zakłócającego). Rejestracja polozenia robota, Rejestracja polozenia robota-pomiar, Rejestracja predkosci robota – znaczenie tych pól jest takie same jak w przypadku piłki Rejestracja sil dzialajacych na robota – rejestracja wypadkowej siły i wypadkowego momentu siły działającego na robota. Rejestracja zadanych predkosci – rejestracja wartości sygnału sterującego wysyłanego do robota. Przycisk Poprz. – przełączenie się na edycję parametrów dotyczących robota o niższym numerze Przycisk Nast. – przełączenie się na edycję parametrów dotyczących robota o wyższym numerze Przycisk Powiel – skopiowanie ustawień dotyczących aktualnie wybranego robota na pozostałe roboty Przycisk Zwolnij pamiec – zwolnienie pamięci zajmowanej przez dotychczas zarejestrowane dane Przycisk Zmien – zatwierdzenie wprowadzonych zmian, zwolnienie pamięci zajmowanej przez dotychczas zarejestrowane dane i zarezerwowanie pamięci pod nowe dane Przycisk Zamknij – zamknięcie okna bez wprowadzania zmian. maksymalna liczba rekordów (wiąże się z wielkością zarezerwowanej pamięci) czas włączenia rejestracji (automatyczne włączenie rejestracji) zwiększenie gęstości rejestracji stanu symulacji włączenie ręcznego wyzwalania rejestracji włączenie nadpisywania rekordów w momencie przekroczenia maksymalnej liczby rekordów włączenie rejestracji dodatkowych obiektów (ściany, skrzynie, słupy) maksymalna długość zapisu dla wybranej maksymalnej liczby rekordów włączenie/wyłączenie rejestracji położenia i prędkości piłki czas zakończenia rejestracji (automatyczne włączenie rejestracji) wybór numeru robota liczba zarejestrowanych rekordów powielenie ustawień dla wybranego robota na wszystkie roboty rozmiar jednego rekordu danych włączenie/wyłączenie rejestracji położenia i prędkości robota ilość pamięci potrzebnej do zapamiętania ustawionej liczby rekordów włączenie/wyłączenie rejestracji siły wypadkowej działającej na robota ilość wolnej pamięci zwolnienie pamięci (skasowanie danych) zamknięcie okna z wprowadzeniem zmian zamknięcie okna bez wprowadzenia zmian wielkość pamięci RAM komputera włączenie/wyłączenie rejestracji sygnału zadającego numer wybranego robota Rys. 20. Okno edycji ustawień rejestracji wyników symulacji. 7.6. Okno „Parametry gry” Okno to służy do edycji wartości podstawowych parametrów służących do sterowania przebiegiem gry (rys.21). Max. Liczba goli – parametr określający warunek zakończenia meczu. Jeżeli jest równy zero, liczba strzelonych goli nie ma wpływu na moment zakończenia gry. Jeżeli jest większy od zera, określa po ilu strzelonych golach, przez jedną z drużyn, kończy się mecz. Automat. Poz. robotow – ustawienie tej opcji powoduje, że po strzeleniu gola (po zakończeniu trwania stanu 210), wszystkie roboty są automatycznie przenoszone na swoje pozycje startowe i mecz jest wznawiany. Jeżeli opcja ta jest wyłączona, po strzeleniu gola symulator jest przełączany w stan o numerze 100. W stanie tym wszystkie roboty muszą samodzielnie wrócić na swoje pozycje startowe (położenie oraz orientacja kątowa robota). Położenie robotów jest monitorowane przez serwer i w momencie gdy dotrą na swoje pozycje startowe (ustawiany jest stan 190), piłka jest przenoszona na pozycję startową i gra zostaje wznowiona. Czas GRY [s] – parametr określający warunek zakończenia meczu. Jeśli jest równy zero, czas gry nie ma wpływu na zakończenie gry. Jeśli jest większy od zera, określa czas trwania meczu. Czas stanu 190 – parametr określa czas trwania stanu o numerze 190. Parametr jest wyrażony w sekundach. Czas stanu 210 – parametr określa czas trwania stanu o numerze 210. Parametr jest wyrażony w sekundach. Przycisk Zmień – Zatwierdzenie wprowadzonych zmian i zamknięcie okna. Przycisk Zamknij – zamknięcie okna bez wprowadzania zmian. 20 do ilu goli jest prowadzony mecz (0 oznacza brak ograniczeń na liczbę strzelonych goli) włączenie automatycznego powrotu robotów na pozycje startowe po strzeleniu gola czas trwania gry (0s oznacza grę bez nałożonego ograniczenia na czas trwania meczu) czas trwania stanu 190 (przed rozpoczęciem gry - roboty znajdują się w pozycjach startowych) czy trwania stanu 210 (po strzeleniu gola) zamknięcie okna bez wprowadzania zmian Rys. 21. Okno edycji parametrów sterujących przebiegiem gry. 7.7. Okno podglądu symulacji – wizualizacja gry W celu umożliwienia obejrzenia symulowanej gry robotów, został stworzony moduł wizualizacji symulacji przedstawiony na rysunku 22. Sytuacja na boisku jest przedstawiana jako trójwymiarowy obraz boiska widziany z punktu widzenia kamery umieszczonej nad boiskiem. Położenie i kąt widzenia kamery może być płynnie zmieniany. Możliwe jest zapamiętanie dziewięciu ustawień kamery dla obrazu trójwymiarowego i jednego ustawienia dla obrazu dwuwymiarowego. Gdy tryb pracy serwera symulacji (rys.10) ustawiony jest na wizualizacja, moduł wizualizacji przedstawia w postaci graficznej dane otrzymywane z serwera symulacji uruchomionego w innym programie i przekazane do wizualizacji za pomocą protokołu UDP. W takiej konfiguracji moduł wizualizacji może również podejrzeć dane normalnie przeznaczone dla któregoś gracza. Okno modułu wizualizacji symulacji składa się z dwóch części, z okna w którym rysowany jest trójwymiarowy obraz boiska i robotów oraz z zakładek w których umieszczone są przyciski sterujące pracą modułu wizualizacji (Rys. 23, 24, 25 i 26). zakładki ustawień wizualizacji liczba generowanych klatek w ciągu jednej sekundy stan gry czas jaki minął od rozpoczęcia gry roboty piłka słupy sygnalizujące strzelone gole liczba danych otrzymywana od serwera symulacji w ciągu ostatniej sekundy wskaźnik stanu komunikacji z serwerem symulacji zamknięcie okna wizualizacji liczba goli strzelona przez pierwszą drużynę okno podglądu gry liczba goli strzelona przez drugą drużynę Rys. 22. Okno wizualizacji symulacji (podgląd gry). Pierwsza zakładka „Odebrane dane” służy do podglądu wartości poszczególnych danych otrzymywanych od serwera symulacji (rys.23). Możemy odczytać czas symulacji, stan gry, liczbę strzelonych goli, położenie piłki oraz położenie i orientację kątową poszczególnych robotów. Kolorowe prostokąty umieszczone z lewej strony opisów robotów „Ri” (i – numer robota) wskazują nam do jakiej drużyny należy dany robot. 21 czas wirtualny symulacji liczba goli strzelonych przez drużynę pierwszą liczba goli strzelonych przez drużynę drugą stan gry położenie i orientacja kątowa robotów: wskaźnik obecności i przydziału robota położenie robota w osi x położenie robota w osi y orientacja kątowa robota położenie piłki w osi x i y Rys. 23. Widok zakładki podglądu stanu gry (położenie robotów i piłki). Zakładka Widok (rys.24) służy do ustawienia parametrów położenia kamery. Aktualne ustawienia kamery można zapisać do pliku lub w razie potrzeby odczytać z pliku wcześniej zapisane nastawy. Przycisk Powieksz służy do zwiększenia okna podglądu wizualizacji na cały ekran. Powrót z trybu pełnoekranowego odbywa się przez naciśnięcie klawisza [ Esc ]. paski ustawień położenia i kąta widzenia kamery wybór zdefiniowanego ustawienia kamery odczyt z pliku zapamiętanych ustawień kamery powiększenie okna podglądu gry na cały ekran wskaźnik wyboru ustawień kamery zapis do pliku aktualnych ustawień kamery Rys. 24. Widok zakładki ustawień widoku kamery (wizualizacja gry). W trybie pełnoekranowym zdefiniowane są następujące skróty klawiszowe: Klawisze [ 0 ], [1], …, [9] – przełączenie się między różnymi zapamiętanymi ustawieniami kamery Klawisz [ spacja ] – zatrzymanie/wznowienie symulacji (opcja niedostępna w wizualizacji zdalnej) Klawisz [ N ] – przejście o jeden krok do przodu (okres pracy sterownika) w trybie zatrzymania symulacji (opcja niedostępna w wizualizacji zdalnej) Klawisz [ H ] – powrót robotów na pozycje startowe, powrót robotów na pozycje startowe nie powoduje zmiany wyniku meczu (liczby strzelonych goli) ani wyzerowania czasu gry. Opcja ta jest użyteczna, gdy konieczna jest zmiana położenia robotów i piłki bez przerywania meczu. (opcja niedostępna w wizualizacji zdalnej) Klawisz [ L ] – włączenie/wyłączenie oświetlenia Klawisz [ T ] – włączenie/wyłączenie nakładania tekstur na obiekty Klawisz [ D ] – włączenie/wyłączenie dokładnego nakładania tekstur (LINEAR/NEAREST) Klawisz [ C ] – włączenie/wyłączenie generowania cieni obiektów Klawisz [ V ] – przełączanie dokładności generowania cieni obiektów Klawisz [ S ] – włączenie/wyłączenie rysowania obiektów w postaci siatki Klawisz [ R ] – włączenie/wyłączenie rozmywania obrazu piłki. Opcja ta ma znaczenie przy ustawieniu długiego okresu pracy sterownika. W takim przypadku obraz może być odświeżany tylko kilka (kilkanaście) razy na sekundę i poruszająca się szybko (obracająca się) piłka może nie wyglądać naturalnie jeśli jej obraz nie będzie odpowiednio rozmyty. Klawisz [ A ] – włączenie/wyłączenie antyaliasingu (opcja niedostepna) Klawisz [ M ] – włączenie/wyłączenie efektu mgły Klawisz [ O ] – włączenie/wyłączenie wyświetlania stanu i czasu gry Klawisz [ P ] – włączenie/wyłączenie wyświetlania liczby strzelonych goli Klawisz [Esc] – wyjście z trybu pełnoekranowego 22 Zakładka Zapisz (rys.25) służy do sterowania przebiegiem rejestracji danych otrzymywanych od serwera symulacji oraz odtwarzania zarejestrowanej gry. liczba zapamiętanych rekordów przechowujących stan robotów na boisku maksymalny rozmiar bloku danych przeznaczony na zapamiętanie gry orientacyjny czas rejestracji gry przy ustalonym rozmiarze bloku danych nowy maksymalny rozmiar bloku danych na zapamiętanie gry odczyt zarejestrowanych danych z pliku binarnego zapisanie zarejestrowanych danych do pliku binarnego zapisanie zarejestrowanych danych do pliku tekstowego zatwierdzenie nowego rozmiaru bloku danych zerowanie pamięci, skasowanie zarejestrowanych rekordów włączenie/wyłączenie rejestracji gry włączenie/wyłączenie odtwarzania zarejestrowanej gry wskaźnik postępu odczytu/zapisu do pliku wskaźnik włączenia rejestracji/odtwarzania gry wskaźnik rejestracji/odtwarzania przyciski sterujące odtwarzaniem gry wskaźnik czasu rejestrowanej/odtwarzanej gry Rys. 25. Widok zakładki rejestracji i odtwarzania gry. Zakładka Ustaw służy do ustawienia sposobu renderowania sceny. Pola w górnej części zakładki służą do włączania lub wyłączania odpowiednich efektów w generowanym obrazie. Pasek ustalenia liczby źródeł świateł umożliwia ustawienie od jednego od 4 źródeł światła, obracających się zgodnie lub przeciwnie do wskazówek zegara, zgodnie z prędkością ustawioną w pasku ustawienia prędkości źródła światła. Ustawienie suwaka na środku paska prędkości powoduje zatrzymanie obrotu źródeł światła. Ustawienie dokładności rysowania cieni obejmuje następujące przypadki: ‘1’ – rysowanie uproszczonego cienia obiektów (roboty, piłka, skrzynie, ściany i słupy) (spłaszczenie obiektu do poziomu powierzchni boiska, nie jest rysowany cień anteny robota), nie jest rysowany cień pochodzący od ścian boiska i słupów ‘2’ – rysowanie uproszczonego cienia obiektów oraz uproszczonych cieni ścian boiska i słupów ‘3’ – rysowanie dokładnego cienia obiektów (cień rzucany jest również na inne obiekty, nie tylko na powierzchnię boiska) oraz uproszczonego cienia ścian boiska i słupów ‘4’ – rysowanie dokładnego cienia obiektów, ścian boiska i słupów ‘5’ – rysowanie bardzo dokładnego cienia robotów (odwzorowany jest dokładny kształt robota) i dokładnego cienia pozostałych obiektów Suwak „Liczba poziomów jasności cienia” określa jak dokładnie odwzorowywany jest stopień zmienności intensywności cienia dla dokładnego trybu rysowania cienia. Duża liczba poziomów jasności cienia powoduje znaczące spowolnienie rysowania sceny, mała liczba poziomów jasności cienia powoduje że cienie skokowo zmieniają swoją intensywność wraz z oddalaniem się obiektu od źródła światła. Ze względu na różnice w sposobie generowania cienia uproszczonego i dokładnego, cień uproszczony płynnie zmienia swą intensywność wraz z oddalaniem się od źródła światła. włączenie rysowania tekstur obiektów rozmycie tekstury rzutowanej na obiekty włączenie rysowania siatki włączenie wyświetlania liczby strzelonych goli włączenie efektu mgły włączenie rozmycia obrazu piłki włączenie wyświetlania stanu gry ustalenie liczby źródeł światła włączenie oświetlenia sceny powrót źródeł światła do położenia domyślnego ustawienie prędkości obrotu źródeł światła włączenie rysowania cieni obiektów ustawienie dokładności rysowania cieni ustawienie liczby poziomów jasności cienia (opcja aktywna dla dokładnego Cieniowania obiektów) Rys. 26. Widok zakładki ustawień renderowania sceny. 23 7.8. Podgląd zarejestrowanych wyników symulacji Do podglądu zarejestrowanych trajektorii robotów i piłki służy okno „Podglad zarejestrowanych wynikow symulacji” (rys.27). Przedstawione trajektorie pochodzą z zarejestrowanych zmiennych symulacji. Możliwe jest wyświetlenie oryginalnych trajektorii robotów jak i trajektorii obarczonych błędem pomiarowym z dołączonym sygnałem szumu (dane wysyłane do programów sterujących). Okno podglądu trajektorii składa się z dwóch części, z okna podglądu z rysunkami trajektorii oraz z panelu sterującego. W oknie podglądu narysowane są ściany boiska, trajektorie robotów oraz trajektoria piłki. W panelu sterującym znajdują się przyciski służące do poruszania się po oknie podglądu, zwiększenie lub zmniejszenie obrazu, otwarcie okna opcji widoku. Poniżej znajduje się pole wyboru koloru trajektorii poszczególnych robotów, odczytu położenia zaznaczonego obiektu, przesuwania się w wzdłuż osi czasu. Znaczenie poszczególnych przycisków oraz odpowiadające im klawisze skrótu: Przycisk ‘L’ – przesunięcie podglądu w lewo, klawisz skrótu [ a ]. Przycisk ‘P’ – przesunięcie podglądu w prawo, klawisz skrótu [ d ]. Przycisk ‘G’ – przesunięcie podglądu w górę, klawisz skrótu [ w ]. Przycisk ‘D’ – przesunięcie podglądu w dół, klawisz skrótu [ z ]. Przycisk ‘Z’ – powrót ustawień podglądu do wartości początkowej (widok całego boiska). Przycisk ‘+’ – zwiększenie powiększenia podglądu, klawisz skrótu [ + ]. Przycisk ‘–‘ – zmniejszenie powiększenia podglądu, klawisz skrótu [ – ]. Przycisk ‘+’ w polu Czas – przesunięcie się w czasie do przodu, klawisze skrótu [ > ] i [ Shift ] + [ > ]. Przycisk ‘–‘ w polu Czas – przesunięcie się w czasie do tyłu, klawisze skrótu [ < ] i [ Shift ] + [ < ]. Przycisk Widok – włączenie okna opcji widoku. Przycisk Zamknij – zamknięcie okna „Podgladu zarejestrowanych wynikow symulacji”. zwiększanie/zmniejszanie powiększenia poruszanie podglądu po boisku powrót do widoku całego boiska linie łączące punkty trajektorii zarejestrowane punkty trajektorii markery czasu definicja kolorów reprezentujących roboty i piłkę wybrany obiekt obraz piłki i robota położenie x i y wybranego obiektu przyciski zmiany czasu wybrany punkt czasu okno podglądu zarejestrowanej gry zamknięcie okna podglądu zarejestrowanej gry Rys. 27. Widok okna podglądu zarejestrowanych trajektorii. Klikając myszką na kolorowym kwadracie z lewej strony napisu reprezentującego piłkę lub robota włączamy okno edycji koloru trajektorii danego obiektu. Klikając na napis reprezentujący robota powodujemy wybranie aktualnego obiektu i wyświetlenie jego położenia w aktualnie wybranym punkcie czasu. W momencie kliknięcia myszką w dowolnym punkcie okna podglądu, program znajduje najbliższy zaznaczonemu miejscu, zarejestrowany punkt trajektorii i przypisuje aktualny czas odpowiadający znalezionemu punktowi trajektorii. Zmianie ulega również aktualnie wybrany obiekt oraz wskazywane położenie x i y. 24 Okno „Opcje widoku” służy do włączenia i wyłączenia pewnych elementów trajektorii. Zmniejszenie długości rysowanej trajektorii znacząco zwiększa czytelność podglądu trajektorii oraz skraca czas rysowania, dzięki czemu przewijanie podglądu jest bardziej płynne. Okno „Opcje widoku” wraz z opisem znaczenia poszczególnych parametrów przedstawione jest na rysunku 28. włączenie wyświetlania linii łączących punkty zarejestrowanej trajektorii włączenie wyświetlania punktów trajektorii włączenie wyświetlania markera czasu włączenie wyświetlania obrazu robotów i piłki włączenie wyświetlania markera czasu (pomiar) włączenie wyświetlania punktów trajektorii (pomiar) włączenie wyświetlania obrazów rob. i piłki (pomiar) czy rysować całą zarejestrowaną trajektorię czy rysować tylko te punkty które znajdują się na osi czasu przed markerem czasu czy rysować tylko te punkty które znajdują się na osi czasu za markerem czasu rysowanie określonej liczby punków trajektorii znajdujących się przez i za markerem czasu ustalenie liczby punktów trajektorii znajdujących się przed i za markerem czasu zamknięcie okna z wprowadzeniem zmian zamknięcie okna bez wprowadzenia zmian Rys. 28. Widok okna ustawień rysowania zarejestrowanych trajektorii. 25 Dodatek A Plik nagłówkowy biblioteki DLL dla gracza 1 Plik nagłówkowy biblioteki DLL dla gracza drugiego jest identyczny z plikiem nagłówkowym biblioteki DLL gracza pierwszego z tą różnicą, że dla gracza drugiego nazwy wszystkich funkcji i zmiennych oznaczone są cyfrą ‘2’ zamiast ‘1’. Opis struktury danych wskazywanych przez wskaźniki ‘Dane1_dll’ oraz ‘Rozkazy1_dll’ jest taki sam jak dla komunikacji z serwerem symulacji przez protokół UDP i opisany jest w dodatku B (plik ‘Dane_opis.h’). const ile_rr = 12; //------------------------------------------------------------// Gracz 1 // maksymalna liczba robotów int __export Dane1_dll; int __export Rozkazy1_dll; bool bool bool bool bool __export dane1_dll_zapis; __export dane1_dll_odczyt; __export rozkazy1_dll_zapis; __export rozkazy1_dll_odczyt; __export nowe_dane1_dll; bool __export nowe_rozkazy1_dll; bool char __export wiadomosc1_dll_wysw; __export wiadomosc1_dll[256]; int __export wiadomosc1_dll_dlugosc; // adres do bloku danych przechowujących informacje o stanie gry oraz położenia obiektów na boisku // rozkazy wysyłane do serwera symulacji maksymalny rozmiar bloku: 512 bajtów // Dane1_dll w trakcie zapisu // Dane1_dll w trakcie odczytu, // Rozkazy1_dll w trakcie zapisu, // Rrozkazy1_dll w trakcie odczytu, // czy dane opisujące sytuacje na boisku były aktualizowane // czy dane opisujące rozkazy do robotów były aktualizowane // czy wyświetlić wiadomość // wiadomość która ma być wyświetlona w oknie symulacji // liczba znaków w wiadomości extern "C" void __declspec(dllexport) Inicjuj_ster1_dll(); extern "C" void __declspec(dllexport) Start_ster1_dll(); extern "C" void __declspec(dllexport) Stop_ster1_dll(); extern "C" void __declspec(dllexport) Krok_ster1_dll(); // funkcja inicjująca sterownik // funkcja startu sterownika // funkcja zatrzymująca sterownik // funkcja wywoływana każdorazowo po aktualizacji danych opisujących sytuację na boisku 26 Dodatek B Opis komunikacji między programem sterującym a serwerem symulacji Komunikacja z symulatorem odbywa się poprzez protokół UDP, symulatorowi oraz programom sterującym należy przypisać odpowiednie adresy IP oraz numer bramki. W kompilatorze Builder, do realizacji komunikacji poprzez protokół UDP, można wykorzystać komponent NMUDP znajdujący się w pasku FastNet. Paczka danych wysyłanych z serwera symulacji rozpoczyna się nagłówkiem postaci: struct naglowek_struct { int ident; // identyfikator wiadomości { = 12345 } int rozm_naglowka; // rozmiar bloku danych nagłówka int liczba_bl_danych; // liczba bloków danych !!! (rozm_naglowka = sizeof(nagowek_struct) + // liczba_bl_danych*sizeof(naglowek_bloku_danych_struct)) // Bezpośrednio za nagłówkiem znajduje się lista nagłówków bloków danych. // Liczba nagłówków określona przez wartość pola 'liczba_bl_danych'. // Każdy nagłówek bloku danych ma strukturę: 'naglowek_bloku_danych_struct'. }; struct naglowek_bloku_danych_struct { int opis; // identyfikator bloku danych // 1 - podstawowy blok danych: 'opis_sytuacji_struct' // 2 - rozszerzony blok danych (wizualizacja): 'opis_sytuacji_struct2' // 3 - informacja o stanie gry, położenie piłki i robotów oraz // opis i położenie dodatkowych obiektów boiska // (ściany, skrzynie, słupy): 'opis_rozszerzony_sytuacji_struct' // 4 - informacja o stanie gry, płożenie piłki i robotów oraz // opis i położenie dodatkowych obiektów boiska (wizualizacja) // (ściany, skrzynie, słupy): 'opis_rozszerzony_sytuacji_struct' // 5 - wysłanie pozycji startowych robotów // Jeśli stan gry jest równy 100 (po strzeleniu gola), gra zostanie wznowiona // gdy wszystkie roboty zostaną doprowadzone do swoich pozycji startowych // 10 - blok danych zawiera ciąg znaków ASCII otrzymanych przez serwer symulacji // od programów sterujących (przesyłany do modułu wizualizacji) // 11 - blok danych będący potwierdzeniem otrzymania bloku nr 10 // 100 - blok danych zawiera ciąg bajtów interpretowany jako // łańcuch znaków ASCII do wyświetlenia // 101 - blok danych przechowuje rozkazy do robotów // 102 - blok danych jest zapytaniem o pozycje startowe robotów (następny blok // danych wysyłany z serwera będzie zawierał pozycje startowe robotów) // 110 - blok danych zawiera ciąg znaków ASCII będących nazwą gracza // (wysyłany od programu sterującego do serwera symulacji) // 111 - blok danych będący potwierdzeniem otrzymania bloku nr 110 lub będący // zapytaniem o nazwę drużyny (wysyłany do programów sterujących) // 200 - logowanie się programu wizualizacji do serwera gry // 201 - odpowiedź na próbę zalogowania się modułu wizualizacji int adres; // adres bloku danych (w odebranej paczce danych) int rozm; // rozmiar bloku danych }; Po nagłówku paczki danych zawierającym opis bloków danych zawartych w paczce, umieszczone są bloki danych pod adresami (względem początku paczki danych) podanymi w nagłówkach bloków danych. W zależności od wartości pola ‘opis’ nagłówka bloku danych, blok danych może przyjmować postać: 27 Blok danych o numerze 1 ( 'opis' = 1 ) Blok danych zawiera informacje o stanie obiektów (robotów i piłki) na boisku, stanie gry, liczbie strzelonych goli oraz przydziału robotów do drużyny: struct opis_sytuacji_struct { float t; float dt; float Xp,Yp; int stan_gry; // czas wirtualny // co jaki czas wysyłany jest opis stanu robotów // położenie piłki // zmienna opisująca aktualny stan symulacji (gry) // -1 - podane położenie robotów odpowiada położeniu startowemu // 0 - zatrzymanie gry // 10 - zakończenie gry // 100 - powrót robotów do pozycji startowych // 190 - wszystkie roboty znajdują się w pozycjach startowych // 200 - gra // 210 - gra (był gol) int ile_goli1; // ile goli strzeliła 1 drużyna int ile_goli2; // ile goli strzeliła 2 drużyna int Przydzial_robotow[12]; // 0 - robota nie ma, 1 - robot należy do 1 drużyny, // 2 - robot należy do drugiej drużyny float Xr[12]; // położenie robotów w osi x float Yr[12]; // położenie robotów w osi y float Alfa[12]; // orientacja katowa robota }; Blok danych o numerze 2 ( 'opis' = 2 ) Oprócz informacji podstawowych zawartych w strukturze ‘opis_sytuacji_struct’, blok ten zawiera również aktualne sygnały sterujące wysłane do robotów. Blok danych o numerze 2 (‘opis’=2) wysyłany jest do modułu wizualizacji gry. struct opis_sytuacji_struct2 { float t; float dt; float Xp,Yp; int stan_gry; // czas wirtualny // co jaki czas wysyłany jest opis stanu robotów // położenie piłki // zmienna opisująca aktualny stan symulacji // -1 - podane położenie robotów odpowiada położeniu startowemu // 0 - zatrzymanie gry // 10 - zakończenie gry // 100 - powrót robotów do pozycji startowych // 190 - wszystkie roboty znajdują się w pozycjach startowych // 200 - gra // 210 - gra (był gol) int ile_goli1; // ile goli strzeliła 1 drużyna int ile_goli2; // ile goli strzeliła 2 drużyna int Przydzial_robotow[12]; // 0 - robota nie ma, 1 - robot należy do 1 drużyny, // 2 - robot należy do drugiej drużyny float Xr[12]; // położenie robotów w osi x float Yr[12]; // położenie robotów w osi y float Alfa[12]; // orientacja kątowa robota float Vz[12]; // zadana prędkość liniowa robotów float Wz[12]; // zadana prędkość obrotowa robotów }; 28 Blok danych o numerze 3 i 4 ( 'opis' = 3 lub 'opis' = 4 ) Blok ten nie ma sztywno ustalonej struktury jak ma to miejsce w poprzednich przypadkach. Oprócz podstawowych informacji dotyczących stanu gry, położenia piłki i robotów, blok danych zawiera informacje o położeniu i rozmiarach dodatkowych obiektów boiska {słupy, ściany, skrzynie}. Blok danych rozpoczyna się nagłówkiem postaci: struct opis_rozszerzony_sytuacji_naglowek_struct { int liczba_robotow; // liczba robotów int liczba_obiektow; // liczba dodatkowych obiektów na boisku }; Bezpośrednio za nagłówkiem znajduje się struktura przechowująca informacje o stanie gry o postaci zdefiniowanej przez ‘opis_sytuacji_uproszcz_struct’. Jest to uproszczony blok danych podstawowych bez położenia robotów oraz przydziału robotów do drużyny. struct opis_sytuacji_uproszcz_struct { float t; // czas wirtualny float dt; // co jaki czas wysyłany jest opis stanu robotów float Xp,Yp; // położenie piłki int stan_gry; // zmienna opisująca aktualny stan symulacji // -1 - podane położenie robotów odpowiada położeniu startowemu // 0 - zatrzymanie gry // 10 - zakończenie gry // 100 - powrót robotów do pozycji startowych // 190 - wszystkie roboty znajdują się w pozycjach startowych // 200 - gra // 210 - gra (był gol) int ile_goli1; // ile goli strzeliła 1 drużyna int ile_goli2; // ile goli strzeliła 2 drużyna }; Za ta strukturą znajdują się dane typu ‘robot_struct’ lub ‘robot_wiz_struct’ w zależności od wartości identyfikatora bloku. Dla identyfikatora bloku równego 3 (‘opis’ = 3), robota opisuje struktura ‘robot_struct’. Dla identyfikatora bloku równego 4 (‘opis’ = 4), robota opisuje struktura 'robot_wiz_struct'. Liczba bloków opisujących roboty jest równa wartości pola ‘liczba_robotow’ znajdującego się w nagłówku bloku danych. Struktura przechowująca informacje o położeniu robota oraz przydział robota do drużyny ma postać: struct robot_struct { int druz; float X; float Y; float Alfa; }; // 1- robot należy do drużyny pierwszej, 2- robot należy do drużyny drugiej // położenie robotów w osi x // położenie robotów w osi y // orientacja kątowa robota Struktura przechowująca rozszerzoną informację o położeniu robota, (wysyłana do modułu wizualizacji). struct robot_wiz_struct { int druz; // 1- robot należy do drużyny pierwszej, 2- robot należy do drużyny drugiej float X; // położenie robotów w osi x float Y; // położenie robotów w osi y float Alfa; // orientacja kątowa robota float Vz; // zadana prędkość liniowa robotów float Wz; // zadana prędkość obrotowa robotów }; 29 Dalej znajdują się informacje o położeniu dodatkowych obiektów boiska. Każdy obiekt jest typu ‘obiekt_boiska_struct’. Liczba obiektów jest równa wartości pola ‘liczba_obiektow’ znajdującego się w nagłówku bloku danych ‘opis_rozszerzony_sytuacji_naglowek_struct’. Struktura przechowująca informacje o dodatkowym obiekcie znajdującym się na boisku ma postać: struct obiekt_boiska_struct { int ident; // identyfikator obiektu { 0 - slup; 1 - ściana; 2 - skrzynia }; float a,b; // szerokość i długość obiektu { ściana, skrzynia } float x,y,alfa; // położenie środka obiektu oraz jego orientacja kątowa, { dla słupa Alfa = R } }; Blok danych o numerze 5 ( 'opis' = 5 ) Za pomocą tego bloku danych, do programów sterujących jest przekazywana informacja o położeniu startowym robotów. Są to położenia, które muszą osiągnąć wszystkie roboty, aby po strzeleniu gola gra została wznowiona. Blok ten rozpoczyna się liczbą typu int przechowującą liczbę robotów na boisku. int liczba_robotow; Bezpośrednio za liczbą określającą liczbę robotów, znajduje się struktura przechowująca informacje o parametrach gry, następującej postaci: struct parametry_struct { double Czas_gry; // maksymalny czas gry, czas trwania meczu, // Czas_gry = 0 - nie ma ograniczenia na czas trwania meczu int max_l_goli; // maksymalna liczba goli, mecz jest przerwany po osiągnięciu maksymalnej // liczby goli (przez którakolwiek z drużyn) // 0 - o zakończeniu gry decyduje tylko ‘Czas_gry’ bool Autom_poz; // True - po trafieniu gola automatyczne przestawienie położenia robotów // do pozycji startowych, // False - roboty musza same dojechać do pozycji startowych double t_190; // czas włączenia stanu 190 - wszystkie roboty znajdują się w pozycjach // startowych double t_210; // czas włączenia stanu 210 - gra (był gol) }; Za tą strukturą znajdują się dane typu ‘robot_struct’ przechowujące pozycje startowe robotów. Liczba bloków opisujących roboty jest równa wartości pola ‘liczba_robotow’ znajdującego się w nagłówku bloku danych. 30 Wysłanie sygnałów sterujących do robotów: Programy sterujące sterują robotami poprzez wysyłanie do symulatora odpowiednich rozkazów. Uwzględniane są tylko te rozkazy, które dotyczą robotów przypisanych do danej drużyny, tzn. nie można wysyłać rozkazów do robotów przeciwnika. Maksymalny rozmiar bloku danych wysyłany do serwera symulacji wynosi 512 bajtów !!! Maksymalny rozmiar napisu do wyświetlenia wynosi 256 bajtów (256 znaków ASCII) !!! Maksymalna liczba rozkazów jakie mogą być wysłane w jednym bloku danych wynosi 60 !!! Struktura danych wysyłanych do symulatora jest identyczna jak struktura danych wysyłanych do programu sterującego. Wiadomość rozpoczyna się nagłówkiem: ‘naglowek_struct’ wraz z opisem bloków danych ‘naglowek_bloku_danych_struct’. Bloki danych wykorzystywane przy komunikacji: program sterujący Æ serwer symulacji mają numery: opis=100 - blok danych zawiera przesyłany ciąg bajtów interpretowany jako łańcuch znaków ASCII do wyświetlenia (opcja ta ma charakter pomocniczy dla osób które chcą przetestować komunikacje miedzy programem sterującym a serwerem symulacji) opis=101 - blok danych przechowuje rozkazy do robotów opis=102 - blok danych jest zapytaniem o pozycje startowe robotów, rozmiar bloku danych wynosi 0, (w takim przypadku, następny blok danych wysyłany z programu sterującego będzie zawierał pozycje startowe robotów) Blok danych o numerze 100 ( 'opis' = 100 ) Pole ‘rozm’ nagłówka bloku oznacza liczbę znaków ASCII w bloku Pole ‘adres’ nagłówka bloku wskazuje adres pod którym znajduje się ciąg znaków do wyświetlenia Blok danych o numerze 101 ( 'opis' = 101 ) Blok danych rozpoczyna się od informacji na temat liczby przesyłanych rozkazów int liczba_rozk; Następnie umieszczone są sygnały sterujące robotami o następującej postaci (liczba wysłanych rozkazów musi być równa wartości pola ‘liczba_rozk’): int nr_robota; float wartosc; // numer robota i rodzaj rozkazu // wartość dodatnia: prędkość liniowa robota, podana wartość oznacza numer // robota, numeracja robotów rozpoczyna się od wartości 0 // wartość ujemna: prędkość obrotowa robota, podana wartość oznacza numer // robota, wysłana wartość = -(nr robota dla którego wysyłany jest rozkaz + 1); // Jeżeli model robota jest ustawiony w tryb rozszerzony // zadana prędkość liniowa traktowana jest jako zadana prędkość obrotowa // lewego koła, a zadana prędkość obrotowa robota traktowana jest // jako zadana prędkość obrotowa prawego koła // wartość od -100 do 100 (jest to prędkość liniowa lub obrotowa) // prędkość ta jest odniesiona w stosunku do prędkości maksymalnej będącej // parametrem modelu robota. 0 - prędkość zerowa, 100 - prędkość maksymalna // wartość dodatnia (jazda do przodu, skręt w lewo) // wartość ujemna (jazda do przodu, skręt w prawo) 31 Dodatkowe bloki danych Blok danych o numerze 10 ( 'opis' = 10 ) Ten blok danych jest wysyłany do programów wizualizacji gry i zawiera ciąg znaków ASCII (komunikat do wyświetlenia), wysłany z programu sterującego do serwera wizualizacji. Każda wiadomość wysyłana jest maksymalnie pięć razy. Otrzymanie potwierdzenia odbioru wiadomości powoduje przerwanie wysyłania wiadomości. Blok ten rozpoczyna się następującymi wartościami: int identyf; // identyfikator wiadomości - każda wysłana wiadomość posiada inny numer identyfikatora, // Wiadomość wysyłana jest tak długo, aż nie pojawi się nowa wiadomość lub nie zostanie // odebrany blok danych będący potwierdzeniem odebrania wiadomości. int druzyna; // od której drużyny pochodzi komunikat; 0-komunikat pochodzący bezpośrednio od serwera // symulacji; 1 - komunikat pochodzący od drużyny 1; 2 - komunikat pochodzący od drużyny 2 // 3 - nazwa drużyny 1; 4 - nazwa drużyny 2 (maksymalna długość komunikatu wynosi 24 znaki) int rozm; // długość komunikatu (liczba znaków ASCII), maksymalnie 256 znaków Następnie umieszczony jest ciąg znaków do wyświetlenia. Blok danych o numerze 11 ( 'opis' = 11 ) Ten blok danych jest wysyłany do serwera symulacji w odpowiedzi na odebranie bloku danych o numerze 10. Blok ten zawiera jedynie identyfikator wiadomości, otrzymany wraz z komunikatem, oraz nadawcę wiadomości. Rozmiar bloku danych wynosi 2*sizeof(int) = 8 bajtów. Jeżeli do serwera symulacji jest zalogowanych kilka programów wizualizacji, wystarczy ze jeden z nich potwierdzi odebranie wiadomości. Wynika to stad, że paczka danych wysyłanych do wizualizacji jest generowana jednokrotnie a następnie wysyłana pod adresy znajdujące się na liście zalogowanych programów wizualizacji. int identyf; // Identyfikator otrzymanej wiadomości int druzyna; // Od której drużyny pochodzi komunikat; 0-komunikat pochodzący bezpośrednio od serwera // symulacji; 1 - komunikat pochodzący od drużyny 1; 2 - komunikat pochodzący od drużyny 2 // 3 - nazwa drużyny 1; 4 - nazwa drużyny 2 Blok danych o numerze 110 ( 'opis' = 110 ) Ten blok danych jest wysyłany od programu sterującego do serwera symulacji i zawiera ciąg znaków będących nazwą drużyny. Blok ten rozpoczyna się następującymi wartościami: int identyf; // Identyfikator wiadomości int rozm; // długość komunikatu (liczba znaków ASCII), maksymalnie 24 znaki Następnie znajduje się ciąg znaków do wyświetlenia (nazwa drużyny). Blok danych o numerze 111 ( 'opis' = 111 ) Ten blok danych jest wysyłany do programu sterującego w odpowiedzi na odebranie bloku danych o numerze 110. Zawiera on jedynie identyfikator wiadomości, otrzymany wraz z otrzymaną nazwą drużyny. int identyf; // Identyfikator otrzymanej wiadomości (identyfikator >= 0) // Identyfikator = -1 oznacza zapytanie programu sterującego o nazwę drużyny. // Wysyłanie zapytania zostanie przerwane po otrzymaniu bloku o numerze 110 lub po // wysłaniu pięciu zapytań. Zapytanie o nazwę drużyny jest wysyłane na początku gry. 32 Blok danych o numerze 200 ( 'opis' = 200 ) Blok danych nie zawiera żadnych dodatkowych informacji, ‘rozm’ = 0. Ten blok danych służy do logowania się wizualizacji w programie symulacyjnym. Po odebraniu paczki danych o numerze identyfikacyjnym 200 ('opis==200'), symulator dołącza adres IP i numer portu, z którego otrzymał daną paczkę danych, do listy adresów wizualizacji symulacji. Serwer symulacji wysyła dane dotyczące sytuacji na boisku do programów wizualizacji znajdujących się na liście adresów. Jeżeli serwer symulacji nie będzie otrzymywał potwierdzenia od programu wizualizacji przez okres dłuższy niż (150 okresów pracy sterownika - ok 5s dla Ts=33,3ms) (blok o numerze 200), usunie dany program wizualizacji z listy adresów i tym samym przestanie wysyłać do niego informacje o stanie gry. Paczki danych o numerze 200, odbierane spod adresów IP i numerów portów przypisanych graczom oraz głównemu modułowi wizualizacji (adres IP i numer portu ręcznie wpisany w oknie ustawień komunikacji) są ignorowane. Blok danych o numerze 201 ( 'opis' = 201 ) Odpowiedz serwera symulacji o przyjęciu lub odrzuceniu zgłoszenia programu wizualizacji. Zawartość bloku danych: int maksym_liczba_wiz; // maksymalna liczba wizualizacji jaka może być dołączona // do serwera symulacji przez protokół UDP int liczba_wiz; // liczba aktualnie dołączonych wizualizacji int przyjecie; // '1' - zgłoszenie zostało przyjęte, '0' - zgłoszenie zostało odrzucone Blok ten jest potwierdzeniem odebrania bloku danych o numerze 200 i wpisania adresu IP i numeru portu wizualizacji do listy adresów. 33