Skip to content

guia de colaboracao criando seu time

Eduardo Makita edited this page Jul 21, 2023 · 6 revisions

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.

Conceitos Iníciais:

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:

Etapas:

1) Criação do coach:

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}