Mudanças entre as edições de "Grupo2-PJI2-2018-1"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 621: Linha 621:
  
 
==Diagramas de Sequência==
 
==Diagramas de Sequência==
 +
[[Arquivo:Configurar Partida (CSU-SA01).png|850px]]
  
 
[[Arquivo:Cadastrar Robôs (CSU-SA03).png|850px]]
 
[[Arquivo:Cadastrar Robôs (CSU-SA03).png|850px]]
  
 
[[Arquivo:iniciar.jpeg|850px]]
 
[[Arquivo:iniciar.jpeg|850px]]
 
[[Arquivo:config.jpeg|850px]]
 
  
 
[[Arquivo:verificar.jpeg|850px]]
 
[[Arquivo:verificar.jpeg|850px]]

Edição das 13h48min de 15 de maio de 2018

Equipe

Luísa Machado
Marina Souza
Natália Miranda


Cronograma de Atividades

Atividades 26/02 - 03/03 03/03 - 10/03 10/03- 17/03 17/03 - 24/03 24/03 - 31/03 31/03 - 07/04 10/04 - 17/04 17/04 - 24/04 24/04 - 01/05 - 08/05
Estrutura do EV3 OK
SD Card com sistema operacional embarcado OK
Acesso via WiFI OK
Execução de programas na linguagem Python OK
Teste de sensores e motor parcial
Estudo do artigo do Borenstein e pesquisas sobre métodos de localização OK
Definir método para localização OK
Definir regras do jogo OK
Entrega do sumário executivo OK
Casos de uso e requisitos parcial

Estrutura do EV3

Inicialmente, na primeira versão do robô, utilizamos um modelo adaptado do Gyro Boy LEGO® MINDSTORMS® Education EV3. Porém por questões de desempenho optamos por montar de uma forma diferente, este novo formato foi criado pela equipe.
As interfaces de entrada e saída utilizadas no controle do robô seguem a nomenclatura tabela:

Interfaces
Input Output
1 Sensor de Toque A Motor Direita
2 Sensor Ultrassônico B
3 Sensor de Giro C
4 Sensor de Cor D Motor Esquerda
EV3 criado e montado pela Equipe

Acesso via WiFI

Para acessar o robô via rede Wi-Fi utilizamos um dispositivo Wi-Fi (TP-Link N500) conectado à porta USB do EV3 e acessamos as configurações de rede na tela do EV3 para obter o endereço IP.
A partir de um computador conectado na mesma rede local que o robô, configuramos o software Moba para gerar uma interface gráfica de programação e permitir o envio de arquivos via SSH ao software do EV3.
O tutorial completo pode acessado neste link.

Execução de programas na linguagem Python

O primeiro código em Python enviado ao EV3 foi um teste no sensor de toque. O objetivo do programa é acionar o led verde do EV3 quando o sensor de toque for pressionado.

Teste do Sensor de Toque

Teste de sensores e motor

Teste dos Motores
Teste do Sensor de Cor
Teste do Sensor de Giro
Teste do Sensor de Ultrassônico


Estudo do artigo do Borenstein e pesquisas sobre métodos de localização

Review Técnicas de Indoor Positioning

Implementação e Teste de Soluções de Navegação de Robôs Móveis com Base no Sistema NXT/EV3 da LEGO®

Mobile Robot Positioning & Sensors and Techniques

Sumário Executivo

Arquivo:SumarioExecutivo.pdf

Levantamento de Requisitos

Requisitos Funcionais

RF01 O robô entra em funcionamento a partir de instruções originadas no sistema de auditoria.
RF02 O robô inicia em uma posição aleatória.
RF03 O robô deve descobrir sua localização no tabuleiro.
RF04 O robô deve encontrar alvos aleatoriamente escolhidos pelo sistema.
RF05 O robô deve informar ao sistema supervisor quando um alvo for encontrado.
RF06 O robô deve funcionar de modo autônomo ou manual.
RF07 O robô em modo autônomo deve ser capaz de tomar decisões quanto ao seu deslocamento evitando chocar-se com outro robô.
RF08 O sistema de auditoria notifica o sistema supervisor sobre o início e o término de uma partida e quando um alvo for alcançado por um adversário.
RF09 O sistema de auditoria deve gerenciar os dados da partida e ser capaz de apresentar esses dados ao público em tempo real.
RF10 O sistema de auditoria deve gerar randomicamente a quantidade de alvos escolhido pelo juiz.
RF11 O sistema de auditoria deve permitir a pausa, reinício ou término de uma partida.
RF12 O sistema de auditoria deve permitir que se escolha o modo de funcionamento manual ou autônomo para o robô.
RF13 O sistema supervisor deve repassar ao robô as informações sobre a partida recebidas do sistema de auditoria.

