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