Skip to content

ieee-ras-ufcg/SS2D

Repository files navigation

Competição SS2D

Badge em Desenvolvimento GitHub Org's stars

Nosso Projeto Primeiros Passos Aprendendo Mais
🤖SS2D 🛠Instalação Server+Monitor 🗂️ Acesso ao Projeto
🧑‍🎓Equipe 📼Assistir um Jogo Gravado 💻Criando um Binário
📄Metodologia 🛠Instalação de Equipes 🕹️Modo de Controle Manual
🗓Planejamento 🎮Rodando o Primeiro Jogo 📖Material Extra

🤖 Competição SS2D?

  • A Robocup é uma competição anual internacional de robótica estabelecida em 1996, que objetiva promover pesquisas de robótica e de inteligência artificial através de torneios de várias modalidades.
  • A SS2D é a modalidade da Robocup que aborda o futebol simulado por computador num espaço 2D.
  • Cada time tem 11 jogadores virtuais que "pensam" separadamente e tomam decisões com base nas informações que conseguem capturar do seu ambiente.
  • Os jogadores têm atributos como velocidade máxima, precisão de chute, tamanho e energia. Esses atributos são escolhidos aleatoriamente pelo servidor em cada partida.
  • Os algoritmos e lógicas que cada jogador usa para decidir o que ele vai fazer devem ser criados pela equipe do time. Porém, é permitido e recomendado que equipes novas utilizem o código de outras equipes como base.
  • As regras das partidas do SS2D são extremamente parecidas com as que conhecemos no futebol: Existem faltas, impedimentos, tiros de meta, cartões, entre outros. Ganha a partida o time que fizer mais gols.

📄 Metodologia

Para uma melhor divisão das tarefas, o projeto pode ser dividido em duas áreas de foco:

  • Microdinâmica - Responsável por decisões de baixo nível, pelo desenvolvimento das heurísticas, inteligência artificial e tomada de decisões de cada um dos jogadores. Área mais focada em detalhes de controle, como: Dribles, Fazer o robô chutar com a força certa ao fazer o passe, interceptação, ETC.
  • Macrodinâmica - Responsável por decisões de alto nível, pelo desenvolvimento de estratégias, formações e modo de jogo geral do time. A área engloba: Comparação e escolha de formações a cada ponto do jogo, jogadas "ensaiadas", economia de energia, ETC.

🗓 Planejamento

  • No primeiro instante foi realizada uma introdução geral acerca da competição e das equipes. Para isso foi feito o estudo e a leitura dos TDP's disponibilizados pelas equipes tanto internacionais como nacionais. Neste estudo foi possível captar aspectos importantes da competição, como por exemplo seu funcionamento, como as equipes e como o jogo funciona. Também com a leitura foi possível perceber estratégias de algumas equipes, como por exemplo o uso de inteligência artificial, o uso de diferentes marcações e etc. Além dos TDP’s disponibilizados pelas equipes, também foi e está sendo utilizado o manual, The RoboCup Soccer Simulator Users Manual.
  • No momento a equipe busca ter os primeiros contatos com os softwares, as equipes bases e criar um time com apenas um jogador, para assim poder compreender a dinâmica do jogo na prática e poder criar um time que possa participar de competiçoẽs.

Status do projeto

# Atividade Status
1 Compreender a Competição SS2D - Leitura de TDP's Finalizado
2 Instalação do Servidor e do Monitor Finalizado
3 Instalação dos Times Base e Rodar Partidas Finalizado
4 Realizar o controle Manual de um Dummy Finalizado
5 Criação de um Time Com Apenas um Cliente Em Andamento
6 Criação de uma Estratégia Própria Não Iniciado

🛠 Instalando o Servidor e Monitor

  • Recomenda-se usar o Ubuntu 16.04 ou uma versão posterior para rodar os programas da modalidade. No Ubuntu, é possível instalar todos os requisitos de ambiente com os seguintes comandos:
