Pràctica:
"Utilització de Jess per a planejar una estratègia
de futbol"
Pràctica: "Utilització de Jess per a
planejar una estratègia de futbol"
Objectiu de la pràctica:
La Figura 1 mostra la pantalla principal del programa.
Figura 1: Pantalla principal i posicions dels jugadors en el començament del partit.
Les dimensions del camp de futbol són de 152.2 cm d’amplada
per 274 cm de llargada. Cada porteria té una mida de 50 cm. En el
sistema de coordenades utilitzat en la simulació, el centre del
camp és el (0,0) amb +x cap a la dreta (est) i +y cap a dalt (nord).
L’equip que comença a la part dreta del camp s’anomena equip "east"
i el de l’esquerra, equip "west".
Els robots són rodones de 12 cm de diàmetre i poden moure’s a una velocitat lineal de 0.3 m/s i girar 360 graus per segon. Cadascú té un número d’identificació i un equip pot tenir com a màxim, cinc robots. Ells poden relliscar seguint la paret sempre i quan no hi estiguin encarats.
La pilota té un diàmetre de 4 cm i pot arribar a una velocitat màxima de 0.5 m/s quan es xuta. Desaccelera a 0.1 m/s2. Les col·lisions amb la paret són perfectament elàstiques.
Actualment no hi ha cap restricció en el temps de durada del partit, però la RoboCup estableix un temps de 10 minuts.
Cada porteria està envoltada per una zona de defensa, que es troba a 22.5 cm de la línia de gol i que té una amplada de 100 cm. Només un robot defensor pot entrar en aquesta àrea.
La Figura 1 mostra les posicions dels jugadors al començament del partit. La RoboCup no especifica cap posició inicial, però si que l’equip que xuta primer pot estar a menys de 15 cm de la pilota.
JavaSoccer no fa acomplir cap tipus de faltes, però existeix un rellotge que comença a funcionar quan es fa un gol i que compta enrera des de 60 segons. Si cap equip anota en aquest temps, la pilota torna automàticament al centre del camp. La pilota també torna al centre si queda encallada per un període de temps.
En la simulació, els robots no poden comunicar-se entre ells,
però són autònoms.
Per executar aquest programa cal cridar al fitxer demo.bat que es
troba al directori /javasoccer/javasoccer. Aquest en fa servir un altre
anomenat robocup.dsc que conté els paràmetres inicials del
simulador, com són les posicions inicials dels jugadors, els colors
dels equips, la posició de la pilota (al centre del camp), les mides
del camp, les parets, etc, i un de molt important que és el nom
de la classe Java que inclou l’estratègia de l’equip.
Per més informació consultar la pagina web:
http://eia.udg.es/~iitap/cursjava/javasoccer.html
Com que JavaSoccer i Jess són programes en Java, es poden
utilitzar junts. Existeix un conjunt de funcions per enviar objectes Java
entre ells. La manera de fer-ho és mitjançant una hashtable
on tant Jess com JavaSoccer hi poden accedir per introduir i recuperar
les dades. Les funcions utilitzades en la transferència d’informació
són store i fetch.
La funció fetch recupera i retorna un valor prèviament emmagatzemat per la funció store sota un nom donat o null si no hi ha cap valor. La sintaxi és: (fetch <nom>).
La funció store té la sintaxi següent (store
<string o àtom> <expressió>) i associa el contingut
de <expressió> amb el nom donat pel primer argument de manera
que amb successives crides de la funció fetch es pugui recuperar.
Per alleugerar la tasca de l’alumne, les modificacions de JavaSoccer seran fetes pels professors.
El treball consistirà en escriure un arxiu anomenat decisioe.clp o decisiow.clp en Jess, que contingui la tàctica del jugador.
En principi es demana l’estratègia per a un jugador, però l’alumne pot fer-la per a més (fins a cinc jugadors). Tenint en compte que existeix aquesta possibilitat es donaran les coordenades de tots els jugadors (ambdós equips).
Per aproximar més la simulació al cas real, és a dir, a l’ús dels micro-robots que juguen a futbol, i per a facilitar els càlculs, ja que totes les dades seran positives, es traslladarà l’eix de coordenades a la cantonada dreta de la porteria corresponent a l’equip propi.
Aquests canvis de coordenades permeten fer un únic programa en Jess i que estar a la part esquerra o dreta del camp sigui transparent per a l’alumne.
Figura 2: Nou eix de coordenades per als equips "west".
Figura 3: Nou eix de coordenades per als equips "east".
Seguidament es donen les dades que seran introduïdes a la hashtable amb el seu nom (necessari per a la funció fetch):
Coordenades x,y de:
- Equip propi:
"x_jo", "y_jo"
"x_company1", "y_company1"
"x_company2", "y_company2"
"x_company3", "y_company3"
"x_company4", "y_company4"
Equip contrari:
"x_contrari2", "y_contrari2"
"x_contrari3", "y_contrari3"
"x_contrari4", "y_contrari4"
"x_contrari5", "y_contrari5"
Si es planteja l’estratègia per a un sol jugador, aquest
número serà sempre 1.
Com a resposta, l’alumne ha de fer un store de:
"coordx" , "coordy"
"moure"
"xutar"
On "coordx" i "coordy" són les coordenades on es desitja que vagi el jugador; "moure" una variable booleana per a dir si el robot ha de moure’s o no ( 1 = si, 0 = no), i "xutar" una altra variable booleana per a indicar si el robot ha de xutar (1) o no (0) la pilota.
Si "moure" = 0 llavors el robot només girarà sobre el propi eix, apuntant el seu front cap a les coordenades donades per "coordx" i "coordy".
Per a xutar la pilota, el jugador ha de ser a una distància màxima de 2 cm d’ella. Recordeu que la distància es considera a partir d’on acaba el robot i la pilota, i les coordenades (x,y) donades són del centre del robot i la pilota. De totes maneres, si "xutar" sempre es 1, JavaSoccer comprova aquesta distància i només xuta quan toca. Aquesta variable s’ha inclòs per si donat una situació on es pot xutar, no es desitja fer-ho.
Finalment, es dona una plantilla de Jess, que inclou les sentències
necessàries per a comunicar-se amb JavaSoccer.
(deffacts inici
(fet obtenir_posicions) ) // aquest fet es necessari per la continuïtat de la execusió de JavaSoccer. (defrule qui_pilota
// coordenades pilota
// coordenades equip propi
// coordenades equip contrari
// coordenades de la porteria del equip propi
// coordendes de la porteria del equip contrari
// numero del jugador
.....
// per passar dades a JavaSoccer
(store "coordx" <variable x>)
|
Per a que els programes funcionen bé:
Els arxius robocup.dsc, javajesse.java i javajessw.java són
a la pàgina web
Per que el programa funcioni, cal crear un directori equips dins
del c:\temp, posar-hi els arxius .java i compilar-los (javac nom-fitxer.java).
Dins del c:\temp han de ser els arxius robocup.dsc
i demo.bat. Cal modificar el robocup.dsc, tan per a escollir el nombre
de jugadors com l’equip (est o oest).
//======WEST TEAM======
robot EDU.gatech.cc.is.abstractrobot.SocSmallSim equips.javajessw
-1.2 0 0 xEAEA00 xFFFFFF 2
//======EAST TEAM======
robot EDU.gatech.cc.is.abstractrobot.SocSmallSim equips.javajesse
1.2 0 0 xFF0000 x0000FF 2
La definició de l’equip és al final de l’arxiu i només fa falta canviar el nom de la classe.
Per a entrenar el nou equip, JavaSoccer té els equips següents: