roboti.doc by xiaoyounan

VIEWS: 0 PAGES: 8

									                                   Virtuálni roboti – futbal.
                                       Pavel Karády, Martin Jaroš.

       Základom celého robotického futbalu je skratka RoboCup. Jej interpretáciou je Robot World
Cup Soccer Games and Conferences. Ide o neziskovú organizáciu, ktorá každoročne usporadúva turnaje
v robotickom futbale. Snahou tejto spoločnosti je podporovať vývoj rôznych technologických oblastí
pomocou riešenia štandardnou metódou, pri ktorej je možné využiť obrovské množstvo technológií. Na
tento účel programátori zvolili futbal. Základnou ideou je vytvoriť čo najviac dokonalých fyzických, ale
i syntetických, čiže programovo realizovaných agentov, ktorí dokážu hrať futbal na vysokej úrovni.
Míľnikom, o ktorý RoboCup-u ide, je zostrojenie tímu humanoidných robotov, ktorí by hrali proti
najlepšiemu “ľudskému” tímu podľa oficiálnych pravidiel FIFA. Predpovede organizácie RoboCup
hovoria o uskutočnení tohoto zápasu okolo polovice tohoto storočia.

   Kategórie, ktoré má RoboCup v súčasnosti:

      Liga stredne veľkých robotov (11 robotov)
      Liga malých robotov (11 robotov)
      Liga malých robotov (5 robotov)
      Simulačná liga pre softwérových robotov - agentov

        RoboCup Federation je medzinárodná nezisková organizácia zaregistrovaná v Ženeve za účelom
podpory, propagácie a posilňovania výskumu RoboCup-u. Túto iniciatívu v súčasnosti nasleduje
približne 1500 výskumníkov v 17 rôznych krajinách. Do súťaže sa môže zapojiť každý tím (resp.
jednotlivec), bez ohľadu na to, či je alebo nie je zameraný na samotný výskum. Niektoré tímy sa
zúčastnujú súťaže iba zo zábavy (najmä v simulačnej lige), iné sú zamerané na seriózny výskum, pričom
svoje výsledky pravidelne publikujú.

       My sme sa sústredili, v rámci našich možností, na simulačnú ligu a zostavili sme v jazyku Java
agenta hrajúceho futbal, aktívne sa snažiaceho zasadiť gól do súperovej brány. Celý futbal funguje na
princípe troch elementov – servera, monitora a agentov.


       SoccerServer je program, ktorý sa stará takpovediac o platnosť futbalových pravidiel. V rýchlom
slede posiela agentom informácie o tom čo vidia, čo počujú a ako sa cítia. Zabezpečuje pohyb lopty,
kontroluje jednotlivé futbalové situácie (napr. rozohrávku, ofsajd, voľný kop, roh, aut, gól atď.), takisto
sa stará o účinok vetra na priebeh zápasu. Jednotlivým agentom, ktorí sa pripájajú priamo na tento
server, však poskytuje informácie o tom, čo vidia trochu skreslene – aby to nebolo také jednoduché.
        SoccerMonitor je program, ktorý po spustení pripojíme na SoccerServer a môžeme pomocou
neho sledovať priebeh samotného zápasu.


        Team Agentov je dokopy šestnásť spustených agentov (8 za jeden tým, 8 za druhý) –
najdôležitejší aktéri futbalu.


        Agenti so serverom komunikujú pomocou datagramov cez jednoduchý UDP protokol.



Konštruktor:
AgentFH
public AgentFH(com.ls.robocup.AgentIfc agent,
               java.lang.String host,
               int port,
               java.lang.String team)
        Konštruktor vytvára futbalového agenta. Výsledkom jeho činnosti je po poskytnutí informácií o
        hoste a porte priame pripojenie na server.

        Parametre:
        host – referencia na objekt typu AgentIfc
        host – meno servera (“localhost” pre hru na jednom počítači)
        port – port používaný serverom (štandardne 6000)
        team – meno tímu, ku ktorému sa agent pripojí




Zoznam metód:
     void dash(int power)
                  Rozbehne hráča silou power do smeru, do ktorého je práve natočený.
     void disconnect()
                  Odpojí agenta od servera.
      int getBallDirection()
                  Vracia smer lopty ako uhol vzhľadom na hráčov pohľad.
      int getGoalDirection()
                  Vracia smer súperovej bránky ako uhol vzhľadom na hráčov pohľad.
 boolean haveBall()
                  Skontroluje, či má agent loptu vo vzdialenosti, pri ktorej je možné strieľať.
     void kick(int power, int direction)
               Spôsobí výkop lopty silou power       relatívne špecifikovaným smerom direction.
     void onHear(com.ls.robocup.perception.AudibelInfo audibel)
                  Volá sa, keď server pošle novú informáciu o tom, čo hráč počuje.
     void onInit(char side, int number, java.lang.String team)
                  Volá sa pri vrátení stavu inicializácie od servera.
     void onMessage(java.lang.String message)
                  Volá sa v prípade chybového hlásenia alebo neznámej správy od servera.
   void onSee(com.ls.robocup.perception.VisualInfo visual)
                 Volá sa, keď server pošle novú informáciu o tom, čo hráč vidí.
   void onSenseBody(com.ls.robocup.perception.PropriozeptiveInfo propriozeption)
                 Volá sa, keď server pošle novú telesnú informáciu o hráčovi.
