Mudanças entre as edições de "Grupo2-PJI2-2018-1"
Linha 460: | Linha 460: | ||
==Códigos== | ==Códigos== | ||
− | Código webservice.py: | + | 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> | <code> | ||
#!/usr/bin/pythonfrom | #!/usr/bin/pythonfrom | ||
Linha 507: | Linha 600: | ||
app.run(host='0.0.0.0', debug=True) | app.run(host='0.0.0.0', debug=True) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | Códigos da página Web: | ||
+ | [[Arquivo:InterfaceWEB_SS.zip]] | ||
=Modo Manual com Sistema de Auditoria= | =Modo Manual com Sistema de Auditoria= | ||
=Links Auxiliares= | =Links Auxiliares= |
Edição das 22h12min de 7 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 |
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
Levantamento de Requisitos
Requisitos Funcionais |
---|
RF01 O robô entra em funcionamento a partir de instruções originadas no sistema de auditoria. |
Requisitos Não Funcionais |
---|
RNF01 O sistema de auditoria deve ser compartilhado entre os robôs. |
Restrições |
---|
As limitações encontradas pela equipe para o desenvolvimento do projeto envolvem:
|
Casos de uso
Atores |
---|
Casos de Uso do Sistema de Auditoria:
Casos de Uso do Sistema Supervisor:
Casos de Uso do Sistema do Robô:
|
Diagramas de Casos de Uso | ||||||
---|---|---|---|---|---|---|
|
Regras de Negócio | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Etapa 1
Nesta etapa foram feitos os diagramas e implementações do modo manual sem o Sistema de Auditoria.
Diagrama de Classe
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:
- !/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
Modo Manual com Sistema de Auditoria
Links Auxiliares