-
Notifications
You must be signed in to change notification settings - Fork 7
guia de colaboracao criando seu time
O NeonFC é um sistema criado para ser fácil a criação de novas estratégias, considerando qualquer algoritmo de controle ou path-planning. Porém, para comecar a implementar por sua conta a estratégia de um time inteiro é importante conhecer os principais módulos do software e como eles se comunicam.
Esse guia tem como objetivo mostrar passo a passo como cria uma estratégia do zero.
O NeonFC trabalha com dois conceitos importantes que devem ser bem entendidos para que possamos criar estratégias:
-
Coach: Coaches são módulos que são iniciados logo na execução do NeonFC, eles são responsáveis, a todo frame, atribuir a cada um dos robôs uma Strategy. Dentro do coach, também podemos implementar posicionamento de faltas.
-
Strategy: Strategies são módulos responsáveis por encapsular toda a lógica por trás da tomada de decisão do robô, um objeto Robot precisa de uma strategy para que possa calcular sua tomada de decisão. Dentro de Strategy precisamos manipular qualquer algoritmo necessário para tomar decisões.
Para entender melhor como esses conceitos funcionam leia as páginas:
O primeiro passo é sempre criar um coach. Para isso adicione em NeonFC/entities/coach
o seu arquivo nome_do_coach.py
. Normalmente seguimos o padrão [campeonato][ano]_[categoria].py
.
Dentro do arquivo python é necessário criar uma classe coach que herda de BaseCoach
.
from entities.coach.coach import BaseCoach
import strategy
class Coach(BaseCoach): # heranca da classe abstrata
NAME = "nome_do_coach" # todo coach deve ter um nome
def __init__(self, match): # método de início do coach
super().__init__(match) # chamada do metodo da classe mae
def decide(self):
# O método decide é obrigatório.
# Ele é chamado toda iteração do NeonFC e é responsável
# por decidir qual estratégia será passada para qual robô.
pass
Esse é o esqueleto básico de todo coach. Mas para que ele funcione ainda é necessário instanciar as estratégias e escolher como elas serão passadas aos robôs.
from entities.coach.coach import BaseCoach
import strategy
class Coach(BaseCoach):
NAME = "IRON_2022"
def __init__(self, match):
super().__init__(match)
# instancia as estratégias
self._3 = strategy.iron2022.Midfielder(self.match)
self._0 = strategy.iron2022.Attacker_LC(self.match)
self._9 = strategy.iron2022.Goalkeeper(self.match)
def decide(self):
robots = [(i, r.robot_id) for i, r in enumerate(self.match.robots)]
strategies = [
self._3,
self._9,
self._0
]
# coach estático, cada robô recebe sempre a mesma estratégia.
for robot, strategy in zip(robots, strategies):
if self.match.robots[robot[0]].strategy is not None:
continue
self.match.robots[robot[0]].strategy = strategy
self.match.robots[robot[0]].start()
Esse exemplo é o que nos utilizamos durante a IRONCup 2022 e a LARC 2022 na categoria físico. Aqui é possivel ver que as estratégias são instanciadas no __init__
. E que o coach escolhido foi um estático, ou seja, cada robô recebia sempre a mesma estratégia (o robô 3 é sempre meio campo, o 0 sempre atacante e o 9 sempre goleiro).
Após criar o coach é importante adicioná-lo a lista de coaches em NeonFC/entities/coach/__init__.py
from entities.coach.coach import BaseCoach
from entities.coach.iron2022 import Coach as IRON_2022
from entities.coach.guideCoach import Coach as GuideCoach
from entities.coach.test_coach import Coach as TestCoach
from entities.coach.rsm2022 import Coach as RSMCoach
from entities.coach.iron2023 import Coach as IRON_2023
_coach_list = [
# Tournament coaches
GuideCoach,
RSMCoach,
IRON_2022,
IRON_2023,
TestCoach
]
COACHES = {c.NAME: c for c in _coach_list}