Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
TITULACIÓ: Enginyeria Automàtica i Electrònica Industrial
AUTOR: Ricard Nicaforo Reverté.
DIRECTOR: Albert Oller Pujol.
DATA: Juny / 2009.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
Índex General
1 Objecte del Projecte ................................................................................1
2 Titular .......................................................................................................2
3 Antecedents ..............................................................................................3
4 Introducció ...............................................................................................4
4.1 El futbol robòtic .................................................................................................4
4.2 El robot mòbil ....................................................................................................4
4.3 Historia del robot mòbil ....................................................................................5
4.4 Tipus de robots ..................................................................................................7
4.5 Classificació dels robots amb rodes ...............................................................10
4.5.1 Configuració diferencial .........................................................................11
4.5.2 Configuració en Tricicle .........................................................................11
4.5.3 Configuració Ackerman .........................................................................12
4.5.4 Rodes Síncrones ......................................................................................12
4.5.5 Tracció omnidireccional .........................................................................13
4.5.6 Pistes de lliscament .................................................................................14
5 Futbol de robots .....................................................................................15
5.1 Intel·ligència artificial (IA) .............................................................................15
5.2 Agents Intel·ligents ..........................................................................................16
5.2.1 Agents reactius ........................................................................................17
5.2.2 Agents deliberatius ..................................................................................18
5.2.3 Agents híbrids ..........................................................................................18
5.3 Sistema multi-agent .........................................................................................18
5.4 Control distribuït .............................................................................................19
6 Simulador Robot Soccer .......................................................................21
6.1 Introducció del Robot Soccer .........................................................................21
6.2 Especificacions del simulador.........................................................................22
6.2.1 Requisits del sistema ...............................................................................22
6.2.2 L’interfície d’usuari ................................................................................23
6.2.3 Terreny de joc i robots ............................................................................23
6.2.4 Menú principal de l’interfície .................................................................25
6.2.5 Menú Strategies.......................................................................................25
6.2.6 Menú Time/Score ....................................................................................26
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
6.2.7 Menú en joc .............................................................................................27
6.2.8 Menú Replay ...........................................................................................27
6.3 Llenguatge de programació ............................................................................28
6.3.1 Fitxer DLL estàndard .............................................................................29
7 Implementació equips futbol ................................................................33
7.1 Equip dinàmic vs pseudo-dinàmic .................................................................33
7.2 Nivells de programació....................................................................................35
7.3 Estratègia equip dinàmic ................................................................................37
7.4 Estratègia equip pseudo-dinàmic ...................................................................38
7.5 Nivell 4. Accions ...............................................................................................39
7.5.1 Càlcul_angle_relatiu ...............................................................................39
7.5.2 Velocity ....................................................................................................40
7.5.3 Control_posició .......................................................................................40
7.5.3.1 Velocitat de joc ...........................................................................40
7.5.3.2 Control obstacles ........................................................................41
7.5.3.3 Control de velocitat ....................................................................42
7.5.3.4 Control obstrucció robot propi .................................................44
7.5.4 Ir_a_punto ...............................................................................................44
7.5.4.1 Control àrea pròpia....................................................................45
7.6 Nivell 3. Comportaments ................................................................................46
7.6.1 Porter .......................................................................................................46
7.6.1.1 Tapar situat al pal ......................................................................46
7.6.1.2 Allunyar pilota lateral................................................................47
7.6.1.3 Predicció interceptar pilota .......................................................47
7.6.1.4 Reubicar posició .........................................................................48
7.6.1.5 Allunyar pilota moviment giratori ...........................................48
7.6.2 Interceptar_perseguir_pilota ..................................................................49
7.6.2.1 Interceptar pilota .......................................................................49
7.6.2.2 Allunyar pilota moviment giratori ...........................................50
7.6.3 Rematar_perseguir_pilota ......................................................................50
7.6.3.1 Perseguir la pilota ......................................................................52
7.6.3.2 Conduir pilota.............................................................................52
7.6.3.3 Rematar a porteria .....................................................................53
7.6.4 Posicionar_secundari..............................................................................53
7.6.4.1 Situació al punt de defensa ........................................................54
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
7.6.4.2 Interceptar_perseguir_pilota ....................................................55
7.6.4.3 Control àrea pròpia....................................................................55
7.6.5 Reubicar_robots ......................................................................................55
7.6.5.1 Interceptar oponent ...................................................................58
7.6.5.2 Acompanyament passiu .............................................................58
7.6.5.3 Control de remat ........................................................................60
7.7 Nivell 2. Precondicions ....................................................................................61
7.7.1 PredictBall ...............................................................................................61
7.7.2 PEC (Pelota En Campo) .........................................................................61
7.7.3 MLP (Mejor Llegar Pelota) ....................................................................62
7.7.4 CCP (Contrario Controla Pelota) ...........................................................63
7.8 Nivell 1. Funcions generals .............................................................................64
7.8.1 Assignació_comportaments ....................................................................64
7.8.2 Canvi_coordenades .................................................................................66
7.8.3 Possessió_pilota .......................................................................................67
7.8.4 Temps_costat ...........................................................................................68
7.8.5 Temps_zona .............................................................................................69
8 Resultats .................................................................................................70
8.1 Paràmetres i condicions de joc .......................................................................70
8.2 Recopilatori de resultats .................................................................................71
8.3 Possessió de la pilota........................................................................................75
8.4 Pilota a cada meitat del camp .........................................................................77
8.5 Pilota a cada zona del camp............................................................................79
8.6 Nombre de gols marcats..................................................................................81
8.7 Victòries i empats ............................................................................................82
8.8 Observacions globals .......................................................................................83
9 Conclusions finals ..................................................................................84
10 Bibliografia ............................................................................................85
11 Anexes .....................................................................................................86
11.1 Codi programació Equip Dinàmic .................................................................86
11.2 Codi programació Equip Pseudo-dinàmic ..................................................1211
11.3 Dades resultats Robot Soccer .......................................................................1555
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
1
1 Objecte del Projecte
L’objectiu principal d’aquest projecte és implementar dues tècniques de control distribuït de dos equips de futbol de robots programades amb C++ i posteriorment, fer competir els dos equips mitjançant la plataforma Robot Soccer analitzant els resultats obtinguts.
Al futbol, ja sigui robòtic com real, ens trobem dins d’un entorn competitiu, és a dir, tots els jugadors competeixen per la seva posició dins el camp i per la possessió de la pilota. Per tant, s’han programat totes les funcions necessàries per tal de poder assignar als jugadors rols de porter, defenses o davanters per tal d’aconseguir un equip competitiu.
Primerament s’han implementat les accions bàsiques per al moviment dels robots com moure’s d’un punt a un altre, girar i avançar. Posteriorment, agrupant aquestes accions s’han aconseguit comportaments de nivell superior com interceptar, parar, allunyar, perseguir i xutar la pilota o posicionar als jugadors. Finalment, a partir dels comportaments i l’estat del joc, s’ha programat l’estratègia on els jugadors es comuniquen entre ells per tal de decidir que fa cadascun per a assolir l’objectiu final que és marcar el màxim nombre de gols i rebre els mínims.
A continuació, per tal de simular aquest projecte s’ha utilitzat un software anomenat “Robot Soccer 1.5a” que està desenvolupat per “The School of Information Technology” de la universitat Griffith University d’Austràlia i està implementat amb el Macromedia Director 8.5 Shockwave Studio. Aquest simulador s’utilitzava a l’assignatura “Robòtica Mòbil” impartida pel Dr. Albert Oller Pujol ja que permet moltes opcions ja sigui a l’hora de la simulació de partits com a l’hora de parar i repetir les jugades.
Per últim, s’analitzen els resultats obtinguts desprès de fer competir els dos equips avaluant els avantatges i desavantatges de cadascuna de les dues tècniques de control distribuït programades.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
2
2 Titular
El titular del projecte és el Departament d'Enginyeria Elèctrica, Electrònica i Automàtica (DEEEA) situat a l’avinguda Països Catalans, 26, Sant Pere i Sant Pau, Tarragona. El director del projecte és el Dr. Albert Oller Pujol.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
3
3 Antecedents
El present projecte parteix de l’equip de futbol de robots programat per l’autor d’aquest projecte a l’assignatura “Robòtica Mòbil” impartida pel professor Albert Oller i Pujol.
Amb el codi de programació realitzat amb Lingo s’implementava un equip de cinc robots per a jugar a futbol baix la plataforma Robot Soccer 1.5a. En aquest codi es definia un porter, dos defenses i dos davanters amb les seves funcions pertinents per tal de moure’s i posicionar-se en el camp i parar i xutar la pilota.
Amb la programació amb C++ implementada, s’amplien i es milloren les prestacions de cada robot així com l’estratègia global de l’equip on passem de tenir fixat el rol de cada robot a tenir un intercanvi de comportaments i posicions entre ells.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
4
4 Introducció
4.1 El futbol robòtic
Segurament, en llegir el títol del projecte, ens poden sorgir algunes preguntes sobre la importància o utilitat del mateix, com ara: ¿Quin interès té el futbol robòtic? ¿Quina aplicació real tenen uns robots futbolistes? ¿Perquè programar robots futbolistes podent programar un microxip amb una altra aplicació? Possiblement, hi hauria un espectre molt gran d’opinions segons quin sigui l’àmbit de cadascú (telecomunicacions, electrònica, dret, química...) però a nivell personal, el motiu és que sempre m’ha il·lusionat qualsevol tema relacionat amb la robòtica i entre ells els robots futbolistes.
A part del paràgraf anterior i entrant a l’àmbit tècnic, el futbol robòtic és un camp de proves interessant que està cobrant major interès any a any. A més del desafiament tecnològic que requereix desenvolupar un sistema complet perceptiu, locomotor, estratègic, que inclogui autolocalització i cooperació entre els seus membres, té l’ingredient extra de ser un entorn competitiu. Un equip de robots s’enfronta a un altre equip amb objectius oposats als seus. Des del punt de vista de la coordinació, és un escenari molt propici per a establir rols entre els membres de cada equip (porter, defensa, davanter…) amb estratègies de posicionament i comportaments específics.
La creació de robots que juguen a futbol involucra el desenvolupament, incorporació i consolidació de molts tipus de tecnologia que cobreix gairebé per complet les àrees d’intel·ligència artificial i robòtica com el disseny d’agents autònoms, fusió sensorial de temps real, disseny de sistemes multi-agent (SMA), adquisició d’estratègies, raonaments i planificació en temps real, mètodes de cooperació i treball en equip, tècniques de predicció, aprenentatge, visió per computadora, presa de decisions estratègica, control de moviments, sistemes de comunicació, etc, etc, etc.
La investigació i desenvolupament de tota aquesta gamma de tecnologies resulta un gran impacte científic, econòmic i social del que moltes altres àrees se’n beneficien directament. Per tant, l’interès de crear i programar robots que juguen a futbol comporta més beneficis que pròpiament els de veure vint-i-dos robots perseguint una pilota (símil de la definició per a qui no li agrada el futbol de “vint-i-dos homes amb pantalons curts corrent darrere una pilota”).
Abans de comentar i explicar en detall l’objectiu del present projecte, farem un petit esment sobre els robots, la seva evolució històrica i la seva classificació per a veure d’on venim i a on anem amb la intenció d’incrementar un mica, si cap, als lectors d’aquest projecte (moltes gràcies) l’interès per la robòtica. 4.2 El robot mòbil
Els robots són màquines en les que s’integren components mecànics, elèctrics, electrònics i de comunicació, i dotats d’un sistema informàtic per al control de temps real, percepció de l’entorn i programació.
No s’ha de confondre el que és un robot mòbil amb els vehicles autònoms utilitzats en les indústries guiats per cables o rails..., amb un entorn fortament estructurat per a la automatització de processos industrials.
Un robot mòbil ha de tenir la suficient intel·ligència com per reaccionar y prendre decisions basant-se en observacions del seu entorn, sense suposar que aquest entorn és perfectament conegut.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
5
Un robot mòbil haurà de planificar trajectòries i desprès evitar els obstacles que hi puguin haver en aquestes trajectòries variant així la trajectòria inicial. Un cop feta la planificació de la trajectòria es planifiquen moviments concrets i es controlen. El control d’aquests moviments busca determinar l’angle de direcció tenint en compte la posició i orientació actual respecte a la trajectòria, també és necessari resoldre el problema del control i regulació de velocitats.
4.3 Historia del robot mòbil
La primera vegada que es va utilitzar el terme robot va ser Karel Capek a la seva obra teatral Rossum's Universal Robots. L’obra s’estrenà per primera vegada al 1921 i explica la història de Rossum un inventor que crea robots capaços de servir als humans.
Després del seu perfeccionament els robots es rebel·len contra el seu amo i acaben destruint la vida humana. Aquesta paraula és d’origen txec (robota) i significa “treball de manera forçada”. Històricament, existeixen diversos autòmats molt avançats a la seva època. Exemples com ninots articulats a Egipte, Índia o Xina de segles d’abans de Crist. També el gall rellotge de la catedral d’Estrasburg al 1364, el rellotge i automatismes de la Plaça de San Marcos a Venècia que daten del 1493 o caixes musicals amb ballarines i autòmats diversos.
Figura 4.1. Ninots articulats d’Egipte, Índia o Xina.
Figura 4.2. Robot obra teatral Rossum's Universal Robots.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
6
La robòtica tal i com es coneix actualment sorgeix als anys 50 amb l’aparició de la cibernètica però fins l’aparició del microprocessador no s’avança ràpidament. De la dècada dels 50 era Grey Walter que va construir vuit tortugues amb un fototub com a ull capaces de moure’s al voltant d’una llum que transforma en energia elèctrica per emmagatzemar en un acumulador que té dins. Un cop està carregada s’allunya de la llum.
Figura 4.3. Tortugues de Grey Walter.
Al 1969 un equip d’investigació de Standford va crear a Shakey. Era una capsa quadrada, amb una càmera de televisió, amb un telèmetre i una antena de ràdio. El món de Shakey era un micromon de blocs de grandària natural composat de set habitacions connectades entre sí amb vuit portes. A les habitacions hi havia cubs que Shakey podia manipular, apilar i transportar per mitjà d’un teclat.
Als anys 80 amb els ordinadors empotrats, robots amb dos càmeres de visió estereoscòpica feien una reconstrucció 3D del voltant una mica limitada. Reconeixien objectes i navegaven entre ells però eren molt lents i necessitaven molt de temps per recórrer un petit trajecte.
Actualment el concepte de robòtica inclou els sistemes mòbils autònoms, capaços de sortir-se’n per sí mateixos en entorns desconeguts i sense necessitat de supervisió humana.
Per tant, la història de la robòtica es pot dividir en tres generacions:
1) El robot es capaç de repetir una seqüència pre-gravada de moviments, sense realimentació sensorial (control en llaç obert).
2) El robot adquireix informació limitada de l’entorn i actua en conseqüència (control de llaç tancat). Pot localitzar, classificar (mitjançant visió) i detectar esforços per adaptar els seus moviments.
3) El robot utilitza intel·ligència artificial per resoldre el problema plantejat. La seva programació està realitzada en llenguatge d’alt nivell.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
7
4.4 Tipus de robots Actualment, existeixen una gran varietat de robots segons la seva funcionalitat i
l’entorn. Per exemple, podem diferenciar en quatre grans grups:
• Terrestres: en molts casos consisteix en dotar d’intel·ligència a un vehicle convencional. Exemples com els vehicles, els robots amb potes o els manipuladors industrials.
Figura 4.4. Robot de Honda.
• Espacials: serveixen per estudiar, fer fotografies i agafar mostres de l’espai exterior i de planetes.
Figura 4.5. Robot espacial.
• Aquàtics: aquests robots són impulsats per hèlix o turbines, altres simulen el moviment d’animals aquàtics amb aletes. Serveixen per explorar, observar i recol·lectar mostres del fons marí.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
8
Figura 4.6. Robot aquàtic.
• Aeris: principalment utilitzat en investigacions per aplicacions militars, per exemple en avions d’exploració que tenen com a objectiu principal entrar a les línies enemigues sense ser detectats i realitzar un reconeixement del terreny i de l’enemic.
Figura 4.7. Robot aeri.
Pel que respecta a la temàtica d’aquest projecte, ens centrarem amb els robots mòbils
utilitzats al futbol robòtic. En particular, realitzarem un petit comentari d’uns quants exemples existents a les competicions internacionals.
• Mirosot: robot amb unes dimensions de 7,5 x 7,5 x 7,5 cm. Té dues rodes independents que li permeten girar sobre sí mateix i avançar o retrocedir descrivint arcs.
Figura 4.8. Robot categoria Mirosot.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
9
• CMU Hammerhead: les rodes davanteres tenen tracció independent i les trasseres estan muntades sobre el xassís que conté la unitat de procés, les bateries i el sistema de visió.
Figura 4.9. Robot CMU Hammerhead.
• Middle Size League: robots totalment autònoms amb sensors i un sistema individual de visió. Poden mesurar com a màxim 50 x 50 cm amb una altura de 80 cm i un pes de 40 kg.
Figura 4.10. Robots categoria Middle Size League.
• Robot NAIST: posseeix acoplat un PC portátil i està envoltat de sensors táctils.
Figura 4.11. Robot NAIST.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
10
• Gossos quadrúpedes Sony: requereixen mecanismes més complexes per a desplaçar-se ja que han de coordinar les quatre potes on una d’elles té 3 graus de llibertat.
Figura 4.12. Robot aeri.
• Hurosot: consta de robots humanoides autònoms de dos cames amb una altura màxima de metre i mig i un pes màxim de 30 kg.
Figura 4.13. Robot aeri.
4.5 Classificació dels robots amb rodes
Segons com estiguin distribuïts els principals elements que composen un robot la precisió i mesures serà més o menys bona.
En relació a les rodes, existeixen diverses configuracions: diferencial, tricicle, Ackerman, rodes síncrones, tracció omnidireccional i pistes de lliscament.
A continuació s’expliquen totes aquestes configuracions.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
11
4.5.1 Configuració diferencial Aquesta configuració és la que tenen els robots Yujin utilitzats en la realització del
present projecte.
La configuració diferencial consta de dos rodes situades en un eix perpendicular a la direcció del robot. Cada una d’elles va dotada d’un motor, de forma que els girs es produeixen donant-los-hi velocitats diferents. Així, si volem girar a la dreta donarem més velocitat al motor que controla la roda esquerra. Per girar a l’esquerra, el motor dret tindrà més velocitat. Però amb dos rodes és impossible mantenir l’horitzontalitat del robot.
Aquest mètode és molt sensible a la relació entre la velocitat de les dues rodes, ja que petits errors en les velocitats de cada roda poden provocar diferents trajectòries.
Figura 4.14. Configuració mode diferencial.
4.5.2 Configuració en Tricicle En aquest cas es disposa de tres rodes situades de manera similar a un tricicle dels
nens. Es tenen dos rodes al darrere que no porten cap motor. La roda davantera és la que té tracció, la que dirigeix al robot.
Un problema associat a aquesta configuració és que el centre de gravetat tendeix a allunyar-se de la roda de tracció en terrenys inclinats quan el robot està pujant. Això produeix una pèrdua de la tracció del robot. Al perdre’s el contacte amb el terra la roda davantera continua girant però el robot no avança.
Figura 4.15. Configuració tricicle.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
12
4.5.3 Configuració Ackerman És una configuració utilitzada per l’industria de l’automòbil amb dos rodes amb
tracció del darrere i dos rodes directrius al davant. Aquesta configuració està dissenyada per a que la roda davantera interior en un gir tingui un angle lleugerament més agut que l’exterior i evitar el derrapatge de les rodes.
La relació entre els angles de les rodes directrius ve donada per l’equació d’Ackerman:
(1.1)
On
θi = angle relatiu de la roda interior
θo = angle relatiu de la roda exterior
d = separació lateral entre rodes
l = separació longitudinal entre rodes
La configuració Ackerman constitueix un bon sistema de tracció inclús en terrenys inclinats. No obstant això, la construcció d’un robot amb configuració Ackerman és complicada respecte a les anteriors.
Figura 4.16. Configuració Ackerman.
4.5.4 Rodes Síncrones Aquesta configuració consisteix en tres o més rodes on totes elles van dotades de
tracció i acoblades mecànicament de forma que totes giren a la mateixa direcció o amb la mateixa velocitat. Aquesta configuració necessita una gran sincronització.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
13
Figura 4.17. Rodes síncrones.
4.5.5 Tracció omnidireccional Aquesta configuració tracta de dotar al robot amb rodes omnidireccionals. Es basa en
tres rodes directrius i motrius. Així s’aconsegueixen tot tipus de moviments i el robot es pot situar en qualsevol orientació.
Figura 4.18. Roda omnidireccional.
Figura 4.19. Configuració amb tracció Omnidireccional.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
14
4.5.6 Pistes de lliscament Aquesta configuració és semblant a un tanc militar. Les rodes són pistes de
lliscament que donen impuls i direcció al robot. S’utilitza en navegació per terrenys irregulars i la seva resistència al desgast és major en front les altres configuracions.
Figura 4.20. Robot anti-bombes.
Figura 4.21. Robot MAARS utilitzat en la guerra d’Afganistan.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
15
5 Futbol de robots El futbol de robots pot ser considerat com un joc bastant específic però molt atractiu
al mateix temps, on problemes summament interessants poden ser abordats com objecte d’investigació. Bàsicament, un partit de futbol de robots consisteix en dos equips que competeixen entre sí per a assolir un sol objectiu que és guanyar el partit. Així, cada equip està compost de múltiples agents (Sistemes Multi-Agent) que han de treballar junts per a aconseguir-ho.
Podem veure també que la forma de guanyar un partit pot dividir-se, a la vegada, en dos objectius més específics com marcar la major quantitat de gols i evitar que l’equip contrari marqui. Per a aconseguir-ho, cada agent (jugador) ha d’actuar ràpidament i de forma cooperativa, tenint en compte tant situacions locals com globals, de forma i manera de seguir una estratègia d’equip compartida per tots els agents.
Un dels aspectes més interessants està relacionat amb que els objectius dels dos equips en un partit de futbol són exactament oposats. Això fa que el domini del futbol de robots pot caracteritzar-se com col·laboratiu i advers al mateix temps. És a dir, l’equip contrari es podria veure com un ambient totalment advers amb la capacitat d’obstruir i impedir el compliment de l’objectiu del nostre equip.
Per altra banda, un altre aspecte a considerar és que l’ambient en un partit de futbol canvia contínuament i, per tant, es requereix una ràpida presa de decisions per a poder respondre a aquests canvis.
Per tot això, el futbol de robots es considera una bona plataforma d’investigació i recerca per a poder afrontar i solucionar problemes robòtics amb característiques similars al món industrial.
A continuació passarem a comentar els aspectes més teòrics, anomenats en els anteriors paràgrafs, pel que respecta al futbol robòtic.
5.1 Intel·ligència artificial (IA) Després de la fundació de la federació internacional de robots futbolistes anomenada
FIRA (Federation of International Robot-soccer Association) s’ha celebrat anualment un torneig internacional baix el nom de “FIRA Robot World Cup”.
La “FIRA Robot World Cup” és una iniciativa internacional per a promoure els avanços en Intel·ligència Artificial i Robòtica tot enfocat sobre un problema estàndard pel que fa a la investigació com és el futbol robòtic. No només té a veure amb la investigació i desenvolupament del “hardware” dels robots, sinó que també té a veure amb el “software” de la seva intel·ligència.
Per a assolir el seu objectiu, que és aconseguir que un grup de robots sigui capaç de jugar al futbol de forma autònoma, intel·ligent i coordinada, es requereix desenvolupar i integrar una àmplia gamma de tècniques i algoritmes d’Intel·ligència Artificial i Sistemes Intel·ligents.
El problema estàndard de la “FIRA Robot World Cup” és summament interessant i complexe a la vegada degut a que hi ha múltiples robots movent-se a gran velocitat en un ambient dinàmic i incert. Algunes tècniques d’Intel·ligència Artificial utilitzades són per exemple el disseny d’agents autònoms, algoritmes de coordinació i col·laboració multi-agent, de raonament i aprenentatge automàtic en temps real, etc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
16
La Intel·ligència Artificial (IA) és un subcamp de la Informàtica dedicat a la construcció d’agents que exhibeixen aspectes de comportament intel·ligents, és a dir, que puguin “pensar”. La idea de construir una màquina que pugui executar tasques interpretades com que requereixen d’intel·ligència humana és atractiu.
Altres definicions sobre Intel·ligència Artificial que puguin aclarir aquest terme són: • Disciplina científico-tècnica que tracta de crear sistemes artificials capaços de
comportaments que, de ser realitzats per éssers humans, es diria que requereixen d’intel·ligència.
• La Intel·ligència Artificial és l’estudi de com fer que els ordenadors facin coses que avui en dia són realitzades millor pels éssers humans. (Rich y Knight)
• Estudi dels mecanismes de la intel·ligència i les tecnologies que el sustenten. (Newell)
• Intent de reproduir o modelar la manera en que les persones identifiquen, estructuren i resolen problemes difícils. (Pople)
Però des dels seus inicis fins l’actualitat, la Intel·ligència Artificial ha hagut de fer front a una sèrie de problemes:
• Els computadors no tenen autoconsciència (emocions, sociabilitat, etc.).
• Un computador només pot fer allò per al que està programat.
• Les màquines no poden pensar realment.
5.2 Agents Intel·ligents Un agent pot definir-se com una entitat, semi o completament autònoma, que situat
en algun entorn, actua racionalment d’acord a les seves percepcions de l’exterior i l’estat del seu coneixement. És a dir, l’agent rep entrades sensorials d’un entorn on està situat i realitza accions que canvien l’esmentat entorn.
Els agents es poden caracteritzar pels següents punts:
• Autonomia: els agents operen sense la intervenció directa dels éssers humans i tenen cert tipus de control sobre les seves accions i estats interns.
• Reactiu: els agents perceben el seu ambient (el qual pot ser el món físic, una interfície gràfica, Internet,...) i respon en un temps raonable per a canviar el que succeeix en ell.
• Pro-actiu: els agents no han d’actuar simplement en resposta al seu entorn, sinó que han de ser capaços d’exhibir comportaments dirigits a aconseguir objectius que siguin oportuns i prendre la iniciativa quan convingui.
• Social: els agents han de ser capaços d’interactuar, quan convingui, amb altres agents artificials o humans per a completar el seu propi procés de resolució del problema i ajudar a altres amb les seves activitats.
• Continuïtat temporal: es considera un agent un procés sense fi, executant-se contínuament i desenvolupant la seva funció.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
17
• Racionalitat: l’agent sempre realitza “el correcte” a partir de les dades que percep de l’entorn.
• Adaptabilitat: està relacionat amb l’aprenentatge que un agent és capaç de realitzar i si pot canviar el seu comportament basant-se en aquest aprenentatge.
• Mobilitat: capacitat d’un agent per traslladar-se a través d’una xarxa telemàtica.
• Veracitat: donar per entès que un agent no comunica informació falsa a propòsit.
• Benevolència: donar per entès que un agent està disposat a ajudar a altres agents si això no entra en conflicte amb els seus propis objectius.
No existeix un consens sobre el grau d’importància de cadascuna d’aquestes
propietats per a un agent. No obstant això, es pot afirmar que aquestes propietats són les que distingeixen als agents de simples programes.
Una vegada comentades les característiques que ha de tenir un agent per a ser considerat com a tal, els classificarem en tres grans grups:
• Agents reactius
• Agents deliberatius
• Agents híbrids
5.2.1 Agents reactius Es basen en el model percepció-acció. Es limiten a percebre l’ambient i en base a
l’estat del mateix defineixen una acció. En ambients que són totalment observables poden adaptar-se correctament però estan exposats a punts morts en ambients parcialment observables.
Els millors resultats s’obtenen en ambients estables que no pateixen modificacions considerables sobtades causades per la velocitat que imprimeix la presa de decisions. Pel contrari, els comportaments aconseguits solen ser simples i, al no tenir memòria ni capacitat de retenir estats anteriors, són incapaços d’adaptar les seves decisions als canvis.
Habitualment són construïts en base a màquines d’estat o arbres de decisió, és a dir, totes les decisions han d’estar predefinides inicialment incloent-hi la coordinació entre els agents. Aquestes restriccions afecten sobretot als sistemes multi-agent on és important que cadascú pugui anticipar les conseqüències dels seus actes i les dels altres i, per tant, s’obtenen mals resultats pel que fa a la cooperació. El comportament global observat en la majoria dels casos sembla més un cúmul d’agents perseguint objectius individuals que no pas un equip amb objectius globals.
Per altra banda, també existeixen agents reactius basats en un model de l’ambient que els permet conèixer els diferents estats en els quals es poden trobar en cada moment. En base a aquests estats, i les regles d’acció definides per a cadascun d’ells, els agents prenen les decisions i actuen.
Encara que els agents basats en aquest model poden ser eficients al moment de prendre decisions, la incapacitat de planificació a llarg termini poden tornar-los poc útils en sistemes on es requereix que cada agent sigui conscient de les pròpies metes.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
18
5.2.2 Agents deliberatius Els sistemes deliberatius, a diferencia dels reactius, basen les seves decisions en el
model condició-cognició-acció. Aquest cicle agrega una etapa on, clàssicament, es realitza reconeixement de la informació de l’entorn i planificació. Solen considerar informació del passat recent a més de la que reben a través dels sensors.
Poden considerar la predicció per a anticipar l’efecte d’accions passades i també l’ús de motors lògics que permeten millorar les regles i proposicions que s’utilitzen per a modelar els diferents escenaris.
D’entre els avantatges que presenten els sistemes deliberatius sobre els sistemes reactius és el poder d’expressivitat, entenent com a tal, la capacitat de modelar aspectes del món, el que els sistemes reactius no tenen. Una debilitat important d’aquest punt de vista és el temps de còmput que pot requerir una única decisió.
Depenent de la quantitat d’aspectes del món tinguts en compte i la complexitat del anàlisi, una sola decisió podria durar des d’una fracció de segon fins a minuts, essent aquest punt de vista prohibitiu en alguns entorns com el futbol de robots.
5.2.3 Agents híbrids Els enfocaments reactius i deliberatius mostren fortaleses i debilitats. Aquest
enfocament intenta ser una solució que engloba el millor dels dos minimitzant les seves debilitats. La proposta de l’aproximació híbrida és prendre l’expressivitat de l’aproximació deliberativa i el temps de processament de l’aproximació reactiva, intentant prendre decisions intel·ligents garantint el temps de resposta. Per això, els sistemes híbrids es componen de dos components de presa de decisions: un de deliberatiu i un altre reactiu.
Aquests components s’executen en paral·lel tot el temps. Normalment, s’utilitzen les decisions adoptades pel component deliberatiu però si la presa de decisió s’allarga, s’utilitza la component reactiva. La decisió reactiva no és tan bona com la deliberativa però és millor que no fer res.
5.3 Sistema multi-agent Del apartat anterior sabem que un agent pot ser vist com una entitat ubicada en un
cert entorn amb la capacitat de percebre i actuar sobre ell per a assolir els seus objectius. Però quan en el mateix entorn es troben varis agents formant un sistema, aquests necessiten comunicar-se i coordinar-se entre sí. En aquest cas, ens trobem en presencia de Sistemes Multi-agent (SMA).
Concretament, podem definir un Sistema Multi-agent com una xarxa d’agents amb un objectiu particular treballant conjuntament per a resoldre, més enllà de les capacitats o del coneixement de cadascun, problemes més complexes.
Tècnicament, els Sistemes Multi-agent són un camp de la Intel·ligència Artificial (IA) amb l’ànim de proporcionar principis per a la construcció de sistemes complexes amb múltiples agents i mecanismes per coordinar comportaments d’agents independents.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
19
Encara que la major dificultat d’aquests sistemes se centra en la resolució de la comunicació i coordinació entre els agents que composen el sistema, els motius per a l’elecció d’un SMA pel que respecta al futbol de robots són els següents:
• Els sistemes estan geogràficament distribuïts. És a dir, els agents tenen diferents zona d’influència encara que aquestes puguin coincidir en alguns casos.
• Els sistemes tenen molts components. Per tant, és necessària una coordinació i una comunicació entre ells.
• Els sistemes són fortament heterogenis. Els agents tenen comportaments diferents entre ells (porter, defensa, davanter,...) i necessiten d’una cooperació per a assolir l’objectiu final.
A continuació comentarem les característiques i l’elecció del control per a poder
coordinar els robots entre sí fins a assolir l’objectiu comú.
5.4 Control distribuït La decisió més fonamental que es pren al definir l’arquitectura d’un grup és si el
sistema de control és centralitzat o distribuït. Les arquitectures centralitzades estan caracteritzades per un únic agent de control mentre que les arquitectures distribuïdes manquen d’aquest agent. Concretament, en arquitectures distribuïdes tots els agents són iguals en termes de control.
A continuació es mostren les principals característiques de cada tipus de control:
• Centralitzat
o Permet obtenir una solució òptima.
o Requereix comunicació global.
o Requereix molta informació.
o Es pot crear un coll d’ampolla.
o És molt lent.
o No és robust (punt únic d’error).
• Distribuït
o Cada robot decideix que fer pel seu compte.
o No es necessita acumular informació.
o Es minimitza la comunicació.
o Els robots o subgrups poden fallar.
o El grup es pot redimensionar dinàmicament.
o Els robots es poden adaptar (comportaments).
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
20
La categoria Middle League MiroSot o Simurosot a primera vista pot pertànyer a un control bàsicament centralitzat. La raó principal és l’existència d’una entitat de processament clarament privilegiada com l’ordinador que rep la imatge de vídeo i emet les comandes als robots.
No obstant això, podem considerar que ens trobem dins d’un control distribuït. Més enllà de la distribució física dels elements del sistema, tots els robots són iguals pel que fa al control. A més, en cas d’error d’algun robot no tenim una fallada del sistema i aquests poden adquirir diferents comportaments comunicant-se amb els altres i decidint que fer entre ells.
En el següents capítols s’explica amb detall la programació de les tècniques de control distribuït per a controlar i coordinar a la plataforma Robot Soccer un Sistema Multi-agent d’agents intel·ligents, o dit d’una altra forma, un equip Simurosot de 5 jugadors.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
21
6 Simulador Robot Soccer 6.1 Introducció del Robot Soccer
Robot Soccer va ser desenvolupat pel professor Jong-Hwan Kim del KAIST (Korean Institute of Technology) l’octubre de 1995 per aprendre i aplicar intel·ligència artificial, sensors, control i també software i hardware. Des de llavors i fins ara ha crescut contínuament la participació de joves científics.
El primer torneig Robot Soccer World Cup va tenir lloc a KAIST el novembre de 1996 i el segon es va jugar al mateix lloc el juny de 1997. Només tres anys després es va fundar una federació internacional de robots futbolistes composta por 34 països anomenada FIRA (Federation of International Robot-soccer Association). Després de la inauguració oficial de la FIRA, tots els partits internacionals s’han anomenat “FIRA Robot World Cup”. La meta final d’aquesta federació seria que a mitjans del segle XXI un equips de robots humanoides completament autònoms guanyin, d’acord amb les regles oficials de la FIFA, al guanyador de la copa del món de futbol més recent.
Ja que diàriament està creixent l’entusiasme per la competició “FIRA Robot World Cup”, es va desenvolupar “The Robot Soccer Simulator™” amb el propòsit de simular els moviments físics dels robots Yujin a una plataforma de simulació. D’aquesta manera, es va expandir internacionalment la competició per a la majoria de gent ja que entre les utilitats de “The Robot Soccer Simulator™” està inclòs el desenvolupament d’estratègies que podran ser utilitzades posteriorment pels robots Yujin a la competició “FIRA Robot World Cup”.
Figura 6.1. Robot Yujin.
Hi ha dos plataformes de Robot Soccer, en una hi juguen onze jugadors contra onze (Large League SimuroSot) i en l’altra cinc jugadors contra cinc (Middle League SimuroSot). El simulador utilitzat en aquest projecte és un software anomenat “Robot Soccer 1.5a” que està desenvolupat per “The School of Information Technology” de la universitat Griffith University d’Austràlia i està implementat amb el Macromedia Director 8.5 Shockwave Studio. Es va realitzar aquesta plataforma per la FIRA Simurosot Game, que és un torneig de simulació de robots futbolistes on cada equip realitza la seva estratègia.
Concretament, s’ha escollit el simulador de cinc contra cinc (Middle League SimuroSot) ja que el “Robot Soccer 1.5a” és el software que s’utilitzava a l’assignatura “Robòtica Mòbil” impartida pel Dr. Albert Oller Pujol i també perquè permet moltes opcions ja sigui a l’hora de la simulació de partits com a l’hora de parar i repetir les jugades.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
22
Figura 6.2. Simulador Robot Soccer 1.5a..
A continuació es comentaran les característiques d’aquest software on la idea és que pugui ser usat com a manual bàsic.
6.2 Especificacions del simulador
6.2.1 Requisits del sistema Els requisits mínims del sistema que es recomana que s’utilitzi el simulador de Robot
Soccer en ordinadors són els següents:
• Pentium III 600 MHz
• 256 megabytes de memòria RAM
• Tarjeta 3d Graphics accelerator amb 32 megabytes de RAM
• CD-ROM amb velocitat de 24x
• Resolució de pantalla de 800 x 600 píxels
• Tarja de so de 16 bit
• Sistema operatiu: Microsoft Windows XP
• DirectX 8.0
• 10 megabytes lliures de disc dur
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
23
6.2.2 L’interfície d’usuari Quan s’obre el programa es presenta la següent pantalla on es mostra el terreny de
joc i a la dreta de la pantalla hi ha els menús i la informació de la plataforma.
Figura 6.3. Vista general del simulador Robot Soccer 1.5a..
L’usuari pot seleccionar els robots, col·locar-los en la posició desitjada i rotar-los. Per rotar-los es necessita seleccionar el robot i llavors polsar:
Tecla “←” per rotar el robot en sentit anti-horari.
Tecla “→” per rotar el robot en sentit horari.
L’usuari pot polsar el menú per desplegar les opcions incloses. Sota el menú està situat el comptador de temps i el marcador de gols.
6.2.3 Terreny de joc i robots El terreny de joc de la plataforma està basat en un de real de mida 220 cm x 180 cm.,
Com a curiositat, a l’hora de programar s’ha de tenir en compte que el valor de les variables donades pel simulador són en polzades.
Per tant, si es vol realitzar un canvi de polzades a centímetres només haurem de tenir compte la següent relació:
1 polzada (inch) = 2,54 cm (1.2)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
24
Figura 6.4. Mesures del terreny de joc real en cm.
Pel que fa als robots, cada equip està format per cinc jugadors en forma de cub amb
unes dimensions reals de 7,5 × 7,5 × 7,5 cm amb una petita ranura a la part frontal per a dominar millor la pilota. Una altra característica és que, per a permetre la identificació de les posicions i orientacions dels robots dins al terreny de joc, cadascun posseeix a la part superior un adhesiu de 3,5 x 3,5 cm amb el color corresponent de l’equip (groc o blau) i un altre color per a diferenciar-se dels altres.
Els robots Yujin reals tenen dues rodes i són robots amb tracció diferencial. Per a cada roda es determina una velocitat on la diferencia entre les dues, permetrà modificar la posició i la orientació. Segons si la diferencia de velocitat és positiva o negativa, el robot girarà en sentit horari o en sentit anti-horari.
Pel que respecta al simulador Robot Soccer 1.5a, per defecte els jugadors es localitzen a les posicions de la següent figura, on els jugadors Y (yellow) són els 5 jugadors de l’equip groc i els jugadors B (blue) són els 5 jugadors de l’equip blau. També podem observar la diferencia de colors per a identificar individualment cada robot.
Figura 6.5. Distribució i color dels robots dels dos equips al terreny de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
25
6.2.4 Menú principal de l’interfície En aquest apartat és comentaran els diferents botons del menú principal:
• Strategies: l’usuari ha de polsar aquí per carregar les estratègies de cada equip, segons sigui l’equip Blue o el Yellow.
• Estats possibles del joc: aquests botons són per a l’àrbitre per marcar una falta a un equip determinat i declara qui tindrà la possessió de la bola. Una vegada polsat el missatge serà mostrat a la pantalla sota del terreny de joc.
• Start: Per començar el joc.
• Time: Mostra el temps jugat.
• Score: la puntuació actual.
• Time/Score: aquest botó porta a l’usuari a poder modificar el temps i la puntuació
• New Game: reinicia tot i prepara per a un nou joc.
• Help: l’usuari pot prémer aquest botó per a accedir a una versió electrònica del manual ja sigui al inici o mentre s’està jugant.
Figura 6.6. Menú principal del simulador Robot Soccer 1.5a.
6.2.5 Menú Strategies
Aquestes estratègies estan col·locades a la carpeta “c:\Strategy” situada al disc dur. Dins d’aquesta carpeta hi ha dos carpetes amb els noms dels dos equips: yellow i blue. S’ha d’assegurar que l’estratègia que volem que realitzi l’equip està situada dins la carpeta corresponent.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
26
• Se selecciona el llenguatge de programació utilitzat prement Lingo/C++.
• S’introdueix l’estratègia teclejant el nom de l’arxiu que conté l’estratègia per l’equip blau o l’equip groc. L’estratègia ha d’estar situada per l’equip blau a la carpeta “c:\strategy\blue” i per l’equip groc a “c:\strategy\yellow”.
• Send: polsant aquest botó es carreguen les estratègies al simulador.
• Open Viewer: s’obre el visor que permet veure les coordenades dels jugadors i la pilota mentre s’està jugant. També permet veure les mesures del terreny de joc.
Figura 6.7. Menú Strategies del simulador Robot Soccer 1.5a.
6.2.6 Menú Time/Score Si el temps o el nombre de gols necessita ser modificat l’àrbitre pot utilitzar aquesta
interfície per fer ajustaments.
• Time: l’àrbitre pot ajustar el temps amb qualsevol d’aquests botons, pot afegir o treure minuts o segons.
• Score: es pot alterar el marcador. L’àrbitre ha de polsar damunt del nombre de gols que es vol modificar i teclejar el valor desitjat.
• Time/Score: si es polsa una altra vegada es torna al menú principal amb els canvis que s’han realitzat.
Figura 6.8. Menú Time/Score del simulador Robot Soccer 1.5a.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
27
6.2.7 Menú en joc Aquest menú s’observa quan s’ha iniciat el joc i mentre s’està jugant es pot polsar:
• Replay: tornar a veure la jugada.
• Pause: pausar el joc.
• Stop: permet parar el joc i tornar al menú per prendre decisions.
Figura 6.9. Menú en joc del simulador Robot Soccer 1.5a.
6.2.8 Menú Replay Quan s’està veient la repetició de la jugada a la dreta de la pantalla apareix el menú
següent:
Figura 6.10. Elecció de vistes al menú Replay del simulador Robot Soccer 1.5a.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
28
• A: visió des de la pilota i la segueix durant tot el seu moviment.
• B: es veu tot el camp tal i com es veu mentre es juga. És la visió que ofereix per defecte.
• C: es veu només la porteria de l’equip blau.
• D: es veu només la porteria de l’equip groc.
• E: es veu tot el terreny de joc des de la porteria de l’equip blau.
• F: es veu tot el terreny de joc des de la porteria de l’equip groc.
• G: és una vista amb l’equip blau a la dreta i el groc a l’esquerra.
• H: és una vista amb l’equip groc a la dreta i el blau a l’esquerra.
Per altra banda, també apareix el següent menú que ens permet avançar o retrocedir
la jugada a l’hora de la repetició:
Figura 6.11. Menú Replay del simulador Robot Soccer 1.5a.
• <<►: rebobina al principi de la jugada i la torna a mostrar.
• <<\►: rebobina els últims 300 fotogrames i els tornar a mostrar.
• NORM: mostra la repetició a velocitat normal.
• SLOW: mostra la repetició lentament
• STOP FRAME: es para en un fotograma.
• ◄║: avança un fotograma.
• ║►: rebobina un fotograma
• EXIT REPLAY: surt de la repetició actualitzant el gol al marcador.
• NO GOAL: surt de la repetició sense pujar el gol al marcador.
6.3 Llenguatge de programació
El “Robot Soccer 1.5a” accepta la programació d’estratègies ja sigui amb llenguatge C++ o en Lingo. El llenguatge C++ necessita d’un compilador en canvi amb Lingo no. No obstant això, s’ha escollit programar amb llenguatge C++ amb el programa “Microsoft Visual C++ 6.0” ja que permet l’aplicació de més funcions i llibreries que el Lingo no accepta. A més, amb el compilador podrem detectar els possibles errors de programació que per altra banda, amb el Lingo és molt difícil.
Com hem comentat anteriorment, podrem seleccionar el llenguatge de programació utilitzat prement el botó Lingo/C++ del menú Strategies del simulador.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
29
Figura 6.12. Llenguatges de programació de Robot Soccer 1.5a.
A continuació descriurem l’interfície C++ definida per a la comunicació amb el simulador que es correspon d’un fitxer DLL que conté, a part de la programació de l’estratègia, l’estructura de funcions bàsica per a poder programar els comportaments dels robots de l’equip.
6.3.1 Fitxer DLL estàndard En aquest apartat és descriurà el fitxer estàndard inicial compost per un fitxer on
cada usuari programarà la seva estratègia (*.cpp) i una llibreria (*.h).
En posteriors apartats es comenta la programació detallada de l’estratègia ja que inicialment no està programada. Per aquest motiu, ens centrarem en el fitxer llibreria anomenat Strategy.h que conté les diferents variables i les funcions bàsiques per a poder realitzar la programació de l’estratègia de l’equip.
Concretament, la llibreria consta de tres funcions per a poder interactuar entre l’interfície C++ i el simulador Robot Soccer.
Funcions de Strategy.h
void Create(Environment *)
void Destroy(Environment *)
void Strategy(Environment *)
Taula 6.1. Funcions existents dins el fitxer llibreria Strategy.h.
La funció Create(…) s’invoca només una vegada, al moment en que es carga el fitxer DLL de l’equip, és a dir, serveix per a inicialitzar certes variables dins de l’estratègia, mentre que la funció Destroy(…) es crida amb la finalitat d’alliberar recursos (memòria, fitxers, etc.) utilitzats durant el joc.
Finalment, la més important és la funció Strategy(…), la qual és invocada pel simulador a cada pas de simulació. D’aquesta manera, a partir d’aquesta funció, s’intercanviaran les dades entre el simulador i l’estratègia mitjançant un punter a la estructura Environment (entorn).
En aquesta estructura, el simulador actualitzarà entre altres variables, les posicions i orientacions actuals de tots els robots, així com també la posició actual de la pilota. Per la seva part, l’estratègia haurà d’actualitzar a cada pas de simulació, les velocitats de la roda esquerra i la dreta dels diferents robots on aquesta informació serà enviada també a través del punter Environment.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
30
Concretament, les estructures de dades definides a la llibreria Strategy.h que serviran de guia per a poder realitzar la programació de l’estratègia de l’equip són les següents:
Estructura Descripció
typedef struct { double x, y, z; } Vector3D;
Estructura auxiliar que representa un vector a l’espai tridimensional. Actualment, la component z de les variables d’aquest tipus no s’utilitzen mai.
typedef struct { long left, right, top, bottom; } Bounds;
Estructura auxiliar que representa els límits de la superfície rectangular de joc.
typedef struct { Vector3D pos; double rotation; double velocityLeft, velocityRight; } Robot;
Estructura auxiliar que representa un robot propi. Els camps pos i rotation s’omplen pel simulador a cada pas de simulació de la funció Strategy( ). En canvi, els altres dos camps de les velocitats de les rodes, seran emplenats obligatòriament per l’estratègia de l’equip realitzada per l’usuari.
typedef struct { Vector3D pos; double rotation; } OpponentRobot;
Estructura auxiliar que representa un robot contrari. A diferencia de l’estructura Robot, aquesta conté només informació passada del simulador cap a l’estratègia.
typedef struct { Vector3D pos; } Ball;
Estructura auxiliar que representa la pilota. La única informació proporcionada per a la pilota és la seva posició.
typedef struct { Robot home[PLAYERS_PER_SIDE]; OpponentRobot opponent[PLAYERS_PER_SIDE]; Ball currentBall, lastBall, predictedBall; Bounds fieldBounds, goalBounds; long gameState; long whosBall; void *userData; } Environment;
Estructura principal de la interfície. En ella, s’emmagatzemen totes les dades intercanviades entre el simulador i l’estratègia (i viceversa). El camp predictedBall pot ser definit per l’usuari per a predir la posició de la pilota. Actualment, els camps fieldBounds i goalBounds no s’utilitzen, és a dir, el simulador no actualitza aquests camps. El camp userData està pensat per a emmagatzemar informació, al llarg del joc, definida per l’usuari.
Taula 6.2. Estructures de dades definides dins el fitxer llibreria Strategy.h.
Al fitxer Strategy.h es defineixen també certes constants que seran d’utilitat ja que indiquen els estats possibles del joc (que seran actualitzades al camp gameState del Environment), i la informació de qui té la possessió de la pilota després del servei inicial (aquesta informació es passa a través del camp whosBall del Environment).
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
31
Constant Valor Descripció
FREE_BALL 1 Disputa pilota
PLACE_KICK 2 Servei mig camp
PENALTY_KICK 3 Tir de penal
FREE_KICK 4 Tir de falta
GOAL_KICK 5 Servei de porteria
Taula 6.3. Constants que defineixen els estats de joc per al camp gameState del Environment.
És important comentar que no es defineix cap constant quan el valor del camp gameState és zero. Això passa quan al simulador no s’actualitza cap dels estats anteriors.
Constant Valor Descripció
ANYONES_BALL 0 Ningú té la pilota
BLUE_KICK 1 L’equip blau té la pilota
YELLOW_KICK 2 L’equip groc té la pilota
Taula 6.4. Constants que defineixen la possessió de la pilota per al camp whosBall del Environment.
Per altra banda, es defineixen també constants que indiquen els límits del camp i els límits de les dues porteries. Com a comentari, dir que tant les unitats del camp com les de les posicions dels robots i la pilota estan en polzades.
Figura 6.13. Constants relacionades amb els límits del camp i les dues porteries.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
32
Constant Valor (polzades) Descripció
FTOP 77,2392 Coordenada y superior del camp
FBOT 6,3730 Coordenada y inferior del camp
FLEFTX 6,8118 Coordenada x del límit de l’esquerra del camp
FRIGHTX 93,4259 Coordenada x del límit de la dreta del camp
GTOPY 49,6801 Coordenada y superior de les porteries
GBOTY 33,9320 Coordenada y inferior de les porteries
GLEFT 2,8748 Coordenada x dins la porteria de l’esquerra
GRIGHT 97,3632 Coordenada x dins la porteria de la dreta
Taula 6.5. Constants que defineixen els límits del camp i de les porteries.
Finalment, cal comentar que els angles dels camps “rotation” de les estructures Robot
i OpponentRobot estan en graus i pertanyen a l’interval [-180, 180]. Així, un robot tindrà un angle de 0º o 180º si es troba paral.lel a l’eix horitzontal i de 90º o -90º si es troba paral.lel a l’eix vertical. La següent figura mostra l’assignació dels graus que realitza Robot Soccer.
Figura 6.14. Assignació dels graus per a la orientació dels robots.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
33
7 Implementació equips futbol
L’objectiu d’aquest projecte és fer competir dos equips implementant dues estratègies de control distribuït i comentar els resultats obtinguts. La diferencia entre aquest projecte i altres sobre equips programats sota la plataforma Robot Soccer radica en les següents premisses:
• Tots els robots de camp són iguals, és a dir, no hi ha preassignació sobre quin robot de camp fa de defensa o davanter.
• Els robots poden intercanviar-se les posicions segons les condicions de joc. Es pot observar una certa intel·ligència en el comportament dels equips ja que els robots no van tots cap a la pilota sinó que, com al futbol real, existeix una tàctica.
• Es realitza un canvi de coordenades i un canvi d’escala de forma que amb el mateix programa podem jugar indistintament amb l’equip groc o amb el blau. En altres projectes es programa només des del punt de vista d’un dels dos.
• Es pot modificar la velocitat dels robots sense necessitat de compilar i parar el partit. La velocitat s’indica en un fitxer de text extern.
• Es poden bolcar tots els valors de les variables que es desitgin en un fitxer de text per a poder analitzar i realitzar un control estadístic dels resultats.
• Com que els robots són cubs, aquests poden anar indistintament en els dos sentits (velocitat positiva o velocitat negativa). D’aquesta forma, els robots són més ràpids i no perden, com altres, temps per a girar.
En els següents apartats, es comenten i s’expliquen en detall les característiques de programació i funcionament dels dos equips de robots.
7.1 Equip dinàmic vs pseudo-dinàmic
Com que hem de fer competir dos equips amb estratègies de control distribuït, a continuació comentarem les característiques de cadascun i en conseqüència, les seves diferencies.
EQUIP DINÀMIC
Figura 7.1. Estratègia de l’equip dinàmic.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
34
La idea d’aquest equip és que tots els robots són iguals i es podran moure per tot el camp intercanviant-se les posicions excepte el porter que és fix, tal com es pot veure a la figura anterior. D’aquí el nom de dinàmic.
La tàctica és la següent:
1- El millor robot anirà a per la pilota (Robot 1).
2- Assignarem un robot per a la defensa situat entre la pilota i la seva porteria (Robot 2).
3- Dels altres dos robots que queden, el que està més prop del robot que duu la pilota realitzarà un acompanyament passiu per a poder recuperar la pilota en cas de pèrdua (Robot 3).
4- L’últim robot és col·locarà com a davanter a una posició més avançada respecte a la pilota. D’aquesta manera, sempre tindrem un robot que pugi rematar a porteria o agafar la pilota a una zona avançada (Robot 4).
EQUIP PSEUDO-DINÀMIC
Figura 7.2. Estratègia de l’equip pseudo-dinàmic.
La diferencia respecte a l’equip dinàmic és que ara hi ha dos robots fixats a la defensa i altres dos fixats a la davantera. És a dir, ni els defenses ni els davanters poden passar del mig camp. El nom de pseudo-dinàmic és que els defenses i els davanters poden intercanviar-se les posicions però només estan limitats a mig camp. D’aquí el nom de pseudo-dinàmic. La tàctica és la següent:
1- Si la pilota està al mig camp propi, el millor dels dos defenses anirà a per la pilota (Robot 1) i l’altre es col·locarà entre la pilota i la seva porteria (Robot 2). Els dos davanters (Robot 3 i 4) es col·locaran al mig camp interceptant els contraris que vagin a per la pilota i esperaran a que aquesta passi del mig camp.
2- Si la pilota està al mig camp contrari, el millor dels dos davanters anirà a per la pilota (Robot 1) i l’altre farà un acompanyament passiu o es situarà en zona de remat si la pilota està en zona d’atac (Robot 2). D’altra banda, un dels dos defenses es col·locarà entre la pilota i la seva porteria (Robot 3) i l’altre esperarà la pilota situat al mig camp (Robot 4).
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
35
7.2 Nivells de programació
Per a poder explicar i que s’entengui amb més facilitat la programació realitzada, s’han dividit les funcions implementades en quatre nivells diferents. Els diferents nivells considerats són els següents:
1. Funcions generals: és on es troba EL COR DE CADA EQUIP. Agrupa tots els nivells anteriors per a poder tenir un conjunt de robots jugant a futbol amb una estratègia definida. A part, també hi ha funcions generals per a poder realitzar el control estadístic posterior.
2. Precondicions: són funcions que ens ajuden a saber la situació del joc i d’aquesta manera actuarem d’una forma o d’una altra segons convingui.
3. Comportaments: són funcions que ens determinen quin rol ha d’adquirir cada robot, és a dir, si el robot a d’atacar, defensar, porter, acompanyar, ....
4. Accions: són funcions per a que el robot realitzi moviments bàsics com calcular angles, anar a un punt, velocitats a les rodes,...
FuncionsGenerals
Precondicions
Comportaments
Accions
Nivell 1
Nivell 2
Nivell 3
Nivell 4
Figura 7.3. Nivells de programació.
A continuació, es comenten les funcions utilitzades a cada nivell per a tenir una idea general de tot el conjunt.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
36
Nivell 1. Funcions generals
Capçalera de la funció Descripció
Assignació_comportaments ( ) És la funció més important de totes. Aquí és on s’implementa l’estratègia de l’equip
Canvi_coordenades ( ) Canvia el sistema de referència de Robot Soccer i passa les mesures del camp de polzades a cm.
Possessió_pilota ( ) Funció estadística que indica quin dels dos equips té la possessió de la pilota.
Temps_costat ( ) Funció estadística que indica a quina meitat del camp es desenvolupa el joc.
Temps_zona ( ) Funció estadística que divideix el camp en 4 parts iguals i indica en quina part es juga més.
Nivell 2. Precondicions
Capçalera de la funció Descripció
PEC ( ) (Pelota En Campo) Indica la zona del camp on es troba la pilota.
MLP ( ) (Mejor Llegar Pelota)
Indica quin robot, excepte el porter, és el millor per a agafar la pilota.
CCP ( ) (Contrario Controla Pelota)
Indica si un robot contrari està en possessió de la pilota.
PredictBall ( ) Indica la situació futura de la pilota.
Nivell 3. Comportaments
Capçalera de la funció Descripció
Porter ( ) Els moviments del porter.
Interceptar_perseguir_pilota ( ) Indica segons la situació del joc si el robot intercepta la pilota o va a buscar-la.
Rematar_Perseguir_pilota ( ) Indica segons la situació del joc si el robot remata a porteria o va a buscar la pilota.
Posicionar_secundari ( ) Indica el millor robot per a situar-se entre la pilota i la porteria.
Reubicar_robots ( ) Indica quins robots han d’actuar d’acompanyants passius o col·locar-se en zones d’utilitat.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
37
Nivell 4. Accions
Capçalera de la funció Descripció
Control_posició ( ) Calcula la velocitat que ha de tenir cada roda per tal d’evitar els obstacles o robots propis.
Ir_a_punto ( ) Calcula les variables necessàries per a que el robot vagi cap al seu objectiu.
Càlcul_angle_relatiu ( ) Indica l’angle que ha de girar el robot per a encarar-se a l’objectiu.
Velocity ( ) Indica la velocitat que ha de tenir cada roda.
7.3 Estratègia equip dinàmic
Una vegada comentades totes les funcions implementades, en aquest apartat es mostra l’organigrama de l’equip dinàmic comentat anteriorment (7.1) per a tenir una idea general.
Millor robot busca pilota ( )
Control_posicio ( )
Contrari porta pilota ( )
Porter ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Situacio pilota ( )
Reubicar_robots ( )
Robot 0 fixe
1ª Precondició (MLP)
2ª Precondició (CCP)
1r Robot
2n Robot
3ª Precondició (PEC)
3r i 4t Robot
Inici Estrategia Dinamic
Fi Estrategia Dinamic
Canvi_coordenades ( )
Control_estadistic ( )
Prediccio_pilota ( )
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
38
7.4 Estratègia equip pseudo-dinàmic
Com en l’apartat anterior, es mostra l’organigrama de l’equip pseudo-dinàmic per a tenir també una idea general tal i com s’ha comentat a l’apartat 7.1.
Millor defensa busca pilota ( )
Contrari porta pilota ( )
Porter ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Reubicar_davanters ( )
Robot 0 fixe
1ª Precondició (MLP)
2ª Precondició (CCP)
1r Robot
2n Robot
3r i 4t Robot
Inici Estrategia PseudoDinamic
Canvi_coordenades ( )
Control_estadistic ( )
Prediccio_pilota ( )
Pilota encamp propi
Control_posicio ( )
Fi Estrategia PseudoDinamic
SI NO
Millor davanter busca pilota ( )
Contrari porta pilota ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Reubicar 3r robot
Reubicar 4t robot
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
39
7.5 Nivell 4. Accions
7.5.1 Càlcul_angle_relatiu Indica l’angle que ha de girar el robot per a encarar-se a l’objectiu. Aquest angle
vindrà determintat per la posició de l’objectiu respecte al robot i l’angle d’orientació del mateix tal i com s’observa a la següent figura.
Figura 7.4. Posició relativa entre el robot i la pilota.
Primerament es calcula la distancia X i Y entre el robot i l’objectiu: dx = robot->pos.x - punto_x; dy = robot->pos.y - punto_y;
Aleshores, es calcula l’angle existent entre ells dos mitjançant la següent fòrmula:
Una vegada s’ha calculat l’angle absolut, es calcula l’angle relatiu segons a quin
quadrant estigui l’objectiu aplicant les següents relacions:
if ( dx < 0 ){ I→ if ( dy < 0 ) angulo_obstaculo = angulo_obstaculo + 180; II→ else if ( dy > 0 )angulo_obstaculo = 180 - angulo_obstaculo; } else{ III→ if ( dy < 0 ) angulo_obstaculo = - angulo_obstaculo; IV→ else if ( dy > 0 )angulo_obstaculo = angulo_obstaculo; }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
40
7.5.2 Velocity Indica la velocitat que ha de tenir cada roda. robot->velocityRight = vr; robot->velocityLeft = vl;
7.5.3 Control_posició Calcula la velocitat que ha de tenir cada roda per tal d’evitar els obstacles o robots
propis. Aquest control de posició és el mateix per als dos equips programats. A continuació es mostra l’organigrama d’aquesta funció.
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Control obstacles
Variables entrada
Inici Control Posicio
Fi Control Posicio
Posicio RobotPosicio Objectiu
Angle relatiuVelocitat de joc
Variables sortida
Velocitat roda dretaVelocitat roda esquerra
Control velocitat
Control obstruccio robot propi
7.5.3.1 Velocitat de joc Com que estem programant amb C++, a l’hora de realitzar qualsevol canvi es
necessita tornar a compilar i actualitzar el fitxer *.dll. Això és un problema ja que per a realitzar el control estadístic (veurem més endavant) és necessari canviar la velocitat de joc dels jugadors moltes vegades. Per aquest motiu, s’ha utilitzat la comanda ifstream de manera que sense necessitat de compilar, llegim la velocitat de joc desitjada des d’un fitxer de text.
ifstream ficher("DIRECTORI");
ficher >>VALOR FITXER TEXT;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
41
7.5.3.2 Control obstacles S’ha considerat realitzar un control d’obstacles de manera d’evitar la col.lisió ja sigui
amb un robot propi com un contrari. Bàsicament, si es detecta una col.lisió aplicarem un increment de velocitat a una de les dues rodes. L’organigrama següent mostra una idea general sobre el control d’obstacles.
Buscar l'obstacle més proper
Variables entrada
Inici Control Obstacles
Fi Control Obstacles
Posicio RobotRadi Col.lisioPunt de Tall
Variables sortida
Velocitat roda dretaVelocitat roda esquerra
Col.lisió?
Apliquem un deltaa una de les rodes
NO
SI
Primerament, es busca quin obstacle és el més proper ja sigui amb un robot propi o contrari i posteriorment es mira, trigonomètricament, si l’obstacle està situat entre l’objectiu i el robot. Si l’obstacle no està entre la pilota i el robot no s’aplicarà el control de col·lisions. En cas contrari, s’observa el punt de tall amb la condició que no tenim conflicte mentre el radi de l’obstacle sigui superior a 20 cm. Finalment, s’aplica un increment de velocitat a una de les dues rodes.
Figura 7.5. Control de col·lisions.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
42
7.5.3.3 Control de velocitat Per a calcular la velocitat que tindrà cada una de les dues rodes dels robots dependrà
de l’estat de joc, és a dir, la velocitat final d’una roda vindrà determinada per la composició de la distancia i l’orientació del robot fins a l’objectiu i el control d’obstacles.
Distancia objectiu Orientació Obstacles+ +Velocitat roda =
Figura 7.6. Paràmetres per al càlcul de la velocitat de les rodes.
El segon paràmetre (orientació) està comentat a l’apartat “7.5.1 Càlcul angle relatiu”
i el tercer paràmetre (obstacles) a l’apartat “7.5.3.2 Control obstacles”.
Pel que respecta al primer paràmetre (distancia a l’objectiu), per al control de velocitat dels robots es volia que aquests paressin correctament quan estessin arrivant al seu objectiu i que anessin a la màxima velocitat (Y) quan l’objectiu (X) estigués lluny. Per tant, s’ha escollit la funció SIGMOIDE on la seva evolució és com la funció escaló peró amb una pendent (m) variable.
Figura 7.7. Funció Sigmoide utilitzada per al control de velocitat.
Les característiques principals d’aquesta funció és que és estrictament creixent i
lineal, és constant quan assoleix un punt desitja i és pot modificar la pendent variant un sol paràmetre, tal i com es pot observar a la següent figura.
Figura 7.8. Velocitat del robot en funció de la distancia a l’objectiu mitjançant la funció Sigmoide.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
43
Aleshores, si multipliquem per un valor la funció Sigmoide aquesta tendeix a aquest valor per a valors alts de la distancia a l’objectiu. És a dir, la velocitat màxima que tindrà el robot serà la desitjada.
Figura 7.9. Velocitat màxima del robot en funció de la velocitat desitjada.
A la següent figura es pot veure la variació de la velocitat màxima assolida pel robot segons la velocitat d’entrada inicial. Podem observar també que el robot disminueix suaument la velocitat a mesura que la distancia a l’objectiu es redueix.
El valor d’aquest paràmetre és la velocitat de joc comentada anteriorment a l’apartat “7.5.3.1 Velocitat de joc”.
Figura 7.10. Gràfica de la velocitat màxima del robot en funció de la velocitat desitjada amb la funció Sigmoide.
Finalment, a la següent figura es pot veure la variació de la pendent (m) fixant una velocitat de 50. A partir dels valors obtiguts s’ha escollit una pendent de valor 3.
Figura 7.11. Gràfica de la variació de la pendent de la funció Sigmoide.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
44
Per tant, després d’explicar tots els paràmetres, les velocitats de les rodes vindran determinades per les següents expressions finals sabent que els robots poden anar indistintament amb els dos sentits (velocitat positiva o velocitat negativa).
Velocitat positiva (el robot es mou de cara)
deltatiuangle_rela*ke1
1*desitjada)velocitat_(roda_dreta _pilota)*distancia3( ++⎟⎠⎞
⎜⎝⎛+
+= −
deltatiuangle_rela*ke1
1*desitjada)velocitat_(rraroda_esque _pilota)*distancia3( +−⎟⎠⎞
⎜⎝⎛+
+= −
Velocitat negativa (el robot es mou d’esquena)
deltatiuangle_rela*ke1
1*desitjada)velocitat_(roda_dreta pilota)distancia_*3( ++⎟⎠⎞
⎜⎝⎛+
−= −
deltatiuangle_rela*ke1
1*desitjada)velocitat_(rraroda_esque pilota)distancia_*3( +−⎟⎠⎞
⎜⎝⎛+
−= −
7.5.3.4 Control obstrucció robot propi A part del control respecte els obstacles, també s’ha realitzat un control d’obsturcció
cap a un robot del mateix equip. Això s’ha fet en el cas quan un altre robot del propi equip porti la pilota i hi hagi un robot que pugui interrompre o dificultar el seu avanç. La solució en aquests casos és que el robot que obstrueix el pas s’aparta del camí del que porta la pilota. A continuació, es mostra un exemple del control d’obstrucció on el robot rosa deixa el camí lliure al robot lila.
Figura 7.12. Control obstrucció robot propi..
7.5.4 Ir_a_punto Calcula les variables necessàries per a que el robot vagi cap al seu objectiu. La idea
d’aquesta funció és que el robot vagi cap a un punt en concret i es pari. També es té en compte un control d’area propia ja que s’evitarà que un robot propi entri dins l’area del porter per a evitar que es pugui fer un gol o obstruir al porter.
Entrant en detall, primerament es farà el comentat control d’àrea i posteriorment mentre el robot estigui a una distancia de l’objectiu superior a 2 cm es realitzarà el control de posició comentat a l’apartat anterior.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
45
Aquesta funció és la mateixa per als dos equips programats i l’organigrama es mostra a continuació:
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Control area propia
Variables entrada
Inici Ir_a_punto
Fi Ir_a_punto
Posicio RobotPosicio Objectiu
Variables sortida
Velocitat roda dreta = 0Velocitat roda esquerra = 0
Parar robot
Control posicioDistancia objectiuinferior a 2 cm ?
NO
SI
7.5.4.1 Control àrea pròpia La idea per a realitzar aquest control és fer una circumferencia de 30 cm de radi des
del centre de la porteria sabent que la seva coordenada es (0,90). Aleshores, si l’objectiu del robot cau dins aquesta circumferencia es cosiderarà que està situat a 30 cm del centre de la porteria i per tant, el robot no entrarà dins l’àrea. La següent figura mostra aquest control:
Figura 7.13. Control d’àrea pròpia.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
46
7.6 Nivell 3. Comportaments
7.6.1 Porter Aquí s’implementen tots els moviments del porter com són: allunyar la pilota,
interceptar la pilota, reubicar posició i tapar la porteria.
Aquesta funció és la mateixa per als dos equips programats i l’organigrama es mostra a continuació:
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Inici Porter
Fi Porter
Robot 0
Velocitat rodesó
Ir_a_punto
NO
Pilota allateral ?
Tapar situatal pal
Pilota dinsde l'area ?
Pilota s'allunyaporteria i distancia
superior 60 ?
Distancia pilotainferior 10 ?
Allunyar pilotalateral
SISI
NO
Reubicarposicio
SI
NO
Allunyar pilotamoviment giratori
SI
Predicciointerceptar pilota
NO
A continuació es comenten amb més detall les funcions esmentades a l’organigrama anterior i d’aquesta manera es podrà entendre millor el comportament del porter.
7.6.1.1 Tapar situat al pal
El porter es situarà tapant el pal sempre que la pilota estigui al lateral de l’àrea però sense entrar en ella. Aquesta posició es per a mantenir el porter a l’espera ja que si va cap a la pilota deixaria la porteria desprotegida.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
47
Figura 7.14. Porter situat al pal.
7.6.1.2 Allunyar pilota lateral El porter allunyarà la pilota mitjançant un cop frontal sempre que aquesta es trobi
dins l’àrea al lateral. D’aquesta manera el porter frenaria un robot contrari que dugués la pilota.
Figura 7.15. Porter allunyant la pilota dins l’àrea i al lateral.
7.6.1.3 Predicció interceptar pilota El porter realitzarà una predicció per a poder interceptar la pilota quan vagi dins a
porteria sempre que aquesta no estigui al lateral o la distancia respecte la porteria sigui superior a 60 cm. El mètode per a calcular el punt de tall és realitzar la intersecció entre les trajectòries del porter i la pilota a partir de les equacions d’una recta.
//calculem pendent de la trajectoria de la pilota ballX = posicio X pilota futura – posicio X pilota actual ballY = posicio Y pilota futura – posicio Y pilota actual m = ballY/ballX; //terme independent de la equacio de la pilota b = posicio Y pilota actual - m * posicio X pilota actual; //calculem el punt on s’ha de situar el porter Punt de tall X = porter posicio X Punt de tall Y = m * Punt de tall X + b
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
48
Figura 7.16. Porter interceptant la pilota.
7.6.1.4 Reubicar posició
El porter es reubicarà al mig de la porteria sempre que la pilota no es trobi al lateral o que aquesta s’allunyi de la porteria amb una distancia mínima de 60 cm. D’aquesta manera evitem que el porter es resitui mentre la pilota està en una situació de perill o que es quedi en una posició fora de la porteria.
Figura 7.17. Reubicació del porter al mig de la porteria.
7.6.1.5 Allunyar pilota moviment giratori El porter allunyarà la pilota aplicant un moviment giratori sempre que aquesta estigui
a menys de 10 cm del porter i no estigui al lateral. S’evita que el poter surti de la porteria i s’aconsegueix que la pilota s’allunyi amb força. El moviment giratori s’aconsegueix donant un valor positiu a una roda i un valor negatiu a l’altra.
Figura 7.18. El porter allunya la pilota girant sobre sí mateix.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
49
7.6.2 Interceptar_perseguir_pilota Indica segons la situació del joc si el robot intercepta la pilota o va a buscar-la.
Primerament es mirarà si un robot contrari està en possessió de la pilota i en direcció a la porteria pròpia. En aquest cas, el nostre robot interceptarà la pilota i quan l’hagi interceptat l’allunyarà per a que el robot contrari perdi la possessió de la pilota. Per altra banda, si la pilota no està en possessió d’un contrari o aquest no es dirigeix cap a la nostra porteria, el nostre robot perseguirà la pilota fins a tenir la possessió.
Aquesta funció és la mateixa per als dos equips programats i l’organigrama es mostra a continuació:
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Rematar_perseguir_pilota
Variables entrada
Inici Interceptar_perseguir_pilota
Fi Interceptar_perseguir_pilota
Posicio RobotPosicio Oponent
Allunyar pilota moviment giratori
NO
SI
Oponent ambpilota i a prop ?
Distancia pilotainferior 10 cm ?
NO
SI
Interceptar pilota
7.6.2.1 Interceptar pilota
El jugador realitzarà una predicció per a poder interceptar la pilota quan aquesta vingui cap a ell conduïda per un oponent. El mètode per a calcular el punt de tall és realitzar la intersecció entre les trajectòries del jugador i la pilota a partir de les equacions d’una recta.
//calculem pendent de la trajectoria de la pilota ballX = posicio X pilota futura – posicio X pilota actual ballY = posicio Y pilota futura – posicio Y pilota actual m = ballY/ballX; //terme independent de la equacio de la pilota b = posicio Y pilota actual - m * posicio X pilota actual; //calculem el punt on s’ha de situar el jugador Punt de tall X = jugador posicio X Punt de tall Y = m * Punt de tall X + b
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
50
Figura 7.19. El jugador intercepta la pilota conduïda per un contrari.
7.6.2.2 Allunyar pilota moviment giratori El jugador allunyarà la pilota aplicant un moviment giratori sempre que aquesta
estigui a menys de 10 cm. Com que la pilota està en possessió d’un robot contrari, amb un moviment giratori s’intenta allunyar la pilota que, d’altra banda, no es podria fer si es fés un atac frontal. El moviment giratori s’aconsegueix donant un valor positiu a una roda i un valor negatiu a l’altra.
Figura 7.20. El jugador allunya la pilota girant sobre sí mateix.
7.6.3 Rematar_perseguir_pilota
Indica segons la situació del joc si el robot remata a porteria o va a buscar la pilota. En aquest cas, diferenciarem entre l’equip dinàmic i el pseudo-dinàmic ja que el seu comportament és diferent.
Pel que fa a l’equip dinàmic, primerament es mira si el nostre jugador està situat a la frontal o dins l’àrea contraria. En aquest cas, si el jugador està en possessió de la pilota rematarà a porteria i sinó anirà a buscar-la. Per altra banda, si el jugador no està en zona d’atac, conduirà la pilota si té la possessió o la perseguirà fins a agafar-la.
Pel que fa a l’equip pseudo-dinàmic, inicialment es mirarà si el robot que ha de perseguir o està en possessió de la pilota és defensa o davanter. Si el jugador és un defensa, aquest només perseguirà la pilota o la conduirà fins al mig camp, ja que com s’ha comentat anteriorment a l’apartat “7.1 Equip dinàmic vs pseudo-dinàmic” els defenses no poden situar-se al mig camp contrari ni els davanters al mig camp propi. Si el robot és un davanter, si té la possessió de la pilota i està en zona d’atac rematarà a porteria i sinó la conduirà cap a la porteria contraria. En el cas que no tingui la possessió de la pilota, la perseguirà.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
51
A continuació es mostren els diferents organigrames de cada equip per tal de tenir una idea general del comportament de cadascun.
EQUIP DINÀMIC
Conduir pilota capa porteria contraria
Variables entrada
Inici Rematar_perseguir_pilota
Fi Rematar_perseguir_pilota
Posicio Robot
NO
SI
El robot situatarea contaria ?
NO
SI
Possessiopilota ?
Perseguir pilota(control posicio)
SI
NO
Rematar pilota
Possessiopilota ?
EQUIP PSEUDO-DINÀMIC
Conduir pilota capa porteria contraria
Variables entrada
Inici Rematar_perseguir_pilota
Fi Rematar_perseguir_pilota
Posicio Robot
NO
SI
El robot situatarea contaria ?
NO
SI
Possessiopilota ?
Perseguir plilotamig camp contrari(control posicio)
SI
NO
Rematar pilota
Possessiopilota ?
El robot ésun defensa ?
Possessiopilota ?
Conduir pilota capal mig camp
Perseguir pilotamig camp propi(control posicio)
SI
NO
SI
NO
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
52
7.6.3.1 Perseguir la pilota Aquesta funció és bàsicament l’acció “Control posició” comentada a l’apartat 7.5.3
ja que el que es vol és anar cap a la pilota evitant els obstacles i controlant la velocitat del robot.
7.6.3.2 Conduir pilota Per a conduir la pilota cap a la porteria contraria necessitem que el robot tingui la
possessió de la pilota (distancia inferior a 10 cm) i que estigui situat darrere la pilota per a poder empènyer-la. Hem de diferenciar dues situacions segons si el robot està situat a la zona dels extrems o a la zona central.
En el cas que el jugador dugui la pilota per la zona central, aquest la conduirà fins a la porteria contraria. Per fer-ho es considerarà que l’objectiu del robot està situat al centre de la porteria contraria, és a dir, a la posició (220,90).
Si el jugador duu la pilota per la zona lateral, aquest continuarà el seu moviment fins al final del camp per a aprofitar que els cantons no són rectes sinó que tenen uns xamfrans. D’aquesta manera s’aconseguirà que la pilota reboti produint una passada de la mort per a que un altre robot remati cap a porteria. A continuació es poden observar les dues situacions diferents i també el codi programat.
Figura 7.21. Passada de la mort o conduir cap a la porteria contraria.
//codi programacio conduir pilota dx = posicio X jugador - posicio X pilota; dy = posicio Y jugador - posicio Y pilota; distancia = sqrt(dx * dx + dy * dy); angle_relatiu = Calcul_angle_relatiu (dx,dy,rotacio_robot); //el jugador condueix la pilota per la zona central if ( (distancia < 10) && (dx < 0) && (pos Y jugador > 30) && && (posicio Y jugador < 150 )) Ir_a_punto (robot,env,220,90); //el jugador condueix la pilota per la zona central else Control_posicio (robot, ballx, bally, angle_relatiu);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
53
7.6.3.3 Rematar a porteria Aquesta funció només s’utilitzarà quan el jugador amb la pilota estigui situat a la
frontal o dintre de l’àrea contraria. Bàsicament hi ha dos formes principals per a que el robot remati a porteria.
La primera forma de remat serà acompanyant la pilota. S’utilitzarà quan la pilota vagi en direcció a la porteria contraria i aleshores, s’augmentarà la velocitat d’una de les dues rodes, segons la situació al camp, aconseguint que la pilota surti impulsada cap endavant.
Figura 7.22. Remat a porteria acompanyant la pilota.
La segona forma de remat serà mitjançant moviment giratori. Al contrari que el remat anterior, aquest s’usarà quan la pilota vingui cap al robot ja que d’aquesta forma la pilota sortirà amb força cap endavant. Com a comentari, dir que la direcció de sortida de la pilota és imprevisible ja que depèn de la velocitat i trajectòria de la pilota i la situació del robot. Per aquest motiu aquest remat és efectiu quan hi ha una passada de la mort ja que el porter contrari no pot preveure al cent per cent a on anirà la pilota.
Figura 7.23. Remat a porteria amb moviment giratori.
7.6.4 Posicionar_secundari
Indica quin és el millor robot per a situar-se entre la pilota i la porteria o el millor robot per a interceptar un robot propi que vagi cap a la pròpia porteria amb la pilota.
La programació d’aquesta funció es considera pràcticament igual per als dos equips ja que la única diferencia existent entre l’equip dinàmic i el pseudo-dinàmic és que el robot secundari dinàmic s’elegeix entre tots els robots de camp mentre que el robot secundari pseudo-dinàmic s’elegeix entre un dels dos defensors.
La funció consisteix en col·locar un defensa situat a mitja distancia entre la pilota i la porteria pròpia sense entrar dins a l’àrea del porter. D’aquesta forma, sempre hi haurà un robot darrera la pilota per a parar un possible atac d’un robot contrari o interceptar o agafar la pilota si ve cap al propi camp.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
54
A continuació es mostra l’organigrama d’aquesta funció per tal de tenir una idea general del comportament.
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Variables entrada
Inici Posicionar_secundari
Fi Posicionar_secundari
Posicio Robot Principal
NORobot propi cap aporteria propiaamb la pilota ?
SIBuscar secundarimes a prop pilota
Buscar secundarimes a prop punt defensa
Interceptar_perseguir_pilota
Control area propia
Situació punt defensa
Calcul punt defensa
7.6.4.1 Situació al punt de defensa Aquesta funció consisteix en calcular el punt on s’ha de situar el robot defensor per
tal d’evitar que un robot contrari tingui camí lliure cap a la pròpia porteria i també per a tenir sempre un robot darrere la pilota per a interceptar-la o perseguir-la.
Concretament, aquest punt es situarà a mitja distancia entre la pilota i el centre de la porteria. Així, obtenim un robot defensor més òptim ja que no es situa en una posició prefixada sinó que aquesta anirà variant segons la posició de la pilota al camp.
Figura 7.24. Col.locació del defensor a mitja distancia entre la pilota i el centre de porteria.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
55
Per al càlcul del punt es considerarà com si agaféssim una circumferència de radi la meitat de distancia entre la pilota i la porteria on l’origen se situa al centre de la porteria. Per tant, a continuació es mostren els càlculs trigonomètrics emprats per al càlcul d’aquest punt.
//distancia de la pilota fins al centre de la porteria (0,90) px = ballx - 0; py = bally - 90; distancia = sqrt (px*px + py*py); //calcul de l’angle if (py == 0) angle = 0; else angle = atan2(py,px); //colocarem el secundari a la meitat de distancia radi = distancia/2; //control d’area propia if (radi < 30) radi = 30; //coordenades on s’ha de col.locar el secundari x = radi * cos (angle); y = radi * sin (angle) + 90;
7.6.4.2 Interceptar_perseguir_pilota
Aquesta funció s’ha explicat i comentat a l’apartat 7.6.2.
7.6.4.3 Control àrea pròpia Aquesta funció s’ha explicat i comentat a l’apartat 7.5.4.1.
7.6.5 Reubicar_robots
Indica quins robots han d’actuar d’acompanyants passius o col·locar-se en zones d’utilitat sabent que dos robots ja tenen assignats el seu comportament arribats a aquest punt. En aquest cas, es diferencia entre l’equip dinàmic i el pseudo-dinàmic ja que el seu comportament és diferent.
Pel que respecta a l’equip dinàmic, dels dos robots que queden per assignar es busca el que estigui més a prop de la pilota com a tercer i l’altre com a quart. El tercer robot tindrà la funció d’obstaculitzar els robots contraris que vagin a buscar la pilota i el de fer un acompanyament passiu al robot del mateix equip que porti la pilota. En la situació que aquest perdi la pilota, el tercer robot intentarà interceptar-la i aconseguir la possessió. Quan la pilota es trobi en zona d’atac, el tercer robot es col·locarà en una bona posició dins l’àrea per tal de fer un bon remat. També pararà l’avanç d’un robot propi que vagi cap a la pròpia porteria amb la pilota.
Per altra banda, el quart robot només tindrà l’objectiu de situar-se en una bona posició per a rematar quan la pilota estigui en zona d’atac. En cas contrari, farà un acompanyament passiu al jugador que porta la pilota però bastant més avançat per tal de tenir sempre un robot col·locat a la davantera.
Per a entendre millor l’explicació dels anteriors paràgrafs, a continuació es mostra l’organigrama de l’equip dinàmic.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
56
EQUIP DINÀMIC
Variables entrada
Inici Reubicar_robots
Fi Reubicar_robots
Robot PrincipalRobot Secundari
Posicio Pilota
Pilota area propiao direccio porteria
contraria ?
SI
Interceptar oponent
Robot entrepilota i contrari a
camp propi?
Assignar 3r i 4t robot
Pilota enzona d'atac ?
Pilota cap a areapropia amb unrobot propi ?
Acompanyamentpassiu
Control de remat
Interceptar pilota
Perseguir pilota
SI
SI
SI
NO
NO
NO
NO
3r ROBOT
Pilota enzona d'atac ?
Acompanyamentpassiu
Control de remat
SI
NO
4t ROBOT
Pel que fa a l’equip pseudo-dinàmic, la idea és la mateixa que a l’equip dinàmic però amb la diferencia que segons el camp on es troba la pilota, l’assignació del tercer i quart robot serà diferent en cada cas. Hem de recordar que l’equip pseudo-dinàmic es caracteritza per tenir dos robots fixats a la defensa (camp propi) i dos robots fixats a la davantera (camp contrari) que no poden passar del seu mig camp.
Per tant, si la pilota es troba al camp propi un defensor anirà a per la pilota i l’altre defensarà la porteria. El tercer i quart robot seran els dos davanters.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
57
Si la pilota es troba al camp contrari un davanter anirà a per la pilota i un dels dos defenses es situarà entre la pilota i la porteria. El tercer robot serà el segon davanter i el quart robot el segon defensor.
A continuació es mostra l’organigrama de l’equip pseudo-dinàmic.
EQUIP PSEUDO-DINÀMIC
Variables entrada
Inici Reubicar_robots
Fi Reubicar_robots
Robot PrincipalRobot Secundari
Posicio Pilota
Pilota area propiao direccio porteria
contraria ?
SI
Interceptar oponent
Robot entrepilota i contrari a
camp propi?
Assignar 3r i 4t robot
Pilota enzona d'atac ?
Pilota cap a areapropia amb unrobot propi ?
Acompanyamentpassiu
Control de remat
Interceptar pilota
Perseguir pilota
SI
SI
SI
NO
NO
NO
NO
3r ROBOT
4t robot esun defensa ?
Acompanyamentpassiu
Situar al mig camp
SI
NO
4t ROBOT
Assignar 3r i 4t robot
Pilota encamp propi ?
SI NO
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
58
7.6.5.1 Interceptar oponent Aquesta funció és la mateixa que la d’interceptar la pilota comentada anteriorment,
però amb la diferencia que s’intercanvia la pilota pel robot contrari. El mètode per a calcular el punt de tall és realitzar la intersecció entre les trajectòries del jugador i l’oponent-pilota a partir de les equacions d’una recta.
//calculem pendent de la trajectoria de l’oponent ballX = posicio X oponent – posicio X pilota actual ballY = posicio Y oponent – posicio Y pilota actual m = ballY/ballX; //terme independent de la equacio de la pilota b = posicio Y oponent - m * posicio X oponent; //calculem el punt on s’ha de situar el jugador Punt de tall X = jugador posicio X Punt de tall Y = m * Punt de tall X + b
Figura 7.25. El jugador intercepta l’oponent que va a buscar la pilota.
7.6.5.2 Acompanyament passiu
Aquesta funció tindrà l’objectiu de calcular el punt on s’han de situar els robots que realitzin l’acompanyament passiu.
El comportament escollit per al tercer robot és que aquest vagi seguint la pilota però amb un desplaçament de ±30 cm segons estigui per sobre o sota la pilota. El quart robot té el mateix comportament que el tercer però es col·loca 50 cm més avançat a la pilota.
La següent figura mostra la ubicació del tercer i quart robot respecte la pilota.
Figura 7.26. Situació del tercer i quart robot respecte la pilota.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
59
Per altra banda, diferenciarem les zones d’acció de l’acompanyament passiu de l’equip dinàmic del pseudo-dinàmic ja que els jugadors de l’equip dinàmic poden desplaçar-se per tot el camp mentre que els del pseudo-dinàmic estan limitats al seu mig camp segons siguin defenses o davanters.
Pel que fa a l’equip dinàmic, l’acompanyament es realitzarà sempre que la pilota es trobi a l’àrea pròpia o al mig camp desplaçant-se cap a l’àrea contraria. El jugador passiu es mourà per tota la zona del mig camp compresa entre els 40 i 165 cm.
Els motius d’aquest comportament és que es desitja l’acompanyament passiu sempre i quan el robot que porti la pilota vagi cap a la porteria contraria. En el cas que la pilota vagi cap a la porteria pròpia, no tindria sentit realitzar un acompanyament sinó que, com s’ha comentat a l’anterior apartat, s’interceptaria la pilota. Tampoc es vol que el robot passiu entri dins l’àrea pròpia ja que podria obstruir la sortida de la pilota pel que s’ha limitat a 40 cm. Finalment, quan la pilota es trobi en zona d’atac tampoc es realitzarà l’acompanyament sinó que s’intentarà rematar-la.
Pel que fa a l’equip pseudo-dinàmic, el comportament és el mateix que el de l’equip dinàmic però amb la variació que la zona estarà compresa entre 110 cm (mig camp) i 165 cm. Això és degut a que l’acompanyament només es podrà realitzar per un davanter i mai per un defensa ja que un dels dos defenses anirà a buscar la pilota i l’altre defensarà.
Figura 7.27. Zones d’acció de l’acompanyament passiu per als dos equips.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
60
7.6.5.3 Control de remat En aquesta funció s’especifica el comportament del tercer i/o quart robot quan la
pilota es situa en zona d’atac. La idea és col·locar-los a la frontal de l’àrea contraria per a poder rematar la pilota quan el jugador que porta la condueix realitza una passada de la mort.
Concretament, el tercer robot és col·locarà a la posició (185,105) si la pilota ve del lateral superior o al punt (185,75) si ve de l’inferior mentre que el quart robot sempre es situarà al punt (185,90).
Figura 7.28. Zones d’acció de l’acompanyament passiu per als dos equips.
Els jugadors sempre intentaran rematar la pilota cap a porteria sempre i quan estigui situada entre un límit superior i un límit inferior ja que sinó no rematarien a porteria. Com que el remat depèn de la velocitat de la pilota, s’ha considerat que els límits puguin ser variables segons la velocitat de joc determinada per l’usuari. Els límits es desplaçaran cap als laterals quan més ràpida vagi la pilota i cap a l’àrea quan vagi més lenta. D’aquesta forma s’evita que el jugador remati abans d’hora o que remati una vegada la pilota ja ha passat.
//velocitat desitjada de joc ifstream fitxer("c:\\Strategy\\fitxer.txt"); fitxer >> vc; if (vc == 20) limit inferior = 70; //limit superior = 180 - inferior else if (vc == 30) limit inferior = 65; //limit superior = 180 - inferior else if (vc == 40) limit inferior = 60; //limit superior = 180 - inferior else if (vc == 50) limit inferior = 55; //limit superior = 180 – inferior else if (vc == 60) limit inferior = 50; //limit superior = 180 – inferior else if (vc == 70) limit inferior = 45; //limit superior = 180 – inferior else if (vc == 80) limit inferior = 40; //limit superior = 180 – inferior else if (vc == 90) limit inferior = 35; //limit superior = 180 – inferior else if (vc >= 100) limit inferior = 30; //limit superior = 180 – inferior
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
61
7.7 Nivell 2. Precondicions Les precondicions són funcions utilitzades per tal d’avaluar les condicions del partit
mirant la situació de la pilota i els jugadors. Aquesta avaluació ens servirà per a assignar els comportaments que ha de realitzar cada jugador com defensar, interceptar o perseguir la pilota, acompanyar o rematar comentats a l’apartat “7.6 Nivell 3. Comportaments”.
7.7.1 PredictBall
Calcula la posició futura de la pilota.
dx = posicio X actual – posicio X anterior; dy = posicio Y actual – posicio Y anterior; Posicio X futura = posicio X actual + dx; Posicio X futura = posicio Y actual + dy;
7.7.2 PEC (Pelota En Campo)
Bàsicament aquesta funció indica la zona del camp on es troba la pilota. Diferenciarem entre l’equip dinàmic i el pseudo-dinàmic.
EQUIP DINÀMIC
if (env->predictedBall.pos.x <= 40) pilota = 0;//zona area propia else if (env->predictedBall.pos.x > 40 && env->predictedBall.pos.x <= 165) pilota = 1;//zona mig camp else if (env->predictedBall.pos.x > 165) pilota = 2;//zona atac
EQUIP PSEUDO-DINÀMIC if (env->predictedBall.pos.x <= 40) pilota = 0;//zona area propia else if (env->predictedBall.pos.x > 40 && env->predictedBall.pos.x <= 110) pelota = 1;//zona mig camp propi else if (env->predictedBall.pos.x > 110 && env->predictedBall.pos.x <= 165) pelota = 2;//zona mig camp contrari else if (env->predictedBall.pos.x > 165) pelota = 3;//zona atac
Figura 7.29. Zones del camp on es troba la pilota per als dos equips.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
62
7.7.3 MLP (Mejor Llegar Pelota) Indica quin robot, excepte el porter, és el millor per a agafar la pilota. La idea és
similar al futbol real on el jugador que està de cara a la pilota va a per ella excepte el cas que hi hagi un altre robot en possessió o a prop de la pilota. S’ha pensat d’aquesta forma ja que els robots són cubs i per tant, un mateix robot no pot parar la pilota i donar el tomb cap a la porteria contraria.
Ja que la situació de l’estat de joc varia contínuament al ser un partit de futbol, és en aquesta funció on s’aprecia amb més detall l’intercanvi de posicions entre els jugadors ja que cada cop s’elegeix quin és el millor jugador de camp per a buscar la pilota.
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Inici MLP ( )
Fi MLP ( )
Eleccio millor robot
NOAlgun robotdarrere la pilota ?
SI
Millor robot el queesta mes a prop
de la pilota
NOAlgun robotdarrere la pilota ?
SI
A continuació es mostren dues situacions per a l’elecció del millor robot per a buscar la pilota. En els dos casos, el millor robot és el número 1.
Figura 7.30. Situacions per a l’elecció del millor robot.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
63
7.7.4 CCP (Contrario Controla Pelota) Indica si un robot contrari està en possessió de la pilota. El motiu d’aquesta funció és
avaluar si hi ha un robot contrari amb possibilitats reals de crear perill a la pròpia porteria. En cas d’haver-hi aquesta situació, s’assignarà que el robot principal intercepti al jugador contrari per a fer-se amb la possessió de la pilota i en conseqüència eliminar el perill.
EQUIP DINÀMIC = EQUIP PSEUDO-DINÀMIC
Inici CCP ( )
Fi CCP ( )
Eleccio oponent mes perillos
NOAlgun oponenta menys de
20 cm pilota ?
SI
NO hi ha perillNODireccio propia
porteria ?
SI
A continuació es mostren tres situacions per a l’avaluació de perill cap a la pròpia porteria. Només existeix perill en el cas 3.
Figura 7.31. Situacions per a la avaluació de perill.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
64
7.8 Nivell 1. Funcions generals
7.8.1 Assignació_comportaments Aquí és on s’implementa l’estratègia que ha de tenir cada equip. Això s’aconsegueix
assignant als diferents robots de l’equip els comportaments comentats a l’apartat 7.6 segons la situació i l’estat de joc avaluat mitjançant les precondicions comentades a l’apartat 7.7. A continuació, es comenta l’assignació de comportaments de l’equip dinàmic i el pseudo-dinàmic.
Pel que fa a l’equip dinàmic, com s’ha definit en anteriors apartats, la idea és que tots els robots són iguals i es podran moure per tot el camp intercanviant-se les posicions excepte el porter que és fix. A partir d’aquí, l’assignació dels comportaments és la següent:
1- Es fixa un robot com a porter (Robot 0).
2- S’avalua l’estat de joc amb les precondicions MLP ( ) i CPP ( ) per a que el millor robot vagi a per la pilota (Robot 1)
3- Assignarem un robot per a la defensa situat entre la pilota i la seva porteria (Robot 2).
4- Es mira la situació de la pilota al camp amb la precondició PEC ( ).
5- Dels altres dos robots que queden, el que està més prop del robot que duu la pilota realitzarà un acompanyament passiu per a poder recuperar la pilota en cas de pèrdua (Robot 3).
6- L’últim robot és col·locarà com a davanter a una posició més avançada respecte a la pilota. D’aquesta manera, sempre tindrem un robot que pugi rematar a porteria o agafar la pilota a una zona avançada (Robot 4).
EQUIP DINÀMIC
Millor robot busca pilota ( )
Contrari porta pilota ( )
Porter ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Situacio pilota ( )
Robot 0 fixe
1ª Precondició (MLP)
2ª Precondició (CCP)
1r Robot
2n Robot
3ª Precondició (PEC)
3r Robot
Inici Assignacio Dinamic
Fi Assignacio Dinamic
Reubicar 3r robot
Reubicar 4t robot4t Robot
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
65
Pel que fa a l’equip pseudo-dinàmic, la diferencia respecte a l’equip dinàmic és que ara hi ha dos robots fixats a la defensa i altres dos fixats a la davantera. És a dir, ni els defenses ni els davanters poden passar del mig camp. L’assignació dels comportaments és la següent:
1- Si la pilota està al mig camp propi, el millor dels dos defenses anirà a per la pilota (Robot 1) i l’altre es col·locarà entre la pilota i la seva porteria (Robot 2). Els dos davanters (Robot 3 i 4) es col·locaran al mig camp interceptant els contraris que vagin a per la pilota i esperaran a que aquesta passi del mig camp.
2- Si la pilota està al mig camp contrari, el millor dels dos davanters anirà a per la pilota (Robot 1) i l’altre farà un acompanyament passiu o es situarà en zona de remat si la pilota està en zona d’atac (Robot 2). D’altra banda, un dels dos defenses es col·locarà entre la pilota i la seva porteria (Robot 3) i l’altre esperarà la pilota situat al mig camp (Robot 4).
EQUIP PSEUDO-DINÀMIC
Millor defensa busca pilota ( )
Contrari porta pilota ( )
Porter ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Reubicar_davanters ( )
Robot 0 fixe
2ª Precondició (MLP)
3ª Precondició (CCP)
1r Robot
2n Robot
3r i 4t Robot
Inici Assignacio PseudoDinamic
Pilota encamp propi ?
Fi Assignacio PseudoDinamic
SI NO
Millor davanter busca pilota ( )
Contrari porta pilota ( )
Interceptar_perseguir_pilota ( )
Posicionar_secundari ( )
Reubicar 3r robot
Reubicar 4t robot
Situacio pilota ( )1ª Precondició (PEC)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
66
7.8.2 Canvi_coordenades Canvia el sistema de referència de Robot Soccer i passa les mesures del camp de
polzades a cm. S’ha considerat realitzar un canvi de referència de l’origen de coordenades de l’equip blau i l’equip groc per tal que els valors que venen per defecte al Robot Soccer no afectin a l’hora de programar cadascun.
També s’ha canviat les unitats que venen per defecte en polzades a cm, per tal de tenir valors exactes pel que fa a les dimensions del camp, ja que realment mesura 220 x 180 cm.
Figura 7.32. Canvis de referència per a l’equip groc i l’equip blau.
Primerament, pel que fa a la conversió de polzades a cm, s’ha aplicat el següent
factor d’escala mitjançant els límits del camp. També, es pot aplicar directament la relació que 1 polzada = 2,54 cm.
Factor_escala = 220 /(FRIGHTX - FLEFTX) = 2,54 cm
Aleshores, aplicant les següents relacions, s’han obtingut els nous canvis de coordenades dels sistemes de referència de cada equip a cm.
Xyellow = (Valor_X_defecte - FLEFTX) * factor_escala Yyellow = (Valor_Y_defecte - FBOT) * factor_escala Angleyellow = Angle_per_defecte Xblue = (FRIGHTX - Valor_X_defecte) * factor_escala Yblue = (FTOP - Valor_Y_defecte) * factor_escala Angleblue = Angle_per_defecte + 180º
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
67
7.8.3 Possessió_pilota Funció estadística que indica el % de possessió de la pilota de l’equip groc i de
l’equip blau.
Primerament, es busca el jugador de cada equip que està més a prop de la pilota i s’avalua la situació entre aquests dos jugadors. Aleshores, s’incrementa una variable que compta el temps de possessió de la pilota segons si el jugador de camp que està més a prop d’ella és de l’equip groc o blau.
Finalment, sabent el temps total de joc i el temps de possessió de la pilota de cada equip s’obté el % de possessió de cada equip.
Figura 7.33. Distancia entre els millors robots de cada equip i la pilota.
El codi de programació utilitzat per a obtenir el % de possessió de cada equip és el següent:
//es busca el robot propi més a prop de la pilota if (distancia[0] < distancia[1]) millor_propi = 0; else millor_propi = 1; if (distancia[millor_propi] > distancia[2]) millor_propi = 2; if (distancia[millor_propi] > distancia[3]) millor_propi = 3; if (distancia[millor_propi] > distancia[4]) millor_propi = 4; //es busca el robot contrari més a prop de la pilota if (distancia_op[0] < distancia_op[1]) millor_oponent = 0; else millor_oponent = 1; if (distancia_op[millor_oponent] > distancia_op[2]) millor_oponent = 2; if (distancia_op[millor_oponent] > distancia_op[3]) millor_oponent = 3; if (distancia_op[millor_oponent] > distancia_op[4]) millor_oponent = 4; //s’incrementa la variable de possessió de cada equip if (distancia[millor_propi] < distancia_op[millor_oponent]) possessio_equip_groc++; else possessio_equip_blau++; //es calcula el temps total de joc temps_total = possessio_equip_groc + possessio_equip_blau; //es calcula el % de possessió de cada equip percentatge_groc = (possessio_equip_groc / temps_total) * 100; percentatge_blau = (possessio_equip_blau / temps_total) * 100;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
68
7.8.4 Temps_costat Funció estadística que indica a quina meitat del camp es desenvolupa el joc.
Primerament, es mira si la pilota està al camp propi o al camp contrari i aleshores, s’incrementa una variable que compta el temps que està la pilota en cada camp.
Finalment, sabent el temps total de joc i el temps que està la pilota al camp propi o al camp contrari, s’obté el % de temps en cada meitat de camp.
Figura 7.34. Situació de la pilota en camp propi o camp contrari.
El codi de programació utilitzat per a obtenir el % de temps que passa la pilota en cada meitat del camp és el següent:
//es mira a quina meitat del camp es troba la pilota if (posicio_X_pilota <= 110) camp_groc++; else camp_blau++; //es calcula el temps total de joc temps_camp = camp_groc + camp_blau; //es calcula el % temps que passa la pilota en cada camp percentatge_groc = (camp_groc / temps_camp) * 100; percentatge_blau = (camp_blau / temps_camp) * 100;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
69
7.8.5 Temps_zona Funció estadística que divideix el camp en 4 parts iguals i indica en quina part del
camp es desenvolupa el partit i d’aquesta forma saber quin dels dos equips ataca més. Primerament, es mira a quina de les quatre zones és troba la pilota i aleshores, s’incrementa una variable que compta el temps que està la pilota en cadascuna de les diferents zones.
Finalment, sabent el temps total de joc i el temps que està la pilota en cada part del camp, s’obté el % de temps en cada zona.
Figura 7.34. Situació de la pilota en cada zona del camp.
El codi de programació utilitzat per a obtenir el % de temps que passa la pilota en cada zona del camp és el següent:
//es mira la zona on es troba la pelota if (posicio_X_pilota <= 55) zona1++; else if (posicio_X_pilota > 55 && posicio_X_pilota <= 110) zona2++; else if (posicio_X_pilota > 110 && posicio_X_pilota <= 165 ) zona3++; else if (posicio_X_pilota > 165) zona4++; //es calcula el temps total de joc temps_zona = zona1 + zona2 + zona3 + zona4; //es calcula el % temps que passa la pilota en cada zona percentatge_zona1 = (zona1 / temps_zona) * 100; percentatge_zona2 = (zona2 / temps_zona) * 100; percentatge_zona3 = (zona3 / temps_zona) * 100; percentatge_zona4 = (zona4 / temps_zona) * 100;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
70
8 Resultats 8.1 Paràmetres i condicions de joc
En aquest apartat es mostren i s’analitzen els resultats obtinguts desprès de fer jugar l’equip dinàmic (groc) contra el pseudo-dinàmic (blau). Concretament, per a poder realitzar una comparativa entre els dos equips s’han observat els següents paràmetres comentats en anteriors apartats:
1- Temps de possessió de la pilota. 2- Temps de la pilota a cada meitat del camp. 3- Temps de la pilota a cada zona del camp. 4- Nombre de gols realitzats. 5- Nombre de victòries i empats.
Per a dur a terme aquesta comparativa, s’han realitzat els diferents partits a diferents velocitats de joc per tal de veure com afecta a la variació dels paràmetres anteriorment citats. S’han realitzat cinc partits per a cada velocitat de joc escollida amb les següents condicions:
• Cada partit dura 5 minuts.
• El partit s’acaba quan algun equip fa 3 gols.
• No es pot col·lisionar amb el porter contrari per a fer gol.
• Si la lluita per la pilota dura 5 segons es considera falta.
Figura 8.1. Condicions de joc.
A l’annex es poden veure els valors obtinguts del Robot Soccer, utilitzats per a realitzar les taules que es comentaran als següents apartats. A continuació, es realitza l’estudi comparatiu dels dos equips a partir de les estadístiques obtingudes dels paràmetres considerats.
Comparativa de técnicas de control distribuido. Aplicación en la plataforma RoboSoccer
71
8.2 Recopilatori de resultats Abans d’entrar en detall amb l’anàlisi dels resultats per cadascun dels paràmatres segons la velocitat de joc, es mostren els resultats
obtinguts mitjançant el Robot Soccer (apartat 11.3 de l’annex) per a veure com es va desenvolupar cada partit. S’ha composat una taula per a cada velocitat de joc les quals mostren els percentatges de cada equip pel que fa a la possessió, meitat de camp i zona de moviment de la pilota així com els gols marcats i la durada de cada partit.
Finalment, s’obté una mitjana total dels 5 partits disputats a cada velocitat per a observar a cada paràmetre si domina més l’equip dinàmic (groc) o l’equip pseudo-dinàmic (blau).
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 45,9 54,1 43,6 56,4 21,7 21,9 25,0 31,4 3 2 3:43
2 45,9 54,1 46,8 53,2 28,3 18,5 19,9 33,3 2 1 5:00
3 48,3 51,7 50,9 49,1 27,1 23,8 17,9 31,2 3 1 3:52
4 45,3 54,7 47,5 52,5 27,3 20,2 22,5 30,0 1 0 5:00
Velocitat 30
5 40,1 59,9 44,5 55,5 18,3 26,2 25,4 30,1 2 2 5:00
Mitja Final (%) 45 55 47 53 25 22 22 31 2,2 1,2
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
72
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 44,3 55,7 46,5 53,5 22,5 23,9 24,8 28,8 2 0 5:00
2 57,1 42,9 52,1 47,9 28,7 23,5 23,4 24,4 1 0 5:00
3 54,8 45,2 54,3 45,7 30,6 23,7 24,3 21,4 1 1 5:00
4 51,4 48,6 52,8 47,2 27,2 25,6 18,9 28,3 2 1 5:00
Velocitat 40
5 47,3 52,7 48,4 51,6 23,3 25,1 20,5 31,1 2 2 5:00
Mitja Final (%) 51 49 51 49 26 24 23 27 1,6 0,8
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 51,8 48,2 58,7 41,3 28,0 30,7 11,6 29,6 3 0 4:50
2 50,9 49,1 53,7 46,3 30,4 23,3 24,6 21,6 2 3 3:57
3 44,2 55,8 54,3 45,7 22,5 31,8 19,9 25,8 1 1 5:00
4 49,4 50,6 52,6 47,4 24,1 28,5 26,5 20,8 3 2 3:17
Velocitat 50
5 45,4 54,6 54,8 45,2 31,4 23,3 23,0 22,2 2 2 5:00
Mitja Final (%) 48 52 55 45 27 28 21 24 2,2 1,6
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
73
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 48,9 51,1 54,6 45,4 29,4 25,2 18,9 26,5 1 0 5:00
2 47,9 52,1 50,7 49,3 27,1 23,7 20,3 29,0 1 0 5:00
3 50,8 49,2 48,4 51,6 25,4 23,0 26,9 24,7 1 2 5:00
4 50,2 49,8 52,4 47,6 28,2 24,2 26,3 21,3 2 1 5:00
Velocitat 60
5 46,8 53,2 69,2 30,8 36,5 32,7 18,6 12,2 1 3 4:43
Mitja Final (%) 49 51 55 45 29 26 22 23 1,2 1,2
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 45,3 54,7 54,3 45,7 34,0 20,3 21,9 23,8 1 3 4:16
2 52,0 48,0 48,7 51,3 23,5 25,2 24,9 26,4 1 1 5:00
3 57,4 42,6 47,1 52,9 26,5 20,6 20,3 32,6 2 1 5:00
4 51,8 48,2 51,3 48,7 28,0 23,3 23,8 24,9 2 3 4:09
Velocitat 70
5 47,1 52,9 54,1 45,9 31,5 22,7 20,5 25,3 1 3 3:36
Mitja Final (%) 51 49 51 49 29 22 22 27 1,4 2,2
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
74
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 46,6 53,4 56,0 44,0 37,7 18,3 19,6 24,4 1 2 5:00
2 54,3 45,7 50,5 49,5 28,9 21,5 19,7 29,8 2 2 5:00
3 52,2 47,8 58,7 41,3 31,4 22,7 18,6 27,3 1 2 5:00
4 50,1 49,9 48,3 51,7 28,1 20,3 23,4 28,2 2 2 5:00
Velocitat 80
5 47,4 52,6 53,5 46,5 28,1 23,4 23,1 25,5 2 3 4:01
Mitja Final (%) 50 50 53 47 31 21 21 27 1,6 2,2
Dinàmic (groc)
Pseudo (blau)
Nº Proba
Possessió Dinàmic
(%)
PossessióPseudo
(%)
Camp Dinàmic
(%)
Camp Pseudo
(%)
Zona1 (%)
Zona2 (%)
Zona3 (%)
Zona4 (%)
Gols Dinàmic
Gols Pseudo
Temps partit
1 52,1 47,9 54,6 45,4 27,7 26,9 24,7 20,7 2 2 5:00
2 53,4 46,6 53,3 46,7 26,7 26,6 25,7 20,9 2 3 3:27
3 52,1 47,9 56,1 43,9 29,0 27,1 21,0 22,9 2 2 5:00
4 50,2 49,8 58,2 41,8 31,8 26,4 20,4 21,4 3 1 3:59
Velocitat 90
5 50,1 49,9 52,4 47,6 27,3 25,1 29,3 18,4 3 2 3:35
Mitja Final (%) 52 48 55 45 29 26 24 21 2,4 2
Comparativa de técnicas de control distribuido. Aplicación en la plataforma RoboSoccer
75
8.3 Possessió de la pilota En aquest apartat es comenten els resultats obtinguts pel que fa a la possessió de la
pilota. La idea d’observar aquest paràmetre és per a determinar si algun dels dos equips s’imposa considerablement sobre l’altre ja que es pot considerar que a més possessió de la pilota més probabilitat de marcar un gol i, en conseqüència, de guanyar el partit.
La següent taula mostra els percentatges finals de possessió de la pilota de cadascun dels dos equips per a cada velocitat de joc. Tanmateix, s’obté la possessió global dels dos equips.
Velocitat Possessió dinàmic
Possessió pseudo
Velocitat 30 45 55 Velocitat 40 51 49 Velocitat 50 48 52 Velocitat 60 49 51 Velocitat 70 51 49 Velocitat 80 50 50 Velocitat 90 52 48
Mitja (%) 49 51
A continuació, es mostren els valors de l’anterior taula de forma gràfica per tal de poder interpretar millor visualment l’evolució d’aquest paràmetre a mesura que s’incrementa la velocitat de joc.
Possessió de la pilota
44
45
46
47
48
49
50
51
52
53
54
55
56
Velocitat 30 Velocitat 40 Velocitat 50 Velocitat 60 Velocitat 70 Velocitat 80 Velocitat 90
(%)
Possessió Dinàmic
Posessio Pseudo
Figura 8.2. Possessió de la pilota segons la velocitat de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
76
Velocitat 30
Possessió dinàmic
45%
Possessió pseudo
55%
Velocitat 40
Possessió dinàmic
51%
Possessió pseudo
49%
Velocitat 50
Possessió pseudo
52%
Possessió dinàmic
48%
Velocitat 60
Possessió pseudo
51%
Possessió dinàmic
49%
Velocitat 70
Possessió pseudo
49%
Possessió dinàmic
51%
Velocitat 80
Possessió pseudo
50%
Possessió dinàmic
50%
Velocitat 90
Possessió pseudo
48%
Possessió dinàmic
52%
Total Possessió
Possessió dinàmic
49%
Possessió pseudo
51%
Com a anàlisi de la possessió de la pilota, es pot dir que tant l’equip dinàmic (groc) com el pseudo-dinàmic (blau) tenen la mateixa possessió de la pilota per a totes les simulacions a velocitats diferents. El motiu és que amb la tàctica de joc programada per als dos equips, sempre hi haurà almenys un robot de cada equip estarà situat a les proximitats de la pilota i, per tant, la distancia respecte d’aquesta serà la mateixa per als dos jugadors ja que no es pot determinar quins dels dos està controlant la pilota. Per tant, la velocitat de joc no influeix sobre la possessió de la pilota.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
77
8.4 Pilota a cada meitat del camp En aquest apartat es comenten els resultats obtinguts pel que fa a la situació de la
pilota a cadascuna de les meitats del camp. La idea d’analitzar aquest paràmetre és per a observar numèricament en quina part del camp es desenvolupa el partit.
La següent taula mostra els percentatges finals que indiquen a quin camp ha estat més temps la pilota, així com també el valor global.
Velocitat Camp dinàmic Camp pseudo
Velocitat 30 47 53 Velocitat 40 51 49 Velocitat 50 55 45 Velocitat 60 55 45 Velocitat 70 51 49 Velocitat 80 53 47 Velocitat 90 55 45
Mitja (%) 52 48
A continuació, es mostren els valors de l’anterior taula de forma gràfica per tal de poder interpretar millor visualment l’evolució d’aquest paràmetre a mesura que s’incrementa la velocitat de joc.
Temps meitat de camp
44
45
46
47
48
49
50
51
52
53
54
55
56
Velocitat 30 Velocitat 40 Velocitat 50 Velocitat 60 Velocitat 70 Velocitat 80 Velocitat 90
(%)
Camp Dinàmic
Camp Pseudo
Figura 8.3. Possessió de la pilota segons la velocitat de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
78
Velocitat 30
Camp pseudo
53%
Camp dinàmic
47%
Velocitat 40
Camp pseudo
49%
Camp dinàmic
51%
Velocitat 50
Camp pseudo
45%
Camp dinàmic
55%
Velocitat 60
Camp pseudo
45%
Camp dinàmic
55%
Velocitat 70
Camp pseudo
49%
Camp dinàmic
51%
Velocitat 80
Camp pseudo
47%
Camp dinàmic
53%
Velocitat 90
Camp pseudo
45%
Camp dinàmic
55%
Total Costat Camp
Camp dinàmic
52%
Camp pseudo
48%
Com a anàlisi de la situació de la pilota a cada meitat del camp, es pot dir que el partit es desenvolupa més temps al camp dinàmic que al pseudo-dinàmic. El motiu és que amb la tàctica de joc programada per a l’equip pseudo-dinàmic, un dels dos defenses està situat al mig camp pel que intercepta tots els jugadors que venen del camp dinàmic. Per tant, la tàctica del pseudo-dinàmic predomina sobre la velocitat de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
79
8.5 Pilota a cada zona del camp En aquest apartat, s’amplia el paràmetre de l’anterior apartat especificant en quina
zona de cada meitat del camp es desenvolupa el partit. La idea d’analitzar aquest paràmetre és per a observar, apart d’on es desenvolupa el partit, quin dels dos equips ataca més.
La següent taula mostra els percentatges finals que indiquen a quina zona del camp ha estat més la pilota així com també el valor global.
Figura 8.4. Distribució del camp per zones.
Velocitat Zona 1 Zona 2 Zona 3 Zona 4
Velocitat 30 25 22 22 31 Velocitat 40 26 24 23 27 Velocitat 50 27 28 21 24 Velocitat 60 29 26 22 23 Velocitat 70 29 22 22 27 Velocitat 80 31 21 21 27 Velocitat 90 29 26 24 21
Mitja (%) 28 24 22 26 A continuació, es mostren els valors de l’anterior taula de forma gràfica per tal de
poder interpretar millor visualment l’evolució d’aquest paràmetre a mesura que s’incrementa la velocitat de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
80
Temps per Zona del camp
16
18
20
22
24
26
28
30
32
Velocitat 30 Velocitat 40 Velocitat 50 Velocitat 60 Velocitat 70 Velocitat 80 Velocitat 90
(%)Zona 1 Zona 2 Zona 3 Zona 4
Temps per Zona del camp
30
30 30
30
40
40
40
4050 50
50
50
60
60
606070 70
70
80 80
8090
90
90
70
80
90
16
18
20
22
24
26
28
30
32
Zona1 Zona2 Zona3 Zona4
(%)
Figura 8.5. Temps de la pilota en les zones del camp.
Com a anàlisi de la situació de la pilota a cada zona del camp, es pot dir que a velocitats baixes l’equip dinàmic arriba més vegades a l’àrea contraria que el pseudo-dinàmic. A mesura que la velocitat de joc es va incrementant, els papers es van intercanviant i aleshores és l’equip pseudo-dinàmic el que ataca més.
També es pot observar que el joc pràcticament no es desenvolupa al mig camp sinó que el joc se situa a cadascuna de les dues àrees. El motiu és que l’objectiu dels dos equips és el d’atacar i no el de controlar i anar basculant la pilota al mig camp com passa al futbol real. Es pot considerar la zona del mig camp com un camí de pas quan un equip ha robat la pilota en defensa i aleshores marxa cap a l’atac.
Un altre motiu per a entendre perquè el joc es desenvolupa a les dues àrees és degut a que és en aquestes zones on els robots defensors intercepten als jugadors contraris que porten la pilota i aleshores, es quan es produeixen les lluites per la pilota fins que és xiula falta al cap de cinc segons.
Per tant, es pot dir que per a velocitats baixes l’equip dinàmic ataca més que el pseudo-dinàmic o almenys els seus jugadors estan situats a l’àrea contraria i a mesura que s’augmenta la velocitat de joc és el pseudo-dinàmic el que s’imposa.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
81
8.6 Nombre de gols marcats En aquest apartat s’observen el nombre de gols marcats per cada equip. No cal dir
que aquest paràmetre és el més important a l’hora de jugar a futbol ja que evidentment determina quins dels dos equips guanya el partit.
A continuació, es mostra una taula amb els gols marcats per cada equip segons la velocitat de joc del partit i el respectiu gràfic per tal de poder interpretar millor visualment l’evolució d’aquest paràmetre a mesura que s’incrementa la velocitat de joc.
Velocitat Gols dinàmic
Gols pseudo
Velocitat 30 11 6 Velocitat 40 8 4 Velocitat 50 11 8 Velocitat 60 6 6 Velocitat 70 7 11 Velocitat 80 8 11 Velocitat 90 12 10
Total 63 56 Mitja (%) 53 47
Gols Dinàmic i Pseudo-dinàmic
0
1
2
3
4
5
6
7
8
9
10
11
12
Velocitat 30 Velocitat 40 Velocitat 50 Velocitat 60 Velocitat 70 Velocitat 80 Velocitat 90
Nombre de gols
Gols Dinàmic Gols Pseudo
Figura 8.6. Nombre de gols marcats a diferents velocitats de joc.
Com a anàlisi dels gols marcats, es pot dir que a velocitats baixes l’equip dinàmic
marca més gols que l’equip pseudo-dinàmic i a mesura que la velocitat de joc es va incrementant aleshores és l’equip pseudo-dinàmic el que aconsegueix marcar més gols.
Es pot observar que quan la velocitat de joc és de 60, existeix una igualtat entre els dos equips ja que marquen els mateixos gols i és el moment que entre els dos equips marquen el menor nombre. En aquest cas, cap davantera s’imposa sobre la defensa de l’equip contrari. També es pot afirmar, agrupant l’anàlisi de l’anterior apartat, que l’equip que més ataca també és aproximadament l’equip que marca més gols.
Per tant, es pot dir que a velocitats baixes l’equip dinàmic marca més gols que el pseudo-dinàmic i viceversa a velocitats altes.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
82
8.7 Victòries i empats En aquest apartat es comenta finalment quina influencia han tingut els paràmetres
anteriorment comentats sobre l’objectiu principal d’un equip de futbol que és guanyar el partit. D’aquesta forma, es pot veure globalment quin dels dos equips és el millor desprès de realitzar tota la bateria de simulacions a diferents velocitats.
La següent taula mostra el nombre de victòries de cada equip i el nombre d’empats a cadascuna de les diferents velocitats de joc.
Velocitat Victòries dinàmic Empats Victòries
pseudo
Velocitat 30 4 1 0 Velocitat 40 3 2 0 Velocitat 50 2 2 1 Velocitat 60 3 0 2 Velocitat 70 1 1 3 Velocitat 80 0 2 3 Velocitat 90 2 2 1
Total 15 10 10
Mitja (%) 42 29 29
A continuació, es mostren els valors de l’anterior taula de forma gràfica per tal de
poder interpretar millor visualment l’evolució d’aquest paràmetre a mesura que s’incrementa la velocitat de joc.
Victòries i Empats
0
1
2
3
4
Velocitat 30 Velocitat 40 Velocitat 50 Velocitat 60 Velocitat 70 Velocitat 80 Velocitat 90
Victoria DinàmicEmpatVictoria Pseudo
Figura 8.7. Nombre de victòries i empats a diferents velocitats de joc.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
83
Com a anàlisi del nombre de victòries i empats es pot dir que és una conseqüència directa dels gols marcats comentats a l’anterior apartat. Com que a velocitats baixes l’equip dinàmic (groc) marca més gols que el pseudo-dinàmic (blau), això condueix a que el nombre de victòries del dinàmic sigui superior. Per contra l’equip pseudo-dinàmic pràcticament només pot empatar.
Per altra banda, l’equip pseudo-dinàmic s’imposa clarament a velocitats de joc altes essent en aquest cas quan marca més gols. Quan la velocitat de joc és 60 es manifesta una igualtat quasi completa entre els dos equips ja que a més de marcar el mateix nombre de gols també aconsegueixen pràcticament les mateixes victòries.
Pel que fa a la velocitat 90, no es pot determinar com afecta al domini d’un o altre equip ja que en aquest cas, la gran velocitat de la pilota provoca que cap equip pugui tenir un control d’aquesta i els jugadors estan contínuament canviant de rol a causa dels canvis de posició de la pilota. A conseqüència d’això, la tàctica programada per als dos equips no té influencia sobre els gols marcats sinó que es produeixen a partir de rebots i cops d’atzar.
Per tant, l’equip dinàmic s’imposa a velocitats baixes, existeix igualtat entre els dos quan la velocitat és 60 i, en endavant, és l’equip pseudo-dinàmic el que guanya.
8.8 Observacions globals Després de comentar detalladament els paràmetres anteriors com el nombre de gols i
victòries de cada equip i la possessió i la situació de la pilota al camp, a continuació es realitza un anàlisi general englobant els resultats obtinguts i les característiques de programació de cadascun dels dos equips. Les conclusions extretes són les següents:
1. A velocitats baixes (30-40-50) predomina la "intel·ligència" i l’intercanvi de posicions entre tots els jugadors de l’equip dinàmic per a controlar la pilota i així marcar un gran nombre de gols. Es poden veure molt bé els moviments de l’equip, les ajudes entre ells i els remats a porteria. En aquest cas s’imposa clarament l’atac amb tres jugadors mentre que l’equip pseudo-dinàmic només pot defensar amb 2 robots.
2. Quan la velocitat és 60, s’observa una igualtat entre els dos equips on no es pot dir que un s’imposi sobre l’altre. L’atac amb tres robots de l’equip dinàmic es compensa amb el defensor de pseudo-dinàmic situat al mig camp que intercepta la pilota. En aquesta velocitat ja es comença a veure que tots els jugadors no són tan precisos a l’hora de perseguir la pilota, de conduir-la o d’anar a un punt en concret.
3. A mesura que es va augmentant la velocitat (70-80), el domini de l’equip pseudo-dinàmic és bastant important a causa de la tàctica dels dos equips i de la gran velocitat de la pilota. Concretament, com que els rebots de la pilota contra la paret són bastant forts, quan els defenses pseudo-dinàmics l’allunyen de la seva àrea, aleshores es produeix un atac de dos robots contra un defensa dinàmic. És a dir, com que l’equip dinàmic ataca amb tres robots i a velocitats tan altes perden precisió, no són tan efectius per a fer gols i aleshores el pseudo-dinàmic aprofita per a guanyar amb superioritat numèrica al contraatac i marcar. En aquest cas, el joc se centra bàsicament als cantons del camp ja que cap equip pot conduir la pilota i és en aquestes zones on els defenses lluiten amb els davanters.
4. Finalment, si s’augmenta la velocitat fins a 90, en aquest cas no existeix ni tàctica ni assignació lògica dels comportaments entre els jugadors. Aquí ja no hi ha intel·ligència per culpa de la velocitat de la pilota i existeixen molts gols a pròpia porteria. Els robots no tenen precisió a l’hora de xutar la pilota i bàsicament els joc se centra en el moviment aleatori d’aquesta per tot el camp i els robots intentant tocar-la sense cap tàctica d’equip.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
84
9 Conclusions finals En aquest projecte s’ha realitzat satisfactòriament la implementació de dues
tècniques de control distribuït de dos equips de futbol de robots sota l’entorn C++. Posteriorment, mitjançant la plataforma Robot Soccer s’ha comprovat que el comportament dels dos equips compleix amb l’objectiu proposat inicialment.
Aquest objectiu era poder aconseguir que els robots futbolistes tinguessin principis d’intel·ligència mostrant com es comunicaven entre ells decidint què fer en cada moment segons les condicions de joc i a partir d’una estratègia competitiva. Es volia que els robots no tinguessin un comportament preassignat des d’un principi com al futbol real, sinó que es volia aprofitar el fet que tots els robots són iguals per a que aquests intercanviessin els rols de davanter o defensa segons la situació del partit.
Aconseguir que els robots puguin comportar-se d’aquesta manera no ha estat fàcil. El problema ha estat la complexitat per a interrelacionar el gran nombre de funcions per tal que els robots realitzin els moviments correctes en cada moment evitant que hi hagi conflictes entre ells a l’hora de perseguir la pilota, d’atacar o defensar.
Altres aportacions, apart de les estrictament referents a la tàctica de l’equip i als moviments dels jugadors, ha estat poder realitzar un canvi de coordenades del sistema de referència predefinit inicialment pel Robot Soccer aconseguint que amb un mateix codi de programació es pugui jugar amb els dos equips. S’ha pogut variar la velocitat de joc sense necessitat de tornar a compilar el codi sinó que aquesta es llegeix des d’un fitxer de text extern i també, s’han pogut guardar els valors de les variables desitjades en un altre fitxer de text per tal de poder realitzar els anàlisis estadístics.
Pel que fa a la comparativa entre els dos equips programats, la diferència recau amb l’efectivitat de cadascun d’ells segons la velocitat de joc. Per a velocitats baixes l’equip predominant és l’equip dinàmic on l’atac amb tres davanters s’imposa als dos defensors pseudo-dinàmics, mentre que a velocitats altes l’equip pseudo-dinàmic s’aprofita del contraatac de dos jugadors contra un defensa dinàmic.
Com que l’objectiu final d’aquest projecte no és implementar un equip que realitzi el major nombre de gols sinó que és aconseguir un bon comportament global dels seus jugadors, es conclou que jugar a velocitats altes distorsiona el funcionament dels dos equips. És a dir, quan la velocitat de joc és elevada, no existeix cap tàctica ja que els jugadors intenten perseguir la pilota sense cap lògica i a causa de la seva velocitat perden tota la precisió. En aquesta situació, la gran velocitat de la pilota provoca problemes a l’hora d’assignar els comportaments als jugadors ja que aquests estan contínuament canviant. Per aquest motiu, l’elecció del millor equip s’ha avaluat a partir de les velocitats baixes.
Per tant, desprès de la programació dels dos equips i els posteriors enfrontaments entre ells, es conclou que és l’equip dinàmic el que ha donat les millors prestacions ja sigui a l’hora d’obtenir bons resultats com a l’hora d’aconseguir que el comportament entre tots els seus jugadors sigui òptim.
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
85
10 Bibliografia [1] Aníbal Ollero, Robótica manipuladores y robots móviles, Barcelona Marcombo Boixareu, 2001.
[2] G. Weiss, Multiagent Systems, M.I.T. Press, 2000.
[3] Gregory Dudek, Computational principlies of mobile robotics, Cambridge University Press, 2000.
[4] Antonio Barrientos, Fundamentos de robótica, Mc Graw-Hill, 1997.
[5] Marta Rodriguez Aguila, Control de robots mòbils des de robot soccer, Projecte Final de Carrera, Universitat Rovira i Virgili, 2007.
[6] Gonzalo Tejera, Proyecto FIBRA Estado del arte, Universidad de la República de Montevideo , 2006.
[7] Juan Pablo Ferrari, Sistemas de control distribuído, Universidad Nacional de Rosario, 2005.
[8] Victor García Castaño, Programació de comportaments per a un equip de cinc robots futbolistes reals, Projecte Final de Carrera, Universitat Rovira i Virgili, 2004.
[9] Néstor Adrián Balich, Aspectos básicos de robots autónomos y lineamientos para la construcción de un equipo de fútbol robótico, Universidad Abierta Interamericana, 2004.
[10] Pedro Salcedo Lagos, Inteligencia Artificial Distribuida y Razonamiento: conocimiento para la educación a distancia, Universidad de Concepción, 2004.
[11] S. González i E. Milanese, Equipo Simul-ARLT: El Fútbol de Robots como Entorno Educativo, Escuela de Educación Media Roberto Arlt, Buenos Aires, 2003.
[12] Bodey R. Baker, Mark Reynolds i Wei Liu, Strategy Specification for Teamwork in Robot Soccer, University of Western Australia, 2002.
[13] Luca Iocchi i Daniele Nardi, Distributed coordination in heterogeneous multi-robot systems, Kluwer Academic Publishers, 2002.
[14] Rubén Rodríguez Tamayo, Lenguaje ANSI C, Universidad de Navarra, 1998.
[15] Robot Soccer Simulator Inc, 3D Robot Soccer Simulator Help, Robot Soccer Simulator v1.5a, 2003.
[16] FIRA (Federation of International Robot-soccer Association): http://fira.net/soccer/simurosot/overview.html
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
86
11 Anexes
11.1 Codi programació Equip Dinàmic /////////////////////////////////////////////////////////////////////////////////////// //EQUIP DINAMIC /////////////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Strategy.h" #include <math.h> #include <iostream> #include <fstream> using namespace std; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } const double PI = 3.1415923; /////////////////////////////////////////////////////////////////////////////////////// //funciones de las acciones void Velocity (Robot *robot, double vl, double vr); double Calculo_angulo_relativo (double dx, double dy, double R); void Ir_a_punto (Robot *robot, Environment *env, double punto_x, double punto_y); void Control_posicion (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo); void Ir_a_punto_portero ( Robot *robot, Environment *env, double punto_x, double punto_y); void Control_posicion_portero (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo); //funciones de las precondiciones int PEC (Environment *env); int MLP (Environment *env,int pelota); int CCP (Environment *env,int mejor_robot); void PredictBall (Environment *env); //funciones de los comportamientos void Portero (Robot *robot, Environment *env); void Interceptar_perseguir_pelota (Environment *env, int mejor_robot, int
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
87
mejor_oponente); void Rematar_perseguir_pelota (Robot *robot, Environment *env); int Posicionar_secundario (Environment *env, int mejor_robot); void Reubicar_robots (Environment *env, int mejor_robot, int secundario, int pelota); //funciones generales void Asignacion_comportamientos (Environment *env); void Cambio_coordenadas (Environment *env ); void Posesion_pelota (Environment *env); void Tiempo_campo (Environment *env); void Tiempo_zona (Environment *env); /////////////////////////////////////////////////////////////////////////////////////// extern "C" STRATEGY_API void Create ( Environment *env ) { // allocate user data and assign to env->userData // eg. env->userData = ( void * ) new MyVariables (); } extern "C" STRATEGY_API void Destroy ( Environment *env ) { // free any user data created in Create ( Environment * ) // eg. if ( env->userData != NULL ) delete ( MyVariables * ) env->userData; } extern "C" STRATEGY_API void Strategy ( Environment *env ) { Cambio_coordenadas (env); PredictBall (env); Posesion_pelota (env); Tiempo_lado (env); Tiempo_zona (env); Asignacion_comportamientos (env); } /////////////////////////////////////////////////////////////////////////////////////// void Ir_a_punto ( Robot *robot, Environment *env, double punto_x, double punto_y) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double R = robot->rotation; double dx,dy; double angulo_relativo, distancia; double px,py,angulo,radio; //evitaremos que los robots defiendan dentro del area pequeña //distancia del punto hasta centro porteria (0,90) px = punto_x - 0; py = punto_y - 90; distancia = sqrt (px*px + py*py);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
88
if (distancia < 30) { //calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos robot a un radio de 30cm del centro de la porteria radio = 30; //nuevas coordenadas donde se tiene que colocar el robot punto_x = radio * cos (angulo); punto_y = radio * sin (angulo) + 90; } //distancia del robot hasta el punto dx = robot->pos.x - punto_x; dy = robot->pos.y - punto_y; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (distancia > 2) Control_posicion (env,robot,punto_x,punto_y,angulo_relativo); else Velocity ( robot,0,0); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Rematar_perseguir_pelota ( Robot *robot, Environment *env) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double R = robot->rotation; double bx = env->predictedBall.pos.x; double by = env->predictedBall.pos.y; double dx,dy,angulo_relativo; double distancia; double px,py,angulo,radio; double ballX; //miramos sentido de la pelota ballX = env->predictedBall.pos.x - env->currentBall.pos.x; //evitaremos que los robots defiendan dentro del area pequeña //distancia del punto hasta centro porteria (0,90) px = bx - 0; py = by - 90; distancia = sqrt (px*px + py*py); if (distancia < 30 && env->home[0].pos.x < 30) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
89
//calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos robot a un radio de 30cm del centro de la porteria radio = 30; //nuevas coordenadas donde "estara" la pelota bx = radio * cos (angulo); by = radio * sin (angulo) + 90; } dx = robot->pos.x - bx; dy = robot->pos.y - by; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); //control en zona de ataque if ( robot->pos.x < 165 ) { if ( distancia<8.5 && dx<0 && robot->pos.y>30 && robot->pos.y<150 ) Ir_a_punto (robot,env,220,90); else Control_posicion (env,robot,bx,by,angulo_relativo); } else if ( robot->pos.x >= 165 && robot->pos.x < 205 ) { dx = robot->pos.x - env->predictedBall.pos.x; dy = robot->pos.y - env->predictedBall.pos.y; distancia = sqrt(dx * dx + dy * dy); if ( ballX <= 0 && distancia < 10 && robot->pos.y > 55 && robot->pos.y < 125) Velocity (robot,50,-50); else if ( distancia<10 && dx<0 && robot->pos.y>60 && robot->pos.y<120 ) { if (robot->pos.y <= env->predictedBall.pos.y) { if (robot->rotation > -75 && robot->rotation < 75) Velocity (robot,100,20); else if (robot->rotation > 135 && robot->rotation < -135) Velocity (robot,-20,-100); } else if (robot->pos.y > env->predictedBall.pos.y) { if (robot->rotation > -75 && robot->rotation < 75) Velocity (robot,20,100); else if (robot->rotation > 135 && robot->rotation < -135) Velocity (robot,-100,-20); } else Control_posicion (env,robot,bx,by,angulo_relativo); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
90
else Control_posicion (env,robot,bx,by,angulo_relativo); } else if ( robot->pos.x > 205 ) { if (distancia<12 && robot->pos.y>55 && robot->pos.y<125) { if (robot->pos.y>55 && robot->pos.y<90) { if (robot->rotation < 135 && robot->rotation > 75) Velocity (robot,100,20); else if (robot->rotation > -135 && robot->rotation < -75) Velocity (robot,-20,-100); } else if (robot->pos.y>90 && robot->pos.y<125) { if (robot->rotation < 135 && robot->rotation > 75) Velocity (robot,20,100); else if (robot->rotation > -135 && robot->rotation < -75) Velocity (robot,-100,-20); } else Control_posicion (env,robot,bx,by,angulo_relativo); } else Control_posicion (env,robot,bx,by,angulo_relativo); } else Control_posicion (env,robot,bx,by,angulo_relativo); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Control_posicion (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int i,players = 4,mejor_op=0,mejor_robot=0; int area=0,colision=0; double dx[4],dy[4],distancia[4]; double dxop[5],dyop[5],distanciaop[5]; double angulo_oponente,R; double px,py,dist; double dx_pelota,dy_pelota,distancia_pelota; double mejor_x,mejor_y,mejor_dx,mejor_dy,mejor_distancia; double corte_x,corte_y,distancia_corte; double corte_pelota_x,corte_pelota_y,distancia_corte_pelota; double robot_corte_x,robot_corte_y,distancia_robot_corte; double m1,b1,m2,b2,punto_corte_x,punto_corte_y; double vr,vl,delta,delta_right=0,delta_left=0; double vc,kpa=0.1,distancia_colision;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
91
//******************************* //velocidad deseada de los robots // vc = FICHERO TEXTO; //******************************* ifstream ficher("c:\\Strategy\\vel_dinamic.txt"); ficher >>vc; //deteccion de obstaculos //distancia respecto a nuestros robots for (i=0;i<=players;i++) { if (env->home[i].pos.x != robot->pos.x && env->home[i].pos.y != robot->pos.y) { dx[i] = robot->pos.x - env->home[i].pos.x; dy[i] = robot->pos.y - env->home[i].pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); } else distancia[i] = 300; } //buscamos a nuestro compañero mas cercano if (distancia[0] < distancia [1]) mejor_robot = 0; else mejor_robot = 1; if (distancia[mejor_robot] > distancia [2]) mejor_robot = 2; if (distancia[mejor_robot] > distancia [3]) mejor_robot = 3; if (distancia[mejor_robot] > distancia [4]) mejor_robot = 4; //distancia respecto a los oponentes for (i=0;i<=players;i++) { dxop[i] = robot->pos.x - env->opponent[i].pos.x; dyop[i] = robot->pos.y - env->opponent[i].pos.y; distanciaop[i] = sqrt (dxop[i]*dxop[i] + dyop[i]*dyop[i]); } //buscamos el oponente mas cercano if (distanciaop[0] < distanciaop[1]) mejor_op = 0; else mejor_op = 1; if (distanciaop[mejor_op] > distanciaop[2]) mejor_op = 2; if (distanciaop[mejor_op] > distanciaop[3]) mejor_op = 3; if (distanciaop[mejor_op] > distanciaop[4]) mejor_op = 4; //buscamos el robot mas cercano if (distancia[mejor_robot] < distanciaop[mejor_op]) { mejor_x = env->home[mejor_robot].pos.x; mejor_y = env->home[mejor_robot].pos.y; mejor_dx = dx[mejor_robot]; mejor_dy = dy[mejor_robot]; mejor_distancia = distancia[mejor_robot]; }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
92
else { mejor_x = env->opponent[mejor_op].pos.x; mejor_y = env->opponent[mejor_op].pos.y; mejor_dx = dxop[mejor_op]; mejor_dy = dyop[mejor_op]; mejor_distancia = distanciaop[mejor_op]; } //control de obstaculos px = punto_x - robot->pos.x; py = punto_y - robot->pos.y; if ( px != 0 && py !=0 ) { m1 = py/px; //pendiente de la trayectoria del objetivo m2 = -1/m1; } else { m1 = 0; m2 = 0; } b1 = punto_y - m1 * punto_x; //termino independiente de la ecuacion del objetivo b2 = mejor_y - m2 * mejor_x; if ( m1 != 0 && m2 !=0 ) punto_corte_x = (b2 - b1)/(m1 - m2); else punto_corte_x = 0; punto_corte_y = m2 * punto_corte_x + b2; //trigonometricamente miramos si el "oponente" esta entre el robot y el objetivo //distancia del oponente mas cercano a la trayectoria del robot corte_x = punto_corte_x - mejor_x; corte_y = punto_corte_y - mejor_y; distancia_corte = sqrt (corte_x*corte_x + corte_y*corte_y); //distancia del punto de corte al objetivo corte_pelota_x = punto_corte_x - punto_x; corte_pelota_y = punto_corte_y - punto_y; distancia_corte_pelota = sqrt (corte_pelota_x*corte_pelota_x + corte_pelota_y*corte_pelota_y); //distancia del robot al punto de corte robot_corte_x = punto_corte_x - robot->pos.x; robot_corte_y = punto_corte_y - robot->pos.y; distancia_robot_corte = sqrt (robot_corte_x*robot_corte_x + robot_corte_y*robot_corte_y); //distancia del robot respecto al objetivo dx_pelota = robot->pos.x - punto_x; dy_pelota = robot->pos.y - punto_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
93
//miramos si se cumplen las condiciones para tener colision colision =0; if (distancia_corte < 20) { if (distancia_corte_pelota > 0 && distancia_robot_corte > 0) { if (distancia_pelota == distancia_robot_corte + distancia_corte_pelota) colision = 1; } } //distancia y delta deseada para evitar colision if (distancia_pelota < 10) { distancia_colision = 50; delta = 40; } else { distancia_colision = 30; delta = 20; } //evitaremos el robot entre en el area pequeña //distancia del punto hasta centro porteria (0,90) px = robot->pos.x - 0; py = robot->pos.y - 90; dist = sqrt (px*px + py*py); if (dist <= 30) area = 1; //controlador de velocidad segun la distancia,angulo,oponentes y portero //valor de kpa segun la distancia al objetivo if (distancia_pelota > 100.) kpa = 0.19; else if (distancia_pelota > 50) kpa = 0.21; else if (distancia_pelota > 30) kpa = 0.24; else if (distancia_pelota > 20) kpa = 0.26; else kpa = 0.28; if (angulo_relativo < 85 && angulo_relativo > -85) //el robot ataca de frente a la pelota { //control de colisiones y area pequeña if (area == 1) { if (env->predictedBall.pos.y > robot->pos.y) delta_left = delta; else delta_right = delta; } //control de area pequeña
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
94
else if (mejor_distancia < distancia_colision && colision == 1) { //miramos el sentido de giro del robot R = robot->rotation; angulo_oponente = Calculo_angulo_relativo (mejor_dx,mejor_dy,R); if (angulo_oponente < 85 && angulo_oponente > -85) { if (angulo_relativo < angulo_oponente) delta_left = delta; else if (angulo_relativo == angulo_oponente) { if (robot->pos.y <= 110) delta_left = delta; else delta_right = delta; } else if (angulo_relativo > angulo_oponente) delta_right = delta; } } //calculamos la velocidad (distancia,angulo relativo y delta) vr = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) + kpa * angulo_relativo) + delta_right; vl = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) - kpa * angulo_relativo) + delta_left; //control de velocidad en caso de "lucha" con un robot nuestro dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia[mejor_robot]<20 && distancia_pelota<12 && dx_pelota>0 && dx[mejor_robot]>0 && robot->pos.x>10) { if ( env->predictedBall.pos.y <= 90 ) { vl=-50; vr=-10; } else if ( env->predictedBall.pos.y > 90 ) { vl=-10; vr=-50; } } else if (distancia[mejor_robot]<20 && distancia_pelota<12 && robot->pos.x<=10) { if (env->predictedBall.pos.y <= 90 && dy_pelota<0 && dy[mejor_robot]<0) { vl=-50; vr=-10; } else if (env->predictedBall.pos.y > 90 && dy_pelota>0 && dy[mejor_robot]>0) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
95
vl=-10; vr=-50; } } } else if (angulo_relativo > 95 || angulo_relativo < -95) //el robot ataca de espaldas a la pelota { //control de colisiones y area pequeña if (area == 1) { if (env->predictedBall.pos.y > robot->pos.y) delta_right = delta; else delta_left = delta; } else if (mejor_distancia < distancia_colision && colision == 1) { //miramos el sentido de giro del robot R = robot->rotation; angulo_oponente = Calculo_angulo_relativo (mejor_dx,mejor_dy,R); if (angulo_oponente > 95 || angulo_oponente < -95) { if (angulo_oponente < 0) angulo_oponente += 360; if (angulo_relativo < 0) angulo_relativo += 360; if (angulo_relativo < angulo_oponente) delta_right = delta; else if (angulo_relativo == angulo_oponente) { if (robot->pos.y <= 110) delta_right = delta; else delta_left = delta; } else if (angulo_relativo > angulo_oponente) delta_left = delta; if (angulo_oponente > 180) angulo_oponente -= 360; if (angulo_relativo > 180) angulo_relativo -= 360; } } angulo_relativo += 180; if (angulo_relativo > 180) angulo_relativo -= 360; angulo_oponente += 180; if (angulo_oponente > 180) angulo_oponente -= 360; //calculamos la velocidad (distancia,angulo relativo y delta) vr = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) + kpa * angulo_relativo) - delta_right; vl = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) - kpa * angulo_relativo) - delta_left; //control de velocidad en caso de "lucha" con un robot nuestro
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
96
dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia[mejor_robot]<20 && distancia_pelota<12 && dx_pelota>0 && dx[mejor_robot]>0 && robot->pos.x>10) { if ( env->predictedBall.pos.y <= 90 ) { vl=10; vr=50; } else if ( env->predictedBall.pos.y > 90 ) { vl=50; vr=10; } } else if (distancia[mejor_robot]<20 && distancia_pelota<12 && robot->pos.x<=10) { if (env->predictedBall.pos.y <= 90 && dy_pelota<0 && dy[mejor_robot]<0) { vl=10; vr=50; } else if (env->predictedBall.pos.y > 90 && dy_pelota>0 && dy[mejor_robot]>0) { vl=50; vr=10; } } } else { if (angulo_relativo <= 95 && angulo_relativo >= 85) { vr = (+.5 * angulo_relativo); vl = (-.5 * angulo_relativo); } else if (angulo_relativo >= -95 && angulo_relativo <= -85) { vl = (+.5 * angulo_relativo); vr = (-.5 * angulo_relativo); } } Velocity ( robot,vl,vr ); fichero.close(); ficher.close(); } ///////////////////////////////////////////////////////////////////////////////////////
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
97
void Ir_a_punto_portero ( Robot *robot, Environment *env, double punto_x, double punto_y) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double R = robot->rotation; double dx,dy; double angulo_relativo, distancia; //distancia del robot hasta el punto dx = robot->pos.x - punto_x; dy = robot->pos.y - punto_y; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (distancia > 2) Control_posicion_portero (env,robot,punto_x,punto_y, angulo_relativo); else Velocity (robot,0,0); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Control_posicion_portero (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double dx_pelota,dy_pelota,distancia_pelota; double vr,vl; double vc,kpa=0.1; //******************************* //velocidad deseada de los robots vc = 70; //******************************* //distancia del robot respecto a la pelota dx_pelota = robot->pos.x - punto_x; dy_pelota = robot->pos.y - punto_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); //controlador de velocidad segun la distancia,angulo,oponentes y portero //valor de kpa segun la distancia al objetivo if (distancia_pelota > 100.) kpa = 0.19; else if (distancia_pelota > 50) kpa = 0.21; else if (distancia_pelota > 30) kpa = 0.24; else if (distancia_pelota > 20) kpa = 0.26; else kpa = 0.28; if (angulo_relativo < 85 && angulo_relativo > -85) //el robot ataca de frente a la pelota {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
98
//calculamos la velocidad (distancia,angulo relativo y delta) vr = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) + kpa * angulo_relativo); vl = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) - kpa * angulo_relativo); } else if (angulo_relativo > 95 || angulo_relativo < -95) //el robot ataca de espaldas a la pelota { angulo_relativo += 180; if (angulo_relativo > 180) angulo_relativo -= 360; //calculamos la velocidad (distancia,angulo relativo y delta) vr = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) + kpa * angulo_relativo); vl = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota))) - kpa * angulo_relativo); } else { if (angulo_relativo <= 95 && angulo_relativo >= 85) { vr = (+.5 * angulo_relativo); vl = (-.5 * angulo_relativo); } else if (angulo_relativo >= -95 && angulo_relativo <= -85) { vl = (+.5 * angulo_relativo); vr = (-.5 * angulo_relativo); } } Velocity ( robot,vl,vr ); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Velocity ( Robot *robot, double vl, double vr ) { robot->velocityRight = vr; robot->velocityLeft = vl; } /////////////////////////////////////////////////////////////////////////////////////// void PredictBall ( Environment *env ) { double dx_p = env->currentBall.pos.x - env->lastBall.pos.x; double dy_p = env->currentBall.pos.y - env->lastBall.pos.y; env->predictedBall.pos.x = env->currentBall.pos.x + dx_p; env->predictedBall.pos.y = env->currentBall.pos.y + dy_p; } ///////////////////////////////////////////////////////////////////////////////////////
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
99
void Cambio_coordenadas (Environment *env) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int i; double factor_escala = 220/(FRIGHTX - FLEFTX); //pasamos de pulgadas a cm if (env->home[0].pos.x < 50) //equipo amarillo { env->predictedBall.pos.x = (env->predictedBall.pos.x - FLEFTX) * factor_escala; env->predictedBall.pos.y = (env->predictedBall.pos.y - FBOT) * factor_escala; env->currentBall.pos.x = (env->currentBall.pos.x - FLEFTX) * factor_escala; env->currentBall.pos.y = (env->currentBall.pos.y - FBOT) * factor_escala; env->lastBall.pos.x = (env->lastBall.pos.x - FLEFTX) * factor_escala; env->lastBall.pos.y = (env->lastBall.pos.y - FBOT) * factor_escala; for (i=0;i<5;i++) { env->home[i].pos.x = (env->home[i].pos.x - FLEFTX) * factor_escala; env->home[i].pos.y = (env->home[i].pos.y - FBOT) * factor_escala; env->opponent[i].pos.x = (env->opponent[i].pos.x - FLEFTX) * factor_escala; env->opponent[i].pos.y = (env->opponent[i].pos.y - FBOT) * factor_escala; } } else //(env->home[0].pos.x > 50) equipo azul { env->predictedBall.pos.x = (FRIGHTX - env->predictedBall.pos.x) * factor_escala; env->predictedBall.pos.y = (FTOP - env->predictedBall.pos.y) * factor_escala; env->currentBall.pos.x = (FRIGHTX - env->currentBall.pos.x) * factor_escala; env->currentBall.pos.y = (FTOP - env->currentBall.pos.y) * factor_escala; env->lastBall.pos.x = (FRIGHTX - env->lastBall.pos.x) * factor_escala; env->lastBall.pos.y = (FTOP - env->lastBall.pos.y) * factor_escala; for (i=0;i<5;i++) { env->home[i].pos.x = (FRIGHTX - env->home[i].pos.x) * factor_escala; env->home[i].pos.y = (FTOP - env->home[i].pos.y) * factor_escala; env->home[i].rotation = env->home[i].rotation - 180; env->opponent[i].pos.x = (FRIGHTX - env->opponent[i].pos.x) * factor_escala; env->opponent[i].pos.y = (FTOP - env->opponent[i].pos.y) * factor_escala; env->opponent[i].rotation = env->opponent[i].rotation - 180; if (env->home[i].rotation < -180) env->home[i].rotation += 360; if (env->opponent[i].rotation < -180) env->opponent[i].rotation += 360; } } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// double Calculo_angulo_relativo (double dx, double dy, double R)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
100
{ double angulo_obstaculo, angulo_relativo, variable; if ( dx == 0 ) { if ( dy > 0 ) angulo_obstaculo = -90; else angulo_obstaculo = 90; } else if ( dy == 0 ) { if ( dx > 0 ) angulo_obstaculo = 180; else angulo_obstaculo = 0; } else { angulo_obstaculo = atan2(fabs(dy),fabs(dx))*(180.0/ PI); //angulo segun cuadrante if ( dx > 0 ) { if ( dy > 0 ) angulo_obstaculo = angulo_obstaculo + 180; else if ( dy < 0 ) angulo_obstaculo = 180 - angulo_obstaculo; } else // dx < 0 { if ( dy > 0 ) angulo_obstaculo = - angulo_obstaculo; else if ( dy < 0 ) angulo_obstaculo = angulo_obstaculo; } } while ( angulo_obstaculo < -180 ) angulo_obstaculo += 360; while ( angulo_obstaculo > 180 ) angulo_obstaculo -= 360; angulo_relativo = ( angulo_obstaculo - R ); if ( dx > 0 ) { if ( dy > 0 ) { variable = angulo_obstaculo + 180; if (R > variable ) angulo_relativo += 360; } else { variable = angulo_obstaculo - 180; if (R < variable ) angulo_relativo -= 360; } } return (angulo_relativo); } /////////////////////////////////////////////////////////////////////////////////////// int PEC (Environment *env)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
101
{//A_pelota_nuestro_campo. 0->zona area, 1->medio campo, 2->area contraria int pelota; if (env->predictedBall.pos.x <= 40) pelota = 0; //zona de nuestra area else if (env->predictedBall.pos.x > 40 && env->predictedBall.pos.x <= 165) pelota = 1; //pelota en el medio del campo else if (env->predictedBall.pos.x > 165) pelota = 2; //zona area contraria return(pelota); } /////////////////////////////////////////////////////////////////////////////////////// int MLP (Environment *env) {//D_mejor_llegar_pelota. env->home[i]== 1 a 4; ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int i,players=4; int mejor_robot,cercanos_pelota=0; int robot_cercano1=0,robot_cercano2=0,robot_cercano3=0,robot_cercano4=0; double bx = env->predictedBall.pos.x; double by = env->predictedBall.pos.y; double dx[4],dy[4],distancia[4]; for (i=1;i<=players;i++) { dx[i] = env->home[i].pos.x - env->predictedBall.pos.x; dy[i] = env->home[i].pos.y - env->predictedBall.pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); } bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //miramos los robots mas cercanos a la pelota if (dx[1]<0 || dx[2]<0 || dx[3]<0 || dx[4]<0) { for (i=1;i<=players;i++) { if ( dx[i]>0 && distancia[i]>20 && env->predictedBall.pos.x<185) distancia[i] = 300; if (distancia[i] <= 20) { cercanos_pelota++; if (cercanos_pelota == 1) robot_cercano1 = i; if (cercanos_pelota == 2) robot_cercano2 = i; if (cercanos_pelota == 3) robot_cercano3 = i; if (cercanos_pelota == 4) robot_cercano4 = i; } } }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
102
//escogemos el robot mejor situado if (cercanos_pelota == 1) mejor_robot = robot_cercano1; else if (cercanos_pelota > 1) { if (dx[robot_cercano1] < 0 && dx[robot_cercano2] < 0) { if (distancia[robot_cercano1] < distancia [robot_cercano2]) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } else if (dx[robot_cercano1] > 0 && dx[robot_cercano2] > 0) { if (distancia[robot_cercano1] < distancia [robot_cercano2]) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } else { if (dx[robot_cercano1] < 0) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } if (cercanos_pelota > 2) { if (dx[mejor_robot] < 0 && dx[robot_cercano3] < 0) { if (distancia[mejor_robot] > distancia [robot_cercano3]) mejor_robot = robot_cercano3; } else if (dx[mejor_robot] > 0 && dx[robot_cercano3] > 0) { if (distancia[mejor_robot] > distancia [robot_cercano3]) mejor_robot = robot_cercano3; } else { if (dx[robot_cercano3] < 0) mejor_robot = robot_cercano3; } } if (cercanos_pelota > 3) { if (dx[mejor_robot] < 0 && dx[robot_cercano4] < 0) { if (distancia[mejor_robot] > distancia [robot_cercano4]) mejor_robot = robot_cercano4; } else if (dx[mejor_robot] > 0 && dx[robot_cercano4] > 0)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
103
{ if (distancia[mejor_robot] > distancia [robot_cercano4]) mejor_robot = robot_cercano4; } else { if (dx[robot_cercano4] < 0) mejor_robot = robot_cercano4; } } } else if (cercanos_pelota == 0) { if (distancia[1] < distancia [2]) mejor_robot = 1; else mejor_robot = 2; if (distancia[mejor_robot] > distancia [3]) mejor_robot = 3; if (distancia[mejor_robot] > distancia [4]) mejor_robot = 4; } fichero.close(); return (mejor_robot); } /////////////////////////////////////////////////////////////////////////////////////// int CCP (Environment *env, int mejor_robot) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int i,players = 4; int mejor_op,peligro = 0; double dx_robot,dy_robot,distancia_robot; double dx_op[4],dy_op[4],distancia_op[4]; //distancias de los oponentes a la pelota for (i=1;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->predictedBall.pos.x; dy_op[i] = env->opponent[i].pos.y - env->predictedBall.pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); //robot por delante y cerca de la pelota y mas alla de nuestra area if (dx_op[i] > 0 && env->opponent[i].pos.x > 40 && distancia_op[i] < 20) peligro++; else distancia_op[i] = 300; } if (peligro!=0) //algun oponente esta bien posicionado
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
104
{ //buscamos el oponente mas "peligroso" a la pelota if (distancia_op[1] < distancia_op[2]) mejor_op = 1; else mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; //distancia de nuestro mejor robot a la pelota dx_robot = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy_robot = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia_robot = sqrt(dx_robot*dx_robot + dy_robot*dy_robot); //comparamos con nuestro mejor robot if (distancia_robot < distancia_op[mejor_op]) mejor_op = -1; } else //no hay "peligro" mejor_op = -1; fichero.close(); return (mejor_op); } /////////////////////////////////////////////////////////////////////////////////////// void Interceptar_perseguir_pelota (Environment *env, int mejor_robot, int mejor_oponente) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double m,b,bx,by; double ballX,ballY; double punto_corte_x,punto_corte_y; double dx,dy,distancia; double dx_pelota,dy_pelota,distancia_pelota; bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el mejor robot y la pelota dx = env->home[mejor_robot].pos.x - bx; dy = env->home[mejor_robot].pos.y - by; distancia = sqrt (dx*dx + dy*dy); //la pelota viene hacia nuestra porteria con un oponente //nuestro mejor robot esta detras y cerca de la pelota if( ballX < 0 && dx < 0 && distancia < 50 && mejor_oponente != -1)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
105
{ bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m=0; b = by - m * bx; //termino independiente de la ecuacion de la pelota punto_corte_x = env->home[mejor_robot].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el mejor robot y el punto de corte dx = env->home[mejor_robot].pos.x - punto_corte_x; dy = env->home[mejor_robot].pos.y - punto_corte_y; distancia = sqrt (dx*dx + dy*dy); //distancia entre la pelota y el punto de corte dx_pelota = env->predictedBall.pos.x - punto_corte_x; dy_pelota = env->predictedBall.pos.y - punto_corte_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia_pelota < 10 && fabs(dx) < 2 && fabs(dy) < 2) //Raqueteo Velocity (&env->home[mejor_robot],-50,50); else Ir_a_punto (&env->home[mejor_robot],env,punto_corte_x,punto_corte_y); } else { Rematar_perseguir_pelota ( &env->home[mejor_robot],env ); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// int Posicionar_secundario (Environment *env, int mejor_robot) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int mejor_secundario,delante_pelota=0; int i,players = 4; double bx = env->predictedBall.pos.x; double by = env->predictedBall.pos.y; double dx[4],dy[4],distancia[4]; double ballX,ballY,angulo; double dist,x=0,y=0,radio,px,py; double m,b,d; double punto_corte_x=0,punto_corte_y=0; double dx_corte,dy_corte,distancia_corte; //miramos la direccion de la pelota
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
106
ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el mejor robot y la pelota dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]); bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //buscamos el secundario mas cercano a la pelota for (i=1;i<=players;i++) { if ( i != mejor_robot) { dx[i] = env->home[i].pos.x - env->predictedBall.pos.x; dy[i] = env->home[i].pos.y - env->predictedBall.pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); } else distancia[i] = 300; } if (distancia[1] < distancia [2]) mejor_secundario = 1; else mejor_secundario = 2; if (distancia[mejor_secundario] > distancia [3]) mejor_secundario = 3; if (distancia[mejor_secundario] > distancia [4]) mejor_secundario = 4; bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]); //la pelota viene hacia nuestra porteria con nuestro robot y el secundario detras pelota if( ballX < 0 && distancia[mejor_robot] < 15 && dx[mejor_robot] > 0 && dx[mejor_secundario] < 0 ) { d = env->home[mejor_robot].pos.y - env->home[mejor_secundario].pos.y; if( fabs(d) < 40 ) { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 )
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
107
m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente de la ecuacion de la pelota //calculamos el punto de corte del mejor secundario punto_corte_x = env->home[mejor_secundario].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el mejor secundario y el punto de corte dx_corte = env->home[mejor_secundario].pos.x - punto_corte_x; dy_corte = env->home[mejor_secundario].pos.y - punto_corte_y; distancia_corte = sqrt (dx_corte*dx_corte + dy_corte*dy_corte); if (distancia_corte < 15 && fabs(dx_corte) < 2 && fabs(dy_corte) < 2) //Raqueteo Velocity (&env->home[mejor_secundario],-50,50); else Ir_a_punto (&env->home[mejor_secundario],env,punto_corte_x, punto_corte_y); } else Rematar_perseguir_pelota ( &env->home[mejor_secundario],env ); } else { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //distancia de la pelota hasta centro porteria (0,90) px = bx - 0; py = by - 90; dist = sqrt (px*px + py*py); bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos el secundario a la mitad de distancia radio = dist/2; if (radio < 30) radio = 30; //coordenadas donde se tiene que colocar el secundario x = radio * cos (angulo); y = radio * sin (angulo) + 90; for (i=1;i<=players;i++) { if ( i != mejor_robot)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
108
{ dx[i] = env->home[i].pos.x - x; dy[i] = env->home[i].pos.y - y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); } else distancia [i] = 300; } if (distancia[1] < distancia [2]) mejor_secundario = 1; else mejor_secundario = 2; if (distancia[mejor_secundario] > distancia [3]) mejor_secundario = 3; if (distancia[mejor_secundario] > distancia [4]) mejor_secundario = 4; if (dist < 40 && fabs(dx[mejor_secundario])<2 && fabs(dy[mejor_secundario])<2) //Raqueteo Velocity (&env->home[mejor_secundario],-50,50); else Ir_a_punto (&env->home[mejor_secundario],env,x,y); } fichero.close(); return (mejor_secundario); } /////////////////////////////////////////////////////////////////////////////////////// void Reubicar_robots (Environment *env, int mejor_robot, int secundario, int pelota) {//0->zona area, 1->medio campo, 2->area contraria ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); int tercer,cuarto; int mejor_op,vc,limite; int i,players = 4; double ballX,ballY; double dx[4],dy[4],distancia[4]; double dx_op[4],dy_op[4],distancia_op[4]; double m,d,b,bx,by,px,py; double punto_corte_x=0,punto_corte_y=0; double dx_corte,dy_corte,distancia_corte; //buscamos el robot mas cercano a la pelota for (i=1;i<=players;i++) { if (i == mejor_robot) distancia[i] = 300; else if (i == secundario) distancia[i] = 300;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
109
else { dx[i] = env->home[i].pos.x - env->predictedBall.pos.x; dy[i] = env->home[i].pos.y - env->predictedBall.pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); } } //asignamos el tercer robot if (distancia[1] < distancia[2]) tercer = 1; else tercer = 2; if (distancia[tercer] > distancia[3]) tercer = 3; if (distancia[tercer] > distancia[4]) tercer = 4; //asignamos el cuarto robot cuarto = 10 - mejor_robot - secundario - tercer; dx[tercer] = env->home[tercer].pos.x - env->predictedBall.pos.x; dy[tercer] = env->home[tercer].pos.y - env->predictedBall.pos.y; distancia[tercer] = sqrt (dx[tercer]*dx[tercer] + dy[tercer]*dy[tercer]); //oponente mas cercano al tercer robot for (i=1;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->home[tercer].pos.x; dy_op[i] = env->opponent[i].pos.y - env->home[tercer].pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); if (dx[tercer] < 0 && dx_op[i] > 0) distancia_op[i] = 300; else if (dx[tercer] > 0 && dx_op[i] < 0) distancia_op[i] = 300; else if (distancia[tercer] < 30) distancia_op[i] = 300; } if (distancia_op[1] < distancia_op[2]) mejor_op = 1; else mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
110
//ubicamos el tercer robot if (distancia_op[mejor_op] != 300 && env->predictedBall.pos.x < 110 && env->home[tercer].pos.x < 110) { //tercer intercepta un robot contrario //pendiente para interceptar oponente con el tercer robot bx = env->opponent[mejor_op].pos.x; by = env->opponent[mejor_op].pos.y; ballX = bx - env->predictedBall.pos.x; ballY = by - env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente de la ecuacion de la pelota //calculamos el punto de corte con el oponente punto_corte_x = env->home[tercer].pos.x; punto_corte_y = m * punto_corte_x + b; if (punto_corte_x < 40) punto_corte_x = 40; if (punto_corte_y < 15) punto_corte_y = 15; if (punto_corte_y > 165) punto_corte_y = 165; Ir_a_punto (&env->home[tercer],env,punto_corte_x,punto_corte_y); } else { //acompañamos a nuestro mejor robot //miramos el sentido de la pelota bx = env->currentBall.pos.x; by = env->currentBall.pos.y; ballX = env->predictedBall.pos.x - bx; ballY = env->predictedBall.pos.y - by; if ((pelota == 0) || (pelota == 1 && ballX > 0)) { if (env->predictedBall.pos.y <= env->home[tercer].pos.y) { px = env->predictedBall.pos.x; py = env->predictedBall.pos.y + 30; if (px < 40) px = 40; if (py > 165) py = 165; } else if (env->predictedBall.pos.y > env->home[tercer].pos.y) { px = env->predictedBall.pos.x; py = env->predictedBall.pos.y - 30; if (px < 40) px = 40; if (py < 15) py = 15; }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
111
Ir_a_punto (&env->home[tercer],env,px,py); } else if (pelota == 2) { //leemos la velocidad deseada de los robots del fichero de texto ifstream ficher("c:\\Strategy\\vel_estatic.txt"); ficher >> vc; if (vc == 20) limite = 65; else if (vc == 30) limite = 60; else if (vc == 40) limite = 55; else if (vc == 50) limite = 50; else if (vc == 60) limite = 50; else if (vc == 70) limite = 45; else if (vc == 80) limite = 45; else if (vc == 90) limite = 30; else if (vc >= 100) limite = 30; else limite = 50; if (env->predictedBall.pos.y > 90) { if (env->predictedBall.pos.y < limite || env->predictedBall.pos.y > (180-limite)) Ir_a_punto (&env->home[tercer],env,185,105); else { if (env->home[mejor_robot].pos.y>60 && env->home[mejor_robot].pos.y < 120 && env->home[mejor_robot].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,105); else if (env->home[secundario].pos.y>60 && env->home[secundario].pos.y<120 && env->home[secundario].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,105); else if (env->home[cuarto].pos.y >60 && env->home[cuarto].pos.y < 120 && env->home[cuarto].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,105); else Rematar_perseguir_pelota (&env->home[tercer],env); } } else { if (env->predictedBall.pos.y < limite || env->predictedBall.pos.y > (180-limite)) Ir_a_punto (&env->home[tercer],env,185,75); else { if (env->home[mejor_robot].pos.y>60 && env->home[mejor_robot].pos.y<120 && env->home[mejor_robot].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,75); else if (env->home[secundario].pos.y>60 && env->home[secundario].pos.y<120 && env->home[secundario].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,75); else if (env->home[cuarto].pos.y>60 && env->home[cuarto].pos.y<120 && env->home[cuarto].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,75); else Rematar_perseguir_pelota (&env->home[tercer],env);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
112
} } } else { //la pelota viene hacia nuestra porteria con nuestro robot y el tercer robot detras pelota if( ballX < 0 && distancia[mejor_robot] < 15 && dx[mejor_robot] > 0 && dx[tercer] < 0 ) { //tercer intercepta a nuestro mejor robot d = env->home[mejor_robot].pos.y - env->home[tercer].pos.y; if( fabs(d) < 40 ) { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente ecuacion de la pelota //calculamos el punto de corte del tercer robot punto_corte_x = env->home[tercer].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el tercer robot y el punto de corte dx_corte = env->home[tercer].pos.x - punto_corte_x; dy_corte = env->home[tercer].pos.y - punto_corte_y; distancia_corte = sqrt (dx_corte*dx_corte + dy_corte*dy_corte); if (distancia_corte < 15 && fabs(dx_corte)<2 && fabs(dy_corte)< 2) //Raqueteo Velocity (&env->home[tercer],-50,50); else Ir_a_punto (&env-home[tercer],env,punto_corte_x,punto_corte_y); } else { Rematar_perseguir_pelota ( &env->home[tercer],env ); } } else { Rematar_perseguir_pelota ( &env->home[tercer],env ); } } } //ubicacion el cuarto robot segun situacion de la pelota if (pelota == 0) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
113
if (env->predictedBall.pos.y <= 90) { px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y + 30; if (px < 110) px = 110; } else if (env->predictedBall.pos.y > 90) { px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y - 30; if (px < 110) px = 110; } Ir_a_punto (&env->home[cuarto],env,px,py); } else if (pelota == 1) { if (env->predictedBall.pos.y <= 90) { px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y + 30; if (px < 110) px = 110; if (px > 185) { px = 185; py = 75; } } else if (env->predictedBall.pos.y > 90) { px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y - 30; if (px < 110) px = 110; if (px > 185) { px = 185; py = 105; } } Ir_a_punto (&env->home[cuarto],env,px,py); } else if (pelota == 2) { //leemos la velocidad deseada de los robots del fichero de texto ifstream ficher("c:\\Strategy\\vel_estatic.txt"); ficher >> vc; if (vc == 20) limite = 65;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
114
else if (vc == 30) limite = 60; else if (vc == 40) limite = 55; else if (vc == 50) limite = 50; else if (vc == 60) limite = 50; else if (vc == 70) limite = 45; else if (vc == 80) limite = 45; else if (vc == 90) limite = 30; else if (vc >= 100) limite = 30; else limite = 50; if (env->predictedBall.pos.y < limite || env->predictedBall.pos.y > (180-limite)) Ir_a_punto (&env->home[cuarto],env,182.5,90); else { if (env->home[mejor_robot].pos.y>60 && env->home[mejor_robot].pos.y<120 && env->home[mejor_robot].pos.x>200) Ir_a_punto (&env->home[cuarto],env,182.5,90); else if (env->home[secundario].pos.y>60 && env->home[secundario].pos.y<120 && env->home[secundario].pos.x>200) Ir_a_punto (&env->home[cuarto],env,182.5,90); else if (env->home[tercer].pos.y>60 && env->home[tercer].pos.y<120 && env->home[tercer].pos.x>200) Ir_a_punto (&env->home[cuarto],env,182.5,90); else Rematar_perseguir_pelota (&env->home[cuarto],env); } } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Portero ( Robot *robot, Environment *env ) { ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); double R = robot->rotation; double ballX,ballY; double m,b,bx,by,angulo_relativo; double punto_corte_x,punto_corte_y; double dx,dy,distancia,vr,vl; double dx_pelota,dy_pelota,distancia_pelota; //miramos sentido de la pelota ballX = env->predictedBall.pos.x - env->currentBall.pos.x; bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //distancia entre la pelota y el portero dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.x - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
115
//la pelota esta en nuestro lateral if ( bx < 10 && (by < 70 || by > 110) ) { //distancia entre la pelota y el portero dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (by < 65 && distancia_pelota > 20) Ir_a_punto_portero (&env->home[0],env,5,70); else if (by > 115 && distancia_pelota > 20) Ir_a_punto_portero (&env->home[0],env,5,110); else { angulo_relativo = Calculo_angulo_relativo (dx_pelota,dy_pelota,R); if (distancia_pelota < 20 && by > 50 && by < 130 ) { if (angulo_relativo < 85 && angulo_relativo > -85) { vr = 100; vl = 100; } else if (angulo_relativo > 95 || angulo_relativo < -95) { vr = -100; vl = -100; } } else { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if (by < 50) Ir_a_punto_portero (&env->home[0],env,5,70); else if (by > 130) Ir_a_punto_portero (&env->home[0],env,5,110); else Control_posicion_portero (env,robot,bx,by,angulo_relativo); } } } else if (ballX > 0 && distancia_pelota > 60) { //distancia del robot hasta el centro de la porteria (0,90) dx = robot->pos.x - 0; dy = robot->pos.y - 90; distancia = sqrt (dx*dx + dy*dy); //el portero esta lejos del centro de la porteria if (distancia > 25 || env->predictedBall.pos.x > 40 || robot->pos.x < 0) Ir_a_punto_portero(robot,env,5,90); else if (distancia_pelota < 10) Velocity (&env->home[0],-70,70); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
116
//la pelota viene hacia nuestra porteria y esta cerca else { //interceptamos la pelota bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el portero y la pelota dx = env->home[0].pos.x - bx; dy = env->home[0].pos.y - by; distancia = sqrt (dx*dx + dy+dy); if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m=0; b = by - m * bx; //termino independiente de la ecuacion de la pelota punto_corte_x = env->home[0].pos.x; punto_corte_y = m * punto_corte_x + b; //evitamos que el portero salga de los limites de la porteria if (punto_corte_x < 5) punto_corte_x = 5; if (punto_corte_y > 115) punto_corte_y = 115; else if (punto_corte_y < 65) punto_corte_y = 65; //distancia entre el mejor robot y el punto de corte dx = env->home[0].pos.x - punto_corte_x; dy = env->home[0].pos.y - punto_corte_y; distancia = sqrt (dx*dx + dy*dy); //distancia entre la pelota y el punto de corte dx_pelota = env->predictedBall.pos.x - punto_corte_x; dy_pelota = env->predictedBall.pos.y - punto_corte_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia_pelota < 10 && fabs(dx) < 2 && fabs(dy) < 2) //Raqueteo Velocity (&env->home[0],-70,70); else Ir_a_punto_portero (&env->home[0],env,punto_corte_x,punto_corte_y); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// //Estrategia del equipo DINAMICO /////////////////////////////////////////////////////////////////////////////////////// void Asignacion_comportamientos (Environment *env) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
117
ofstream fichero("c:\\Strategy\\pos.txt",ofstream::app); //inicializamos las precondiciones int A_pelota_en_campo = 0; int C_contrario_controla_pelota = 0; int D_mejor_llegar_pelota = 0; int D_secundario = 0; //1r comportamiento Portero (&env->home[0],env); //el robot 0 es el portero //1ª precondicion D_mejor_llegar_pelota = MLP(env); //Robot 1 a 4; //2ª precondicion C_contrario_controla_pelota = CCP(env,D_mejor_llegar_pelota); //si-> 1 a 4, no->-1 //2º comportamiento Interceptar_perseguir_pelota(env,D_mejor_llegar_pelota,C_contrario_controla_pelota); //colocamos el primer robot //3r comportamiento D_secundario = Posicionar_secundario(env,D_mejor_llegar_pelota); //colocamos el segundo robot //3ª precondicion A_pelota_en_campo = PEC(env); //0->zona area, 1->medio campo, 2->area contraria //4º comportamiento Reubicar_robots (env,D_mejor_llegar_pelota,D_secundario,A_pelota_en_campo); //colocamos el tercer y cuarto robot fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// //CONTROL ESTADÍSTICO /////////////////////////////////////////////////////////////////////////////////////// void Posesion_pelota (Environment *env) { //cambiamos la opcion "app" por "trunc" para empezar a escribir de nuevo ofstream fichero("c:\\Strategy\\pos_dinamic.txt",ofstream::trunc); int i,players=4; int mejor_robot,mejor_op; double per1=0,per2=0,per3=0; double dx[4],dy[4],distancia[4]; double dx_op[4],dy_op[4],distancia_op[4]; //distancia de nuestros robots respecto a la pelota for (i=0;i<=players;i++) { dx[i] = env->home[i].pos.x - env->predictedBall.pos.x; dy[i] = env->home[i].pos.y - env->predictedBall.pos.y;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
118
distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); //fichero <<i<<"-> "<<distancia[i]<<"\n"; } //buscamos a nuestro robot mas cercano a la pelota if (distancia[0] < distancia[1]) mejor_robot = 0; else mejor_robot = 1; if (distancia[mejor_robot] > distancia[2]) mejor_robot = 2; if (distancia[mejor_robot] > distancia[3]) mejor_robot = 3; if (distancia[mejor_robot] > distancia[4]) mejor_robot = 4; //fichero <<"mejor_robot: "<<mejor_robot<<"\n"; //distancias de los oponentes a la pelota for (i=0;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->predictedBall.pos.x; dy_op[i] = env->opponent[i].pos.y - env->predictedBall.pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); //fichero <<i<<"----> "<<distancia_op[i]<<"\n"; } //buscamos al oponente mas cercano a la pelota if (distancia_op[0] < distancia_op[1]) mejor_op = 0; else mejor_op = 1; if (distancia_op[mejor_op] > distancia_op[2]) mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; //buscamos el robot mas cercano a la pelota y sumamos al contador //equipo,oponente,tiempo_total son variables globales if (distancia[mejor_robot] < distancia_op[mejor_op]) equipo++; else oponente++; tiempo_total = equipo + oponente; per1 = (double)equipo/tiempo_total; per2 = (double)oponente/tiempo_total; per3 = (double)tiempo_total/tiempo_total; fichero <<"TIEMPO POSESION PELOTA\n"; fichero <<"Posesion Dinamico: "<<equipo<<" -> "<<per1*100<<" %\n"; fichero <<"Posesion Estatico: "<<oponente<<" -> "<<per2*100<<" %\n"; fichero <<"TOTAL Posesion: "<<tiempo_total<<" -> "<<per3*100<<" %\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Tiempo_lado (Environment *env) { ofstream fichero("c:\\Strategy\\pos_dinamic.txt",ofstream::app);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
119
double per1=0,per2=0,per3=0; //miramos si la pelota esta en nuestro campo o en el contrario //campo_propio,campo_contrario,tiempo_campo son variables globales if (env->predictedBall.pos.x <= 110) campo_propio++; else campo_contrario++; tiempo_campo = campo_propio + campo_contrario; per1 = (double)campo_propio/tiempo_campo; per2 = (double)campo_contrario/tiempo_campo; per3 = (double)tiempo_campo/tiempo_campo; fichero <<"TIEMPO LADO CAMPO\n"; fichero <<"Lado Dinamico: "<<campo_propio<<" -> "<<per1*100<<" %\n"; fichero <<"Lado Estatico: "<<campo_contrario<<" -> "<<per2*100<<" %\n"; fichero <<"TOTAL Lado: "<<tiempo_campo<<" -> "<<per3*100<<" %\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Tiempo_zona (Environment *env) { ofstream fichero("c:\\Strategy\\pos_dinamic.txt",ofstream::app); double per1=0,per2=0,per3=0,per4=0,per5=0; //miramos la zona donde se encuentra la pelota //zona1,zona2,zona3,zona4,tiempo_zona son variables globales if (env->predictedBall.pos.x <= 55) zona1++; //pelota de nuestra area else if (env->predictedBall.pos.x > 55 && env->predictedBall.pos.x <= 110) zona2++; //pelota en el medio campo propio else if (env->predictedBall.pos.x > 110 && env->predictedBall.pos.x <= 165 ) zona3++; //pelota en el medio campo contririo else if (env->predictedBall.pos.x > 165) zona4++; //pelota area contraria tiempo_zona = zona1 + zona2 + zona3 + zona4; per1 = (double)zona1/tiempo_zona; per2 = (double)zona2/tiempo_zona; per3 = (double)zona3/tiempo_zona; per4 = (double)zona4/tiempo_zona; per5 = (double)tiempo_zona/tiempo_zona; fichero <<"TIEMPO ZONA CAMPO\n"; fichero <<"ZONA 1: "<<zona1<<" -> "<<per1*100<<" %\n"; fichero <<"ZONA 2: "<<zona2<<" -> "<<per2*100<<" %\n"; fichero <<"ZONA 3: "<<zona3<<" -> "<<per3*100<<" %\n";
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
120
fichero <<"ZONA 4: "<<zona4<<" -> "<<per4*100<<" %\n"; fichero <<"TOTAL Zona: "<<tiempo_zona<<" -> "<<per5*100<<" %\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
121
11.2 Codi programació Equip Pseudo-dinàmic /////////////////////////////////////////////////////////////////////////////////////// //EQUIP PSEUDO-DINAMIC /////////////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Strategy.h" #include <math.h> #include <iostream> #include <fstream> using namespace std; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } const double PI = 3.1415923; ///////////////////////////////////////////////////////////////////////////////// //funciones de las acciones void Velocity (Robot *robot, double vl, double vr); double Calculo_angulo_relativo (double dx, double dy, double R); void Ir_a_punto (Robot *robot, Environment *env, double punto_x, double punto_y); void Control_posicion (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo); void Ir_a_punto_portero ( Robot *robot, Environment *env, double punto_x, double punto_y); void Control_posicion_portero (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo); //funciones de las precondiciones int PEC (Environment *env); int MLP (Environment *env,int pelota); int CCP (Environment *env,int mejor_robot); void PredictBall (Environment *env); //funciones de los comportamientos void Portero (Robot *robot, Environment *env); void Interceptar_perseguir_pelota (Environment *env, int mejor_robot, int mejor_oponente);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
122
void Rematar_perseguir_pelota (Robot *robot, Environment *env); int Posicionar_secundario (Environment *env, int mejor_robot); void Reubicar_robots (Environment *env, int mejor_robot, int secundario, int pelota); //funciones generales void Asignacion_comportamientos (Environment *env); void Cambio_coordenadas (Environment *env ); void Posesion_pelota (Environment *env); void Tiempo_campo (Environment *env); void Tiempo_zona (Environment *env); ////////////////////////////////////////////////////////////////////////////////// extern "C" STRATEGY_API void Create ( Environment *env ) { // allocate user data and assign to env->userData // eg. env->userData = ( void * ) new MyVariables (); } extern "C" STRATEGY_API void Destroy ( Environment *env ) { // free any user data created in Create ( Environment * ) // eg. if ( env->userData != NULL ) delete ( MyVariables * ) env->userData; } extern "C" STRATEGY_API void Strategy ( Environment *env ) { Cambio_coordenadas (env); PredictBall (env); Posesion_pelota (env); Tiempo_campo (env); Tiempo_zona (env); Asignacion_comportamientos (env); } /////////////////////////////////////////////////////////////////////////////////////// void Ir_a_punto ( Robot *robot, Environment *env, double punto_x, double punto_y) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i,mejor_robot; double R = robot->rotation; double dx,dy; double angulo_relativo, distancia; double px,py,angulo,radio; for (i=1;i<=4;i++) { if (env->home[i].pos.x == robot->pos.x && env->home[i].pos.y == robot->pos.y) mejor_robot = i; } //evitaremos que los robots defiendan dentro del area pequeña
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
123
//distancia del punto hasta centro porteria (0,90) px = punto_x - 0; py = punto_y - 90; distancia = sqrt (px*px + py*py); if (distancia < 30) { //calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos robot a un radio de 30cm del centro de la porteria radio = 30; //nuevas coordenadas donde se tiene que colocar el robot punto_x = radio * cos (angulo); punto_y = radio * sin (angulo) + 90; } //distancia del robot hasta el punto dx = robot->pos.x - punto_x; dy = robot->pos.y - punto_y; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (distancia > 2) Control_posicion (env,robot,punto_x,punto_y,angulo_relativo); else Velocity ( robot,0,0); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Rematar_perseguir_pelota ( Robot *robot, Environment *env) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i,mejor_robot; double R = robot->rotation; double bx = env->predictedBall.pos.x; double by = env->predictedBall.pos.y; double dx,dy,angulo_relativo; double distancia; double px,py,angulo,radio; double ballX; for (i=1;i<=4;i++) { if (env->home[i].pos.x == robot->pos.x && env->home[i].pos.y == robot->pos.y) mejor_robot = i;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
124
} if (mejor_robot < 3) { //evitaremos que los robots defiendan dentro del area pequeña //distancia del punto hasta centro porteria (0,90) px = bx - 0; py = by - 90; distancia = sqrt (px*px + py*py); if (distancia < 30 && env->home[0].pos.x < 30) { //calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos robot a un radio de 30cm del centro de la porteria radio = 30; //nuevas coordenadas donde "estara" la pelota bx = radio * cos (angulo); by = radio * sin (angulo) + 90; } dx = robot->pos.x - bx; dy = robot->pos.y - by; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (env->predictedBall.pos.x > 110) bx = 110; Control_posicion (env,robot,bx,by,angulo_relativo); } else if (mejor_robot > 2) { //miramos sentido de la pelota ballX = env->predictedBall.pos.x - env->currentBall.pos.x; dx = robot->pos.x - bx; dy = robot->pos.y - by; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (env->predictedBall.pos.x < 110) bx = 110; //control en zona de ataque if ( robot->pos.x < 165 ) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
125
if ( distancia<8.5 && dx<0 && robot->pos.y>30 && robot->pos.y<150 ) Ir_a_punto (robot,env,220,90); else Control_posicion (env,robot,bx,by,angulo_relativo); } else if ( robot->pos.x >= 165 && robot->pos.x < 205 ) { dx = robot->pos.x - env->predictedBall.pos.x; dy = robot->pos.y - env->predictedBall.pos.y; distancia = sqrt(dx * dx + dy * dy); if ( ballX <= 0&&distancia < 10 && robot->pos.y > 55 && robot->pos.y < 125) Velocity (robot,50,-50); else if ( distancia<10 && dx<0 && robot->pos.y>60 && robot->pos.y<120 ) { if (robot->pos.y <= env->predictedBall.pos.y) { if (robot->rotation > -75 && robot->rotation < 75) Velocity (robot,100,20); else if (robot->rotation > 135 && robot->rotation < -135) Velocity (robot,-20,-100); } else if (robot->pos.y > env->predictedBall.pos.y) { if (robot->rotation > -75 && robot->rotation < 75) Velocity (robot,20,100); else if (robot->rotation > 135 && robot->rotation < -135) Velocity (robot,-100,-20); } else Control_posicion (env,robot,bx,by,angulo_relativo); } else Control_posicion (env,robot,bx,by,angulo_relativo); } else if ( robot->pos.x > 205 ) { if (distancia<12 && robot->pos.y>55 && robot->pos.y<125) { if (robot->pos.y>55 && robot->pos.y<90) { if (robot->rotation < 135 && robot->rotation > 75) Velocity (robot,100,20); else if (robot->rotation > -135 && robot->rotation < -75) Velocity (robot,-20,-100); } else if (robot->pos.y>90 && robot->pos.y<125) { if (robot->rotation < 135 && robot->rotation > 75) Velocity (robot,20,100); else if (robot->rotation > -135 && robot->rotation < -75) Velocity (robot,-100,-20); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
126
else Control_posicion (env,robot,bx,by,angulo_relativo); } else Control_posicion (env,robot,bx,by,angulo_relativo); } else Control_posicion (env,robot,bx,by,angulo_relativo); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Control_posicion (Environment *env,Robot *robot,double punto_x, double punto_y, double angulo_relativo) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i,players = 4,mejor_op=0,mejor_robot=0; int area=0,colision=0; double dx[4],dy[4],distancia[4]; double dxop[5],dyop[5],distanciaop[5]; double angulo_oponente,R; double px,py,dist; double dx_pelota,dy_pelota,distancia_pelota; double mejor_x,mejor_y,mejor_dx,mejor_dy,mejor_distancia; double corte_x,corte_y,distancia_corte; double corte_pelota_x,corte_pelota_y,distancia_corte_pelota; double robot_corte_x,robot_corte_y,distancia_robot_corte; double m1,b1,m2,b2,punto_corte_x,punto_corte_y; double vr,vl,delta,delta_right=0,delta_left=0; double vc,kpa=0.1,distancia_colision; //******************************* //velocidad deseada de los robots // vc = FICHERO TEXTO; //******************************* //leemos la velocidad deseada de los robots del fichero de texto ifstream ficher("c:\\Strategy\\vel_estatic.txt"); ficher >> vc; //deteccion de obstaculos //distancia respecto a nuestros robots for (i=0;i<=players;i++) { if (env->home[i].pos.x != robot->pos.x && env->home[i].pos.y != robot->pos.y) { dx[i] = robot->pos.x - env->home[i].pos.x; dy[i] = robot->pos.y - env->home[i].pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
127
else distancia[i] = 300; } //buscamos a nuestro compañero mas cercano if (distancia[0] < distancia [1]) mejor_robot = 0; else mejor_robot = 1; if (distancia[mejor_robot] > distancia [2]) mejor_robot = 2; if (distancia[mejor_robot] > distancia [3]) mejor_robot = 3; if (distancia[mejor_robot] > distancia [4]) mejor_robot = 4; //distancia respecto a los oponentes for (i=0;i<=players;i++) { dxop[i] = robot->pos.x - env->opponent[i].pos.x; dyop[i] = robot->pos.y - env->opponent[i].pos.y; distanciaop[i] = sqrt (dxop[i]*dxop[i] + dyop[i]*dyop[i]); } //buscamos el oponente mas cercano if (distanciaop[0] < distanciaop[1]) mejor_op = 0; else mejor_op = 1; if (distanciaop[mejor_op] > distanciaop[2]) mejor_op = 2; if (distanciaop[mejor_op] > distanciaop[3]) mejor_op = 3; if (distanciaop[mejor_op] > distanciaop[4]) mejor_op = 4; //buscamos el robot mas cercano if (distancia[mejor_robot] < distanciaop[mejor_op]) { mejor_x = env->home[mejor_robot].pos.x; mejor_y = env->home[mejor_robot].pos.y; mejor_dx = dx[mejor_robot]; mejor_dy = dy[mejor_robot]; mejor_distancia = distancia[mejor_robot]; } else { mejor_x = env->opponent[mejor_op].pos.x; mejor_y = env->opponent[mejor_op].pos.y; mejor_dx = dxop[mejor_op]; mejor_dy = dyop[mejor_op]; mejor_distancia = distanciaop[mejor_op]; } //control de obstaculos px = punto_x - robot->pos.x; py = punto_y - robot->pos.y; if ( px != 0 && py !=0 ) { m1 = py/px; //pendiente de la trayectoria del objetivo m2 = -1/m1; } else
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
128
{ m1 = 0; m2 = 0; } b1 = punto_y - m1 * punto_x; //termino independiente de la ecuacion del objetivo b2 = mejor_y - m2 * mejor_x; if ( m1 != 0 && m2 !=0 ) punto_corte_x = (b2 - b1)/(m1 - m2); else punto_corte_x = 0; punto_corte_y = m2 * punto_corte_x + b2; //trigonometricamente miramos si el "oponente" esta entre el robot y el objetivo //distancia del oponente mas cercano a la trayectoria del robot corte_x = punto_corte_x - mejor_x; corte_y = punto_corte_y - mejor_y; distancia_corte = sqrt (corte_x*corte_x + corte_y*corte_y); //distancia del punto de corte al objetivo corte_pelota_x = punto_corte_x - punto_x; corte_pelota_y = punto_corte_y - punto_y; distancia_corte_pelota = sqrt (corte_pelota_x*corte_pelota_x + corte_pelota_y*corte_pelota_y); //distancia del robot al punto de corte robot_corte_x = punto_corte_x - robot->pos.x; robot_corte_y = punto_corte_y - robot->pos.y; distancia_robot_corte = sqrt (robot_corte_x*robot_corte_x + robot_corte_y*robot_corte_y); //distancia del robot respecto al objetivo dx_pelota = robot->pos.x - punto_x; dy_pelota = robot->pos.y - punto_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); //miramos si se cumplen las condiciones para tener colision colision =0; if (distancia_corte < 20) { if (distancia_corte_pelota > 0 && distancia_robot_corte > 0) { if (distancia_pelota == distancia_robot_corte + distancia_corte_pelota) colision = 1; } } //distancia y delta deseada para evitar colision if (distancia_pelota < 10) { distancia_colision = 50;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
129
delta = 40; } else { distancia_colision = 30; delta = 20; } //evitaremos el robot entre en el area pequeña //distancia del punto hasta centro porteria (0,90) px = robot->pos.x - 0; py = robot->pos.y - 90; dist = sqrt (px*px + py*py); if (dist <= 30) area = 1; //controlador de velocidad segun la distancia,angulo,oponentes y portero //valor de kpa segun la distancia al objetivo if (distancia_pelota > 100.) kpa = 0.19; else if (distancia_pelota > 50) kpa = 0.21; else if (distancia_pelota > 30) kpa = 0.24; else if (distancia_pelota > 20) kpa = 0.26; else kpa = 0.28; if (angulo_relativo < 85 && angulo_relativo > -85) //el robot ataca de frente a la pelota { //control de colisiones y area pequeña if (area == 1) { if (env->predictedBall.pos.y > robot->pos.y) delta_left = delta; else delta_right = delta; } //control de area pequeña else if (mejor_distancia < distancia_colision && colision == 1) { //miramos el sentido de giro del robot R = robot->rotation; angulo_oponente = Calculo_angulo_relativo (mejor_dx,mejor_dy,R); if (angulo_oponente < 85 && angulo_oponente > -85) { if (angulo_relativo < angulo_oponente) delta_left = delta; else if (angulo_relativo == angulo_oponente) { if (robot->pos.y <= 110) delta_left = delta; else delta_right = delta; } else if (angulo_relativo > angulo_oponente)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
130
delta_right = delta; } } //calculamos la velocidad (distancia,angulo relativo y delta) vr = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) + kpa * angulo_relativo) + delta_right; vl = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) - kpa * angulo_relativo) + delta_left; //control de velocidad en caso de "lucha" con un robot nuestro dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia[mejor_robot]<20 && distancia_pelota<12 && dx_pelota>0 && dx[mejor_robot]>0 && robot->pos.x>10) { if ( env->predictedBall.pos.y <= 90 ) { vl=-50; vr=-10; } else if ( env->predictedBall.pos.y > 90 ) { vl=-10; vr=-50; } } else if (distancia[mejor_robot]<20 && distancia_pelota<12 && robot->pos.x<=10) { if (env->predictedBall.pos.y <= 90 && dy_pelota<0 && dy[mejor_robot]<0) { vl=-50; vr=-10; } else if (env->predictedBall.pos.y > 90 && dy_pelota>0 && dy[mejor_robot]>0) { vl=-10; vr=-50; } } } else if (angulo_relativo > 95 || angulo_relativo < -95) //el robot ataca de espaldas a la pelota { //control de colisiones y area pequeña if (area == 1) { if (env->predictedBall.pos.y > robot->pos.y) delta_right = delta; else delta_left = delta; } else if (mejor_distancia < distancia_colision && colision == 1) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
131
//miramos el sentido de giro del robot R = robot->rotation; angulo_oponente = Calculo_angulo_relativo (mejor_dx,mejor_dy,R); if (angulo_oponente > 95 || angulo_oponente < -95) { if (angulo_oponente < 0) angulo_oponente += 360; if (angulo_relativo < 0) angulo_relativo += 360; if (angulo_relativo < angulo_oponente) delta_right = delta; else if (angulo_relativo == angulo_oponente) { if (robot->pos.y <= 110) delta_right = delta; else delta_left = delta; } else if (angulo_relativo > angulo_oponente) delta_left = delta; if (angulo_oponente > 180) angulo_oponente -= 360; if (angulo_relativo > 180) angulo_relativo -= 360; } } angulo_relativo += 180; if (angulo_relativo > 180) angulo_relativo -= 360; angulo_oponente += 180; if (angulo_oponente > 180) angulo_oponente -= 360; //calculamos la velocidad (distancia,angulo relativo y delta) vr = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) + kpa * angulo_relativo) - delta_right; vl = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) - kpa * angulo_relativo) - delta_left; //control de velocidad en caso de "lucha" con un robot nuestro dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia[mejor_robot]<20 && distancia_pelota<12 && dx_pelota>0 && dx[mejor_robot]>0 && robot->pos.x>10) { if ( env->predictedBall.pos.y <= 90 ) { vl=10; vr=50; } else if ( env->predictedBall.pos.y > 90 ) { vl=50; vr=10; } }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
132
else if (distancia[mejor_robot]<20 && distancia_pelota<12 && robot->pos.x<=10) { if (env->predictedBall.pos.y <= 90 && dy_pelota<0 && dy[mejor_robot]<0) { vl=10; vr=50; } else if (env->predictedBall.pos.y > 90 && dy_pelota>0 && dy[mejor_robot]>0) { vl=50; vr=10; } } } else { if (angulo_relativo <= 95 && angulo_relativo >= 85) { vr = (+.5 * angulo_relativo); vl = (-.5 * angulo_relativo); } else if (angulo_relativo >= -95 && angulo_relativo <= -85) { vl = (+.5 * angulo_relativo); vr = (-.5 * angulo_relativo); } } Velocity ( robot,vl,vr ); fichero.close(); ficher.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Ir_a_punto_portero ( Robot *robot, Environment *env, double punto_x, double punto_y) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); double R = robot->rotation; double dx,dy; double angulo_relativo, distancia; //distancia del robot hasta el punto dx = robot->pos.x - punto_x; dy = robot->pos.y - punto_y; angulo_relativo = Calculo_angulo_relativo (dx,dy,R); distancia = sqrt(dx * dx + dy * dy); if (distancia > 2) Control_posicion_portero (env,robot,punto_x,punto_y,angulo_relativo);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
133
else Velocity (robot,0,0); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Control_posicion_portero (Environment *env,Robot *robot,double punto_x, double punto_y,double angulo_relativo) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); double dx_pelota,dy_pelota,distancia_pelota; double vr,vl; double vc,kpa=0.1; //******************************* //velocidad deseada de los robots vc = 70; //******************************* //distancia del robot respecto a la pelota dx_pelota = robot->pos.x - punto_x; dy_pelota = robot->pos.y - punto_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); //controlador de velocidad segun la distancia,angulo,oponentes y portero //valor de kpa segun la distancia al objetivo if (distancia_pelota > 100.) kpa = 0.19; else if (distancia_pelota > 50) kpa = 0.21; else if (distancia_pelota > 30) kpa = 0.24; else if (distancia_pelota > 20) kpa = 0.26; else kpa = 0.28; if (angulo_relativo < 85 && angulo_relativo > -85) //el robot ataca de frente a la pelota { //calculamos la velocidad (distancia,angulo relativo y delta) vr = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) + kpa * angulo_relativo); vl = ( vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) - kpa * angulo_relativo); } else if (angulo_relativo > 95 || angulo_relativo < -95) //el robot ataca de espaldas a la pelota { angulo_relativo += 180; if (angulo_relativo > 180) angulo_relativo -= 360; //calculamos la velocidad (distancia,angulo relativo y delta) vr = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) + kpa * angulo_relativo); vl = (-vc * (1.0 / (1.0 + exp(-3.0 * distancia_pelota)) - 0.3) - kpa * angulo_relativo); } else
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
134
{ if (angulo_relativo <= 95 && angulo_relativo >= 85) { vr = (+.5 * angulo_relativo); vl = (-.5 * angulo_relativo); } else if (angulo_relativo >= -95 && angulo_relativo <= -85) { vl = (+.5 * angulo_relativo); vr = (-.5 * angulo_relativo); } } Velocity ( robot,vl,vr ); fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Velocity ( Robot *robot, double vl, double vr ) { robot->velocityRight = vr; robot->velocityLeft = vl; } /////////////////////////////////////////////////////////////////////////////////////// void PredictBall ( Environment *env ) { double dx_p = env->currentBall.pos.x - env->lastBall.pos.x; double dy_p = env->currentBall.pos.y - env->lastBall.pos.y; env->predictedBall.pos.x = env->currentBall.pos.x + dx_p; env->predictedBall.pos.y = env->currentBall.pos.y + dy_p; } /////////////////////////////////////////////////////////////////////////////////////// void Cambio_coordenadas (Environment *env) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i; double factor_escala = 220/(FRIGHTX - FLEFTX); //pasamos de pulgadas a cm if (env->home[0].pos.x < 50) //equipo amarillo { env->predictedBall.pos.x = (env->predictedBall.pos.x - FLEFTX) * factor_escala; env->predictedBall.pos.y = (env->predictedBall.pos.y - FBOT) * factor_escala; env->currentBall.pos.x = (env->currentBall.pos.x - FLEFTX) * factor_escala; env->currentBall.pos.y = (env->currentBall.pos.y - FBOT) * factor_escala; env->lastBall.pos.x = (env->lastBall.pos.x - FLEFTX) * factor_escala; env->lastBall.pos.y = (env->lastBall.pos.y - FBOT) * factor_escala; for (i=0;i<5;i++)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
135
{ env->home[i].pos.x = (env->home[i].pos.x - FLEFTX) * factor_escala; env->home[i].pos.y = (env->home[i].pos.y - FBOT) * factor_escala; env->opponent[i].pos.x = (env->opponent[i].pos.x - FLEFTX) * factor_escala; env->opponent[i].pos.y = (env->opponent[i].pos.y - FBOT) * factor_escala; } } else //(env->home[0].pos.x > 50) equipo azul { env->predictedBall.pos.x= (FRIGHTX - env->predictedBall.pos.x) * factor_escala; env->predictedBall.pos.y = (FTOP - env->predictedBall.pos.y) * factor_escala; env->currentBall.pos.x = (FRIGHTX - env->currentBall.pos.x) * factor_escala; env->currentBall.pos.y = (FTOP - env->currentBall.pos.y) * factor_escala; env->lastBall.pos.x = (FRIGHTX - env->lastBall.pos.x) * factor_escala; env->lastBall.pos.y = (FTOP - env->lastBall.pos.y) * factor_escala; for (i=0;i<5;i++) { env->home[i].pos.x = (FRIGHTX - env->home[i].pos.x) * factor_escala; env->home[i].pos.y = (FTOP - env->home[i].pos.y) * factor_escala; env->home[i].rotation = env->home[i].rotation - 180; env->opponent[i].pos.x= (FRIGHTX - env->opponent[i].pos.x) * factor_escala; env->opponent[i].pos.y = (FTOP - env->opponent[i].pos.y) * factor_escala; env->opponent[i].rotation = env->opponent[i].rotation - 180; if (env->home[i].rotation < -180) env->home[i].rotation += 360; if (env->opponent[i].rotation < -180) env->opponent[i].rotation += 360; } } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// double Calculo_angulo_relativo (double dx, double dy, double R) { double angulo_obstaculo, angulo_relativo, variable; if ( dx == 0 ) { if ( dy > 0 ) angulo_obstaculo = -90; else angulo_obstaculo = 90; } else if ( dy == 0 ) { if ( dx > 0 ) angulo_obstaculo = 180; else angulo_obstaculo = 0; } else { angulo_obstaculo = atan2(fabs(dy),fabs(dx))*(180.0/ PI); //angulo segun cuadrante if ( dx > 0 )
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
136
{ if ( dy > 0 ) angulo_obstaculo = angulo_obstaculo + 180; else if ( dy < 0 ) angulo_obstaculo = 180 - angulo_obstaculo; } else // dx < 0 { if ( dy > 0 ) angulo_obstaculo = - angulo_obstaculo; else if ( dy < 0 ) angulo_obstaculo = angulo_obstaculo; } } while ( angulo_obstaculo < -180 ) angulo_obstaculo += 360; while ( angulo_obstaculo > 180 ) angulo_obstaculo -= 360; angulo_relativo = ( angulo_obstaculo - R ); if ( dx > 0 ) { if ( dy > 0 ) { variable = angulo_obstaculo + 180; if (R > variable ) angulo_relativo += 360; } else { variable = angulo_obstaculo - 180; if (R < variable ) angulo_relativo -= 360; } } return (angulo_relativo); } /////////////////////////////////////////////////////////////////////////////////////// int PEC (Environment *env) {//A_pelota_nuestro_campo. 0->zona area, 1->medio campo, 2->3/4, 3->ataque int pelota; if (env->predictedBall.pos.x <= 40) pelota = 0; //zona de nuestra area else if (env->predictedBall.pos.x > 40 && env->predictedBall.pos.x <= 110) pelota = 1; //pelota en el medio del campo else if (env->predictedBall.pos.x > 110 && env->predictedBall.pos.x <= 165 ) pelota = 2; //pelota en el medio del campo else if (env->predictedBall.pos.x > 165) pelota = 3; //zona area contraria return(pelota); } /////////////////////////////////////////////////////////////////////////////////////// int MLP (Environment *env,int pelota) {//D_mejor_llegar_pelota. env->home[i]== 1 a 4;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
137
ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i; int mejor_robot,cercanos_pelota=0; int robot_cercano1=0,robot_cercano2=0; double dx[4],dy[4],distancia[4]; if (pelota < 2) //escogemos entre el robot 1 y 2 { //calculamos la distancia respecto la pelota dx[1] = env->home[1].pos.x - env->predictedBall.pos.x; dy[1] = env->home[1].pos.y - env->predictedBall.pos.y; distancia[1] = sqrt (dx[1]*dx[1] + dy[1]*dy[1]); dx[2] = env->home[2].pos.x - env->predictedBall.pos.x; dy[2] = env->home[2].pos.y - env->predictedBall.pos.y; distancia[2] = sqrt (dx[2]*dx[2] + dy[2]*dy[2]); //miramos los robots mas cercanos a la pelota if (dx[1]<0 || dx[2]<0) { for (i=1;i<=2;i++) { if (dx[i]>0 && distancia[i]>20) distancia[i] = 300; if (distancia[i] <= 20) { cercanos_pelota++; if (cercanos_pelota == 1) robot_cercano1 = i; if (cercanos_pelota == 2) robot_cercano2 = i; } } } } else if (pelota > 1) //escogemos entre el robot 3 y 4 { //calculamos la distancia respecto la pelota dx[3] = env->home[3].pos.x - env->predictedBall.pos.x; dy[3] = env->home[3].pos.y - env->predictedBall.pos.y; distancia[3] = sqrt (dx[3]*dx[3] + dy[3]*dy[3]); dx[4] = env->home[4].pos.x - env->predictedBall.pos.x; dy[4] = env->home[4].pos.y - env->predictedBall.pos.y; distancia[4] = sqrt (dx[4]*dx[4] + dy[4]*dy[4]); //miramos los robots mas cercanos a la pelota if (dx[3]<0 || dx[4]<0) { for (i=3;i<=4;i++) { if (dx[i]>0 && distancia[i]>20) distancia[i] = 300; if (distancia[i] <= 20) {
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
138
cercanos_pelota++; if (cercanos_pelota == 1) robot_cercano1 = i; if (cercanos_pelota == 2) robot_cercano2 = i; } } } } //escogemos el robot mejor situado if (cercanos_pelota == 1) mejor_robot = robot_cercano1; else if (cercanos_pelota > 1) { if (dx[robot_cercano1] < 0 && dx[robot_cercano2] < 0) { if (distancia[robot_cercano1] < distancia [robot_cercano2]) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } else if (dx[robot_cercano1] > 0 && dx[robot_cercano2] > 0) { if (distancia[robot_cercano1] < distancia [robot_cercano2]) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } else { if (dx[robot_cercano1] < 0) mejor_robot = robot_cercano1; else mejor_robot = robot_cercano2; } } else if (cercanos_pelota == 0) { if (pelota < 2) { if (distancia[1] < distancia [2]) mejor_robot = 1; else mejor_robot = 2; } else if (pelota > 1) { if (distancia[3] < distancia [4]) mejor_robot = 3; else mejor_robot = 4; } } return (mejor_robot); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
139
/////////////////////////////////////////////////////////////////////////////////////// int CCP (Environment *env, int mejor_robot) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int i,players = 4; int mejor_op,peligro = 0; double dx_robot,dy_robot,distancia_robot; double dx_op[4],dy_op[4],distancia_op[4]; //distancias de los oponentes a la pelota for (i=1;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->predictedBall.pos.x; dy_op[i] = env->opponent[i].pos.y - env->predictedBall.pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); //robot por delante y cerca de la pelota y mas alla de nuestra area if (dx_op[i] > 0 && env->opponent[i].pos.x > 40 && distancia_op[i] < 20) peligro++; else distancia_op[i] = 300; } if (peligro!=0) //algun oponente esta bien posicionado { //buscamos el oponente mas "peligroso" a la pelota if (distancia_op[1] < distancia_op[2]) mejor_op = 1; else mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; //distancia de nuestro mejor robot a la pelota dx_robot = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy_robot = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia_robot = sqrt(dx_robot*dx_robot + dy_robot*dy_robot); //comparamos con nuestro mejor robot if (distancia_robot < distancia_op[mejor_op]) mejor_op = -1; } else //no hay "peligro" mejor_op = -1; fichero.close(); return (mejor_op); }
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
140
/////////////////////////////////////////////////////////////////////////////////////// void Interceptar_perseguir_pelota (Environment *env, int mejor_robot, int mejor_oponente) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); double m,b,bx,by; double ballX,ballY; double punto_corte_x,punto_corte_y; double dx,dy,distancia; double dx_pelota,dy_pelota,distancia_pelota; bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el mejor robot y la pelota dx = env->home[mejor_robot].pos.x - bx; dy = env->home[mejor_robot].pos.y - by; distancia = sqrt (dx*dx + dy*dy); //la pelota viene hacia nuestra porteria con un oponente //nuestro mejor robot esta detras y cerca de la pelota if( ballX < 0 && dx < 0 && distancia < 50 && mejor_oponente != -1) { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m=0; b = by - m * bx; //termino independiente de la ecuacion de la pelota punto_corte_x = env->home[mejor_robot].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el mejor robot y el punto de corte dx = env->home[mejor_robot].pos.x - punto_corte_x; dy = env->home[mejor_robot].pos.y - punto_corte_y; distancia = sqrt (dx*dx + dy*dy); //distancia entre la pelota y el punto de corte dx_pelota = env->predictedBall.pos.x - punto_corte_x; dy_pelota = env->predictedBall.pos.y - punto_corte_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia_pelota < 10 && fabs(dx) < 2 && fabs(dy) < 2) //Raqueteo Velocity (&env->home[mejor_robot],-50,50); else
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
141
Ir_a_punto (&env->home[mejor_robot],env,punto_corte_x,punto_corte_y); } else { Rematar_perseguir_pelota ( &env->home[mejor_robot],env ); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// int Posicionar_secundario (Environment *env, int mejor_robot) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int mejor_secundario,delante_pelota=0; int players = 4; double bx = env->predictedBall.pos.x; double by = env->predictedBall.pos.y; double dx[4],dy[4],distancia[4]; double ballX,ballY,angulo; double dist,x=0,y=0,radio,px,py; double m,b,d; double punto_corte_x=0,punto_corte_y=0; double dx_corte,dy_corte,distancia_corte; //miramos la direccion de la pelota ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el mejor robot y la pelota dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]); bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if (mejor_robot < 3) { if (mejor_robot == 2) mejor_secundario = 1; else if (mejor_robot == 1) mejor_secundario = 2; } else if (mejor_robot > 2) { //buscamos el robot mas cercano a la pelota dx[1] = env->home[1].pos.x - env->predictedBall.pos.x; dy[1] = env->home[1].pos.y - env->predictedBall.pos.y; distancia[1] = sqrt (dx[1]*dx[1] + dy[1]*dy[1]); dx[2] = env->home[2].pos.x - env->predictedBall.pos.x;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
142
dy[2] = env->home[2].pos.y - env->predictedBall.pos.y; distancia[2] = sqrt (dx[2]*dx[2] + dy[2]*dy[2]); //asignamos el tercer robot if (distancia[1] < distancia[2]) mejor_secundario = 2; else mejor_secundario = 1; } bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y; distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]); //la pelota viene hacia nuestra porteria con nuestro robot y el secundario detras pelota if( ballX < 0 && distancia[mejor_robot] < 15 && dx[mejor_robot] > 0 && dx[mejor_secundario] < 0 ) { d = env->home[mejor_robot].pos.y - env->home[mejor_secundario].pos.y; if( fabs(d) < 40 ) { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente de la ecuacion de la pelota //calculamos el punto de corte del mejor secundario punto_corte_x = env->home[mejor_secundario].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el mejor secundario y el punto de corte dx_corte = env->home[mejor_secundario].pos.x - punto_corte_x; dy_corte = env->home[mejor_secundario].pos.y - punto_corte_y; distancia_corte = sqrt (dx_corte*dx_corte + dy_corte*dy_corte); if (distancia_corte < 15 && fabs(dx_corte) < 2 && fabs(dy_corte) < 2) //Raqueteo Velocity (&env->home[mejor_secundario],-50,50); else Ir_a_punto (&env->home[mejor_secundario],env,punto_corte_x, punto_corte_y); } else Rematar_perseguir_pelota ( &env->home[mejor_secundario],env ); } else
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
143
{ bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //distancia de la pelota hasta centro porteria (0,90) px = bx - 0; py = by - 90; dist = sqrt (px*px + py*py); bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //calculamos el angulo if (py == 0) angulo = 0; else angulo = atan2(py,px); //colocaremos el secundario a la mitad de distancia radio = dist/2; if (radio < 30) radio = 30; if (radio > 95) radio = 95; //coordenadas donde se tiene que colocar el secundario x = radio * cos (angulo); y = radio * sin (angulo) + 90; if (dist< 40 && fabs(dx[mejor_secundario])<2 && fabs(dy[mejor_secundario]) < 2) //Raqueteo Velocity (&env->home[mejor_secundario],-50,50); else Ir_a_punto (&env->home[mejor_secundario],env,x,y); } fichero.close(); return (mejor_secundario); } /////////////////////////////////////////////////////////////////////////////////////// void Reubicar_robots (Environment *env, int mejor_robot, int secundario, int pelota) {//0->zona area, 1->medio campo, 2->area contraria ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); int tercer,cuarto; int mejor_op,vc,limite; int i,players = 4; double ballX,ballY; double dx[4],dy[4],distancia[4]; double dx_op[4],dy_op[4],distancia_op[4]; double m,d,b,bx,by,px,py; double punto_corte_x=0,punto_corte_y=0;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
144
double dx_corte,dy_corte,distancia_corte; if (pelota < 2) //la pelota en nuestro campo { //buscamos el robot mas cercano a la pelota dx[3] = env->home[3].pos.x - env->predictedBall.pos.x; dy[3] = env->home[3].pos.y - env->predictedBall.pos.y; distancia[3] = sqrt (dx[3]*dx[3] + dy[3]*dy[3]); dx[4] = env->home[4].pos.x - env->predictedBall.pos.x; dy[4] = env->home[4].pos.y - env->predictedBall.pos.y; distancia[4] = sqrt (dx[4]*dx[4] + dy[4]*dy[4]); //asignamos el tercer robot if (distancia[3] < distancia[4]) tercer = 3; else tercer = 4; cuarto = 7 - tercer; } else if (pelota > 1) //la pelota en campo contrario { tercer = mejor_robot; mejor_robot = 7 - tercer; cuarto = secundario; } //oponente mas cercano al tercer robot for (i=1;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->home[tercer].pos.x; dy_op[i] = env->opponent[i].pos.y - env->home[tercer].pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); if (dx[tercer] < 0 && dx_op[i] > 0) distancia_op[i] = 300; else if (dx[tercer] > 0 && dx_op[i] < 0) distancia_op[i] = 300; else if (distancia[tercer] < 30) distancia_op[i] = 300; } if (distancia_op[1] < distancia_op[2]) mejor_op = 1; else mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; dx[mejor_robot] = env->home[mejor_robot].pos.x - env->predictedBall.pos.x; dy[mejor_robot] = env->home[mejor_robot].pos.y - env->predictedBall.pos.y;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
145
distancia[mejor_robot] = sqrt (dx[mejor_robot]*dx[mejor_robot] + dy[mejor_robot]*dy[mejor_robot]); //ubicamos el tercer robot if (distancia_op[mejor_op] != 300 && env->predictedBall.pos.x > 110 && env->home[tercer].pos.x < 110) { //tercer intercepta un robot contrario //pendiente para interceptar oponente con el tercer robot bx = env->opponent[mejor_op].pos.x; by = env->opponent[mejor_op].pos.y; ballX = bx - env->predictedBall.pos.x; ballY = by - env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente de la ecuacion de la pelota //calculamos el punto de corte con el oponente punto_corte_x = env->home[tercer].pos.x; punto_corte_y = m * punto_corte_x + b; if (punto_corte_x < 110) punto_corte_x = 110; if (punto_corte_y < 15) punto_corte_y = 15; if (punto_corte_y > 165) punto_corte_y = 165; Ir_a_punto (&env->home[tercer],env,punto_corte_x,punto_corte_y); } else { //acompañamos a nuestro mejor robot //miramos el sentido de la pelota bx = env->currentBall.pos.x; by = env->currentBall.pos.y; ballX = env->predictedBall.pos.x - bx; ballY = env->predictedBall.pos.y - by; if ((pelota == 0)||((pelota == 1)&&(ballX > 0))||((pelota == 2)&&(ballX > 0))) { if (env->predictedBall.pos.y <= env->home[tercer].pos.y) { px = env->predictedBall.pos.x; py = env->predictedBall.pos.y + 30; if (px < 110) px = 110; if (py > 165) py = 165; } else if (env->predictedBall.pos.y > env->home[tercer].pos.y) { px = env->predictedBall.pos.x; py = env->predictedBall.pos.y - 30; if (px < 110) px = 110;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
146
if (py < 15) py = 15; } Ir_a_punto (&env->home[tercer],env,px,py); } else if (pelota == 3) { //leemos la velocidad deseada de los robots del fichero de texto ifstream ficher("c:\\Strategy\\vel_estatic.txt"); ficher >> vc; if (vc == 20) limite = 65; else if (vc == 30) limite = 60; else if (vc == 40) limite = 55; else if (vc == 50) limite = 50; else if (vc == 60) limite = 50; else if (vc == 70) limite = 45; else if (vc == 80) limite = 45; else if (vc == 90) limite = 30; else if (vc >= 100) limite = 30; else limite = 50; if (env->predictedBall.pos.y > 90) { if (env->predictedBall.pos.y < limite || env->predictedBall.pos.y > (180-limite)) Ir_a_punto (&env->home[tercer],env,185,105); else { if (env->home[mejor_robot].pos.y>60 && env->home[mejor_robot].pos.y<120 && env->home[mejor_robot].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,105); else Rematar_perseguir_pelota (&env->home[tercer],env); } } else { if (env->predictedBall.pos.y < limite || env->predictedBall.pos.y > (180-limite)) Ir_a_punto (&env->home[tercer],env,185,75); else { if (env->home[mejor_robot].pos.y>60 && env->home[mejor_robot].pos.y<120 && env->home[mejor_robot].pos.x>200) Ir_a_punto (&env->home[tercer],env,185,75); else Rematar_perseguir_pelota (&env->home[tercer],env); } } } else { //la pelota viene hacia nuestra porteria con nuestro robot y el tercer robot detras pelota if( ballX < 0 && distancia[mejor_robot] < 15 && dx[mejor_robot] > 0 && dx[tercer] < 0 )
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
147
{ //tercer intercepta a nuestro mejor robot d = env->home[mejor_robot].pos.y - env->home[tercer].pos.y; if( fabs(d) < 40 ) { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m = 0; b = by - m * bx; //termino independiente ecuacion de la pelota //calculamos el punto de corte del tercer robot punto_corte_x = env->home[tercer].pos.x; punto_corte_y = m * punto_corte_x + b; //distancia entre el tercer robot y el punto de corte dx_corte = env->home[tercer].pos.x - punto_corte_x; dy_corte = env->home[tercer].pos.y - punto_corte_y; distancia_corte = sqrt (dx_corte*dx_corte + dy_corte*dy_corte); if (distancia_corte<15 && fabs(dx_corte)< 2 && fabs(dy_corte) < 2) //Raqueteo Velocity (&env->home[tercer],-50,50); else Ir_a_punto (&env->home[tercer],env,punto_corte_x, punto_corte_y); } else { Rematar_perseguir_pelota ( &env->home[tercer],env ); if (env->home[tercer].pos.x < 110) Ir_a_punto (&env->home[tercer],env,110,env->predictedBall.pos.y); } } else { Rematar_perseguir_pelota ( &env->home[tercer],env ); if (env->home[tercer].pos.x < 110) Ir_a_punto (&env->home[tercer],env,110,env->predictedBall.pos.y); } } } //ubicacion el cuarto robot segun situacion de la pelota if (cuarto > 2) //colocamos el robot 3 o 4 en el medio campo { if (env->predictedBall.pos.y <= 90)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
148
{ px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y + 30; if (px < 125) px = 125; if (px > 185) { px = 185; py = 65; } } else if (env->predictedBall.pos.y > 90) { px = env->predictedBall.pos.x + 50; py = env->predictedBall.pos.y - 30; if (px < 125) px = 125; if (px > 185) { px = 185; py = 115; } } Ir_a_punto (&env->home[cuarto],env,px,py); } else if (cuarto < 3) //colocamos el robot 1 o 2 en el medio campo { //se colocara en el medio campo siguiendo la coordenada "y" de la pelota punto_corte_x = 110; punto_corte_y = env->predictedBall.pos.y; if (fabs(env->home[cuarto].pos.x - env->predictedBall.pos.x) < 10) //Raqueteo Velocity (&env->home[cuarto],-50,50); else Ir_a_punto (&env->home[cuarto],env,punto_corte_x,punto_corte_y); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Portero ( Robot *robot, Environment *env ) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); double R = robot->rotation; double ballX,ballY; double m,b,bx,by,angulo_relativo; double punto_corte_x,punto_corte_y; double dx,dy,distancia,vr,vl; double dx_pelota,dy_pelota,distancia_pelota;
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
149
//miramos sentido de la pelota ballX = env->predictedBall.pos.x - env->currentBall.pos.x; bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; //distancia entre la pelota y el portero dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.x - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); //la pelota esta en nuestro lateral if ( bx < 10 && (by < 70 || by > 110) ) { //distancia entre la pelota y el portero dx_pelota = robot->pos.x - env->predictedBall.pos.x; dy_pelota = robot->pos.y - env->predictedBall.pos.y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (by < 65 && distancia_pelota > 20) Ir_a_punto_portero (&env->home[0],env,5,70); else if (by > 115 && distancia_pelota > 20) Ir_a_punto_portero (&env->home[0],env,5,110); else { angulo_relativo = Calculo_angulo_relativo (dx_pelota,dy_pelota,R); if (distancia_pelota < 20 && by > 50 && by < 130 ) { if (angulo_relativo < 85 && angulo_relativo > -85) { vr = 100; vl = 100; } else if (angulo_relativo > 95 || angulo_relativo < -95) { vr = -100; vl = -100; } } else { bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; if (by < 50) Ir_a_punto_portero (&env->home[0],env,5,70); else if (by > 130) Ir_a_punto_portero (&env->home[0],env,5,110); else Control_posicion_portero (env,robot,bx,by,angulo_relativo); } } } else if (ballX > 0 && distancia_pelota > 60)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
150
{ //distancia del robot hasta el centro de la porteria (0,90) dx = robot->pos.x - 0; dy = robot->pos.y - 90; distancia = sqrt (dx*dx + dy*dy); //el portero esta lejos del centro de la porteria if (distancia > 25 || env->predictedBall.pos.x > 40 || robot->pos.x < 0) Ir_a_punto_portero(robot,env,5,90); else if (distancia_pelota < 10) Velocity (&env->home[0],-70,70); } //la pelota viene hacia nuestra porteria y esta cerca else { //interceptamos la pelota bx = env->predictedBall.pos.x; by = env->predictedBall.pos.y; ballX = bx - env->currentBall.pos.x; ballY = by - env->currentBall.pos.y; //calculamos la distancia entre el portero y la pelota dx = env->home[0].pos.x - bx; dy = env->home[0].pos.y - by; distancia = sqrt (dx*dx + dy+dy); if ( ballX != 0 && ballY !=0 ) m = ballY/ballX; //pendiente de la trayectoria de la pelota else m=0; b = by - m * bx; //termino independiente de la ecuacion de la pelota punto_corte_x = env->home[0].pos.x; punto_corte_y = m * punto_corte_x + b; //evitamos que el portero salga de los limites de la porteria if (punto_corte_x < 5) punto_corte_x = 5; if (punto_corte_y > 115) punto_corte_y = 115; else if (punto_corte_y < 65) punto_corte_y = 65; //distancia entre el mejor robot y el punto de corte dx = env->home[0].pos.x - punto_corte_x; dy = env->home[0].pos.y - punto_corte_y; distancia = sqrt (dx*dx + dy*dy); //distancia entre la pelota y el punto de corte dx_pelota = env->predictedBall.pos.x - punto_corte_x; dy_pelota = env->predictedBall.pos.y - punto_corte_y; distancia_pelota = sqrt (dx_pelota*dx_pelota + dy_pelota*dy_pelota); if (distancia_pelota < 10 && fabs(dx) < 2 && fabs(dy) < 2) //Raqueteo Velocity (&env->home[0],-70,70);
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
151
else Ir_a_punto_portero (&env->home[0],env,punto_corte_x,punto_corte_y); } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// //Estrategia del equipo ESTATICO /////////////////////////////////////////////////////////////////////////////////////// void Asignacion_comportamientos (Environment *env) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); //inicializamos las precondiciones int A_pelota_en_campo = 0; int C_contrario_controla_pelota = 0; int D_mejor_llegar_pelota = 0; int D_secundario = 0; int Primer_robot = 0; int Segundo_robot = 0; int H_pelota_delanteros = 0; int U_tercero = 0; Portero (&env->home[0],env); //el robot 0 es el portero A_pelota_en_campo = PEC(env); //0->zona area, 1->medio campo, 2->3/4, 3->area contraria if (A_pelota_en_campo < 2) //pelota en nuestro campo { D_mejor_llegar_pelota = MLP(env,A_pelota_en_campo); //Robot 1 y 2; C_contrario_controla_pelota=CCP(env,D_mejor_llegar_pelota); //si->1 a 4, no->-1 Interceptar_perseguir_pelota(env,D_mejor_llegar_pelota,C_contrario_controla_pelota); //colocamos el primer robot D_secundario = Posicionar_secundario(env,D_mejor_llegar_pelota); //colocamos el segundo robot Reubicar_robots (env,D_mejor_llegar_pelota,D_secundario,A_pelota_en_campo); //colocamos el tercer y cuarto robot } else if (A_pelota_en_campo > 1) //pelota en campo contrario { D_mejor_llegar_pelota = MLP(env,A_pelota_en_campo); //Robot 3 y 4; C_contrario_controla_pelota = CCP(env,D_mejor_llegar_pelota); //si-> 1 a 4, no->-1 Interceptar_perseguir_pelota(env,D_mejor_llegar_pelota,C_contrario_controla_pelota); //colocamos el primer robot Segundo_robot = Posicionar_secundario(env,D_mejor_llegar_pelota); //colocamos
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
152
el mejor defensa entre 1 y 2 Primer_robot = 3 - Segundo_robot; //entre robot 1 y 2 para ir al medio campo D_secundario = 7 - D_mejor_llegar_pelota; //entre robot 3 y 4 para ir a punto de remate Reubicar_robots (env,D_secundario,Primer_robot,A_pelota_en_campo); //colocamos el primer robot y D_secundario } fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// //CONTROL ESTADÍSTICO /////////////////////////////////////////////////////////////////////////////////////// void Posesion_pelota (Environment *env) { //cambiamos la opcion "app" por "trunc" para empezar a escribir de nuevo ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::trunc); int i,players=4; int mejor_robot,mejor_op; double dx[4],dy[4],distancia[4]; double dx_op[4],dy_op[4],distancia_op[4]; //distancia de nuestros robots respecto a la pelota for (i=0;i<=players;i++) { dx[i] = env->home[i].pos.x - env->predictedBall.pos.x; dy[i] = env->home[i].pos.y - env->predictedBall.pos.y; distancia[i] = sqrt (dx[i]*dx[i] + dy[i]*dy[i]); //fichero <<i<<"-> "<<distancia[i]<<"\n"; } //buscamos a nuestro robot mas cercano a la pelota if (distancia[0] < distancia[1]) mejor_robot = 0; else mejor_robot = 1; if (distancia[mejor_robot] > distancia[2]) mejor_robot = 2; if (distancia[mejor_robot] > distancia[3]) mejor_robot = 3; if (distancia[mejor_robot] > distancia[4]) mejor_robot = 4; fichero <<"mejor_robot: "<<mejor_robot<<"\n"; //distancias de los oponentes a la pelota for (i=0;i<=players;i++) { dx_op[i] = env->opponent[i].pos.x - env->predictedBall.pos.x; dy_op[i] = env->opponent[i].pos.y - env->predictedBall.pos.y; distancia_op[i] = sqrt (dx_op[i]*dx_op[i] + dy_op[i]*dy_op[i]); //fichero <<i<<"----> "<<distancia_op[i]<<"\n"; } //buscamos al oponente mas cercano a la pelota
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
153
if (distancia_op[0] < distancia_op[1]) mejor_op = 0; else mejor_op = 1; if (distancia_op[mejor_op] > distancia_op[2]) mejor_op = 2; if (distancia_op[mejor_op] > distancia_op[3]) mejor_op = 3; if (distancia_op[mejor_op] > distancia_op[4]) mejor_op = 4; fichero <<"mejor_op: "<<mejor_op<<"\n"; //buscamos el robot mas cercano a la pelota y sumamos al contador //equipo,oponente,tiempo_total son variables globales if (distancia[mejor_robot] < distancia_op[mejor_op]) equipo++; else oponente++; tiempo_total = equipo + oponente; fichero <<"Equipo: "<<equipo<<"\n"; fichero <<"Oponente: "<<oponente<<"\n"; fichero <<"TOTAL: "<<tiempo_total<<"\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Tiempo_campo (Environment *env) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); //miramos si la pelota esta en nuestro campo o en el contrario //campo_propio,campo_contrario,tiempo_campo son variables globales if (env->predictedBall.pos.x <= 110) campo_propio++; else campo_contrario++; tiempo_campo = campo_propio + campo_contrario; fichero <<"campo_propio: "<<campo_propio<<"\n"; fichero <<"campo_contrario: "<<campo_contrario<<"\n"; fichero <<"TOTAL: "<<tiempo_campo<<"\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// void Tiempo_zona (Environment *env) { ofstream fichero("c:\\Strategy\\pos_estatic.txt",ofstream::app); //miramos la zona donde se encuentra la pelota //zona1,zona2,zona3,zona4,tiempo_zona son variables globales if (env->predictedBall.pos.x <= 55)
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
154
zona1++; //pelota de nuestra area else if (env->predictedBall.pos.x > 55 && env->predictedBall.pos.x <= 110) zona2++; //pelota en el medio campo propio else if (env->predictedBall.pos.x > 110 && env->predictedBall.pos.x <= 165 ) zona3++; //pelota en el medio campo contrario else if (env->predictedBall.pos.x > 165) zona4++; //pelota area contraria tiempo_zona = zona1 + zona2 + zona3 + zona4; fichero <<"zona1: "<<zona1<<"\n"; fichero <<"zona2: "<<zona2<<"\n"; fichero <<"zona3: "<<zona3<<"\n"; fichero <<"zona4: "<<zona4<<"\n"; fichero <<"TOTAL: "<<tiempo_zona<<"\n\n"; fichero.close(); } /////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
155
11.3 Dades resultats Robot Soccer A continuació es mostren tots els valors obtinguts a partir de les diferents
simulacions dels partits mitjançant Robot Soccer. Les taules contenen totes les dades utilitzades per al control estadístic a diferents velocitats de joc.
VELOCITAT 30
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 6000 -> 45.847 % Posesion Estatico: 7087 -> 54.153 % TOTAL Posesion: 13087 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 5707 -> 43.6082 % Lado Estatico: 7380 -> 56.3918 % TOTAL Lado: 13087 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 2840 -> 21.7009 % ZONA 2: 2867 -> 21.9072 % ZONA 3: 3270 -> 24.9866 % ZONA 4: 4110 -> 31.4052 % TOTAL Zona: 13087 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 8137 -> 45.8164 % Posesion Estatico: 9623 -> 54.1836 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8318 -> 46.8356 % Lado Estatico: 9442 -> 53.1644 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5030 -> 28.3221 % ZONA 2: 3288 -> 18.5135 % ZONA 3: 3530 -> 19.8761 % ZONA 4: 5912 -> 33.2883 % TOTAL Zona: 17760 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 6654 -> 48.2664 % Posesion Estatico: 7132 -> 51.7336 % TOTAL Posesion: 13786 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
156
TIEMPO LADO CAMPO Lado Dinamico: 7018 -> 50.9067 % Lado Estatico: 6768 -> 49.0933 % TOTAL Lado: 13786 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 3741 -> 27.1362 % ZONA 2: 3277 -> 23.7705 % ZONA 3: 2470 -> 17.9167 % ZONA 4: 4298 -> 31.1766 % TOTAL Zona: 13786 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 8093 -> 45.2629 % Posesion Estatico: 9787 -> 54.7371 % TOTAL Posesion: 17880 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8497 -> 47.5224 % Lado Estatico: 9383 -> 52.4776 % TOTAL Lado: 17880 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4888 -> 27.3378 % ZONA 2: 3609 -> 20.1846 % ZONA 3: 4029 -> 22.5336 % ZONA 4: 5354 -> 29.9441 % TOTAL Zona: 17880 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 7091 -> 40.0621 % Posesion Estatico: 10609 -> 59.9379 % TOTAL Posesion: 17700 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 7876 -> 44.4972 % Lado Estatico: 9824 -> 55.5028 % TOTAL Lado: 17700 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 3238 -> 18.2938 % ZONA 2: 4638 -> 26.2034 % ZONA 3: 4497 -> 25.4068 % ZONA 4: 5327 -> 30.096 % TOTAL Zona: 17700 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
157
VELOCITAT 40
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 7894 -> 44.2985 % Posesion Estatico: 9926 -> 55.7015 % TOTAL Posesion: 17820 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8279 -> 46.459 % Lado Estatico: 9541 -> 53.541 % TOTAL Lado: 17820 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4005 -> 22.4747 % ZONA 2: 4274 -> 23.9843 % ZONA 3: 4413 -> 24.7643 % ZONA 4: 5128 -> 28.7767 % TOTAL Zona: 17820 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 10139 -> 57.089 % Posesion Estatico: 7621 -> 42.911 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9259 -> 52.134 % Lado Estatico: 8501 -> 47.866 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5093 -> 28.6768 % ZONA 2: 4166 -> 23.4572 % ZONA 3: 4151 -> 23.3727 % ZONA 4: 4350 -> 24.4932 % TOTAL Zona: 17760 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 9737 -> 54.8255 % Posesion Estatico: 8023 -> 45.1745 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9637 -> 54.2624 % Lado Estatico: 8123 -> 45.7376 % TOTAL Lado: 17760 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
158
TIEMPO ZONA CAMPO ZONA 1: 5436 -> 30.6081 % ZONA 2: 4201 -> 23.6543 % ZONA 3: 4314 -> 24.2905 % ZONA 4: 3809 -> 21.4471 % TOTAL Zona: 17760 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 9136 -> 51.4414 % Posesion Estatico: 8624 -> 48.5586 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9380 -> 52.8153 % Lado Estatico: 8380 -> 47.1847 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4830 -> 27.1959 % ZONA 2: 4550 -> 25.6194 % ZONA 3: 3351 -> 18.8682 % ZONA 4: 5029 -> 28.3164 % TOTAL Zona: 17760 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 8397 -> 47.2804 % Posesion Estatico: 9363 -> 52.7196 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8600 -> 48.4234 % Lado Estatico: 9160 -> 51.5766 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4134 -> 23.277 % ZONA 2: 4466 -> 25.1464 % ZONA 3: 3644 -> 20.518 % ZONA 4: 5516 -> 31.0586 % TOTAL Zona: 17760 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
159
VELOCITAT 50
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 9195 -> 51.7736 % Posesion Estatico: 8565 -> 48.2263 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 10433 -> 58.7443 % Lado Estatico: 7327 -> 41.2556 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4981 -> 28.0462 % ZONA 2: 5452 -> 30.6982 % ZONA 3: 2065 -> 11.6273 % ZONA 4: 5262 -> 29.6283 % TOTAL Zona: 17760 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 7104 -> 50.8846 % Posesion Estatico: 6857 -> 49.1154 % TOTAL Posesion: 13961 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 7499 -> 53.7139 % Lado Estatico: 6462 -> 46.2861 % TOTAL Lado: 13961 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4243 -> 30.3918 % ZONA 2: 3256 -> 23.3221 % ZONA 3: 3440 -> 24.6401 % ZONA 4: 3022 -> 21.646 % TOTAL Zona: 13961 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 7824 -> 44.2034 % Posesion Estatico: 9876 -> 55.7966 % TOTAL Posesion: 17700 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9613 -> 54.3107 % Lado Estatico: 8087 -> 45.6893 % TOTAL Lado: 17700 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
160
TIEMPO ZONA CAMPO ZONA 1: 3988 -> 22.5311 % ZONA 2: 5625 -> 31.7797 % ZONA 3: 3515 -> 19.8588 % ZONA 4: 4572 -> 25.8305 % TOTAL Zona: 17700 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 5391 -> 49.3772 % Posesion Estatico: 5527 -> 50.6228 % TOTAL Posesion: 10918 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 5748 -> 52.647 % Lado Estatico: 5170 -> 47.353 % TOTAL Lado: 10918 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 2631 -> 24.0978 % ZONA 2: 3117 -> 28.5492 % ZONA 3: 2896 -> 26.525 % ZONA 4: 2274 -> 20.828 % TOTAL Zona: 10918 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 7829 -> 45.3934 % Posesion Estatico: 9418 -> 54.6066 % TOTAL Posesion: 17247 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9449 -> 54.7863 % Lado Estatico: 7798 -> 45.2137 % TOTAL Lado: 17247 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5424 -> 31.4489 % ZONA 2: 4025 -> 23.3374 % ZONA 3: 3962 -> 22.9721 % ZONA 4: 3836 -> 22.2415 % TOTAL Zona: 17247 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
161
VELOCITAT 60
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 8738 -> 48.8702 % Posesion Estatico: 9142 -> 51.1298 % TOTAL Posesion: 17880 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9765 -> 54.6141 % Lado Estatico: 8115 -> 45.3859 % TOTAL Lado: 17880 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5263 -> 29.4351 % ZONA 2: 4502 -> 25.179 % ZONA 3: 3374 -> 18.8702 % ZONA 4: 4741 -> 26.5157 % TOTAL Zona: 17880 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 8598 -> 47.9264 % Posesion Estatico: 9342 -> 52.0736 % TOTAL Posesion: 17940 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9103 -> 50.7414 % Lado Estatico: 8837 -> 49.2586 % TOTAL Lado: 17940 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4860 -> 27.0903 % ZONA 2: 4243 -> 23.6511 % ZONA 3: 3635 -> 20.262 % ZONA 4: 5202 -> 28.9967 % TOTAL Zona: 17940 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 9020 -> 50.7883 % Posesion Estatico: 8740 -> 49.2117 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8599 -> 48.4178 % Lado Estatico: 9161 -> 51.5822 % TOTAL Lado: 17760 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
162
TIEMPO ZONA CAMPO ZONA 1: 4513 -> 25.411 % ZONA 2: 4086 -> 23.0068 % ZONA 3: 4778 -> 26.9032 % ZONA 4: 4383 -> 24.6791 % TOTAL Zona: 17760 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 8977 -> 50.2069 % Posesion Estatico: 8903 -> 49.7931 % TOTAL Posesion: 17880 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9365 -> 52.377 % Lado Estatico: 8515 -> 47.623 % TOTAL Lado: 17880 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5043 -> 28.2047 % ZONA 2: 4322 -> 24.1723 % ZONA 3: 4699 -> 26.2808 % ZONA 4: 3816 -> 21.3423 % TOTAL Zona: 17880 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 7865 -> 46.8434 % Posesion Estatico: 8925 -> 53.1566 % TOTAL Posesion: 16790 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 11623 -> 69.2257 % Lado Estatico: 5167 -> 30.7743 % TOTAL Lado: 16790 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 6125 -> 36.48 % ZONA 2: 5498 -> 32.7457 % ZONA 3: 3115 -> 18.5527 % ZONA 4: 2052 -> 12.2216 % TOTAL Zona: 16790 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
163
VELOCITAT 70
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 6554 -> 45.3219 % Posesion Estatico: 7907 -> 54.6781 % TOTAL Posesion: 14461 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 7854 -> 54.3116 % Lado Estatico: 6607 -> 45.6884 % TOTAL Lado: 14461 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4923 -> 34.0433 % ZONA 2: 2931 -> 20.2683 % ZONA 3: 3161 -> 21.8588 % ZONA 4: 3446 -> 23.8296 % TOTAL Zona: 14461 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 9105 -> 51.9692 % Posesion Estatico: 8415 -> 48.0308 % TOTAL Posesion: 17520 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8532 -> 48.6986 % Lado Estatico: 8988 -> 51.3014 % TOTAL Lado: 17520 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4116 -> 23.4932 % ZONA 2: 4416 -> 25.2055 % ZONA 3: 4361 -> 24.8916 % ZONA 4: 4627 -> 26.4098 % TOTAL Zona: 17520 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 10256 -> 57.3602 % Posesion Estatico: 7624 -> 42.6398 % TOTAL Posesion: 17880 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8427 -> 47.1309 % Lado Estatico: 9453 -> 52.8691 % TOTAL Lado: 17880 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
164
TIEMPO ZONA CAMPO ZONA 1: 4747 -> 26.5492 % ZONA 2: 3680 -> 20.5817 % ZONA 3: 3631 -> 20.3076 % ZONA 4: 5822 -> 32.5615 % TOTAL Zona: 17880 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 7603 -> 51.781 % Posesion Estatico: 7080 -> 48.219 % TOTAL Posesion: 14683 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 7531 -> 51.2906 % Lado Estatico: 7152 -> 48.7094 % TOTAL Lado: 14683 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4110 -> 27.9916 % ZONA 2: 3421 -> 23.2991 % ZONA 3: 3500 -> 23.8371 % ZONA 4: 3652 -> 24.8723 % TOTAL Zona: 14683 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 5985 -> 47.0778 % Posesion Estatico: 6728 -> 52.9222 % TOTAL Posesion: 12713 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 6882 -> 54.1336 % Lado Estatico: 5831 -> 45.8664 % TOTAL Lado: 12713 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4001 -> 31.4717 % ZONA 2: 2881 -> 22.6618 % ZONA 3: 2609 -> 20.5223 % ZONA 4: 3222 -> 25.3441 % TOTAL Zona: 12713 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
165
VELOCITAT 80
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 8270 -> 46.5653 % Posesion Estatico: 9490 -> 53.4347 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9944 -> 55.991 % Lado Estatico: 7816 -> 44.009 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 6693 -> 37.6858 % ZONA 2: 3251 -> 18.3052 % ZONA 3: 3478 -> 19.5833 % ZONA 4: 4338 -> 24.4257 % TOTAL Zona: 17760 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 9646 -> 54.3131 % Posesion Estatico: 8114 -> 45.6869 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8964 -> 50.473 % Lado Estatico: 8796 -> 49.527 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 5141 -> 28.9471 % ZONA 2: 3823 -> 21.5259 % ZONA 3: 3507 -> 19.7466 % ZONA 4: 5289 -> 29.7804 % TOTAL Zona: 17760 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 9325 -> 52.1532 % Posesion Estatico: 8555 -> 47.8468 % TOTAL Posesion: 17880 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 10491 -> 58.6745 % Lado Estatico: 7389 -> 41.3255 % TOTAL Lado: 17880 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
166
TIEMPO ZONA CAMPO ZONA 1: 5615 -> 31.4038 % ZONA 2: 4062 -> 22.7181 % ZONA 3: 3327 -> 18.6074 % ZONA 4: 4876 -> 27.2707 % TOTAL Zona: 17880 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 8894 -> 50.0788 % Posesion Estatico: 8866 -> 49.9212 % TOTAL Posesion: 17760 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8586 -> 48.3446 % Lado Estatico: 9174 -> 51.6554 % TOTAL Lado: 17760 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4982 -> 28.0518 % ZONA 2: 3604 -> 20.2928 % ZONA 3: 4161 -> 23.4291 % ZONA 4: 5013 -> 28.2264 % TOTAL Zona: 17760 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 6746 -> 47.3636 % Posesion Estatico: 7497 -> 52.6364 % TOTAL Posesion: 14243 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 7626 -> 53.5421 % Lado Estatico: 6617 -> 46.4579 % TOTAL Lado: 14243 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 3999 -> 28.077 % ZONA 2: 3328 -> 23.3659 % ZONA 3: 3289 -> 23.092 % ZONA 4: 3627 -> 25.4651 % TOTAL Zona: 14243 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
167
VELOCITAT 90
Nº Proba Valors obtinguts
1
TIEMPO POSESION PELOTA Posesion Dinamico: 9154 -> 52.0705 % Posesion Estatico: 8426 -> 47.9295 % TOTAL Posesion: 17580 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9598 -> 54.5961 % Lado Estatico: 7982 -> 45.4039 % TOTAL Lado: 17580 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4871 -> 27.7076 % ZONA 2: 4727 -> 26.8885 % ZONA 3: 4346 -> 24.7213 % ZONA 4: 3636 -> 20.6826 % TOTAL Zona: 17580 -> 100 %
2
TIEMPO POSESION PELOTA Posesion Dinamico: 6022 -> 53.4055 % Posesion Estatico: 5254 -> 46.5945 % TOTAL Posesion: 11276 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 6015 -> 53.3434 % Lado Estatico: 5261 -> 46.6566 % TOTAL Lado: 11276 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 3010 -> 26.6939 % ZONA 2: 3005 -> 26.6495 % ZONA 3: 2902 -> 25.7361 % ZONA 4: 2359 -> 20.9205 % TOTAL Zona: 11276 -> 100 %
3
TIEMPO POSESION PELOTA Posesion Dinamico: 9158 -> 52.0933 % Posesion Estatico: 8422 -> 47.9067 % TOTAL Posesion: 17580 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 9862 -> 56.0978 % Lado Estatico: 7718 -> 43.9022 % TOTAL Lado: 17580 -> 100 %
Comparativa de tècniques de control distribuït. Aplicació a la plataforma Robot Soccer
168
TIEMPO ZONA CAMPO ZONA 1: 5093 -> 28.9704 % ZONA 2: 4769 -> 27.1274 % ZONA 3: 3694 -> 21.0125 % ZONA 4: 4024 -> 22.8896 % TOTAL Zona: 17580 -> 100 %
4
TIEMPO POSESION PELOTA Posesion Dinamico: 7038 -> 50.1711 % Posesion Estatico: 6990 -> 49.8289 % TOTAL Posesion: 14028 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 8166 -> 58.2121 % Lado Estatico: 5862 -> 41.7879 % TOTAL Lado: 14028 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 4462 -> 31.8078 % ZONA 2: 3704 -> 26.4043 % ZONA 3: 2856 -> 20.3593 % ZONA 4: 3006 -> 21.4286 % TOTAL Zona: 14028 -> 100 %
5
TIEMPO POSESION PELOTA Posesion Dinamico: 6281 -> 50.1277 % Posesion Estatico: 6249 -> 49.8723 % TOTAL Posesion: 12530 -> 100 % TIEMPO LADO CAMPO Lado Dinamico: 6560 -> 52.3543 % Lado Estatico: 5970 -> 47.6457 % TOTAL Lado: 12530 -> 100 % TIEMPO ZONA CAMPO ZONA 1: 3418 -> 27.2785 % ZONA 2: 3142 -> 25.0758 % ZONA 3: 3667 -> 29.2658 % ZONA 4: 2303 -> 18.3799 % TOTAL Zona: 12530 -> 100 %