Skip to content

Commit e55221c

Browse files
authored
Merge pull request #16 from LBBassani/pathplanning
Pathplanning
2 parents 66beee5 + 8084a4c commit e55221c

30 files changed

+565
-84
lines changed

new_scripts/Agente.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
"""
99
from sklearn.linear_model import LinearRegression
1010
from .Geometria import Ponto
11+
from .Campo import Campo
12+
import math as m
1113

1214
class Agente(object):
1315

1416
def __init__(self, ponto = Ponto()):
1517
self.__ponto = ponto
18+
self.__theta = 0
1619
self.__posicoesAntigas = list()
1720

1821
@property
@@ -21,30 +24,48 @@ def ponto(self):
2124

2225
@ponto.setter
2326
def ponto(self, value):
24-
self._changePosition()
27+
self.__changePosition()
2528
self.__ponto = value
29+
c = Campo()
30+
c.occupy(c.transform2Grid((value.x, value.y)), self)
2631

2732
@property
2833
def posicao(self):
2934
return self.ponto.posicao
3035

3136
@posicao.setter
3237
def posicao(self, value):
33-
self._changePosition()
38+
self.__changePosition()
3439
self.ponto.posicao = value
40+
c = Campo()
41+
c.occupy(c.transform2Grid(value), self)
3542

3643
@property
3744
def x(self):
3845
return self.ponto.x
46+
47+
@property
48+
def y(self):
49+
return self.ponto.y
50+
51+
@property
52+
def theta(self):
53+
return self.__theta
54+
55+
@theta.setter
56+
def theta(self, value):
57+
self.__theta = value
3958

4059
@property
4160
def posicoesAntigas(self):
4261
return self.__posicoesAntigas.copy()
4362

44-
def _changePosition(self):
45-
if(len(self.__posicoesAntigas) >= 5):
63+
def __changePosition(self):
64+
if len(self.__posicoesAntigas) >= 5:
4665
self.__posicoesAntigas.pop(0)
4766
self.__posicoesAntigas.append(Ponto(self.ponto.x, self.ponto.y))
67+
c = Campo()
68+
c.release(c.transform2Grid(self.posicao))
4869

4970
def predicaoAdaptativa(self):
5071
pass

new_scripts/Aliado.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
class Aliado(Jogador):
1919

20-
def __init__(self, idJ, ponto = Ponto(), comportamento = COMPORTAMENTOS.DEFESA):
21-
Jogador.__init__(id = idJ, ponto = ponto)
20+
def __init__(self, idJ, ponto = Ponto(), comportamento = None):
21+
Jogador.__init__(self, idJ = idJ, ponto = ponto)
2222
self.comportamento = comportamento
2323

2424
""" Nome da função : comportamento (getter)
@@ -52,4 +52,7 @@ def comportamento(self, comportamento):
5252
Retorno : Boolean : Sempre False
5353
"""
5454
def isInimigo(self):
55-
return False
55+
return False
56+
57+
def definirObjetivo(self, mundo):
58+
return self.__comportamento.definirObjetivo(self, mundo)

new_scripts/Ball.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@
88
"""
99
from .Agente import Agente
1010
from .Geometria import Ponto
11+
from .Patterns.Singleton import Singleton
1112

12-
class Ball(Agente):
13+
class Ball(Agente, Singleton):
1314

14-
def __init__(self, ponto = Ponto()):
15+
def __init__(self, *args, **keyargs):
16+
pass
17+
18+
def inicializa(self, ponto = Ponto()):
1519
Agente.__init__(self, ponto)