Requisitos Não Funcionais

RNF01 O sistema de auditoria deve ser compartilhado entre os robôs.
RNF02 O sistema de auditoria deve conter um banco de dados com as informações sobre os alvos e um placar para consulta dos robôs.
RNF03 O tabuleiro deve ter dimensões de 2 metros por 2 metros.
RNF04 O tabuleiro deve ser formado por 100 blocos com dimensões de 0,2 metros por 0,2 metros.
RNF05 O tabuleiro deve ter 6 cores (vermelho, azul, amarelo, verde, branco e marrom).
RNF06 Ao redor do tabuleiro deve ter um contorno preto de 0,15 metros.
RNF07 Cada robô deve ter uma cor para identificação.

Restrições

As limitações encontradas pela equipe para o desenvolvimento do projeto envolvem:

  1. A quantidade de sensores disponíveis para integrar ao robô.
  2. Atraso no processamento de programas grandes ou travamento da plataforma do EV3.
  3. Limitação de horas livres semanalmente que a equipe pode se dedicar ao desenvolvimento do projeto.

Casos de uso

Atores

Casos de Uso do Sistema de Auditoria:

  1. Juiz
  2. Sistema Supervisor
  3. Câmera

Casos de Uso do Sistema Supervisor:

  1. Jogador (modo manual)
  2. Sistema do Robô
  3. Sistema de Auditoria

Casos de Uso do Sistema do Robô:

  1. Sistema Supervisor
  2. Sensor Ultrassônico
Diagramas de Casos de Uso
Casos de Uso do Sistema do Robô

Receber Modo de Operação (CSU-SR01)

Sumário: O Sistema Supervisor informa modo de operação.
Ator Primário: Sistema Supervisor.
Fluxo Principal:

  1. O Sistema Supervisor informa ao sistema qual modo de operação.
  2. O sistema habilita o modo de operação selecionado, modo autônomo ou modo manual.

Regras de Negócio: RN08.

Jogar Manual (CSU-SR02)

Sumário: O Sistema do Robô joga em modo manual.
Ator Primário: Sistema Supervisor.
Ator Secundário: Sensor Ultrassônico.
Precondições: Receber a operação modo manual do Sistema Supervisor.
Fluxo Principal:

  1. O Sistema Supervisor habilita o Sistema do Robô para jogar em modo manual.
  2. Ao detectar algum obstáculo o Sensor Ultrassônico dispara uma exceção no Sistema do Robô executando uma função de desvio de rota.

Jogar Automático (CSU-SR03)

Sumário: O Sistema do Robô joga em modo automático.
Ator Primário: Sistema Supervisor.
Precondições: Receber a operação modo automático do Sistema Supervisor.
Fluxo Principal:

  1. O Sistema Supervisor informa ao Sistema do Robô o modo de operação automático;
  2. O Sistema do Robô joga em modo automático.

Detectar Robô (CSU-SR04)

Sumário: O Sensor Ultrassônico detecta a presença de outro robô.
Ator Primário: Sensor Ultrassônico.
Fluxo Principal:

  1. O Sensor Ultrassônico verifica com frequência a presença de outro robô ao redor do perímetro;
  2. O sensor pode ser utilizado pelo modo automático ou pelo modo manual;

Relatar Alvo Encontrado (CSU-SR05)

Sumário: O sistema informa o Sistema Supervisor o encontro de alvos.
Ator Primário: Sistema Supervisor.
Precondições: O Sistema Supervisor está identificado pelo sistema, o sistema deve estar em modo automático.
Fluxo Principal:

  1. O Sistema do Robô localiza um alvo no tabuleiro.
  2. O sistema informa o Sistema Supervisor sobre os alvos localizados.