sudo apt update
sudo apt install build-essential automake autoconf libtool flex bison libboost-all-dev
sudo apt install build-essential qt5-default libfontconfig1-dev libaudio-dev libxt-dev libglib2.0-dev libxi-dev libxrender-dev
  • Servidor:

    Antes de continuar é recomendado criar uma pasta /servidor/ , dentro da qual você salvará tanto o servidor quanto o monitor.

    No Github do servidor, baixe a versão mais recente do rcssserver-x.x.x.tar.gz, substituindo os "x" pelo número da versão. Em seguida, execute os seguintes comandos no terminal, substituindo o nome do arquivo para que fique igual à versão instalada:

    tar xzvfp rcssserver-x.x.x.tar.gz
    cd rcssserver-x.x.x
    ./configure
    make
    

    A partir de agora, você poderá executar o binário ./rcssserver dentro do /src/ do servidor para fazer o servidor funcionar. Porém, mesmo executando esse comando, não será possivel ver o campo nem qualquer jogo que for executado, pois o monitor ainda não está instalado.

  • Monitor:

    Dentro da pasta /servidor/ que você criou, baixe a versão mais recente do monitor e execute os seguintes códigos, substituindo o nome do arquivo pelo nome correto:

    tar xzvfp rcssmonitor-x.x.x.tar.gz
    cd rcssmonitor-x.x.x
    ./configure
    make
    

    Agora você pode rodar o binário ./rcssmonitor dentro do /src/ do monitor para fazer o monitor funcionar.

    Lembre-se de rodar o servidor sempre antes do monitor. Você saberá que tudo está funcionando se os jogadores aparecerem no monitor na parte superior, logo fora da quadra, como na imagem:

📼 Rodando um Jogo Gravado

A execução de um jogo gravado é um processo muito simples que permite testar se o monitor está funcionando corretamente.

  • Em primeiro lugar, baixe o replay do jogo gravado. Existe uma coleção de replays de todas as partidas da Robocup desde 2004 no site de arquivo da competição. É recomendado que você crie um diretório para salvar os replays do SS2D.
  • Depois disso, copie o caminho do replay baixado na sua máquina. Para isso, você pode clicar com o botão direito no arquivo baixado e selecionar "propriedades". Nas propriedades está exibida a "pasta-mãe" do arquivo. Copie essa pasta-mãe para sua área de transferência.
  • Na pasta /src/ do rcssmonitor, execute o comando: ./rcssmonitor pastacopiada/nomedoreplay Substituindo o "pastacopiada" pelo endereço que você copiou e "nomedoreplay" pelo nome do arquivo de replay que você baixou.
  • Pronto! Se tudo tiver dado certo, irá aparecer uma janela do rcssmonitor com botões de controle no canto superior da tela, como pausar e iniciar, mudar a velocidade e ir para o próximo frame.

🛠 Instalando as Equipes

  • A princípio estão sendo usadas as seguintes equipes como base:
  • Para a instalação dos times bases será necessário ter as seguintes bibliotecas:
  • Para finalizar a instalação da equipe Cyrus Base 2D se faz necessário a inclusão de uma pasta chamada CppDNN na pasta clonada do git da equipe. Da seguinte forma:

  • Dentro da pasta CppDNN deverá ter os seguintes arquivos:

  • Dentro da pasta CppDNN/src deverá ter os seguintes arquivos:

  • Finalizado as instalações das dependências das equipes, deve-se agora seguir o seguinte procedimento para cada umas das equipes:

    • Para construir binários, execute comandos da raiz do diretório de origem:
      ./bootstrap
      ./configure
      make
      

🎮 Primeira Partida

Depois que tudo estiver instalado, você deve seguir essa sequência de passos para simular sua primeira partida:

  • Abra 4 janelas de terminal.
  • No 1° terminal, entre na pasta /servidor/rcssserver-x.x.x/src/ e rode ./rcssserver
  • No 2° terminal, entre na pasta /servidor/rcssmonitor-x.x.x/src/ e rode ./rcssmonitor
  • No 3° terminal, rode o ./start.sh do primeiro time;
  • No 4° terminal, rode o ./start.sh do segundo time;
  • Dentro da janela que o monitor abriu, libere o kickoff com o comando Ctrl-K.

Espere alguns segundos entre cada passo para diminuir a chance de erros.

🗂 Acesso ao Projeto

  • Para ter acesso ao projeto vá na pasta disponibilizada Equipe-RAS. Caso o que procura não esteja presente neste Git, entre em contato com a equipe. Estamos à sua disposição.