new_scripts/Campo.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
""" Nome do módulo : Campo
2+
Ano de criação : 2019/10
3+
Descrição do módulo : Modelar o campo do jogo
4+
Versão : 1.0
5+
Pré-requisitos : WeightedGridGraph
6+
Pattern.Singleton
7+
Membros : Lorena B Bassani
8+
"""
9+
from .Patterns.Singleton import Singleton
10+
from .PathPlanning.Graph import WeightedGridGraph
11+
12+
13+
class Campo(WeightedGridGraph, Singleton):
14+
15+
def __init__(self, *args, **keyargs):
16+
pass
17+
18+
def inicializa(self, celulasX, celulasY, dimX = 150, dimY = 130):
19+
if not hasattr(self, "grade"):
20+
WeightedGridGraph.__init__(self, celulasX, celulasY)
21+
self.__h = (dimX/(celulasX - 1), dimY/(celulasY - 1))
22+
23+
@property
24+
def tamanhoCelula(self):
25+
return self.__h
26+
27+
def transform2Cart(self, cel):
28+
# TODO : Ver Se as grades possuem as mesmas características de crescimento de coordenadas
29+
i, j = WeightedGridGraph.transform2Cart(self, cel)
30+
return (i*self.__h[0], j*self.__h[1])
31+
32+
def transform2Grid(self, cel):
33+
# TODO : Redefinir trasnformação
34+
x, y = cel
35+
return WeightedGridGraph.transform2Grid(self, (x//self.__h[0], y//self.__h[1]))
36+
37+
def cost(self, start, goal):
38+
# TODO : Redefinir custo para variar com a proximidade a um obstáculo
39+
return WeightedGridGraph.cost(self, start, goal)

new_scripts/ComportamentosJogadores/ComportamentoAtacante.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,41 @@
33
Descrição do módulo : Comportamento de Atacante para Jogadores
44
Versão : 1.0
55
Pré-requisitos : IComportamento
6+
Geometria
7+
Mundo, Arena, Lado
8+
Jogador
9+
Ball
10+
math
611
Membros : Lorena Bassani
712
"""
813
from .IComportamento import IComportamento
14+
from ..Geometria import Ponto
15+
from ..Mundo import Mundo, Arena, Lado
16+
from ..Jogador import Jogador
17+
from ..Ball import Ball
18+
import math as m
919

1020
class ComportamentoAtacante(IComportamento):
1121
def __init__(self):
12-
IComportamento.__init__(self)
22+
IComportamento.__init__(self)
23+
24+
def definirObjetivo(self, jogador : Jogador, mundo : Mundo):
25+
ball = mundo.ball
26+
if ball.ponto.distancia(jogador.ponto) > 30:
27+
x, y = ball.posicao
28+
# Se posicionar antes da bola
29+
if mundo.lado == Lado.DIREITO:
30+
x += 3.35
31+
else:
32+
x -= 3.35
33+
# Se a bola estiver acima do meio de campo, se posicionar acima dela
34+
if y < Arena.marcacoes["Meio"].y:
35+
y -= 3.35
36+
else:
37+
y += 3.35
38+
return Ponto(x, y)
39+
elif ball.ponto.distancia(jogador.ponto) > 5:
40+
return ball.ponto
41+
else:
42+
resp = Arena.golEsquerdo["Meio"] if mundo.lado == Lado.ESQUERDO else Arena.golDireito["Meio"]
43+
return resp

new_scripts/ComportamentosJogadores/ComportamentoDefesa.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,23 @@
33
Descrição do módulo : Comportamento de Defesa para Jogadores
44
Versão : 1.0
55
Pré-requisitos : IComportamento
6+
Geometria
7+
Mundo, Arena, Lado
8+
Jogador
9+
Ball
10+
math
611
Membros : Lorena Bassani
712
"""
813
from .IComportamento import IComportamento
14+
from ..Geometria import Ponto
15+
from ..Mundo import Mundo, Arena, Lado
16+
from ..Jogador import Jogador
17+
from ..Ball import Ball
18+
import math as m
919

1020
class ComportamentoDefesa(IComportamento):
1121
def __init__(self):
12-
IComportamento.__init__(self)
22+
IComportamento.__init__(self)
23+
24+
def definirObjetivo(self, jogador, mundo):
25+
pass
Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,63 @@
11
""" Nome do módulo : ComportamentoGoleiro
22
Ano de criação : 2019/10
33
Descrição do módulo : Comportamento de Goleiro para Jogadores
4-
Versão : 1.0
4+
Versão : 2.0
55
Pré-requisitos : IComportamento
6+
Geometria
7+
Mundo, Arena, Lado
8+
Ball
9+
Jogador
10+
math
611
Membros : Lorena Bassani
712
"""
813
from .IComportamento import IComportamento
14+
from ..Geometria import Ponto
15+
from ..Mundo import Mundo, Arena, Lado
16+
from ..Ball import Ball
17+
from ..Jogador import Jogador
18+
import math as m
919

1020
class ComportamentoGoleiro(IComportamento):
1121
def __init__(self):
12-
IComportamento.__init__(self)
22+
IComportamento.__init__(self)
23+
24+
def definirObjetivo(self, jogador : Jogador, mundo : Mundo):
25+
""" Ideia da implementação :
26+
Posicionar o robô de forma que ele impessa a trajetória da bola
27+
Como : Calcular o angulo de abertura entre a bola e o gol
28+
Posicionar o robô onde o "triangulo" tenha base de 7,5 (tamanho do robô)
29+
"""
30+
resp = Ponto()
31+
ball = mundo.ball
32+
bx, _ = ball.posicao
33+
bt = ball.theta
34+
""" a² = b² + c² - 2bc*cos α
35+
a² - b² - c² = -2bc* cos α
36+
(b² + c² - a²)/2bc = cos α
37+
α = acos(((b² + c² - a²)/2bc))
38+
Onde :
39+
a <- lado oposto (tamanho do gol)
40+
b e c <- lados adjascentes (distancia da bola até um dos limites do gol)
41+
α <- angulo desejado
42+
"""
43+
gol = Arena.golDireito if mundo.lado == Lado.DIREITO else Arena.golEsquerdo
44+
a = Arena.metricas["Gol"][1]
45+
b = ball.ponto.distancia(gol["Superior"])
46+
c = ball.ponto.distancia(gol["Inferior"])
47+
alpha = (b**2 + c**2 - a**2)/2*b*c
48+
if alpha > 1:
49+
alpha = 1.0
50+
elif alpha < -1:
51+
alpha = -1.0
52+
alpha = m.acos(alpha)
53+
54+
dx = 3.75/m.tan(alpha) if m.tan(alpha) != 0 else 0 # 3.75 é metade da largura do robô de 7.5x7.5
55+
resp.x = bx + dx if mundo.lado == Lado.DIREITO else bx - dx
56+
57+
theta = m.fabs(bt - jogador.theta)
58+
resp.y = (resp.x/m.tan(theta))
59+
60+
resp.y = 100 if resp.y > 100 else 30 if resp.y < 30 else resp.y
61+
resp.posicao = (10, 65) if mundo.lado == Lado.ESQUERDO and resp.x > 37.5 else (150, 65) if mundo.lado == Lado.DIREITO and resp.x < 112.5 else resp.posicao
62+
63+
return resp
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
""" Nome do módulo : ComportamentoLissajous
2+
Ano de criação : 2019/10
3+
Descrição do módulo : Modela um comportamento que descreve uma curva de Lissajous
4+
Versão : 1.0
5+
Pré-requisitos : IComportamento
6+
Geometria
7+
math
8+
Membros : Lorena B Bassani
9+
"""
10+
from .IComportamento import IComportamento
11+
from ..Geometria import Ponto
12+
from ..Mundo import Mundo, Arena, Lado
13+
from ..Jogador import Jogador
14+
from ..Ball import Ball
15+
import math as m
16+
17+
class ComportamentoLissajous(IComportamento):
18+
__PI = 3.14159
19+
def __init__(self, A = 30, B = 100, a = 3, b = 4, sig = (__PI/2)):
20+
IComportamento.__init__(self)
21+
self.A = A
22+
self.B = B
23+
self.a = a
24+
self.b = b
25+
self.sigma = sig
26+
self.__t = 0
27+
28+
def definirObjetivo(self, jogador, Mundo):
29+
""" Na matemática, a curva de Lissajous (figura de Lissajous ou curva de Bowditch)
30+
é o gráfico produzido por um sistema de equações paramétricas que descreve um complexo movimento harmônico.
31+
x = A*sen(at + sig), y = B*sen(bt)
32+
"""
33+
x = self.A*m.sin(self.a*self.__t + self.sigma)
34+
y = self.B*m.sin(self.b*self.__t)
35+
self.__t += 1
36+
return Ponto(x, y)

new_scripts/ComportamentosJogadores/Factory.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .ComportamentoGoleiro import ComportamentoGoleiro
1313
from .ComportamentoDefesa import ComportamentoDefesa
1414
from .ComportamentoAtacante import ComportamentoAtacante
15+
from .ComportamentoLissajous import ComportamentoLissajous
1516

1617
class Factory(object):
1718

@@ -28,5 +29,7 @@ def create(comportamento):
2829
return ComportamentoGoleiro()
2930
elif comportamento == COMPORTAMENTOS.ATACANTE:
3031
return ComportamentoAtacante()
32+
elif comportamento == COMPORTAMENTOS.DEFESA:
33+
return ComportamentoDefesa()
3134
else:
32-
return ComportamentoDefesa()
35+
return ComportamentoLissajous()

new_scripts/ComportamentosJogadores/IComportamento.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
Membros : Lorena Bassani
77
"""
88
class IComportamento(object):
9-
pass
9+
def definirObjetivo(self, jogador, mundo):
10+
raise NotImplementedError

0 commit comments

Comments
 (0)