Regras de Negócio: RN03.

Receber Localização dos Alvos (CSU-SR06)

Sumário: O Sistema Supervisor informa a localização dos alvos.
Ator Primário: Sistema Supervisor.
Precondições: O Sistema Supervisor está identificado pelo sistema.
Fluxo Principal:

  1. O Sistema Supervisor informa ao sistema a localização dos alvos.
  2. O Sistema do Robô usa a informação sobre a localização dos alvos para decidir sobre qual o próximo movimento a ser feito.

UseCase DiagramSistemaRoboV2.png

Casos de Uso do Sistema Supervisor

Jogar Manual (CSU-SS01)

Sumário: O Sistema Supervisor foi habilitado para operar manualmente.
Ator Primário: Sistema do Robô.
Atores Secundários: Sistema de Auditoria e Jogador
Fluxo Principal:

  1. O Sistema Supervisor habilita o Sistema do Robô para jogar em modo manual.
  2. O Sistema Supervisor disponibilizada ao jogador o acesso a interface de comandos do robô.
  3. O jogador opera em modo manual, determinando a direção de locomoção do robô.

Gerenciar Jogo Automático (CSU-SS02)

Sumário: O Sistema Supervisor foi habilitado para operar de forma autônoma.
Ator Primário: Sistema de Auditoria.
Ator Secundário: Sistema do Robô.
Precondições: O jogador deve optar pela opção autônoma.
Fluxo Principal:

  1. O Sistema de Auditoria define o modo autônomo no Sistema Supervisor.
  2. O modo de operação será autônomo.

Relatar Alvo Encontrado (CSU-SS03)

Sumário: O Sistema Supervisor informa ao Sistema de Auditoria que um alvo foi encontrado.
Ator Primário: Sistema do Robô.
Ator Secundário: Sistema de Auditoria.
Precondições: O Sistema do Robô encontrou um alvo.
Fluxo Principal:

  1. O Sistema do Robô informa ao Sistema Supervisor que encontrou um alvo.
  2. O Sistema de Supervisor relata ao Sistema de Auditoria para conferência.

Regras de Negócio: RN03.

Validar Robô (CSU-SS04)

Sumário: Verificar se o Robô está cadastrado no Sistema de Auditoria.
Ator Primário: Robô.
Ator Secundário: Sistema de Auditoria.
Fluxo Principal:

  1. O Sistema Supervisor consulta o Sistema de Auditoria para verificar se o robô está ou não está cadastrado.

Regras de Negócio: RN07.

UseCase Diagram1.png

Casos de Uso do Sistema de Auditoria

Configurar Partida (CSU-SA01)

Sumário: Juiz utiliza o Sistema de Auditoria para configurar os dados para a partida.
Ator Primário: Juiz.
Ator Secundário: Sistema Supervisor.
Fluxo Principal:

  1. O Juiz seleciona o modo de operação, manual ou autônomo, e os robôs que participaram da partida;
  2. O Juiz inicia a partida;
  3. Dados são mandados para o Sistema Supervisor.
  4. O Juiz dá inicio a partida.

Verificar Histórico (CSU-SA02)

Sumário: O Juiz verifica o histórico das partidas.
Ator Primário: Juiz.
Ator Secundário: Sistema Supervisor.
Fluxo Principal:

  1. O Juiz solicita ao Sistema de Auditoria consulta ao histórico das partidas.
  2. O Juiz visualiza a tabela de partidas jogadas com seus respectivos resultados.

Fluxo Alternativo:

  1. Se o sistema não possuir o registro de partidas anteriores, ou seja, se não tiver ocorrido partidas anteriormente, o mesmo informa ao Juiz a não ocorrência de partidas.

Regras de Negócio: RN01.

Cadastrar Robôs (CSU-SA03)

Sumário: O Juiz realiza o cadastro dos robôs para a partida.
Ator Primário: Juiz.
Ator Secundário: Sistema Supervisor.
Fluxo Principal:

  1. Os robôs que participaram da partida, são cadastrados pelo Juiz através do Sistema de Auditoria.
  2. O cadastro consiste no nome do robô e seu IP.
  3. Os cadastros são enviados para os Sistemas Supervisor.