boolean seeBall()
                 Skontroluje, či agent vidí loptu, alebo nie.
boolean seeGoal()
                 Skontroluje, či agent vidí súperovu bránku.
   void turn(int angle)
                 Otočí hráča o uhol angle.

Popis metód:
disconnect
public void disconnect()
        Odpojí agenta od servera. Táto funkcia by sa mala stále volať predtým, ako sa agent vypne.


onSee
public void onSee(com.ls.robocup.perception.VisualInfo visual)
        Volá sa v prípade, že hráč obdržal od servera nové vizuálne informácie.
        Špecifikácia:
        onSee je v interfejs com.ls.robocup.perception.PerceptionInterface
        Parametre:
        visual – syntakticky analyzovaná vizuálna správa servera



onHear
public void onHear(com.ls.robocup.perception.AudibelInfo audibel)
        Volá sa v prípade, že hráč obdržal od servera nové audio informácie.
        Špecifikácia:
        onHear je v interfejs com.ls.robocup.perception.PerceptionInterface
        Parametre:
        audibel – syntakticky analyzovaná audio správa servera



onSenseBody
public void
onSenseBody(com.ls.robocup.perception.PropriozeptiveInfo propriozeption)
        Volá sa v prípade, že hráč obdržal od servera nové vnemové informácie.
        Špecifikácia:
        onSenseBody je v interfejs com.ls.robocup.perception.PerceptionInterface
        Parametre:
        propriozeption – syntakticky analyzovaná správa servera o vnútorných vnemoch
onInit
public void onInit(char side,
                   int number,
                   java.lang.String team)
         Volá sa v prípade, že hráč obdrží od servera inicializačné informácie.
         Špecifikácia:
         onInit je v interfejs com.ls.robocup.perception.PerceptionInterface
         Parametre:
         side – strana, na ktorej hráč hraje l|r
         number – číslo hráča
         team – meno tímu, do ktorého sa hráč pridá



onMessage
public void onMessage(java.lang.String message)
         Volá sa v prípade, že hráč obdrží od servera chybu alebo neznámu informáciu.
         Špecifikácia:
         onMessage je v interfejs com.ls.robocup.perception.PerceptionInterface
         Parametre:
         message – obdržaný reťazec správy od servera



seeBall
public boolean seeBall()
         Skontroluje, či hráč vidí loptu, alebo nie.
         Vracia:
         true ak hráč loptu vidí, inak false


haveBall
public boolean haveBall()
         Skontroluje, či má hráč loptu v dostatočnej blízkosti na to, aby ju mohol kopnúť.
         Vracia:
         true ak je lopta kopnuteľná, inak false


getBallDirection
public int getBallDirection()
         Vracia relatívne od momentálneho natočenia hráča uhol, pod ktorým hráč vidí loptu.
         Vracia:
         uhol v stupňoch, pod ktorým hráč vidí loptu
         ObjectInfo.NOT_EXISTING ak hráč loptu nevidí
seeGoal
public boolean seeGoal()
         Skontroluje, či hráč vidí súperovu bránku, alebo nie.
         Vracia:
         true ak hráč súperovu bránku vidí, inak false


getGoalDirection
public int getGoalDirection()
         Vracia relatívne od momentálneho natočenia hráča uhol, pod ktorým hráč vidí súperovu bránku.
         Vracia:
         uhol v stupňoch, pod ktorým hráč vidí súperovu bránku
         ObjectInfo.NOT_EXISTING ak hráč súperovu bránku nevidí




turn
public void turn(int angle)
         Otočí hráča o daný uhol. Ak hráč nemá žiadnu rýchlosť, bude to len približný uhol otočenia.
         Záporné hodnoty ho otočia doľava, kladné doprava. Agent môže počas jedného cyklu vykonať
         len jedno otočenie, výkop a beh.
         Parametre:
         angle - uhol (-180 .. 180), o ktorý sa agent otočí



kick
public void kick(int power,
                 int direction)
         Vykoná výkop lopty určenou silou špecifikovaným relatívnym smerom. Záporné hodnoty
         predstavujú ľavú stranu, kladné pravú. Agent môže počas jedného cyklu vykonať len jedno
         otočenie, výkop a beh.
         Parametre:
         power – sila výkopu (0 .. 100)
         direction – relatívny uhol vzhľadom na natočenie hráča, pod ktorým kopne loptu (-180..180)



