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
 
(75 revisões intermediárias por 4 usuários não estão sendo mostradas)
Linha 3: Linha 3:
  
 
----
 
----
 
=Cronograma de Atividades=
 
{| class="wikitable"
 
! style="text-align: center;" | Atividades
 
! style="text-align: center;" | 26/02 - 03/03
 
! style="text-align: center;" | 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
 
! style="text-align: center;" | 24/04 - 01/05 - 08/05
 
|-
 
| [[#Estrutura do Robô|Estrutura do EV3]]
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
| style="text-align: center;" |
 
|-
 
| SD Card com sistema operacional embarcado
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
| style="text-align: center;" |
 
|-
 
|[[#Acesso via WiFI|Acesso via WiFI]]
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
| style="text-align: center;" |
 
|-
 
| [[#Execução de programas na linguagem Python|Execução de programas na linguagem Python]]
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| [[#Teste de sensores e motor|Teste de sensores e motor]]
 
| style="text-align: center;" |
 
| style="text-align: center;" | parcial
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| [[#Estudo do artigo do Borenstein e pesquisas sobre métodos de localização| Estudo do artigo do Borenstein e pesquisas sobre métodos de localização]]
 
| style="text-align: center;" |
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| Definir método para localização
 
| style="text-align: center;" |
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| Definir regras do jogo
 
| style="text-align: center;" |
 
| style="text-align: center;" | OK
 
| style="text-align: center;" |
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| [[#Entrega do sumário executivo|Entrega do sumário executivo]]
 
| style="text-align: center;" |
 
| style="text-align: center;" |
 
| style="text-align: center;" | OK
 
|
 
|
 
|
 
|
 
|
 
|
 
|-
 
| [[#Casos de uso e requisitos|Casos de uso e requisitos]]
 
| style="text-align: center;" |
 
| style="text-align: center;" |
 
| style="text-align: center;" | parcial
 
|
 
|
 
|
 
|
 
|
 
|
 
|}
 
  
 
=Estrutura do EV3=
 
=Estrutura do EV3=
A equipe optou por utilizar um modelo adaptado do [https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-model-core-set-gyro-boy-f8a14d8e3d0e63fa23b87f798bf197f4.pdf Gyro Boy] LEGO® MINDSTORMS® Education EV3.<br />
+
Inicialmente, na primeira versão do robô, utilizamos um modelo adaptado do [https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-model-core-set-gyro-boy-f8a14d8e3d0e63fa23b87f798bf197f4.pdf 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.<br />
 
As interfaces de entrada e saída utilizadas no controle do robô seguem a nomenclatura tabela:
 
As interfaces de entrada e saída utilizadas no controle do robô seguem a nomenclatura tabela:
 
{| class="wikitable"
 
{| class="wikitable"
Linha 138: Linha 14:
 
|-
 
|-
 
| style="font-weight: bold;" | 1
 
| style="font-weight: bold;" | 1
| Sensor de Cor
+
| Sensor de Toque
 
| style="font-weight: bold;" | A
 
| style="font-weight: bold;" | A
 
| Motor Direita
 
| Motor Direita
 
|-
 
|-
 
| style="font-weight: bold;" | 2
 
| style="font-weight: bold;" | 2
| Sensor de Toque
+
| Sensor Ultrassônico
 
| style="font-weight: bold;" | B
 
| style="font-weight: bold;" | B
 
|  
 
|  
 
|-
 
|-
 
| style="font-weight: bold;" | 3
 
| style="font-weight: bold;" | 3
| Sensor Ultrassônico
+
| Sensor de Giro
 
| style="font-weight: bold;" | C
 
| style="font-weight: bold;" | C
 
|  
 
|  
 
|-
 
|-
 
| style="font-weight: bold;" | 4
 
| style="font-weight: bold;" | 4
| Sensor de Giro
+
| Sensor de Cor
 
| style="font-weight: bold;" | D
 
| style="font-weight: bold;" | D
 
| Motor Esquerda
 
| Motor Esquerda
 
|}
 
|}
  
[[Imagem:RoboEV3 v2.jpg|thumb|EV3 montado pela Equipe|centro]]
+
[[Imagem:roboev3.jpeg|thumb|EV3 criado e montado pela Equipe|centro]]
  
 
=Acesso via WiFI=
 
=Acesso via WiFI=
Linha 196: Linha 72:
  
 
= Levantamento de Requisitos=
 
= Levantamento de Requisitos=
== Requisitos Funcionais ==
+
{{collapse top | Requisitos Funcionais}}
  
 
'''RF01''' O robô entra em funcionamento a partir de instruções originadas no sistema de auditoria. <br>
 
'''RF01''' O robô entra em funcionamento a partir de instruções originadas no sistema de auditoria. <br>
Linha 212: Linha 88:
 
'''RF13''' O sistema supervisor deve repassar ao robô as informações sobre a partida recebidas do sistema de auditoria.<br>
 
'''RF13''' O sistema supervisor deve repassar ao robô as informações sobre a partida recebidas do sistema de auditoria.<br>
  
== Requisitos Não Funcionais ==
+
{{collapse bottom}}
 +
 
 +
{{collapse top | Requisitos Não Funcionais}}
 +
 
 
'''RNF01''' O sistema de auditoria deve ser compartilhado entre os robôs. <br>
 
'''RNF01''' O sistema de auditoria deve ser compartilhado entre os robôs. <br>
 
'''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. <br>
 
'''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. <br>
Linha 218: Linha 97:
 
'''RNF04''' O tabuleiro deve ser formado por 100 blocos com dimensões de 0,2 metros por 0,2 metros. <br>
 
'''RNF04''' O tabuleiro deve ser formado por 100 blocos com dimensões de 0,2 metros por 0,2 metros. <br>
 
'''RNF05''' O tabuleiro deve ter 6 cores (vermelho, azul, amarelo, verde, branco e marrom). <br>
 
'''RNF05''' O tabuleiro deve ter 6 cores (vermelho, azul, amarelo, verde, branco e marrom). <br>
'''RNF06''' Ao redor do tabuleiro deve ter um contorno preto de 0,15 metros. <br>
+
'''RNF06''' Ao redor do tabuleiro deve ter um contorno preto de 0,05 metros. <br>
 
'''RNF07''' Cada robô deve ter uma cor para identificação. <br>
 
'''RNF07''' Cada robô deve ter uma cor para identificação. <br>
  
== Restrições ==
+
{{collapse bottom}}
 +
 
 +
{{collapse top |Restrições}}
 +
 
 
As limitações encontradas pela equipe para o desenvolvimento do projeto envolvem:
 
As limitações encontradas pela equipe para o desenvolvimento do projeto envolvem:
 
# A quantidade de sensores disponíveis para integrar ao robô.
 
# A quantidade de sensores disponíveis para integrar ao robô.
 
# Atraso no processamento de programas grandes ou travamento da plataforma do EV3.
 
# Atraso no processamento de programas grandes ou travamento da plataforma do EV3.
 
# Limitação de horas livres semanalmente que a equipe pode se dedicar ao desenvolvimento do projeto.
 
# Limitação de horas livres semanalmente que a equipe pode se dedicar ao desenvolvimento do projeto.
 +
 +
{{collapse bottom}}
  
 
= Casos de uso =
 
= Casos de uso =
== Atores ==
+
 
 +
{{collapse top | Atores}}
 +
 
 
=== Casos de Uso do Sistema de Auditoria: ===
 
=== Casos de Uso do Sistema de Auditoria: ===
 
# Juiz
 
# Juiz
Linha 240: Linha 126:
 
# Sistema Supervisor
 
# Sistema Supervisor
 
# Sensor Ultrassônico
 
# Sensor Ultrassônico
 +
{{collapse bottom}}
  
== Diagramas de Casos de Uso ==
+
{{collapse top | Diagramas de Casos de Uso}}
  
=== Casos de Uso do Sistema do Robô ===
+
{{collapse top | Casos de Uso do Sistema do Robô}}
  
 
==== Receber Modo de Operação (CSU-SR01) ====
 
==== Receber Modo de Operação (CSU-SR01) ====
Linha 296: Linha 183:
 
# O Sistema Supervisor informa ao sistema a localização dos alvos.
 
# O Sistema Supervisor informa ao sistema a localização dos alvos.
 
# 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.
 
# 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.
[[Arquivo:UseCase DiagramSistemaRoboV2.png]]
 
  
=== Casos de Uso do Sistema Supervisor ===
+
[[Arquivo:UseCase DiagramSistemaRoboV2.png|850px]]
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Casos de Uso do Sistema Supervisor}}
 +
 
 
==== Jogar Manual (CSU-SS01) ====
 
==== Jogar Manual (CSU-SS01) ====
 
'''Sumário:''' O Sistema Supervisor foi habilitado para operar manualmente. <br>
 
'''Sumário:''' O Sistema Supervisor foi habilitado para operar manualmente. <br>
Linha 335: Linha 225:
 
'''Regras de Negócio:''' RN07.
 
'''Regras de Negócio:''' RN07.
  
[[Arquivo:UseCase Diagram1.png]]
+
[[Arquivo:UseCase Diagram1.png|850px]]
 
+
{{collapse bottom}}
=== Casos de Uso do Sistema de Auditoria ===
 
  
 +
{{collapse top | Casos de Uso do Sistema de Auditoria}}
 
==== Configurar Partida (CSU-SA01)====
 
==== Configurar Partida (CSU-SA01)====
  
 
'''Sumário:''' Juiz utiliza o Sistema de Auditoria para configurar os dados para a partida. <br>
 
'''Sumário:''' Juiz utiliza o Sistema de Auditoria para configurar os dados para a partida. <br>
 
'''Ator Primário:''' Juiz.<br>
 
'''Ator Primário:''' Juiz.<br>
 +
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Fluxo Principal:'''
 
'''Fluxo Principal:'''
# O Juiz adiciona os dados dos jogadores cadastrados.
+
# O Juiz seleciona o modo de operação, manual ou autônomo, e os robôs que participaram da partida;
# O sistema apresenta frequentemente as posições dos alvos no tabuleiro.  
+
# O Juiz inicia a partida;
 +
# Dados são mandados para o Sistema Supervisor.
 +
# O Juiz dá inicio a partida.
  
 
==== Verificar Histórico (CSU-SA02) ====
 
==== Verificar Histórico (CSU-SA02) ====
Linha 353: Linha 246:
 
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Fluxo Principal:'''  
 
'''Fluxo Principal:'''  
# O Juiz solicita ao Sistema de Auditoria o histórico das partidas.
+
# O Juiz solicita ao Sistema de Auditoria consulta ao histórico das partidas.
# O Juiz envia o histórico ao Sistema Supervisor.
+
# O Juiz visualiza a tabela de partidas jogadas com seus respectivos resultados.
 
'''Fluxo Alternativo:'''
 
'''Fluxo Alternativo:'''
 
# 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.
 
# 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.
Linha 361: Linha 254:
 
==== Cadastrar Robôs (CSU-SA03) ====
 
==== Cadastrar Robôs (CSU-SA03) ====
  
'''Sumário:''' O Juiz realiza o cadastro dos jogadores e robôs para a partida. <br>
+
'''Sumário:''' O Juiz realiza o cadastro dos robôs para a partida. <br>
 
'''Ator Primário:''' Juiz. <br>
 
'''Ator Primário:''' Juiz. <br>
 
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Fluxo Principal:'''
 
'''Fluxo Principal:'''
 
# Os robôs que participaram da partida, são cadastrados pelo Juiz através do Sistema de Auditoria.
 
# Os robôs que participaram da partida, são cadastrados pelo Juiz através do Sistema de Auditoria.
# São realizados dois cadastros por partida.
+
# O cadastro consiste no nome do robô e seu IP.  
# O cadastro consiste no nome do robô.  
+
# Os cadastros são enviados para os Sistemas Supervisor.  
# Os cadastros são enviados para os Sistemas Supervisor de cada jogador.  
 
 
'''Fluxo Alternativo:'''
 
'''Fluxo Alternativo:'''
 
# Caso o robô já esteja cadastrado, o sistema informará ao Juiz.
 
# Caso o robô já esteja cadastrado, o sistema informará ao Juiz.
Linha 379: Linha 271:
 
'''Ator Primário:''' Juiz. <br>
 
'''Ator Primário:''' Juiz. <br>
 
'''Ator Secundário:''' Sistema Supervisor. <br>
 
'''Ator Secundário:''' Sistema Supervisor. <br>
'''Precondições:''' O Juiz está identificado pelo Sistema de Auditoria. <br>
 
 
'''Fluxo Principal:'''
 
'''Fluxo Principal:'''
# O Juiz solicita ao sistema a geração randômica das posições dos alvos por jogador.
+
 
# As posições dos alvos de cada jogador são enviadas para o Sistema Supervisor de cada jogador.
+
# Ao iniciar a partida o Sistema gera randomicamente as posições dos alvos.
# A partir das posições enviadas e dos cadastros realizados o Juiz envia ao Sistema de Auditoria a requisição do início da partida.
+
# As posições dos alvos são enviadas para o Sistema Supervisor de cada jogador.  
 
# O Sistema de Auditoria apresenta ao Juiz o tabuleiro com os alvos posicionados e a contagem do tempo de início da partida.
 
# 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.
 
'''Regras de Negócio:''' RN01, RN05.
  
Linha 396: Linha 288:
 
'''Regras de Negócio:''' RN01.
 
'''Regras de Negócio:''' RN01.
  
==== Validar Alvo (CSU-SA06) ====
+
==== Validar Alvo Modo Autônomo (CSU-SA06) ====
 
'''Sumário:''' A Câmera valida o encontro do alvo usando o Sistema de Auditoria. <br>
 
'''Sumário:''' A Câmera valida o encontro do alvo usando o Sistema de Auditoria. <br>
 
'''Ator Primário:''' Câmera. <br>
 
'''Ator Primário:''' Câmera. <br>
'''Ator Secundário:''' Juiz. <br>
 
 
'''Fluxo Principal:'''
 
'''Fluxo Principal:'''
 
# A Câmera visualiza o tabuleiro e os jogadores.
 
# A Câmera visualiza o tabuleiro e os jogadores.
 
# Ao ocorrer o encontro do jogador com o alvo a Câmera envia uma mensagem ao Sistema de Auditoria validando o encontro do alvo.
 
# Ao ocorrer o encontro do jogador com o alvo a Câmera envia uma mensagem ao Sistema de Auditoria validando o encontro do alvo.
  
[[Arquivo:UseCase Diagram0.png]]
+
==== Validar Alvo Modo Manual (CSU-SA07) ====
 +
'''Sumário:''' A Câmera valida o encontro do alvo usando o Sistema de Auditoria. <br>
 +
'''Ator Primário:''' Juiz. <br>
 +
'''Fluxo Principal:'''
 +
# O Juiz visualiza o tabuleiro e os jogadores.
 +
# Ao ocorrer o encontro do jogador com o alvo o Juiz envia uma mensagem ao Sistema de Auditoria validando o encontro do alvo.
 +
 
 +
[[Arquivo:UseCase Diagram0.png|850px]]
 +
{{collapse bottom}}
 +
 
 +
{{collapse bottom}}
  
== Regras de Negócio ==
+
{{collapse top | Regras de Negócio}}
 
{| border="1" cellpadding="5" cellspacing="0"  
 
{| border="1" cellpadding="5" cellspacing="0"  
!Nome
+
! style="width: 195px;"| Nome
 
!Descrição
 
!Descrição
 
|-
 
|-
Linha 429: Linha 330:
 
|-
 
|-
 
|}
 
|}
 +
{{collapse bottom}}
 +
 +
=Etapa 1=
 +
 +
Nesta etapa foram feitos os diagramas e implementações do modo manual sem o Sistema de Auditoria.
 +
 +
==Diagrama de Classe==
 +
[[Arquivo:Class DiagramModoManual.png|600px|center]]
 +
 +
==Diagrama de Sequência==
 +
 +
==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''':
 +
<code>
 +
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''':
 +
<code>
 +
#!/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==
 +
 +
[[Arquivo:CS_Servidor.png|600px]]
 +
 +
==Diagramas de Sequência==
 +
[[Arquivo:Configurar Partida (CSU-SA01).png|850px]]
 +
 +
[[Arquivo:Cadastrar Robôs (CSU-SA03).png|850px]]
 +
 +
[[Arquivo:Iniciar Partida (CSU-SA04).png|850px]]
 +
 +
[[Arquivo:verificar.jpeg|850px]]
 +
 +
[[Arquivo:pausar.jpeg|850px]]
  
 
=Links Auxiliares=
 
=Links Auxiliares=
 +
 +
Pseudocódigo:
 +
http://thetechnicgear.com/2014/03/howto-create-line-following-robot-using-mindstorms/
 +
 +
Demonstração de Funcionamento do sensor e do tabuleiro colorido:
 +
https://www.youtube.com/watch?v=fnwWcGqY3VA
 +
 +
=Arquivos teste=
 +
 +
[[Arquivo:Ev3-master.zip]]

Edição atual tal como às 12h47min de 16 de junho de 2018

Equipe

Luísa Machado
Marina Souza
Natália Miranda


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,05 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

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 Partida (CSU-SA04).png

Verificar.jpeg

Pausar.jpeg

Links Auxiliares

Pseudocódigo: http://thetechnicgear.com/2014/03/howto-create-line-following-robot-using-mindstorms/

Demonstração de Funcionamento do sensor e do tabuleiro colorido: https://www.youtube.com/watch?v=fnwWcGqY3VA

Arquivos teste

Arquivo:Ev3-master.zip