Fluxo Alternativo:

  1. Caso o robô já esteja cadastrado, o sistema informará ao Juiz.

Fluxo de Exceção:

  1. Se o nome do robô já estiver cadastrado na partida, o sistema informará ao Juiz. Este deve escolher outro nome.

Regras de Negócio: RN01, RN07.

Iniciar Partida (CSU-SA04)

Sumário: O Juiz inicia a partida através do Sistema de Auditoria.
Ator Primário: Juiz.
Ator Secundário: Sistema Supervisor.
Fluxo Principal:

  1. Ao iniciar a partida o Sistema gera randomicamente as posições dos alvos.
  2. As posições dos alvos são enviadas para o Sistema Supervisor de cada jogador.
  3. O Sistema de Auditoria apresenta ao Juiz o tabuleiro com os alvos posicionados e a contagem do tempo de início da partida.

Regras de Negócio: RN01, RN05.

Pausar Partida (CSU-SA05)

Sumário: O Juiz usa o Sistema de Auditoria para pausar a partida.
Ator Primário: Juiz.
Ator Secundário: Sistema Supervisor.
Fluxo Principal:

  1. O Sistema de Auditoria apresenta o encontro de todos os alvos para o Juiz, este envia ao Sistema de Auditoria a requisição de término da partida.
  2. O Juiz, quando necessário, requisita uma pausa na partida ao Sistema de Auditoria.

Regras de Negócio: RN01.

Validar Alvo Modo Autônomo (CSU-SA06)

Sumário: A Câmera valida o encontro do alvo usando o Sistema de Auditoria.
Ator Primário: Câmera.
Fluxo Principal:

  1. A Câmera visualiza o tabuleiro e os jogadores.
  2. Ao ocorrer o encontro do jogador com o alvo a Câmera envia uma mensagem ao Sistema de Auditoria validando o encontro do alvo.

Validar Alvo Modo Manual (CSU-SA07)

Sumário: A Câmera valida o encontro do alvo usando o Sistema de Auditoria.
Ator Primário: Juiz.
Fluxo Principal:

  1. O Juiz visualiza o tabuleiro e os jogadores.
  2. Ao ocorrer o encontro do jogador com o alvo o Juiz envia uma mensagem ao Sistema de Auditoria validando o encontro do alvo.

UseCase Diagram0.png

Regras de Negócio
Nome Descrição
Acesso ao Sistema (RN01) O Sistema Supervisor terá acesso constantemente ao Sistema de auditoria para verificar o mapeamento e as posições dos alvos no tabuleiro.
Tomada de Decisão (RN02) Ao realizar a leitura da cor através do sensor de cor, o robô saberá seu posicionamento atual e por consequência tomará a decisão referente ao posicionamento seguinte.
Atualização do Placar (RN03) Ao encontrar um alvo o Sistema do Robô enviará uma mensagem ao sistema, para atualização do placar.
Delimitação do Tabuleiro (RN04) A faixa preta ao redor do tabuleiro indicará as limitações do mesmo.
Sorteio de Posições (RN05) O Sistema de Auditoria gerará randomicamente as posições dos alvos.
Detecta Adversário (RN06) Através do sensor ultrassônico o robô detecta outro robô e altera seu caminho.
Quantidade de Jogadores (RN07) São cadastrados dois jogadores por partida.
Modo de Operação (RN08) O Sistema Supervisor habilita o modo de operação selecionado, modo autônomo ou modo manual.

Etapa 1

Nesta etapa foram feitos os diagramas e implementações do modo manual sem o Sistema de Auditoria.

Diagrama de Classe

Class DiagramModoManual.png

Diagrama de Sequência

ModoManualDiaSeq.jpg

Códigos

Nesta seção apresentamos os códigos implementados na Etapa 1 do projeto. O primeiro código é o encapsulamento dos códigos dos motores para os movimentos do robô. O segundo código é a Web Service do robô que recebe da página Web os comandos para movimentar o robô. Os códigos da página Web estão no arquivo comprimido no final desta seção.

Código manual.py: from ev3dev.ev3 import * from time import sleep