dash
public void dash(int power)
         Vykoná rozbeh agenta špecifikovanou silou smerom, ktorým je natočený. Záporná hodnota
         spôsobí utekanie vzad, čiže cúvanie, ktoré ho unaví dvakrát tak ako keby bežal dopredu. Agent
         môže počas jedného cyklu vykonať len jedno otočenie, výkop a beh.
         Parametre:
         power – sila, ktorou sa hráč rozbehne (-100 .. 100)

----------------------------------------
Údaje posielané serverom:


(see Time ObjInfo+)

Time ::= čas, simulačný cyklus servera
ObjInfo ::= (ObjName Distance Direction DistChange DirChange BodyFacingDir HeadFacingDir )
       j (ObjName Distance Direction DistChange DirChange
       j (ObjName Distance Direction)
       j (ObjName Direction)
ObjName ::= (p ["Teamname" [UniformNumber [goalie]]])
       j (b)
       j (g [ljr])
       j (f c)
       j (f [ljcjr] [tjb])
       j (f p [ljr] [tjcjb])
       j (f g [ljr] [tjb])
       j (f [ljrjtjb] 0)
       j (f [tjb] [ljr] [10j20j30j40j50])
       j (f [ljr] [tjb] [10j20j30])
       j (l [ljrjtjb])
       j (B)
       j (F)
       j (G)
       j (P)
Distance ::= kladné reálne číslo
Direction ::= -180 .. 180 stupňov
DistChange ::= reálne číslo
DirChange ::= reálne číslo
HeadFaceDir ::= -180 .. 180 stupňov
BodyFaceDir ::= -180 .. 180 stupňov
Teamname ::= reťazec
UniformNumber ::= 1 .. 11
               Grafické znázornenie dôležitých bodov futbalového ihriska:




Brankár


Agent s úlohou brankára je zodpovedný za nepreniknutie lopty do vlastnej brány. Jeho základná pozícia
je tesne pred bránou, nikdy by sa nemal vzdialiť mimo bránkového územia. Ak sa nedopatrením dostane
do oblasti penalty, mal by sa ihneď vrátiť na svoju základnú pozíciu. Brankár má niekoľko schopností
naviac, mal by vedieť presne určiť, či lopta v danom okamihu môže zasiahnuť bránu a ak áno, určiť
priesečník lopty a bránkovej čiary.

Určenie predpokladanej strely lopty
Pokiaľ sa brankár nepohybuje, sleduje pohyb lopty. Má špeciálnu schopnosť (skill) výpočtu, kde
potencionálna strela pretne bránkovú čiaru. V našom brankárovi však nie je implementovaná.
Takýto výpočet je pomerne jednoduchý, pokiaľ brankár vie presnú pozíciu lopty, respektíve pokiaľ vie
jej pohyb predikovať niekoľko krokov dopredu. Problém je v tom, že lopta nemusí byť smerovaná
presne do stredu bránky, ale môže byť vystrelená do akéhokoľvek miesta.
Ak je brankár blízko lopty
Ak je brankár blízko lopty, pokúsi sa ju chytiť príkazom catch. Ak sa mu to nepodarí, môže ešte použiť
klasický príkaz kick na vykopnutie lopty. Ak sa v blízkosti nachádza spoluhráč, je najvýhodnejšie mu
loptu prihrať. Ak je na výber z viacerých spoluhráčov, treba vybrať toho, v ktorého okolí je najmenej
protihráčov, aby bola čo najväčšia šanca dostať loptu preč z obranného pásma.




Problém s príkazom catch

Príkaz catch je možné použiť len raz za niekoľko simulačných krokov (štandardne raz za 2 simulačné
kroky). Preto si hráč musí viesť históriu použitia príkazu catch a rozhodovať použitú akciu aj na základe
toho, že vie či môže použiť tento príkaz. Ak v danom momente nemôže použiť príkaz catch, je
pravdepodobne najvýhodnejšie použiť príkaz kick, ktorý však nie je možné použiť v takej veľkej oblasti
ako je možné použiť príkaz catch. Podobne, je výhodnejšie použiť príkaz kick namiesto príkazu catch
pokiaľ sa lopta nachádza v oblasti použitia príkazu kick. Takto sa ušetrí príkaz catch a je ho v najhoršom
možnom prípade možné použiť v nasledujúcom simulačnom kroku.




Informácie o projekte:
Názov projektu: Virtuálni roboti

Riešitelia: Pavel Karády, Martin Jaroš

Prostredie: Java

Vedúci projektu: ing. Milan Schmotzer

Skratka: roboti



Zoznam použitej literatúry:
Robocup Research Areas: http://www.ieeta.pt/robocup/approach.htm (implementácia základných
štruktúr programu, princíp fungovania vrstevnej sféry aplikačného systému agentov)

Robocup Homepage: http://www.robocup.org (soccerserver, soccermonitor)

Federation of International Robot-soccer Association: http://www.fira.net (informácie o súťažiach)

Europium: http://europium.host.sk (dôležité triedy jazyka Java)

								
To top