From f8b39728b0f59032fcc70b02ee852760f4970b67 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 12:07:02 -0300 Subject: [PATCH 01/26] Ball passa a ser Singleton MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Não testado --- new_scripts/Ball.py | 3 ++- new_scripts/Mundo.py | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/new_scripts/Ball.py b/new_scripts/Ball.py index 175d401..02993dc 100644 --- a/new_scripts/Ball.py +++ b/new_scripts/Ball.py @@ -8,8 +8,9 @@ """ from .Agente import Agente from .Geometria import Ponto +from .Patterns.Singleton import Singleton -class Ball(Agente): +class Ball(Agente, Singleton): def __init__(self, ponto = Ponto()): Agente.__init__(self, ponto) diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index 9eba45f..4eb32f2 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -12,12 +12,11 @@ from .Jogador import Jogador from .ComportamentosJogadores.Comportamentos import COMPORTAMENTOS from .Ball import Ball - class Mundo(Singleton): - def __init__(self, ball): + def __init__(self): Singleton.__init__(self) self.__jogadores = {"Team" : list(), "Enemies" : list()} - self.__ball = ball + self.__ball = Ball.getInstance() """ Nome da função : inimigos (getter) Intenção da função : Retorna os Inimigos @@ -64,20 +63,20 @@ def goleiro(self): Retorno : Nenhum """ @goleiro.setter - def goleiro(self, playerId): + def goleiro(self, jogadorId): if not self.goleiro: - p = player(playerId) + p = self.jogador(jogadorId) p.comportamento = COMPORTAMENTOS.GOLEIRO - """ Nome da função : player (getter) + """ Nome da função : jogador (getter) Intenção da função : Retornar um Jogador de Acordo com seu Id Pré-requisitos : Nenhum Efeitos colaterais : Nenhum Parâmetros : int : Id do Jogador Retorno : Jogador : Jogador correspondente ao Id """ - def player(self, playerId): - p = list(filter(lambda x: x.id == playerId, self.__jogadores["Team"])) + def jogador(self, jogadorId): + p = list(filter(lambda x: x.id == jogadorId, self.__jogadores["Team"])) if p: return p return None From eb8450a332c09ba59bf79df46d97acb6bb2d68ed Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 12:11:20 -0300 Subject: [PATCH 02/26] =?UTF-8?q?SingletonException=20e=20Documenta=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Patterns/Singleton.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/new_scripts/Patterns/Singleton.py b/new_scripts/Patterns/Singleton.py index 425fd27..10f1da8 100644 --- a/new_scripts/Patterns/Singleton.py +++ b/new_scripts/Patterns/Singleton.py @@ -1,5 +1,24 @@ +""" Nome do módulo : Singleton + Ano de criação : 2019/10 + Descrição do módulo : Módulo que implementa padrão Singleton + Versão : 1.0 + Pré-requisitos : Nenhum + Membros : Lorena B. Bassani +""" + +class SingletonException(Exception): + pass + class Singleton(object): __instance = None + + """ Nome da função : getInstance + Intenção da função : Retornar a instância da classe + Pré-requisitos : Nenhum + Efeitos colaterais : Nova instância pode ser criada se ainda não houver uma + Parâmetros : Nenhum + Retorno : Singleton : Instância do Singleton + """ @staticmethod def getInstance(): """ Static access method. """ @@ -9,6 +28,6 @@ def getInstance(): def __init__(self): """ Virtually private constructor. """ if Singleton.__instance != None: - raise Exception("This class is a singleton!") + raise SingletonException else: Singleton.__instance = self \ No newline at end of file From ce25345520955f754c758435374ad0e9ae6dd83b Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 12:12:10 -0300 Subject: [PATCH 03/26] Rascunho de Campo --- new_scripts/Campo.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 new_scripts/Campo.py diff --git a/new_scripts/Campo.py b/new_scripts/Campo.py new file mode 100644 index 0000000..5c5fef8 --- /dev/null +++ b/new_scripts/Campo.py @@ -0,0 +1,29 @@ +""" Nome do módulo : Campo + Ano de criação : 2019/10 + Descrição do módulo : Modelar o campo do jogo + Versão : 1.0 + Pré-requisitos : WeightedGridGraph + Pattern.Singleton + Membros : Lorena B Bassani +""" +from .Patterns.Singleton import Singleton +from .PathPlanning.Graph import WeightedGridGraph + +class Campo(Singleton, WeightedGridGraph): + def __init__(self, celulasX : int, celulasY : int, dimX = 150, dimY = 130): + Singleton.__init__(self) + WeightedGridGraph.__init__(self, celulasX, celulasY) + self.__h = (dimX/(celulasX - 1), dimY/(celulasY - 1)) + + @property + def tamanhoCelula(self): + return self.__h + + def transform2Cart(self, cel): + # TODO : Ver Se as grades possuem as mesmas características de crescimento de coordenadas + i, j = WeightedGridGraph.transform2Cart(self, cel) + return (i*self.__h[0], j*self.__h[1]) + + def transform2Grid(self, cel): + # TODO : Redefinir trasnformação + pass \ No newline at end of file From 31e315c978e25172c756cc032461052c2080f71c Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 12:25:00 -0300 Subject: [PATCH 04/26] =?UTF-8?q?Mudan=C3=A7a=20de=20nomes=20e=20Documenta?= =?UTF-8?q?=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nomes de parametros de cost Alterados. --- new_scripts/PathPlanning/Graph.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/new_scripts/PathPlanning/Graph.py b/new_scripts/PathPlanning/Graph.py index d7ca017..6d2584e 100644 --- a/new_scripts/PathPlanning/Graph.py +++ b/new_scripts/PathPlanning/Graph.py @@ -152,5 +152,13 @@ class WeightedGridGraph(GridGraph): def __init__(self, celulasX, celulasY): GridGraph.__init__(self, celulasX, celulasY) - def cost(self, cel1, cel2): + """ Nome da função : cost + Intenção da função : Calcula o custo de se mover de start até goal + Pré-requisitos : Nenhum + Efeitos colaterais : Nenhum + Parâmetros : int : Celula de Inicio + int : Celula de Objetivo + Retorno : int : Custo de movimentação pela grade + """ + def cost(self, start, goal): return 1 From f7abda289feacb087950e05f12b3a955e8543e2f Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 15:54:11 -0300 Subject: [PATCH 05/26] =?UTF-8?q?Nova=20Implementa=C3=A7=C3=A3o=20de=20Sin?= =?UTF-8?q?gleton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Patterns/Singleton.py | 34 +++++++++---------------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/new_scripts/Patterns/Singleton.py b/new_scripts/Patterns/Singleton.py index 10f1da8..4bd2f01 100644 --- a/new_scripts/Patterns/Singleton.py +++ b/new_scripts/Patterns/Singleton.py @@ -1,33 +1,19 @@ """ Nome do módulo : Singleton Ano de criação : 2019/10 Descrição do módulo : Módulo que implementa padrão Singleton - Versão : 1.0 + Versão : 2.0 Pré-requisitos : Nenhum Membros : Lorena B. Bassani """ -class SingletonException(Exception): - pass - class Singleton(object): - __instance = None + __single = None # the one, true Singleton + + def __new__(classtype, *args, **kwargs): + # Check to see if a __single exists already for this class + # Compare class types instead of just looking for None so + # that subclasses will create their own __single objects + if classtype != type(classtype.__single): + classtype.__single = object.__new__(classtype, *args, **kwargs) + return classtype.__single - """ Nome da função : getInstance - Intenção da função : Retornar a instância da classe - Pré-requisitos : Nenhum - Efeitos colaterais : Nova instância pode ser criada se ainda não houver uma - Parâmetros : Nenhum - Retorno : Singleton : Instância do Singleton - """ - @staticmethod - def getInstance(): - """ Static access method. """ - if Singleton.__instance == None: - Singleton() - return Singleton.__instance - def __init__(self): - """ Virtually private constructor. """ - if Singleton.__instance != None: - raise SingletonException - else: - Singleton.__instance = self \ No newline at end of file From e5db600cd9a57d4df51348febef2943b286b6023 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 15:54:48 -0300 Subject: [PATCH 06/26] =?UTF-8?q?Mundo=20com=20nova=20implementa=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20Singleton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Mundo.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index 4eb32f2..e51b881 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -12,11 +12,13 @@ from .Jogador import Jogador from .ComportamentosJogadores.Comportamentos import COMPORTAMENTOS from .Ball import Ball +from .Campo import Campo + class Mundo(Singleton): def __init__(self): - Singleton.__init__(self) self.__jogadores = {"Team" : list(), "Enemies" : list()} - self.__ball = Ball.getInstance() + self.ball = Ball() + self.campo = Campo(celulasX = 15, celulasY = 13) """ Nome da função : inimigos (getter) Intenção da função : Retorna os Inimigos From 7f3b633a60794f8600dcc10a8a90340281180fa4 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 16:22:11 -0300 Subject: [PATCH 07/26] Bug em Singleton Consertado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug de inicialização com parametros consertado. --- new_scripts/Campo.py | 12 ++++++++---- new_scripts/Patterns/Singleton.py | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/new_scripts/Campo.py b/new_scripts/Campo.py index 5c5fef8..071710b 100644 --- a/new_scripts/Campo.py +++ b/new_scripts/Campo.py @@ -9,9 +9,9 @@ from .Patterns.Singleton import Singleton from .PathPlanning.Graph import WeightedGridGraph -class Campo(Singleton, WeightedGridGraph): - def __init__(self, celulasX : int, celulasY : int, dimX = 150, dimY = 130): - Singleton.__init__(self) + +class Campo(WeightedGridGraph, Singleton): + def __init__(self, celulasX, celulasY, dimX = 150, dimY = 130): WeightedGridGraph.__init__(self, celulasX, celulasY) self.__h = (dimX/(celulasX - 1), dimY/(celulasY - 1)) @@ -26,4 +26,8 @@ def transform2Cart(self, cel): def transform2Grid(self, cel): # TODO : Redefinir trasnformação - pass \ No newline at end of file + pass + + def cost(self, start, goal): + # TODO : Redefinir custo para variar com a proximidade a um obstáculo + return WeightedGridGraph.cost(self, start, goal) \ No newline at end of file diff --git a/new_scripts/Patterns/Singleton.py b/new_scripts/Patterns/Singleton.py index 4bd2f01..196da5f 100644 --- a/new_scripts/Patterns/Singleton.py +++ b/new_scripts/Patterns/Singleton.py @@ -14,6 +14,7 @@ def __new__(classtype, *args, **kwargs): # Compare class types instead of just looking for None so # that subclasses will create their own __single objects if classtype != type(classtype.__single): - classtype.__single = object.__new__(classtype, *args, **kwargs) + classtype.__single = object.__new__(classtype) + classtype.__init__(classtype.__single, *args, **kwargs) return classtype.__single From 9ef6eb2310452ee29de6ec2f58bcf006232af65b Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 16:30:23 -0300 Subject: [PATCH 08/26] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20de=20Observer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Patterns/Observer.py | 48 ++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/new_scripts/Patterns/Observer.py b/new_scripts/Patterns/Observer.py index 18939f5..75a549d 100644 --- a/new_scripts/Patterns/Observer.py +++ b/new_scripts/Patterns/Observer.py @@ -1,16 +1,54 @@ +""" Nome do módulo : Observer + Ano de criação : 2019/10 + Descrição do módulo : Interface do Padrão Observer + Versão : 1.0 + Pré-requisitos : Nenhum + Membros : Lorena B Bassani +""" + +class Observer(object): + + """ Nome da função : update + Intenção da função : Informar a ocorrencia do evento para o observador + Pré-requisitos : Desconhecido + Efeitos colaterais : Desconhecido + Parâmetros : Desconhecido + Retorno : Desconhecido + """ + def update(self, *args, **keyargs): + raise NotImplementedError + class Notifier(object): def __init__(self): self.__observers = list() + """ Nome da função : attach + Intenção da função : Inserir um observador na lista de observação + Pré-requisitos : Nenhum + Efeitos colaterais : O Observador é inserido na lista de observação + Parâmetros : Observer : Observador a ser inserido + Retorno : Nenhum + """ def attach(self, observer : Observer): self.__observers.append(observer) + """ Nome da função : dettach + Intenção da função : Retirar um Observador da lista de observação + Pré-requisitos : Observador estar na lista de observadores + Efeitos colaterais : Observador é retirado da lista de observadores + Parâmetros : Obervador : Observador a ser retirado da lista de observadores + Retorno : Nenhum + """ def dettach(self, observer: Observer): self.__observers.remove(observer) - def notify(self): - map(lambda x: x.update(), self.__observers) + """ Nome da função : notify + Intenção da função : Notificar todos os observadores + Pré-requisitos : Nenhum + Efeitos colaterais : Todos os obervadores são notificados + Parâmetros : Desconhecido + Retorno : Nenhum + """ + def notify(self, *args, **keyargs): + map(lambda x: x.update(*args, **keyargs), self.__observers) -class Observer(object): - def update(self): - raise NotImplementedError \ No newline at end of file From af3903271b8d1b6d80da4fd2ff04ebdf1ed296e2 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Sat, 19 Oct 2019 17:14:50 -0300 Subject: [PATCH 09/26] =?UTF-8?q?Chamadas=20a=20Singleton=20n=C3=A3o=20rei?= =?UTF-8?q?nicializa=20objetos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Ball.py | 5 ++++- new_scripts/Campo.py | 11 ++++++++--- new_scripts/Mundo.py | 6 +++++- new_scripts/Patterns/Singleton.py | 5 ++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/new_scripts/Ball.py b/new_scripts/Ball.py index 02993dc..f97941f 100644 --- a/new_scripts/Ball.py +++ b/new_scripts/Ball.py @@ -12,5 +12,8 @@ class Ball(Agente, Singleton): - def __init__(self, ponto = Ponto()): + def __init__(self, *args, **keyargs): + pass + + def inicializa(self, ponto = Ponto()): Agente.__init__(self, ponto) diff --git a/new_scripts/Campo.py b/new_scripts/Campo.py index 071710b..6234677 100644 --- a/new_scripts/Campo.py +++ b/new_scripts/Campo.py @@ -11,9 +11,14 @@ class Campo(WeightedGridGraph, Singleton): - def __init__(self, celulasX, celulasY, dimX = 150, dimY = 130): - WeightedGridGraph.__init__(self, celulasX, celulasY) - self.__h = (dimX/(celulasX - 1), dimY/(celulasY - 1)) + + def __init__(self, *args, **keyargs): + pass + + def inicializa(self, celulasX, celulasY, dimX = 150, dimY = 130): + if not hasattr(self, "grade"): + WeightedGridGraph.__init__(self, celulasX, celulasY) + self.__h = (dimX/(celulasX - 1), dimY/(celulasY - 1)) @property def tamanhoCelula(self): diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index e51b881..362c2e5 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -15,7 +15,11 @@ from .Campo import Campo class Mundo(Singleton): - def __init__(self): + + def __init__(self, *args, **keyargs): + pass + + def inicializa(self): self.__jogadores = {"Team" : list(), "Enemies" : list()} self.ball = Ball() self.campo = Campo(celulasX = 15, celulasY = 13) diff --git a/new_scripts/Patterns/Singleton.py b/new_scripts/Patterns/Singleton.py index 196da5f..98b4794 100644 --- a/new_scripts/Patterns/Singleton.py +++ b/new_scripts/Patterns/Singleton.py @@ -15,6 +15,9 @@ def __new__(classtype, *args, **kwargs): # that subclasses will create their own __single objects if classtype != type(classtype.__single): classtype.__single = object.__new__(classtype) - classtype.__init__(classtype.__single, *args, **kwargs) + classtype.inicializa(classtype.__single, *args, **kwargs) return classtype.__single + + def inicializa(self, *args, **keyargs): + raise NotImplementedError From 1fd012c5bdbb78e887ece1b86405b9b8021d17cb Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 20 Oct 2019 20:53:10 -0300 Subject: [PATCH 10/26] =?UTF-8?q?Novos=20m=C3=B3dulos=20de=20controle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Controle/ControleTrajeto/__init__.py | 0 new_scripts/Controle/ControleVelocidade/__init__.py | 0 new_scripts/Controle/__init__.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 new_scripts/Controle/ControleTrajeto/__init__.py create mode 100644 new_scripts/Controle/ControleVelocidade/__init__.py create mode 100644 new_scripts/Controle/__init__.py diff --git a/new_scripts/Controle/ControleTrajeto/__init__.py b/new_scripts/Controle/ControleTrajeto/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/new_scripts/Controle/ControleVelocidade/__init__.py b/new_scripts/Controle/ControleVelocidade/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/new_scripts/Controle/__init__.py b/new_scripts/Controle/__init__.py new file mode 100644 index 0000000..e69de29 From 1f9d749407cd630265a49e8911eed8e9c0a1457f Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 20 Oct 2019 20:53:27 -0300 Subject: [PATCH 11/26] Interface de Controle de Trajeto --- new_scripts/Controle/ControleTrajeto/IControleTrajeto.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 new_scripts/Controle/ControleTrajeto/IControleTrajeto.py diff --git a/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py b/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py new file mode 100644 index 0000000..25361ab --- /dev/null +++ b/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py @@ -0,0 +1,4 @@ +class IcontroleTrajeto(object): + + def controle(self, actualValue): + raise NotImplementedError \ No newline at end of file From 2ec902c3d0c83cb0bd232a86a7b3c943c7f9e741 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 20 Oct 2019 20:53:37 -0300 Subject: [PATCH 12/26] Rascunho de Controle PID --- .../Controle/ControleTrajeto/ControlePID.py | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 new_scripts/Controle/ControleTrajeto/ControlePID.py diff --git a/new_scripts/Controle/ControleTrajeto/ControlePID.py b/new_scripts/Controle/ControleTrajeto/ControlePID.py new file mode 100644 index 0000000..bb3cb88 --- /dev/null +++ b/new_scripts/Controle/ControleTrajeto/ControlePID.py @@ -0,0 +1,87 @@ +import time +from .IControleTrajeto import IcontroleTrajeto +class ControleTrajetoPID(IcontroleTrajeto): + def __init__(self, P = 0.2, I = 0.0, D = 0.0, current_time=None): + """Determines how aggressively the PID reacts to the current error with setting Proportional Gain""" + self.Kp = P + """Determines how aggressively the PID reacts to the current error with setting Integral Gain""" + self.Ki = I + """Determines how aggressively the PID reacts to the current error with setting Derivative Gain""" + self.Kd = D + + self.sample_time = 0.00 + self.current_time = current_time if current_time is not None else time.time() + self.last_time = self.current_time + + self.clear() + + def clear(self): + """Clears PID computations and coefficients""" + self.SetPoint = 0.0 + + self.PTerm = 0.0 + self.ITerm = 0.0 + self.DTerm = 0.0 + self.lastError = 0.0 + + # Windup Guard + self.intError = 0.0 + self.windupGuard = 20.0 + + self.output = 0.0 + + def controle(self, actualValue): + pass + """ xs, ys, ts = start + xg, yg, tg = goal + erroT = ts - tg + erroX = xs - xg + erroY = ys - yg """ + + def update(self, feedback_value, current_time=None): + """ Calculates PID value for given reference feedback + Test PID with Kp=1.2, Ki=1, Kd=0.001 (test_pid.py) + """ + error = self.SetPoint - feedback_value + + self.current_time = current_time if current_time is not None else time.time() + delta_time = self.current_time - self.last_time + deltaError = error - self.lastError + + if (delta_time >= self.sample_time): + self.PTerm = self.Kp * error + self.ITerm += error * delta_time + + if (self.ITerm < -self.windupGuard): + self.ITerm = -self.windupGuard + elif (self.ITerm > self.windupGuard): + self.ITerm = self.windupGuard + + self.DTerm = 0.0 + if delta_time > 0: + self.DTerm = deltaError / delta_time + + # Remember last time and last error for next calculation + self.last_time = self.current_time + self.lastError = error + + self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm) + + def setWindup(self, windup): + """ Integral windup, also known as integrator windup or reset windup, + refers to the situation in a PID feedback controller where + a large change in setpoint occurs (say a positive change) + and the integral terms accumulates a significant error + during the rise (windup), thus overshooting and continuing + to increase as this accumulated error is unwound + (offset by errors in the other direction). + The specific problem is the excess overshooting. + """ + self.windupGuard = windup + + def setSampleTime(self, sample_time): + """ PID that should be updated at a regular interval. + Based on a pre-determined sampe time, the PID decides + if it should compute or return immediately. + """ + self.sample_time = sample_time From aa9ab3d2111c51b2e97400bc4a040c5fce8ab5ab Mon Sep 17 00:00:00 2001 From: LBBassani Date: Mon, 21 Oct 2019 18:35:27 -0300 Subject: [PATCH 13/26] =?UTF-8?q?Controle=20baseado=20na=20fun=C3=A7=C3=A3?= =?UTF-8?q?o=20do=20simulador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ainda não testado --- .../ControleTrajeto/IControleTrajeto.py | 2 +- .../ControleTrajeto/controleSiegwart.py | 45 +++++++++++++++++++ new_scripts/Geometria.py | 10 ++++- 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 new_scripts/Controle/ControleTrajeto/controleSiegwart.py diff --git a/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py b/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py index 25361ab..dbb5888 100644 --- a/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py +++ b/new_scripts/Controle/ControleTrajeto/IControleTrajeto.py @@ -1,4 +1,4 @@ class IcontroleTrajeto(object): - def controle(self, actualValue): + def controle(self, actualValue, objective): raise NotImplementedError \ No newline at end of file diff --git a/new_scripts/Controle/ControleTrajeto/controleSiegwart.py b/new_scripts/Controle/ControleTrajeto/controleSiegwart.py new file mode 100644 index 0000000..7f2ab3c --- /dev/null +++ b/new_scripts/Controle/ControleTrajeto/controleSiegwart.py @@ -0,0 +1,45 @@ +from .IControleTrajeto import IcontroleTrajeto +from ...Geometria import Ponto, to180range +import math as m + +class controleSiegwart(IcontroleTrajeto): + + __kRho = 1.85 + __kAlpha = 9.7 + __kBeta = -0.01 + __PI = 3.14159 + + def controle(self, actualValue, objective, speed): + xa, ya, ta = actualValue + xo, yo, to = objective + + rho = Ponto(xa, ya).distancia(Ponto(xo, yo)) + lamb = m.atan2(yo - ya, xo - xa) + + if rho < 3: + lamb = 0 + + alpha = to180range(lamb - ta) + beta = to - lamb + + linearSpeed = - controleSiegwart.__kRho*rho + angularSpeed = controleSiegwart.__kAlpha*alpha + controleSiegwart.__kBeta*beta + + scale = speed/linearSpeed + linearSpeed *= scale + angularSpeed *= scale + + if rho < 3: + linearSpeed = 0 + angularSpeed *= 0.4 + + if m.fabs(alpha) > 0.5*controleSiegwart.__PI: + linearSpeed = - linearSpeed + + result = ((linearSpeed - angularSpeed*3.35)/2, (linearSpeed + angularSpeed*3.35)/2) + maxSpeed = max(m.fabs(result[0]), m.fabs(result[1])) + + if maxSpeed > 100: + result = (result[0]*100/m.fabs(maxSpeed), result[1]*100/m.fabs(maxSpeed)) + + return result \ No newline at end of file diff --git a/new_scripts/Geometria.py b/new_scripts/Geometria.py index 5f0f55d..a250150 100644 --- a/new_scripts/Geometria.py +++ b/new_scripts/Geometria.py @@ -68,4 +68,12 @@ def __eq__(self, outro): """ def distancia(self, outro): return m.sqrt((self.x - outro.x)**2 + (self.y - outro.y)**2) - \ No newline at end of file + +def to180range(angle): + M_PI = 3.14159 + angle = m.fmod(angle, 2 * M_PI) + if (angle < - M_PI): + angle = angle + 2 * M_PI + elif (angle > M_PI): + angle = angle - 2 * M_PI + return angle \ No newline at end of file From 10ff8a08aac55a7fca22da5f396b7188033063b7 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Tue, 22 Oct 2019 13:06:26 -0300 Subject: [PATCH 14/26] =?UTF-8?q?Tentativa=20de=20Simular=20com=20c=C3=B3d?= =?UTF-8?q?igo=20antigo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{controleSiegwart.py => ControleSiegwart.py} | 9 +++++---- scripts/Ball.py | 4 ++-- scripts/Player.py | 8 ++++---- scripts/PlayerAtaque.py | 2 +- scripts/PlayerDefesa.py | 4 ++-- simulador.py | 9 ++++++++- 6 files changed, 22 insertions(+), 14 deletions(-) rename new_scripts/Controle/ControleTrajeto/{controleSiegwart.py => ControleSiegwart.py} (79%) diff --git a/new_scripts/Controle/ControleTrajeto/controleSiegwart.py b/new_scripts/Controle/ControleTrajeto/ControleSiegwart.py similarity index 79% rename from new_scripts/Controle/ControleTrajeto/controleSiegwart.py rename to new_scripts/Controle/ControleTrajeto/ControleSiegwart.py index 7f2ab3c..030bcdb 100644 --- a/new_scripts/Controle/ControleTrajeto/controleSiegwart.py +++ b/new_scripts/Controle/ControleTrajeto/ControleSiegwart.py @@ -2,7 +2,7 @@ from ...Geometria import Ponto, to180range import math as m -class controleSiegwart(IcontroleTrajeto): +class ControleSiegwart(IcontroleTrajeto): __kRho = 1.85 __kAlpha = 9.7 @@ -13,6 +13,7 @@ def controle(self, actualValue, objective, speed): xa, ya, ta = actualValue xo, yo, to = objective + ta = to180range(ta*ControleSiegwart.__PI/180) rho = Ponto(xa, ya).distancia(Ponto(xo, yo)) lamb = m.atan2(yo - ya, xo - xa) @@ -22,8 +23,8 @@ def controle(self, actualValue, objective, speed): alpha = to180range(lamb - ta) beta = to - lamb - linearSpeed = - controleSiegwart.__kRho*rho - angularSpeed = controleSiegwart.__kAlpha*alpha + controleSiegwart.__kBeta*beta + linearSpeed = - ControleSiegwart.__kRho*rho + angularSpeed = ControleSiegwart.__kAlpha*alpha + ControleSiegwart.__kBeta*beta scale = speed/linearSpeed linearSpeed *= scale @@ -33,7 +34,7 @@ def controle(self, actualValue, objective, speed): linearSpeed = 0 angularSpeed *= 0.4 - if m.fabs(alpha) > 0.5*controleSiegwart.__PI: + if m.fabs(alpha) > 0.5*ControleSiegwart.__PI: linearSpeed = - linearSpeed result = ((linearSpeed - angularSpeed*3.35)/2, (linearSpeed + angularSpeed*3.35)/2) diff --git a/scripts/Ball.py b/scripts/Ball.py index c11d5d0..22e50f2 100644 --- a/scripts/Ball.py +++ b/scripts/Ball.py @@ -38,7 +38,7 @@ def predict_ball_method(self, player, mundo): cy_ball_predic = self.gety() + vy_ball * k_pred * norm_v_ball return cx_ball_predic, cy_ball_predic - def predict_ball_method_ofensive(self, player): + def predict_ball_method_ofensive(self, player, mundo): mx = sum(self.x_old)/5.0 my = sum(self.y_old)/5.0 @@ -57,7 +57,7 @@ def predict_ball_method_ofensive(self, player): dif_y = self.gety()-player.gety() ro_aux = math.sqrt(dif_x**2 + dif_y**2) - c_magic = self.predicao_adaptativa(self.x) + c_magic = self.predicao_adaptativa(self.x, mundo) k_pred = c_magic*ro_aux/85.0 cx_ball_predic = self.getx() + vx_ball * k_pred * norm_v_ball diff --git a/scripts/Player.py b/scripts/Player.py index fc454e1..9e75e57 100644 --- a/scripts/Player.py +++ b/scripts/Player.py @@ -145,7 +145,7 @@ def chuta(self, world): xr, yr = self.getxy() xg, yg = world.get_right_goal() my_inf = 1e5 - ofensividade = world.campo_potencial(self) + ofensividade = self.campo_potencial(world) d_East = abs(xb - world.FIELD_RIGHT) d_West = abs(xb - world.FIELD_LEFT) @@ -167,7 +167,7 @@ def chuta(self, world): pto_inf = ((world.FIELD_RIGHT + world.FIELD_LEFT)/2, my_inf) d_Best = d_South - value = world.campo_potencial(self) + value = self.campo_potencial(world) grad_x = (world.campo_potencial_g(xb + 10.0, yb, self.medo_de_bater_na_parede) - value ) @@ -297,12 +297,12 @@ def controle(self, world): def campo_potencial(self, mundo): #return (math.tanh((xr - right_upper[0])**2/medo_de_bater_na_parede**2)* math.tanh((xr - left_upper[0])**2/medo_de_bater_na_parede**2) * math.tanh((yr - right_lower[1])**2/medo_de_bater_na_parede**2) * math.tanh((yr - right_upper[1])**2/medo_de_bater_na_parede**2))/4.0 - xr, yr = mundo.getxy() + xr, yr = self.getxy() dx = xr - mundo.left_goal[0] dy = yr - mundo.left_goal[1] ro = math.sqrt(dx**2+dy**2) - ret = (math.tanh((xr - self.right_upper[0])**2/self.medo_de_bater_na_parede**2)* math.tanh((xr - self.left_upper[0])**2/self.medo_de_bater_na_parede**2) * math.tanh((yr - self.right_lower[1])**2/self.medo_de_bater_na_parede**2) * math.tanh((yr - self.right_upper[1])**2/player.medo_de_bater_na_parede**2))/(1-math.exp(-(ro**2)/8000.0))/4.0 + ret = (math.tanh((xr - mundo.right_upper[0])**2/self.medo_de_bater_na_parede**2)* math.tanh((xr - mundo.left_upper[0])**2/self.medo_de_bater_na_parede**2) * math.tanh((yr - mundo.right_lower[1])**2/self.medo_de_bater_na_parede**2) * math.tanh((yr - mundo.right_upper[1])**2/self.medo_de_bater_na_parede**2))/(1-math.exp(-(ro**2)/8000.0))/4.0 if ro < 100: ret = 0 return ret \ No newline at end of file diff --git a/scripts/PlayerAtaque.py b/scripts/PlayerAtaque.py index 32500f4..9d381c2 100644 --- a/scripts/PlayerAtaque.py +++ b/scripts/PlayerAtaque.py @@ -14,7 +14,7 @@ def chuta(self, world): distancia_pra_sair_da_parede = 3.5 ball = world.get_ball() - xb, yb = ball.predict_ball_method_ofensive(self) + xb, yb = ball.predict_ball_method_ofensive(self, world) xg, yg = world.get_enemy_goal() adiciona_ponto(int(xb), int(yb), 127, 255, 60, 'bola') diff --git a/scripts/PlayerDefesa.py b/scripts/PlayerDefesa.py index 181ba28..e588749 100644 --- a/scripts/PlayerDefesa.py +++ b/scripts/PlayerDefesa.py @@ -61,8 +61,8 @@ def chuta(self, world): ym = yg - ygi#calculo do meio de campo Y #calculo da distancia da bola pro meio : INICIO - vec_ball_meio_x = xb - xmeioRicardo - vec_ball_meio_y = yb - ymeioRicardo + vec_ball_meio_x = xb + vec_ball_meio_y = yb norm_vec_ball_meio = math.sqrt(vec_ball_meio_x**2 + vec_ball_meio_y**2)#distancia da bola pro meio #calculo da distancia da bola pro meio : FIM ########## diff --git a/simulador.py b/simulador.py index 6ce858b..57bfc54 100644 --- a/simulador.py +++ b/simulador.py @@ -16,6 +16,7 @@ from scripts.Ball import Ball from scripts.Player import Player from scripts.Agent import Agent +from new_scripts.Controle.ControleTrajeto.ControleSiegwart import ControleSiegwart from vsscorepy.communications.command_sender import CommandSender from vsscorepy.communications.debug_sender import DebugSender from vsscorepy.communications.state_receiver import StateReceiver @@ -25,6 +26,7 @@ from vsscorepy.domain.pose import Pose from vsscorepy.domain.debug import Debug from enum import Enum +import math as m class Team(Enum): BLUE = 1 @@ -60,6 +62,7 @@ def recebe_estado(self): mundo.add_gk_player(team[2]) enemie = [Player(), Player(), Player()] mundo.jogadores["Enemies"].extend(enemie) +controle = ControleSiegwart() while True: state = k.recebe_estado() mundo.ball.update_position((state.ball.x, state.ball.y)) @@ -71,6 +74,10 @@ def recebe_estado(self): listaComando = list() for p in team: - velr, vell = p.controle(mundo) + ox, oy = p.chuta(mundo) + objetivo = (ox, oy, m.atan2(oy, ox)) + ax, ay = p.getxy() + atual = (ax, ay, p.get_theta()) + vell, velr = controle.controle(actualValue = atual, objective = objetivo, speed = 60) listaComando.append(WheelsCommand(vell, velr)) k.envia_comando(listaComando[0], listaComando[1], listaComando[2]) \ No newline at end of file From 54dcb8ee3688a2abaec0019d8bd85d99dd5ec3ee Mon Sep 17 00:00:00 2001 From: LBBassani Date: Tue, 22 Oct 2019 13:47:22 -0300 Subject: [PATCH 15/26] Simulador com o VSSS Antigo Ainda faz a mesma coisa --- scripts/World.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/World.py b/scripts/World.py index b390c9c..b9f19f0 100644 --- a/scripts/World.py +++ b/scripts/World.py @@ -123,4 +123,13 @@ def updateField(self, fieldRight, fieldLeft, fieldTop, fieldBottom): print (self.FIELD_LEFT) print (self.FIELD_TOP) print (self.FIELD_BOTTOM) - print ("ola1") \ No newline at end of file + print ("ola1") + + def campo_potencial_g(self, xr, yr, medo_de_bater_na_parede): + #return (math.tanh((xr - right_upper[0])**2/medo_de_bater_na_parede**2)* math.tanh((xr - left_upper[0])**2/medo_de_bater_na_parede**2) * math.tanh((yr - right_lower[1])**2/medo_de_bater_na_parede**2) * math.tanh((yr - right_upper[1])**2/medo_de_bater_na_parede**2))/4.0 + dx = xr - self.right_goal[0] + dy = yr - self.right_goal[1] + ro = math.sqrt(dx**2+dy**2) + if ro < 100: + return 0 + return (math.tanh((xr - self.right_upper[0])**2/medo_de_bater_na_parede**2)* math.tanh((xr - self.left_upper[0])**2/medo_de_bater_na_parede**2) * math.tanh((yr - self.right_lower[1])**2/medo_de_bater_na_parede**2) * math.tanh((yr - self.right_upper[1])**2/medo_de_bater_na_parede**2))/(1-math.exp(-(ro**2)/8000.0))/4.0 From 2b9d7dfdad48f709e08214c695dc8411e6f373b2 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 13:50:21 -0300 Subject: [PATCH 16/26] Rascunho de Jogo --- new_scripts/Agente.py | 14 ++++++++ new_scripts/Aliado.py | 9 ++++-- .../ComportamentosJogadores/IComportamento.py | 3 +- new_scripts/Mundo.py | 32 ++++++++++++++++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/new_scripts/Agente.py b/new_scripts/Agente.py index bc1a466..bcc7ca6 100644 --- a/new_scripts/Agente.py +++ b/new_scripts/Agente.py @@ -8,11 +8,13 @@ """ from sklearn.linear_model import LinearRegression from .Geometria import Ponto +import math as m class Agente(object): def __init__(self, ponto = Ponto()): self.__ponto = ponto + self.__theta = 0 self.__posicoesAntigas = list() @property @@ -36,6 +38,18 @@ def posicao(self, value): @property def x(self): return self.ponto.x + + @property + def y(self): + return self.ponto.y + + @property + def theta(self): + return self.__theta + + @theta.setter + def theta(self, value): + self.__theta = value @property def posicoesAntigas(self): diff --git a/new_scripts/Aliado.py b/new_scripts/Aliado.py index 1230c42..a6f1a78 100644 --- a/new_scripts/Aliado.py +++ b/new_scripts/Aliado.py @@ -12,13 +12,13 @@ """ from .Jogador import Jogador from .Geometria import Ponto -from .ComportamentosJogadores.Factory import Factory +from .ComportamentosJogadores.Factory import Factory, COMPORTAMENTOS from .ComportamentosJogadores.IComportamento import IComportamento class Aliado(Jogador): def __init__(self, idJ, ponto = Ponto(), comportamento = COMPORTAMENTOS.DEFESA): - Jogador.__init__(id = idJ, ponto = ponto) + Jogador.__init__(self, idJ = idJ, ponto = ponto) self.comportamento = comportamento """ Nome da função : comportamento (getter) @@ -52,4 +52,7 @@ def comportamento(self, comportamento): Retorno : Boolean : Sempre False """ def isInimigo(self): - return False \ No newline at end of file + return False + + def definirObjetivo(self, mundo): + return self.__comportamento.definirObjetivo(self, mundo) \ No newline at end of file diff --git a/new_scripts/ComportamentosJogadores/IComportamento.py b/new_scripts/ComportamentosJogadores/IComportamento.py index 786f7c2..b7ff0a2 100644 --- a/new_scripts/ComportamentosJogadores/IComportamento.py +++ b/new_scripts/ComportamentosJogadores/IComportamento.py @@ -6,4 +6,5 @@ Membros : Lorena Bassani """ class IComportamento(object): - pass \ No newline at end of file + def definirObjetivo(self, jogador, mundo): + raise NotImplementedError \ No newline at end of file diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index 362c2e5..217af4a 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -13,16 +13,23 @@ from .ComportamentosJogadores.Comportamentos import COMPORTAMENTOS from .Ball import Ball from .Campo import Campo +from .Controle.ControleTrajeto.IControleTrajeto import IcontroleTrajeto +from .Controle.ControleTrajeto.ControleSiegwart import ControleSiegwart +from .PathPlanning.IPathPlanning import IPathPlanning +from .PathPlanning.AStar import AStar +import math as m class Mundo(Singleton): def __init__(self, *args, **keyargs): pass - def inicializa(self): + def inicializa(self, controladorTrajeto = ControleSiegwart, pathPlanning = AStar): self.__jogadores = {"Team" : list(), "Enemies" : list()} self.ball = Ball() self.campo = Campo(celulasX = 15, celulasY = 13) + self.pathPlanning = AStar + self.controladorTrajeto = controladorTrajeto """ Nome da função : inimigos (getter) Intenção da função : Retorna os Inimigos @@ -86,3 +93,26 @@ def jogador(self, jogadorId): if p: return p return None + + def control(self): + self.__defineFunction() + controle = list() + for p in self.__jogadores["Team"]: + # Primeiro passo: Definir Objetivo + goal = p.definirObjetivo(self) + start = p.posicao + # Segundo passo: Planejar Caminho + path = self.pathPlanning.PathPlan(self.campo, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) + path = self.pathPlanning.reconstructPath(path, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) + # Terceiro passo: Seguir Caminho + gx, gy = self.campo.transform2Cart(path.pop(0)) + sx, sy = start + gt = m.acos((gx*sx + gy*sy)/(m.sqrt(gx**2 + gy**2)*m.sqrt(sx**2 + sy**2))) + goal = gx, gy, gt + start = sx, sy, p.theta + vel = self.controladorTrajeto.controle(start, goal, 100) + controle.append(vel) + return controle + + def __defineFunction(self): + pass \ No newline at end of file From 24050b97ed62cbf5155af7b3f5aea6e8c119f51b Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 15:44:23 -0300 Subject: [PATCH 17/26] =?UTF-8?q?Informa=C3=A7=C3=B5es=20sobre=20a=20Arena?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- new_scripts/Mundo.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index 217af4a..45bc761 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -9,6 +9,7 @@ Membros : Lorena Bassani """ from .Patterns.Singleton import Singleton +from .Geometria import Ponto from .Jogador import Jogador from .ComportamentosJogadores.Comportamentos import COMPORTAMENTOS from .Ball import Ball @@ -17,19 +18,46 @@ from .Controle.ControleTrajeto.ControleSiegwart import ControleSiegwart from .PathPlanning.IPathPlanning import IPathPlanning from .PathPlanning.AStar import AStar +from enum import Enum import math as m +class Lado(Enum): + ESQUERDO = 0 + DIREITO = 1 + +class Arena(object): + cantoSuperior = { "Direito" : Ponto(170, 0), + "Esquerdo" : Ponto(0, 0) + } + cantoInferior = { "Direito" : Ponto(170, 130), + "Esquerdo" : Ponto(0, 130) + } + golDireito = { "Superior" : Ponto(160 ,45), + "Meio" : Ponto(160, 65), + "Inferior" : Ponto(160, 95) + } + golEsquerdo = { "Superior" : Ponto(10 ,45), + "Meio" : Ponto(10, 65), + "Inferior" : Ponto(10, 95) + } + marcacoes = { "Meio do Campo" : Ponto(85, 65) + } + metricas = { "Tamanho " : (170, 130), + "Gol" : (10, 40) + } + class Mundo(Singleton): def __init__(self, *args, **keyargs): pass - def inicializa(self, controladorTrajeto = ControleSiegwart, pathPlanning = AStar): + def inicializa(self, controladorTrajeto = ControleSiegwart, pathPlanning = AStar, lado = Lado.DIREITO): self.__jogadores = {"Team" : list(), "Enemies" : list()} self.ball = Ball() self.campo = Campo(celulasX = 15, celulasY = 13) self.pathPlanning = AStar self.controladorTrajeto = controladorTrajeto + self.lado = lado """ Nome da função : inimigos (getter) Intenção da função : Retorna os Inimigos From 60fb9e5c5b6cfc369c3daffd12217d0d1d1ec1f4 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 15:44:42 -0300 Subject: [PATCH 18/26] Rascunhos de definirObjetivo --- .../ComportamentoAtacante.py | 5 ++- .../ComportamentoDefesa.py | 5 ++- .../ComportamentoGoleiro.py | 42 ++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py index 8e409af..f20398c 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py @@ -9,4 +9,7 @@ class ComportamentoAtacante(IComportamento): def __init__(self): - IComportamento.__init__(self) \ No newline at end of file + IComportamento.__init__(self) + + def definirObjetivo(self, jogador, mundo): + pass \ No newline at end of file diff --git a/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py b/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py index b473344..dda1e19 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py @@ -9,4 +9,7 @@ class ComportamentoDefesa(IComportamento): def __init__(self): - IComportamento.__init__(self) \ No newline at end of file + IComportamento.__init__(self) + + def definirObjetivo(self, jogador, mundo): + pass \ No newline at end of file diff --git a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py index e7b32d7..8a788b7 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py @@ -6,7 +6,47 @@ Membros : Lorena Bassani """ from .IComportamento import IComportamento +from ..Geometria import Ponto +from ..Mundo import Mundo, Arena, Lado +from ..Ball import Ball +from ..Jogador import Jogador +import math as m class ComportamentoGoleiro(IComportamento): def __init__(self): - IComportamento.__init__(self) \ No newline at end of file + IComportamento.__init__(self) + + def definirObjetivo(self, jogador : Jogador, mundo : Mundo): + """ Ideia da implementação : + Posicionar o robô de forma que ele impessa a trajetória da bola + Como : Calcular o angulo de abertura entre a bola e o gol + Posicionar o robô onde o "triangulo" tenha base de 7,5 (tamanho do robô) + """ + resp = Ponto() + ball = mundo.ball + bx, by, bt = ball.posicao + """ a² = b² + c² - 2bc*cos α + a² - b² - c² = -2bc* cos α + (b² + c² - a²)/2bc = cos α + α = acos(((b² + c² - a²)/2bc)) + Onde : + a <- lado oposto (tamanho do gol) + b e c <- lados adjascentes (distancia da bola até um dos limites do gol) + α <- angulo desejado + """ + gol = Arena.golDireito if mundo.lado == Lado.DIREITO else Arena.golEsquerdo + a = Arena.metricas["Gol"][1] + b = ball.ponto.distancia(gol["Superior"]) + c = ball.ponto.distancia(gol["Inferior"]) + alpha = m.acos((b**2 + c**2 - a**2)/2*b*c) + + dx = 3.75/m.tan(alpha) # 3.75 é metade da largura do robô de 7.5x7.5 + resp.x = bx + dx if mundo.lado == Lado.DIREITO else bx - dx + + theta = m.fabs(bt - jogador.theta) + resp.y = (resp.x/m.tan(theta)) + + resp.y = 100 if resp.y > 100 else 30 if resp.y < 30 else resp.y + 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 + + return resp \ No newline at end of file From afe3214ba4c25a0c6db53a794d01f4ec254cbcf2 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 15:48:36 -0300 Subject: [PATCH 19/26] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20de=20Comportamen?= =?UTF-8?q?toGoleiro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComportamentosJogadores/ComportamentoGoleiro.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py index 8a788b7..847ce91 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py @@ -1,8 +1,13 @@ """ Nome do módulo : ComportamentoGoleiro Ano de criação : 2019/10 Descrição do módulo : Comportamento de Goleiro para Jogadores - Versão : 1.0 + Versão : 2.0 Pré-requisitos : IComportamento + Geometria + Mundo, Arena, Lado + Ball + Jogador + math Membros : Lorena Bassani """ from .IComportamento import IComportamento @@ -24,7 +29,7 @@ def definirObjetivo(self, jogador : Jogador, mundo : Mundo): """ resp = Ponto() ball = mundo.ball - bx, by, bt = ball.posicao + bx, _, bt = ball.posicao """ a² = b² + c² - 2bc*cos α a² - b² - c² = -2bc* cos α (b² + c² - a²)/2bc = cos α From d9dce99882727060aee84a704a0a026052cb4ce1 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 15:50:09 -0300 Subject: [PATCH 20/26] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20Comportamento=20?= =?UTF-8?q?Ataque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComportamentosJogadores/ComportamentoAtacante.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py index f20398c..bb5e939 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py @@ -3,9 +3,19 @@ Descrição do módulo : Comportamento de Atacante para Jogadores Versão : 1.0 Pré-requisitos : IComportamento + Geometria + Mundo, Arena, Lado + Jogador + Ball + math Membros : Lorena Bassani """ from .IComportamento import IComportamento +from ..Geometria import Ponto +from ..Mundo import Mundo, Arena, Lado +from ..Jogador import Jogador +from ..Ball import Ball +import math as m class ComportamentoAtacante(IComportamento): def __init__(self): From 25de6cdac6be2b902a612bfad29c09ec21c7bc9f Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 16:01:20 -0300 Subject: [PATCH 21/26] Rascunho de Ataque --- .../ComportamentoAtacante.py | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py index bb5e939..cfed2f0 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py @@ -21,5 +21,23 @@ class ComportamentoAtacante(IComportamento): def __init__(self): IComportamento.__init__(self) - def definirObjetivo(self, jogador, mundo): - pass \ No newline at end of file + def definirObjetivo(self, jogador : Jogador, mundo : Mundo): + ball = mundo.ball + if ball.distancia(jogador) > 30: + x, y = ball.posicao + # Se posicionar antes da bola + if mundo.lado == Lado.DIREITO: + x += 3.35 + else: + x -= 3.35 + # Se a bola estiver acima do meio de campo, se posicionar acima dela + if y < Arena.marcacoes["Meio"][1]: + y -= 3.35 + else: + y += 3.35 + return Ponto(x, y) + elif ball.distancia > 5: + return ball.ponto + else: + x, y = Arena.golEsquerdo["Meio"] if mundo.lado == Lado.ESQUERDO else Arena.golDireito["Meio"] + return Ponto(x, y) \ No newline at end of file From ddf6034e13029e46992c8d74f5e67e3148f7a074 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 16:05:04 -0300 Subject: [PATCH 22/26] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20de=20Comportamen?= =?UTF-8?q?toDefesa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComportamentosJogadores/ComportamentoDefesa.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py b/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py index dda1e19..5fdeaa1 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoDefesa.py @@ -3,9 +3,19 @@ Descrição do módulo : Comportamento de Defesa para Jogadores Versão : 1.0 Pré-requisitos : IComportamento + Geometria + Mundo, Arena, Lado + Jogador + Ball + math Membros : Lorena Bassani """ from .IComportamento import IComportamento +from ..Geometria import Ponto +from ..Mundo import Mundo, Arena, Lado +from ..Jogador import Jogador +from ..Ball import Ball +import math as m class ComportamentoDefesa(IComportamento): def __init__(self): From 07045740f829ba39f801171bc36cb90350e085d7 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 16:13:04 -0300 Subject: [PATCH 23/26] Rascunho de Curva de Lissajous --- .../ComportamentoLissajous.py | 27 +++++++++++++++++++ .../ComportamentosJogadores/Factory.py | 5 +++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 new_scripts/ComportamentosJogadores/ComportamentoLissajous.py diff --git a/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py new file mode 100644 index 0000000..7c94697 --- /dev/null +++ b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py @@ -0,0 +1,27 @@ +""" Na matemática, a curva de Lissajous (figura de Lissajous ou curva de Bowditch) + é o gráfico produzido por um sistema de equações paramétricas que descreve um complexo movimento harmônico. + x = A*sen(at + sig), y = B*sen(bt) +""" +from .IComportamento import IComportamento +from ..Geometria import Ponto +from ..Mundo import Mundo, Arena, Lado +from ..Jogador import Jogador +from ..Ball import Ball +import math as m + +class ComportamentoLissajous(IComportamento): + __PI = 3.14159 + def __init__(self, A = 30, B = 100, a = 3, b = 4, sig = (ComportamentoLissajous.__PI/2)): + IComportamento.__init__(self) + self.A = A + self.B = B + self.a = a + self.b = b + self.sigma = sig + self.__t = 0 + + def definirObjetivo(self, jogador, Mundo): + x = self.A*m.sin(self.a*self.__t + self.sigma) + y = self.B*m.sin(self.b*self.__t) + self.__t += 1 + return Ponto(x, y) \ No newline at end of file diff --git a/new_scripts/ComportamentosJogadores/Factory.py b/new_scripts/ComportamentosJogadores/Factory.py index 73ce480..bb93df4 100644 --- a/new_scripts/ComportamentosJogadores/Factory.py +++ b/new_scripts/ComportamentosJogadores/Factory.py @@ -12,6 +12,7 @@ from .ComportamentoGoleiro import ComportamentoGoleiro from .ComportamentoDefesa import ComportamentoDefesa from .ComportamentoAtacante import ComportamentoAtacante +from .ComportamentoLissajous import ComportamentoLissajous class Factory(object): @@ -28,5 +29,7 @@ def create(comportamento): return ComportamentoGoleiro() elif comportamento == COMPORTAMENTOS.ATACANTE: return ComportamentoAtacante() + elif comportamento == COMPORTAMENTOS.DEFESA: + return ComportamentoDefesa() else: - return ComportamentoDefesa() \ No newline at end of file + return ComportamentoLissajous() \ No newline at end of file From eff48e1b3c31c1a0e357f60d0b4e2bf72d213b30 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 16:15:50 -0300 Subject: [PATCH 24/26] =?UTF-8?q?Documenta=C3=A7=C3=A3o=20ComportamentoLis?= =?UTF-8?q?sajous?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComportamentoLissajous.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py index 7c94697..4559293 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py @@ -1,6 +1,11 @@ -""" Na matemática, a curva de Lissajous (figura de Lissajous ou curva de Bowditch) - é o gráfico produzido por um sistema de equações paramétricas que descreve um complexo movimento harmônico. - x = A*sen(at + sig), y = B*sen(bt) +""" Nome do módulo : ComportamentoLissajous + Ano de criação : 2019/10 + Descrição do módulo : Modela um comportamento que descreve uma curva de Lissajous + Versão : 1.0 + Pré-requisitos : IComportamento + Geometria + math + Membros : Lorena B Bassani """ from .IComportamento import IComportamento from ..Geometria import Ponto @@ -21,6 +26,10 @@ def __init__(self, A = 30, B = 100, a = 3, b = 4, sig = (ComportamentoLissajous. self.__t = 0 def definirObjetivo(self, jogador, Mundo): + """ Na matemática, a curva de Lissajous (figura de Lissajous ou curva de Bowditch) + é o gráfico produzido por um sistema de equações paramétricas que descreve um complexo movimento harmônico. + x = A*sen(at + sig), y = B*sen(bt) + """ x = self.A*m.sin(self.a*self.__t + self.sigma) y = self.B*m.sin(self.b*self.__t) self.__t += 1 From b508e55f9f5fba6727b6ffac23dc6e3899a2b1a4 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 16:22:28 -0300 Subject: [PATCH 25/26] =?UTF-8?q?Limpando=20para=20o=20c=C3=B3digo=20novo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simulador.py | 47 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/simulador.py b/simulador.py index 57bfc54..35d9a4b 100644 --- a/simulador.py +++ b/simulador.py @@ -1,22 +1,13 @@ """ VSSS-o-Primeiro Nome do módulo : simulador - Ano de criação : 2019/01 - Descrição do módulo: Modulo para rodar o simulador no código do VSSS (primeira versão) - Versão: 1.0 + Ano de criação : 2019/10 + Descrição do módulo: Modulo para rodar o simulador no código do VSSS (segunda versão) + Versão: 2.0 Pré-requisitos : vsscorepy Membros: Lorena Bassani """ import vsscorepy as simulador -import scripts as vsss_erus -from scripts.World import World -from scripts.Goalkeeper import Goalkeeper as gk -from scripts.PlayerAtaque import PlayerAtaque as fw -from scripts.PlayerDefesa import PlayerDefesa as df -from scripts.Ball import Ball -from scripts.Player import Player -from scripts.Agent import Agent -from new_scripts.Controle.ControleTrajeto.ControleSiegwart import ControleSiegwart from vsscorepy.communications.command_sender import CommandSender from vsscorepy.communications.debug_sender import DebugSender from vsscorepy.communications.state_receiver import StateReceiver @@ -25,6 +16,12 @@ from vsscorepy.domain.point import Point from vsscorepy.domain.pose import Pose from vsscorepy.domain.debug import Debug + +import new_scripts as vsssERUS +from new_scripts.Mundo import Mundo +from new_scripts.Inimigo import Inimigo +from new_scripts.Aliado import Aliado + from enum import Enum import math as m @@ -55,29 +52,3 @@ def recebe_estado(self): k = kernel() -mundo = World() -team = [fw(), df(), gk()] -mundo.add_atk_player(team[0]) -mundo.add_def_player(team[1]) -mundo.add_gk_player(team[2]) -enemie = [Player(), Player(), Player()] -mundo.jogadores["Enemies"].extend(enemie) -controle = ControleSiegwart() -while True: - state = k.recebe_estado() - mundo.ball.update_position((state.ball.x, state.ball.y)) - for i in range(0, 2): - r = state.team_yellow[i] - e = state.team_blue[i] - team[i].set_position_xyt(r.x, r.y, r.angle) - enemie[i].set_position_xyt(e.x, e.y, e.angle) - - listaComando = list() - for p in team: - ox, oy = p.chuta(mundo) - objetivo = (ox, oy, m.atan2(oy, ox)) - ax, ay = p.getxy() - atual = (ax, ay, p.get_theta()) - vell, velr = controle.controle(actualValue = atual, objective = objetivo, speed = 60) - listaComando.append(WheelsCommand(vell, velr)) - k.envia_comando(listaComando[0], listaComando[1], listaComando[2]) \ No newline at end of file From 8084a4cd964160522c01a97f04f0596b526f1a93 Mon Sep 17 00:00:00 2001 From: LBBassani Date: Wed, 23 Oct 2019 17:56:34 -0300 Subject: [PATCH 26/26] Primeira Simulacao Novo Codigo --- new_scripts/Agente.py | 15 ++++++++---- new_scripts/Aliado.py | 4 ++-- new_scripts/Campo.py | 3 ++- .../ComportamentoAtacante.py | 10 ++++---- .../ComportamentoGoleiro.py | 12 +++++++--- .../ComportamentoLissajous.py | 2 +- new_scripts/Inimigo.py | 2 +- new_scripts/Jogador.py | 2 +- new_scripts/Mundo.py | 24 +++++++++++++------ simulador.py | 22 +++++++++++++++-- vss-simulator/VSS-CorePy | 1 + 11 files changed, 70 insertions(+), 27 deletions(-) create mode 160000 vss-simulator/VSS-CorePy diff --git a/new_scripts/Agente.py b/new_scripts/Agente.py index bcc7ca6..563b285 100644 --- a/new_scripts/Agente.py +++ b/new_scripts/Agente.py @@ -8,6 +8,7 @@ """ from sklearn.linear_model import LinearRegression from .Geometria import Ponto +from .Campo import Campo import math as m class Agente(object): @@ -23,8 +24,10 @@ def ponto(self): @ponto.setter def ponto(self, value): - self._changePosition() + self.__changePosition() self.__ponto = value + c = Campo() + c.occupy(c.transform2Grid((value.x, value.y)), self) @property def posicao(self): @@ -32,8 +35,10 @@ def posicao(self): @posicao.setter def posicao(self, value): - self._changePosition() + self.__changePosition() self.ponto.posicao = value + c = Campo() + c.occupy(c.transform2Grid(value), self) @property def x(self): @@ -55,10 +60,12 @@ def theta(self, value): def posicoesAntigas(self): return self.__posicoesAntigas.copy() - def _changePosition(self): - if(len(self.__posicoesAntigas) >= 5): + def __changePosition(self): + if len(self.__posicoesAntigas) >= 5: self.__posicoesAntigas.pop(0) self.__posicoesAntigas.append(Ponto(self.ponto.x, self.ponto.y)) + c = Campo() + c.release(c.transform2Grid(self.posicao)) def predicaoAdaptativa(self): pass \ No newline at end of file diff --git a/new_scripts/Aliado.py b/new_scripts/Aliado.py index a6f1a78..2e97b5f 100644 --- a/new_scripts/Aliado.py +++ b/new_scripts/Aliado.py @@ -12,12 +12,12 @@ """ from .Jogador import Jogador from .Geometria import Ponto -from .ComportamentosJogadores.Factory import Factory, COMPORTAMENTOS +from .ComportamentosJogadores.Factory import Factory from .ComportamentosJogadores.IComportamento import IComportamento class Aliado(Jogador): - def __init__(self, idJ, ponto = Ponto(), comportamento = COMPORTAMENTOS.DEFESA): + def __init__(self, idJ, ponto = Ponto(), comportamento = None): Jogador.__init__(self, idJ = idJ, ponto = ponto) self.comportamento = comportamento diff --git a/new_scripts/Campo.py b/new_scripts/Campo.py index 6234677..2e5e579 100644 --- a/new_scripts/Campo.py +++ b/new_scripts/Campo.py @@ -31,7 +31,8 @@ def transform2Cart(self, cel): def transform2Grid(self, cel): # TODO : Redefinir trasnformação - pass + x, y = cel + return WeightedGridGraph.transform2Grid(self, (x//self.__h[0], y//self.__h[1])) def cost(self, start, goal): # TODO : Redefinir custo para variar com a proximidade a um obstáculo diff --git a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py index cfed2f0..de04a24 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoAtacante.py @@ -23,7 +23,7 @@ def __init__(self): def definirObjetivo(self, jogador : Jogador, mundo : Mundo): ball = mundo.ball - if ball.distancia(jogador) > 30: + if ball.ponto.distancia(jogador.ponto) > 30: x, y = ball.posicao # Se posicionar antes da bola if mundo.lado == Lado.DIREITO: @@ -31,13 +31,13 @@ def definirObjetivo(self, jogador : Jogador, mundo : Mundo): else: x -= 3.35 # Se a bola estiver acima do meio de campo, se posicionar acima dela - if y < Arena.marcacoes["Meio"][1]: + if y < Arena.marcacoes["Meio"].y: y -= 3.35 else: y += 3.35 return Ponto(x, y) - elif ball.distancia > 5: + elif ball.ponto.distancia(jogador.ponto) > 5: return ball.ponto else: - x, y = Arena.golEsquerdo["Meio"] if mundo.lado == Lado.ESQUERDO else Arena.golDireito["Meio"] - return Ponto(x, y) \ No newline at end of file + resp = Arena.golEsquerdo["Meio"] if mundo.lado == Lado.ESQUERDO else Arena.golDireito["Meio"] + return resp \ No newline at end of file diff --git a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py index 847ce91..371ae3d 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoGoleiro.py @@ -29,7 +29,8 @@ def definirObjetivo(self, jogador : Jogador, mundo : Mundo): """ resp = Ponto() ball = mundo.ball - bx, _, bt = ball.posicao + bx, _ = ball.posicao + bt = ball.theta """ a² = b² + c² - 2bc*cos α a² - b² - c² = -2bc* cos α (b² + c² - a²)/2bc = cos α @@ -43,9 +44,14 @@ def definirObjetivo(self, jogador : Jogador, mundo : Mundo): a = Arena.metricas["Gol"][1] b = ball.ponto.distancia(gol["Superior"]) c = ball.ponto.distancia(gol["Inferior"]) - alpha = m.acos((b**2 + c**2 - a**2)/2*b*c) + alpha = (b**2 + c**2 - a**2)/2*b*c + if alpha > 1: + alpha = 1.0 + elif alpha < -1: + alpha = -1.0 + alpha = m.acos(alpha) - dx = 3.75/m.tan(alpha) # 3.75 é metade da largura do robô de 7.5x7.5 + dx = 3.75/m.tan(alpha) if m.tan(alpha) != 0 else 0 # 3.75 é metade da largura do robô de 7.5x7.5 resp.x = bx + dx if mundo.lado == Lado.DIREITO else bx - dx theta = m.fabs(bt - jogador.theta) diff --git a/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py index 4559293..f51d6ec 100644 --- a/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py +++ b/new_scripts/ComportamentosJogadores/ComportamentoLissajous.py @@ -16,7 +16,7 @@ class ComportamentoLissajous(IComportamento): __PI = 3.14159 - def __init__(self, A = 30, B = 100, a = 3, b = 4, sig = (ComportamentoLissajous.__PI/2)): + def __init__(self, A = 30, B = 100, a = 3, b = 4, sig = (__PI/2)): IComportamento.__init__(self) self.A = A self.B = B diff --git a/new_scripts/Inimigo.py b/new_scripts/Inimigo.py index 860d04d..75f4ef4 100644 --- a/new_scripts/Inimigo.py +++ b/new_scripts/Inimigo.py @@ -12,7 +12,7 @@ class Inimigo(Jogador): def __init__(self, idJ, ponto = Ponto()): - Jogador.__init__(self, id = idJ, ponto = ponto) + Jogador.__init__(self, idJ = idJ, ponto = ponto) """ Nome da função : isInimigo Intenção da função : Dizer se um Jogador é Inimigo diff --git a/new_scripts/Jogador.py b/new_scripts/Jogador.py index d8ad357..b623a6a 100644 --- a/new_scripts/Jogador.py +++ b/new_scripts/Jogador.py @@ -12,7 +12,7 @@ class Jogador(Agente): def __init__(self, idJ, ponto = Ponto()): - Agente.__init__(ponto) + Agente.__init__(self, ponto) self.__id = idJ """ Nome da função : id (getter) diff --git a/new_scripts/Mundo.py b/new_scripts/Mundo.py index 45bc761..04e8980 100644 --- a/new_scripts/Mundo.py +++ b/new_scripts/Mundo.py @@ -40,7 +40,7 @@ class Arena(object): "Meio" : Ponto(10, 65), "Inferior" : Ponto(10, 95) } - marcacoes = { "Meio do Campo" : Ponto(85, 65) + marcacoes = { "Meio" : Ponto(85, 65) } metricas = { "Tamanho " : (170, 130), "Gol" : (10, 40) @@ -51,7 +51,7 @@ class Mundo(Singleton): def __init__(self, *args, **keyargs): pass - def inicializa(self, controladorTrajeto = ControleSiegwart, pathPlanning = AStar, lado = Lado.DIREITO): + def inicializa(self, controladorTrajeto = ControleSiegwart(), pathPlanning = AStar, lado = Lado.DIREITO): self.__jogadores = {"Team" : list(), "Enemies" : list()} self.ball = Ball() self.campo = Campo(celulasX = 15, celulasY = 13) @@ -122,23 +122,33 @@ def jogador(self, jogadorId): return p return None + @property + def time(self): + return self.__jogadores["Team"] + + @time.setter + def time(self, newTime): + self.__jogadores["Team"].clear() + self.__jogadores["Team"].extend(newTime) + def control(self): self.__defineFunction() controle = list() for p in self.__jogadores["Team"]: # Primeiro passo: Definir Objetivo - goal = p.definirObjetivo(self) + goal = p.definirObjetivo(self).posicao start = p.posicao # Segundo passo: Planejar Caminho - path = self.pathPlanning.PathPlan(self.campo, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) - path = self.pathPlanning.reconstructPath(path, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) + # path = self.pathPlanning.PathPlan(self.campo, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) + # path = self.pathPlanning.reconstructPath(path, self.campo.transform2Grid(start), self.campo.transform2Grid(goal)) # Terceiro passo: Seguir Caminho - gx, gy = self.campo.transform2Cart(path.pop(0)) + # gx, gy = self.campo.transform2Cart(path.pop(0)) + gx, gy = goal sx, sy = start gt = m.acos((gx*sx + gy*sy)/(m.sqrt(gx**2 + gy**2)*m.sqrt(sx**2 + sy**2))) goal = gx, gy, gt start = sx, sy, p.theta - vel = self.controladorTrajeto.controle(start, goal, 100) + vel = self.controladorTrajeto.controle(actualValue = start, objective = goal, speed = 100) controle.append(vel) return controle diff --git a/simulador.py b/simulador.py index 35d9a4b..f69ad9c 100644 --- a/simulador.py +++ b/simulador.py @@ -7,7 +7,6 @@ Membros: Lorena Bassani """ -import vsscorepy as simulador from vsscorepy.communications.command_sender import CommandSender from vsscorepy.communications.debug_sender import DebugSender from vsscorepy.communications.state_receiver import StateReceiver @@ -17,10 +16,10 @@ from vsscorepy.domain.pose import Pose from vsscorepy.domain.debug import Debug -import new_scripts as vsssERUS from new_scripts.Mundo import Mundo from new_scripts.Inimigo import Inimigo from new_scripts.Aliado import Aliado +from new_scripts.ComportamentosJogadores.Factory import COMPORTAMENTOS from enum import Enum import math as m @@ -52,3 +51,22 @@ def recebe_estado(self): k = kernel() +mundo = Mundo() +time = [Aliado(0, comportamento = COMPORTAMENTOS.GOLEIRO), Aliado(1, comportamento = COMPORTAMENTOS.ATACANTE), Aliado(2)] +inimigo = [Inimigo(3), Inimigo(4), Inimigo(5)] +mundo.inimigos = inimigo +mundo.time = time +while True: + state = k.recebe_estado() + mundo.ball.posicao = (state.ball.x, state.ball.y) + mundo.ball.theta = m.atan2(state.ball.speed_y, state.ball.speed_x) + for i in range(0, len(time)): + r = state.team_yellow[i] + e = state.team_blue[i] + time[i].posicao = (r.x, r.y) + time[i].theta = r.angle + inimigo[i].posicao = (e.x, e.y) + inimigo[i].theta = (e.angle) + listaComando = mundo.control() + listaComando = list(map(lambda vel: WheelsCommand(vel[0], vel[1]), listaComando)) + k.envia_comando(listaComando[0], listaComando[1], listaComando[2]) diff --git a/vss-simulator/VSS-CorePy b/vss-simulator/VSS-CorePy new file mode 160000 index 0000000..b560ecd --- /dev/null +++ b/vss-simulator/VSS-CorePy @@ -0,0 +1 @@ +Subproject commit b560ecdeefb2700eb68b978eb9573574fbc2bfff