Program gracza w lidze software-owej
rozgrywek piłki nożnej robotów RoboCup
Autor: Łukasz Szydłowski
Raport opracowany na zaliczenie przedmiotu:
Metody i algorytmy sztucznej inteligencji
Wrocław 28 czerwca 2008r.
Wprowadzenie
RoboCup (czyli Robot World Cup Initiative) jest międzynarodowym projektem mającym wypromować sztuczną inteligencję i robotykę. RoboCup próbuje rozwijać sztuczną inteligencję i badania nad robotyką poprzez analizę problemu, w którym będzie można połaczyć i zbadać szeroki zakres technologii.
RoboCup wybrał grę w piłkę nożną jako kluczowy temat badania. Zasadniczym celem projektu RoboCup jest do 2050 stworzenie zespołu wpełni autonomicznych humanoidalnych robotów, który mógłby wygrać mecz z ludzkim zespołem mistrza świata w piłce nożnej.
RoboCup software agent
Author of project : Łukasz Szydłowski
This report has been prepared as a requirement for the course:
Methods and algorithms of artificial intelligence
Wrocław 28 June 2008r.
Introduction
RoboCup (Originally called as Robot World Cup Initiative) is an international joint project to promote AI and robotics. It is an attempt to foster AI and intelligent robotics research by providing a standard problem where wide range of technologies can be integrated and examined. RoboCup chose to use soccer game as a central topic of research, aiming at innovations to be applied for socially significant problems and industries. The ultimate goal of the RoboCup project is By 2050, develop a team of fully autonomous humanoid robots that can win against the human world champion team in soccer.
Opis systemu obsługi ligi software-owej RoboCup
Do rozgrywania meczów RoboCup potrzebne są trzy programy:
Serwer
Serwer dzięki współpracy z pozostałymi programami (klientem i monitorem)pozwala na rozegranie i oglądanie meczu ligi software-owej RoboCup. Po uruchomieniu serwera należy uruchomić monitor, a na końcu klientów, co umożliwi współdzałanie wszystkich programów z serwerem i pozwoli rozegrać mecz. Serwer działa w kilku trybach i w żależności od tego w jakim się znajduje podejmuje odpowiednie działania, wysyła i przyjmuje komunikaty.
Działanie serwera
Po uruchomieniu serwer rozpoczyna działanie w trybie BEFORE_KICKOFF. Jest to tryb w którym serwer oczekuje na zgłoszenia klientów chcących wziąść udział w meczu (w tym trybie serwer przyjmuje polecenie MOVE). Po zgłoszenu drużyn serwer przechodzi do trybu KICKOFF_LEFT, a po dotknieciu piłki przez zawodnika do trybu PLAY_ON, w którym przyjmowane są komunikaty dotyczące ruchów poszczególnych graczy przesyłane przez klientów. W trybie PLAY_ON serwer pracuje sekwencyjnie: przyjmuje komunikaty dotyczące ruchów graczy, generuje nowe dane dotyczące każdego zawodnika i piłki, wysła dane o nowych pozycjach do monitora i do każdego zawodnika.
Zdarzenia na boisku powodują przyjęcie przez serwer jednego z nastąpujących trybów (Play Mode):
- KICKOFF_LEFT - piłka po środku pola, czeka na wybicie z lewej strony,
- KICKOFF_RIGHT - piłka po środku pola, czeka na wybicie z prawej strony,
- PLAY_ON - piłka w grze,
- KICKIN_LEFT - rzut z autu dla drużyny lewej,
- KICKIN_RIGHT - rzut z autu dla drużyny prawej,
- FREEKICK_LEFT - rzut wolny dla lewej strony,
- FREEKICK_RIGHT - rzut wolny dla prawej strony,
- CORNERKICK_LEFT - rzut rożny dla lewej strony,
- CORNERKICK_RIGHT - rzut rożny dla prawej strony,
- GOALKICK_LEFT - wybicie sprzed bramki dla lewej strony,
- GOALKICK_RIGHT - wybicie sprzed bramki dla prawej strony,
- AFTERGOAL_LEFT - prawa strona zdobyła gola,
- AFTERGOAL_RIGHT - lewa strona zdobyła gola,
- OFFSIDE_LEFT - spalony dla prawej strony,
- OFFSIDE_RIGHT - spalony dla lewej strony,
- DROPBALL - gra przerwana przez sędziego.
Po upłynięciu czasu przeznaczonego na pierwszą połowę, serwer przechodzi ponownie w stan BEFORE_KICKOFF (do klientów wysyłany jest komunikat HALF_TIME). Przebieg drugiej połowy jest identyczny. Na zakończenie meczu wysyłany jest komunikat TIME_OVER.
Monitor
Monitor jest programem, który wyświetla informacje dotyczące wydarzeń na boisku otrzymywane od serwera. Wyświetlanie gry to nie jedyna funkja jaką może pełnić monitor,bo dzieki możliwości przekazywania informacji do serwera może on pełnić funkję sędzigo.Mimo, że serwer umie obsłużyć większość sytuacji takich jak: spalony, aut, gol mogą pojawić się sytuacje sporne, które może rozstrzygnąć człowiek.
Klient
Klient jest programem, który kieruje zachowaniem jednego zawodnika. Klient aby wziąść udział w meczu musi wysłać do serwera komunikat INIT. Jeżeli serwer jest w stanie BEFORE_KICK_OFF akceptuje zgłoszenie klienta. Właściwe zadanie klienta polega na takim sterowaniu zawodnikiem aby jego drużyna strzeliła gola. W tym celu klient wysyła komunikaty sterujące zawodnikiem (np: obróć się (turn),przyspiesz (dash), kopnij piłkę (kick)). Co pewien czas serwer wysyła do klienta komunikat (see) zawierający informację o tym co widzi zawodnik. Na podstawie tych informacji klient powinien podejmować odpwoiednie decyzje. Algorytmy kierujące grą zawodnika mogą być bardzo różne: od biegnij do piłki i kop na bramkę przeciwnika aż po takie w których zawodnicy podzieleni są na formacje, a ich działania zwierają elementy strategii.
Protokół klient-serwer
Można wyróżnić trzy rodzaje komunikatów pomiędzy klientem a środowiskiem symulacyjnym:
- Komunikaty połączeniowe, które ustalają połączenie i określają atrybuty piłkarza
- Polecenia kontrolne zapewniające kontrolę programu piłkarza w środowisku symulacyjnym.
- Komunikaty sensoryczne, które przekazują informację sensoryczną ze środowiska symulacyjnego do programu piłkarza.
Komunikaty dla serwera
- INIT - Przed rozpoczęciem meczu program piłkarza łączy się z serwerem przy pomocy komunikatu init.
(init TeamName [(version VerNum)] [(goalie)])
TeamName - Nazwa drużyny
VerNum - Numer wersji symulatora
(goalie) - Określenie piłkarza jako bramkarza (w drużynie może być tylko jeden bramkarz).
- RECONNECT - Przed rozpoczęciem drugiej połowy program piłkarza łączy się ponownie ze środowiskiem symulacyjnym za pomocą komunikatu reconnect.
(reconnect TeamName Uniform)
TeamName - Nazwa drużyny, Uniform - Numer gracza (1-11)
- DASH - Polecenie dash zwiększa prędkość piłkarza w kierunku, w którym jest on zwrócony.Jest to chwilowe przyśpieszenie piłkarza. Ruch w tył pobiera podwójną dawkę sił.
(dash Power), Power - Siła przemieszczenia (-100..100)
- KICK - Polecenie kick realizuje próbę kopnięcia piłki.
(kick Power Direction)
Power - Siła kopnięcia (0..100), Direction - Kierunek kopnięcia (-180..180)
Polecenie kick przyśpiesza ruch piłki ale nie daje efektu, jeśli piłka nie jest w obszarze kopnięcia (kikable_area).
Obszar ten jest obliczany następująco:
kickable_area = player_size+ball_size+kickable_margin,
gdzie
player_size - średnica piłkarza,
ball_size - średnica piłki,
kickable_margin - margines kopnięcia
- TURN - Polecenie turn zmienia kierunek piłkarza.
(turn Moment),
Moment - Kąt o jaki ma się zmienić kierunek gracza (-180..180).
Wartość Moment musi być z zakresu określonego parametrami minmoment i maxmoment. Jeżeli piłkarz biegnie z dużą prędkością efektywna zmiana kata jest obliczana następująco:
actual_angle = Moment/(1.0+inertia_moment*player_speed)
- TURN_NECK - Polecenie turn_neck zmienia kierunek patrzenia piłkarza.
(turn_neck Angle), Angle - Kąt patrzenia względem kierunku piłkarza (-90..90).
- CATCH -Polecenie catch jest próbą wychwycenia piłki.
(catch Direction),
Direction - Kierunek łapania piłki (-180-180).
Może być ono wykonane tylko przez bramkarza (komunikat init z opcją (goalie)).Bramkarz może wyłapać piłkę, jeśli jest ona w prostokącie o wymiarach określonych parametrami goalie_catchable_area_w (szerokość) i goalie_catchable_area_l (długość). Środek prostokąta jest w środku piłkarza.
Prawdopodobieństwo powodzenia jest określone parametrem catch_probability.
Bramkarz nie może łapać piłki przez pewną ilość cykli symulacji od ostatniego złapania. Ilość cykli określa parametr catch_ban_cycle.
- BYE - Środowisko symulacyjne odpowiada komunikatem reconnect zawierającym informacje o atrybutach piłkarza (strona, po której gra i stan środowiska symulacyjnego) lub ewentualnie komunikat o błędzie. (bye)
Komunikaty dla klienta
- SEE - Środowisko symulacyjne przy pomocy komunikatu see dostarcza programowi piłkarza informacje wizualne.
(see Time ObjInfo ObjInfo.. )
Time - Cykl symulacji, ObjInfo - Informacja o widzianym obiekcie
Częstotliwość i zakres dostarczanej informacji zależy od kąta i jakości widzenia (ustalanej poleceniem change_view). Widziany obiekt jest rozpoznawany jako widziany w stożku widzenia, albo widzianym sensorem krótkiego zasięgu (obiekt znajduje się obok piłkarza w promieniu 3 m). Wówczas obiekt jest niezidentyfikowany
- HEAR - Środowisko symulacyjne przy pomocy komunikatu hear dostarcza programowi piłkarza informacje audytywne. Są to zarówno informacje od sędziego, jak i komunikaty wysłane przez innych piłkarzy za pomocą komunikatu say .
(hear_body Time Sender Message)
Time - Cykl symulacji,
Angle - Źródło informacji (referee | coach | self | Direction),
Message - Komunikat
- SENSE_BODY - Środowisko symulacyjne wysyła co określony interwał czasowy komunikat sense_body zawierającym informacje o stanie piłkarza.
(sense_body Time
(view_mode ViewQuality ViewWidth) (stamina Stamina Effort) (speed AmountOfSpeed) (head_angle HeadDirection) (kick KickCount) (dash DashCount) (turn TurnCount) (say SayCount) (turn_neck TurnNeckCount))
ViewQuality, ViewWidth - Jakość i szerokość widzenia, Stamina, Effort - Ilość siły i wytrzymałość gracza, AmountOfSpeed - Aktualna prędkość gracza, HeadDirection - Kierunek patrzenia gracza, Time - Cykl symulacji,
*Count - Liczba wykonanych poleceń
Reguły sędziowania przez serwer
Soccerserver kontroluje mecz według naztępujących zasad:
- Goal - Sewer zgłasza strzelenie bramki, aktualizuje rezultat, zawiesza mecz na 5 sekund, przemieszcza piłkę do punktu środkowego i zmienia status gry na kick_off.
- kick_off - Tuż przed zmianą statusu gry na kick_off serwer zawiesza grę na około 5 sekund, podczas których gracze muszą wrócić na swoją połowę (move).
- out_off_field - Kiedy piłka znajdzie się poza boiskiem, jest przemieszczana na właściwą pozycję (linia boczna, narożnik, pole bramkowe) i zmieniany jest status gry na kick_in, corner_kick, goal_kick.
- Clearence - Kiedy status gry ma wartość kick_off, kick_in, corner_kick, serwer przemieszcza wszystkich graczy broniących na pozycję odległą o 9.15m od punktu wznowienia gry, o ile są oni bliżej. Przy statusie offside gracze cofani sę poza pozycję spaloną.
- Play mode Control - Kiedy status gry ma wartość kick_off, kick_in, corner_kick, serwer zmienia status na play_on zaraz po pierwszym poleceniu kick.
- Half time and Time Up - Serwer ogłasza koniec pierwszej połowy i koniec meczu.
Reguły sędziowania przez człowieka
Jak już wyżej wspomniałem przy opisie monitora funkcję sędziego może przejąć człowiek i rozstrzygnąć sporne sytuacje np. podyktować rzyt wolny w następujących przypadkach:
- zawodnicy jednej drużyny szczelnie otaczają piłkę
- zbyt duża liczba zawodników blokuje własną bramkę
- zawodnicy zbyt długo zwlekają ze wznowieniem gry
- zawodnicy specjalnie blokują ruchy przeciwnika
- bramkarz na zmianę wykopuje i łapie piłkę
- zbyt dużo komunikatów od jednego zawodnika dociera do serwera
- zawodnicy grają w sposób nie pozwalający na sensowną grę
Implementacja
W realizacji projektu posłużyłem się szkieletem zawodnika RoboCup autorstwa Klausa Dorera. Agent zaimplementowany został w MS Visual C++ 5.0. Wszelkie zadania związane z percepcją zebrane są w klasie TPerception. Odpowiada ona za przetwarzanie komunikatów see, hear i sense_body oraz za przechowywanie i udostępnianie danych na temat widocznych obiektów. Dane obiektów pamięta ona jako obiekty klas TBall, TPlayer, TFlag, TLine oraz TSoccerGoal.
Komunikacją z serwerem zajmuje się klasa TViewingAgent, dziedzicząca po CBaseAgent, która dziedziczy po klasie CAgentSocket, a ta z kolei dziedziczy po klasie MFC CAsyncSocket. Zawiera ona także całą logikę zawodnika i decyduje o podejmowanych działaniach. Całość oparta jest na mechaniźmie Single Document Interface.
Wnioski
Stworzenie dobrze grającego zawodnika i do tego wykorzystującego zalety gry w drużynie jest bardzo skomplikowanym zadanie. Do testowania gracza został wykorzystany wspomniany wcześniej zawodnik autorstwa Klausa Dorera, który dzięki swojej prostej taktyce może posłóżyć do testowania innych graczy, wystawiając go sam na sam z innym zawodnikiem.
Materiały źródłowe