José Iván Ferrer Ruiz A00468659
Daniel Salas Fukutake A00468938
José A. Ugalde Del R. A01161507
a. Breve descripción del medio ambiente.
Para este proyecto usamos RoboCup Soccer Server, RoboCup Soccer Monitor y las bibliotecas de Fuzzy Logic (pyfuzzy) para escribir un programa que maneje un agente de RoboCup que tome decisiones usando Lógica Difusa.
b. Descripción detallada del problema difuso a resolver.
Los agentes de RoboCup son capaces de avanzar (dash) para ir por el balón, y ya que están junto a él lo pueden patear (kick). Esas dos acciones usan un parámetro de poder entre 0 y 100. Por ejemplo, si un agente realiza la acción dash(100), avanzará hacia adelante una cantidad de centímetros y con dash(0) no avanzará. Al usar kick(100) pateará el balón lo más lejos posible mientras que con kick(0) no lo moverá.
Cuando un agente usa dash, entre más grande sea el número de poder más stamina gasta, y cuando se queda sin stamina no se puede mover hasta que se recupere lo suficiente.
Los problemas que encontramos son haceer que el agente decida:
- qué valor de poder usar al avanzar cuando está cerca del balón para no pasarse y perderlo.
- qué valor de poder usar al avanzar para no cansarse tan rápido.
- qué valor de poder usar al patear para meter gol o avanzar con el balón.
Ejemplos:
Si el balón está lejos del agente, el agente debe ir lo más rápido posible, pero si tiene poca stamina, debería bajar su velocidad para no cansarse.
Si el agente tiene el balón y se encuentra lejos de la portería, debería patearla con poca fuerza para llevarla más cerca de la portería sin perderla.
c. Particiones difusas, Conjuntos difusos y Método de inferencia utilizado.
Las particiones que utilizamos para avanzar no fueron las mismas que usamos para las decisiones de patear.
Para avanzar usamos una partición de la distancia entre el agente y el balón con 3 conjuntos: cerca, medio y lejos.
Para el valor de poder de dash usamos otra partición con los conjuntos débil, normal y fuerte.
Para patear el balón hacia la portería usamos una partición de la distancia entre el agente y la portería con 3 conjuntos: cerca, medio y lejos.
Para el valor de poder de kick usamos otra partición con los conjuntos débil, normal y fuerte, similar al de dash pero con otros tamaños de conjuntos.



El método de inferencia que usamos fue el de centro de gravedad (COG) con las siguientes reglas para acercarse al balón:
RULE 1 : IF distance IS close THEN power IS weak;
RULE 2 : IF distance IS mid AND stamina IS low THEN power IS null;
RULE 3 : IF distance IS mid AND stamina IS half THEN power IS weak;
RULE 4 : IF distance IS mid AND stamina IS full THEN power IS normal;
RULE 5 : IF distance IS far AND stamina IS low THEN power IS null;
RULE 6 : IF distance IS far AND stamina IS half THEN power IS weak;
RULE 7 : IF distance IS far AND stamina IS full THEN power IS strong;
y las siguientes reglas para patear el balón:
RULE 1 : IF distance IS close THEN power IS strong;
RULE 2 : IF distance IS mid THEN power IS normal;
RULE 3 : IF distance IS far THEN power IS weak;
d. Al menos dos ejemplos de la manera en que su sistema resuelve una pregunta (realiza una inferencia difusa).
Cuando un agente ve el balón y se dirige hacia él:
usa su distancia hacia la pelota y su stamina como inputs para calcular el poder que debe usar con dash
self.input['distance'] = self.fm[onto.BALL_DIST]
self.input['stamina'] = self.bm[onto.SENSE_BODY]['stamina'][0]
self.approach_system.calculate(self.input, self.output)
una vez calculado el poder, lo recorta por si se pasa de 100 y lo usa como parámetro en dash
power = self.output['power']
self.dash(100 if power > 100 else power)
Cuando un agente tiene el balón y lo va a patear hacia la portería:
calcula la distancia entre él y la portería contraria , utilizándolos como inputs para calcular el poder que usará en kick
x, y = self.fm[onto.PLAYER_POSITION]
ogx, ogy = self.fm[onto.GOAL_OPP]
ang = get_abs_ang(x, y, ogx, ogy)
ang = trim_ang(ang - self.fm[onto.BODY_ANGLE])
self.input['distance'] = pythagoras(ogx, ogy, x, y)
self.kick_system.calculate(self.input, self.output)
una vez calculado power, lo usa como parámetro
power = self.output['power']
self.kick(power = power, angle = ang)
e. Instructivo para poder hacer preguntas en línea a su programa.
Para hacer preguntas al programa, se pueden usar 2 métodos:
- 1.Abrir el simulador y el monitor de Robocup y desde una terminal correr el script de python llamado “reactiveplayer.py”. Para iniciar un partido se usa Ctrl+K o click derecho -> Play On. Durante el partido los agentes imprimen en la terminal los valores de distancia y stamina, aparte del valor de power que calculan usando lógica difusa.
- 2.Sin abrir RoboCup, se puede abrir editar el archivo de python llamado “fcltest.py”. En la línea 10 (i = {'distance' : 1.5, 'stamina' : 0.0}) se pueden editar los valores de distancia y stamina que tendría un agente a la hora de tomar la decisión, y al correr el mismo archivo en consola, se imprime el valor calculado.
f. Conclusiones después de la programación.
Como conclusión podemos asegurar que la lógica difusa funciona bien en el contexto de agentes reactivos de robocup, permitiendo a los agentes tomar decisiones para jugar de una manera más eficiente, tardándose más en cansarse y conservando el balón a la hora de dirigirse a meter gol a la portería contraria. Se podría aplicar en la toma de más decisiones como el ángulo que debe voltear para contrarrestar la inercia, y sólo se tendrían que hacer modificaciones pequeñas en el programa.
g. Video.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.