‍💻 Criando um Binário

  • Para fazer um binário crie, em primeiro lugar, uma cópia da pasta src do seu time. Essa cópia será transformada no "Binário", ou seja, a pasta com o mínimo necessário de arquivos para fazer um time funcionar.
  • Renomeie a pasta cópia que você criou para o nome de seu time. Dentro dela, acesse o arquivo start.sh e mude a variável teamname na linha 26 para o nome desejado do time. Isso fará com que o servidor trate o seu time pelo nome escolhido.
  • Em seguida, você pode deletar todos os arquivos com quaisquer dessas terminações: .o .h .cpp .in .am. Para facilitar use o seguinte comando shell no terminal, dentro da pasta:
rm *.o *.h *.cpp *.in *.am
  • Por via de regra, além das pastas, apenas os arquivos coach.conf, player.conf, sample_coach, sample_player e start.sh precisam permanecer no seu binário.
  • Com isso, o seu binário está pronto. Para inserir o time no jogo é só usar a função .\start.sh .

🕹 Controlando um Robô

  • Para iniciar o simulador (servidor e monitor), digite:
rcsoccersim
  • Para iniciar o cliente de amostra, digite ./rcssclient ou rcssclient. Em seguida, digite (init sample). Isso conectará o cliente de amostra ao servidor. Você pode então digitar o comando do cliente para mover o cliente pelo campo. Você também precisará de um monitor para poder ver o que está acontecendo no campo.
./rcssclient

ou

rcssclient > /dev/null 2>&1

‍🤖 Dummy

  • um dummy e um player default que não faz nenhuma ação. a utilidade dele está em aprender qual parte do programa faz oque enquanto edita ele, por isso essa é uma parte principal para fazer um jogador proprio
  • a primeira coisa feita, no caminho de criar o dummy é encontrar onde ele faz jogadas, essa parte se dá dentro de /src/chain_action que tem todos os programas para fazer atividades planejadas, dentro dessa pasta existe o action_generator.h que faz a base para a chamada de ações em conjunto de cada jogador.
  • ao entrar nela é possivel transformar essa parte do código em comentário na linha 117, e assim o jogador não conseguirá planejar ações.
(*g)->generate( result, state, wm, path );
  • o proximo passo é faze-lo parar de se movimentar, todo o movimento basico de um player é controlado dentro de /src/bhv_basic_move.cpp onde na linha 93 é chamado uma função que determina para que coordenadas um jogador vai se mover:
const Vector2D target_point = Strategy::i().getPosition( wm.self().unum() );
  • transformar em comentario não funciona nesse caso, pois isso quebra outras chamadas de funções mais a frente no programa, portanto existe algumas opções:
  1. trocar tudo depois do "=" por Vector2D(1.0,1.0); os numeros sendo x e y respectivamente, para todos os jogadores irem para o mesmo lugar
  2. fazer a mesma coisa da linha de cima porem usando wm.self().unum(); para verificar o numero de jogador e fazer cada um ir para um lugar diferente
  3. trocar a parte depois do "=" por Vector2D(wm.self().pos().x,wm.self().pos().y);
  • tambem lembre-se de transformar em comentario a linha 87 desse arquivo para que o jogador não tente roubar a bola de um oponente

com essas feitas volte para a pasta principal e rode o comando make para recompilar o time, isso pode demorar um tempo, lembre-se de fazer isso após cada moduficação do código.

dica: modificar a linha 249 do arquivo makefile na pasta principal te permite adicionar novas bibliotecas durante a compilação do time que você pode importar em algum código

📖 Aprendendo Mais

Softwares oficiais:

Site oficial Página da Wikipedia

Arquivo dos Replays

TDPs:

Tutoriais:

Equipes:

Times base:

Leituras sobre Inteligência Artificial:

🧑‍🎓 Equipe

  • Nossa equipe é composta por graduandos do segundo ao quinto período dos cursos de Ciência da Computação e Engenharia Elétrica da Universidade Federal de Campina Grande(UFCG), todos sendo voluntários do Capítulo Estudantil da Sociedade de Robótica e Automação (IEEE RAS UFCG).

Guilherme Toledo

Lucas Melo

Samara Cardoso

🚧 Projeto em construção 🚧