class manual(object):

 def __init__(self, direcao, passos):
   self.dire = direcao
   self.steps = passos
   self.gy= GyroSensor()
   self.ts = TouchSensor()
   self.mA = LargeMotor('outA')
   self.mD = LargeMotor('outD')
   assert self.gy.connected
   self.gy.mode = 'GYRO-ANG'
   self.units = self.gy.units
 def movimento(self):
   if self.dire == 2:
    self.oeste()
    self.andar()
    self.alinhar()
   elif self.dire == 6:
    self.mA.run_timed(time_sp = 200, speed_sp = 100)
   elif self.dire == 7:
    self.mD.run_timed(time_sp = 200, speed_sp = 100)
   elif self.dire == 3:
    self.leste()
    self.andar()
    self.alinhar()
   elif self.dire == 1:
    self.andar()
    self.alinhar()
   else: 
    self.sul()
 def oeste(self):
   while not self.ts.value():
     angle = self.gy.value()
     print(str(angle) + " " + self.units)
     self.mA.run_timed(time_sp = 300, speed_sp = 100)
     if angle >= 90:
       self.mA.stop(stop_action = "brake")
       break
 def leste(self):
   while not self.ts.value():
     angle = self.gy.value()
     print(str(angle) + " " + self.units)
     self.mA.run_timed(time_sp = 300, speed_sp = -120)
     if angle <= -90:
       self.mA.stop(stop_action = "brake")
       break
 def sul(self):
   for x in range(0, self.steps):
     print ("1 passo")
     self.mA.run_timed(time_sp = 1000, speed_sp = -400)
     self.mD.run_timed(time_sp = 1000, speed_sp = -400)
     sleep(1)
 def andar(self):
   for x in range(0, self.steps):
     print ("1 passo")
     self.mA.run_timed(time_sp = 1000, speed_sp = 400)
     self.mD.run_timed(time_sp = 1000, speed_sp = 400)
     sleep(1)
 def alinhar(self):
   print("alinhando")
   if self.dire == 2:
     while not self.ts.value():
       angle = self.gy.value()
       print(str(angle) + " " + self.units)
       self.mD.run_timed(time_sp = 500, speed_sp = 120)
       if angle <= 1:
         self.mD.stop(stop_action = "brake")
         break
   elif self.dire == 3:
     while not self.ts.value():
       angle = self.gy.value()
       print(str(angle) + " " + self.units)
       self.mA.run_timed(time_sp = 500, speed_sp = 120)
       if angle >= -1:
         self.mA.stop(stop_action = "brake")
         break
   else:
       pass

</syntaxhighlight>

Código webservice.py:

  1. !/usr/bin/pythonfrom

from flask import Flask, jsonify from flask import abort from flask import make_response from flask_cors import CORS, cross_origin from flask import request from flask import url_for from flask.ext.httpauth import HTTPBasicAuth from manual import *

auth = HTTPBasicAuth()

app = Flask(__name__) CORS(app)

oper = [

         {
         'id': 1,
         'dir' : 0,
         'steps' : 0,
         },

]

@app.route('/oper', methods=['GET']) def obtem_oper():

   return jsonify({'oper': oper})

@app.route('/atualiza', methods=['PUT']) def atualizar_valores():

   resultado = [resultado for resultado in oper if resultado['id'] == 1]
   resultado[0]['dir'] = request.json.get('dir', resultado[0]['dir'])
   resultado[0]['steps'] = request.json.get('steps', resultado[0]['steps'])
   dire = request.json.get('dir', resultado[0]['dir'])
   steps = request.json.get('steps', resultado[0]['steps'])
   mov = manual(dire,steps)
   mov.movimento()
   print('atualizou')
   return jsonify({'ok': '1'}), 201

if __name__ == "__main__":

   print('Servidor no ar!')
   app.run(host='0.0.0.0', debug=True)

</syntaxhighlight>

Códigos da página Web: Arquivo:InterfaceWEB SS.zip

Etapa 2

Nesta seção apresentamos os diagrama de sequência dos casos de uso do modo manual com a integração do Sistema de Auditoria.

Diagramas de Classe

CS Servidor.png

Diagramas de Sequência

Configurar Partida (CSU-SA01).png

Cadastrar Robôs (CSU-SA03).png

Iniciar.jpeg

Verificar.jpeg

Pausar.jpeg

Links Auxiliares