Escolar Documentos
Profissional Documentos
Cultura Documentos
Departamento de Informtica
Orientador:
Professor Doutor Lus Alexandre
6 de Dexembro de 2017
Contedo
Contedo
Lista de Figuras
.
.
.
.
1
1
1
1
1
3
3
3
3
Raciocnio do Agente
3.1 Introduo . . . . .
3.2 Estruturas de Dados
3.3 Algoritmos . . . .
3.4 Dificuldades . . . .
3.5 Concluses . . . .
Introduo
1.1 Enquadramento . . . . . . .
1.2 Objetivos . . . . . . . . . .
1.3 Organizao do Documento .
1.4 Diviso do Trabalho . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
5
16
21
23
23
23
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Lista de Figuras
3.1
3.2
3.3
3.4
3.5
3.6
3.7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
18
20
20
20
21
21
Captulo 1
Introduo
1.1
Enquadramento
O projecto do qual este relatrio se refere, trata um certo robot que ir percorrer um
ambiente,passando assim por vrios objectos. Esses mesmos objectos iro ajud-lo a
responder a certas perguntas, propostas pelo utilizador.
1.2
Objetivos
1.3
Organizao do Documento
De modo a refletir o trabalho que foi feito, este documento encontra-se estruturado da
seguinte forma:
1. O primeiro captulo Introduo apresenta o projeto, a motivao para a
sua escolha, o enquadramento para o mesmo, os seus objetivos e a respetiva
organizao do documento.
2. O segundo captulo Tecnologias Utilizadas descreve os conceitos mais importantes no mbito deste projeto, bem como as tecnologias utilizadas durante
do desenvolvimento da aplicao.
3. O terceiro captulo Raciocio do Agente descreve os vrios algoritmos usados
no processo de raciocnio do agente bem como a explicao em python de certas
pores de cdigo.
1.4
Diviso do Trabalho
Visto o trabalho ter sido feito em conjunto a seguinte lista representa de forma abstracta
o trabalho feito por cada um.
Captulo 2
Tecnologias e Ferramentas
Utilizadas
2.1
Introduo
2.1.1
ROV
Este projecto correu num sistema operativo, ligeiramente modificado pelo professor,o
ROV. Sendo este sido assente numa maquina virtual.
2.1.2
Python
Captulo 3
Raciocnio do Agente
3.1
Introduo
Neste captulo vamos explicar como o agente usa o conhecimento que tem e que obtm
ao longo do tempo atravs dos seus sensores para tomar a melhor deciso possvel no
momento de modo a responder s perguntas do anteriormente referidas. para ver
3.2
Estruturas de Dados
3.3 Algoritmos
obj ant uma varivel do tipo string que guardava o valor do objeto
visto mais recentemente. De facto, esta foi a primeira abordagem para
resolver a primeira questo do trabalho prtico, acabou por ser substituida pela prxima estrutura de dados.
listaTiposQuarto uma lista do tipo string que guardava o valor de 12 quartos. E tm os possveis valores: "waiting room","study
room","computer lab","meeting room","generic room".
damentais no trabalho, no sentido que so usadas nas funes mais complexas. A ideia similar s listas abordadas anteriormente, a ideia adicional que vou fazer uma lista de 5 posies, Livros,Cadeiras,Mesas,Computadores,Pessoas
Desta forma vou agrupar,classificar cada objeto no grupo correspondente.Dentro de cada lista vou ter ento uma lista de strings que remete
ao nome do objeto. A EstruturaPosObjetos usada para auxiliar
esta ltima estrutura para ter as coordenadas de cada objeto.A escolha
de tuplos para guardar o par x,y meramente para evitar criar 2 listas.
3.3
Algoritmos
# odometry c a l l b a c k
def callback ( data ) :
3.3 Algoritmos
g l o b a l x_ant , y_ant
x= d a t a . p o s e . p o s e . p o s i t i o n . x
y= d a t a . p o s e . p o s e . p o s i t i o n . y
quarto = descobreQuarto ( f l o a t ( x ) , f l o a t ( y ) )
l i s t a Q u a r t o V i s i t a d o [ q u a r t o 1 ] = 1 ;
3.3 Algoritmos
# main d a s p e r g u n t a s
def questaoMain ( data ) :
i f d a t a . d a t a == " a " :
questaoA ( )
i f d a t a . d a t a == " b " :
questaoB ( )
...
3.3 Algoritmos
def questaoC ( ) :
g l o b a l l i s t a O b j , l i s t a P o s x , l i s t a P o s y , x_ant , y_ant
tam = l e n ( l i s t a O b j )
m u i t o G r a n d e = 99999999999
indice = 0
f o r a i n r a n g e ( 0 , tam ) :
aux = math . s q r t ( pow ( 2 , ( x _ a n t l i s t a P o s x [ a ] ) ) + pow ( 2 , ( y _ a n t
listaPosy [a ]) ) )
i f m u i t o G r a n d e > aux :
m u i t o G r a n d e = aux
indice = a
p r i n t " R e s p o s t a QC : O b j e t o m a i s p r x i m o > %s " % l i s t a O b j [ i n d i c e ]
3.3 Algoritmos
f o r a i n r a n g e ( 0 , tam ) :
aux = l i s t a O b j [ a ]
l i v r o = aux [ : 5 ]
i f l i v r o == " book_ " :
c o n t = c o n t +1
p r i n t " R e s p o s t a QE : L i v r o s v i s t o s > %d " % c o n t
== 1 :
" R e s p o s t a QF : J
v i a Mary . "
" Est
n a s c o o r d e n a d a s x>%s " % x
" y>%s " % y
== 0 :
" R e s p o s t a QF : Ainda n o v i a Mary "
3.3 Algoritmos
10
def descobreQuarto (x , y ) :
i f y <= 1 . 2 :
i f x >= 0.7:
return 1
i f x >= 5.7 and x < 0.7:
return 2
i f x >= 10.7 and x < 5.7:
return 3
i f x < 10.7:
return 4
i f y > 1 . 2 and y<= 6 . 2 :
i f x >= 0.7:
return 5
i f x >= 5.7 and x < 0.7:
return 6
i f x >= 10.7 and x < 5.7:
return 7
i f x < 10.7:
return 8
i f y >= 6 . 2 :
i f x >= 0.7:
return 9
i f x >= 5.7 and x < 0.7:
r e t u r n 10
i f x >= 10.7 and x < 5.7:
r e t u r n 11
i f x < 10.7:
r e t u r n 12
3.3 Algoritmos
11
lisy = []
f o r a i n r a n g e ( 0 , tam ) :
aux = l i s t a O b j [ a ]
s u b a u x = aux [ : 6 ]
i f s u b a u x == " t a b l e _ " :
f l a g =1
l i s x . append ( l i s t a P o s x [ a ] )
l i s y . append ( l i s t a P o s y [ a ] )
i f f l a g == 1 :
tam1 = l e n ( l i s x )
p r i n t " R e s p o s t a QH : Os s e g u i n t e s q u a r t o s t m += 1 mesa : "
f o r a i n r a n g e ( 0 , tam1 ) :
quarto = descobreQuarto ( l i s x [ a ] , l i s y [ a ] )
p r i n t " q u a r t o %d " % q u a r t o
i f f l a g == 0 :
p r i n t " R e s p o s t a QH : Ainda n o v i mesas "
3.3 Algoritmos
12
pc = o b j [ : 9 ]
i f pc == " c o m p u t e r _ " :
e s t r u t u r a O b j e t o s [ 3 ] . append ( obj )
e s t r u t u r a P o s O b j e t o s [ 3 ] . append ( ( x , y ) )
pessoa = obj [ : 7 ]
i f p e s s o a == " p e r s o n _ " :
e s t r u t u r a O b j e t o s [ 4 ] . append ( obj )
e s t r u t u r a P o s O b j e t o s [ 4 ] . append ( ( x , y ) )
Nesta funo auxiliar calculo com ajuda da estruturaPosObje o parametro indice que remete para: livro,cadeira,mesa... pertence ao mesmo
quarto enviado para parametro. Isto usado na funo preencheTipoQuarto e a ideia confirmar se um tipo de grupo de objeto est no quarto
do robot.
def preencheTipoQuarto ( quarto ) :
global estruturaObjetos , listaTiposQuarto , estruturaPosObjetos
tam = l e n ( l i s t a T i p o s Q u a r t o )
f o r p o s i n r a n g e ( 0 , tam ) :
flag = 0
i f e s t r u t u r a O b j e t o s [ 0 ] == [ ] and e s t r u t u r a O b j e t o s [ 1 ] ! = [ ] and
e s t r u t u r a O b j e t o s [ 2 ] == [ ] and e s t r u t u r a O b j e t o s [ 3 ] == [ ] and
e s t r u t u r a O b j e t o s [ 4 ] == [ ] :
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 1 ) == 1 :
l i s t a T i p o s Q u a r t o [ p o s ] = " w a i t i n g room "
flag = 1
i f e s t r u t u r a O b j e t o s [ 0 ] ! = [ ] and e s t r u t u r a O b j e t o s [ 1 ] ! = [ ] and
e s t r u t u r a O b j e t o s [ 2 ] ! = [ ] and e s t r u t u r a O b j e t o s [ 3 ] == [ ] :
flag1 = 0
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 1 ) == 1 :
flag1 = flag1 + 1
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 0 ) == 1 :
flag1 = flag1 + 1
3.3 Algoritmos
13
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 2 ) == 1 :
flag1 = flag1 + 1
i f f l a g 1 == 3 :
l i s t a T i p o s Q u a r t o [ p o s ] = " s t u d y room "
flag = 1
if
e s t r u t u r a O b j e t o s [ 1 ] ! = [ ] and e s t r u t u r a O b j e t o s [ 2 ] ! = [ ] and
e s t r u t u r a O b j e t o s [ 3 ] != [ ] :
flag2 = 0
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 1 ) == 1 :
flag2 = flag2 + 1
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 2 ) == 1 :
flag2 = flag2 + 1
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 3 ) == 1 :
flag2 = flag2 + 1
i f f l a g 2 == 3 :
l i s t a T i p o s Q u a r t o [ pos ] = " computer l a b "
flag = 1
i f l e n ( e s t r u t u r a O b j e t o s [ 1 ] ) >= 3 and l e n ( e s t r u t u r a O b j e t o s [ 2 ] ) == 1 :
# s e v e r a l c h a i r s d e f i n i d o como >=3
flag2 = 0
cont = 0
tam = l e n ( e s t r u t u r a P o s O b j e t o s [ v a l o r ] )
f o r p o s 1 i n r a n g e ( 1 , tam ) :
tuplox , t u p l o y = e s t r u t u r a P o s O b j e t o s [ v a l o r ] [ pos1 ]
i f d e s c o b r e Q u a r t o ( t u p l o x , t u p l o y ) == q u a r t o :
c o n t = c o n t +1 # nao pude r e u t i l i z a r e s t a f u n c a o p o i s t i n h a de
c o n t a r 3 t u p l o s dum mesmo q u a r t o
i f p e r t e n c e T i p o Q u a r t o ( q u a r t o , 2 ) == 1 :
flag2 = 1
i f f l a g 2 == 1 and c o n t >=3:
l i s t a T i p o s Q u a r t o [ p o s ] = " m e e t i n g room "
flag = 1
i f f l a g == 0 :
l i s t a T i p o s Q u a r t o [ p o s ] = " g e n e r i c room "
do t i p o > %s " %
3.3 Algoritmos
14
3.3 Algoritmos
15
d e f questaoM ( ) :
g l o b a l x_ant , y_ant
x = f l o a t ( x_ant )
y = f l o a t ( y_ant )
quarto = descobreQuarto (x , y )
#atualiza
o da e s t r u t u r a O b j e t o s
e Pos na p e r g u n t a M e L
preencheTipoQuarto ( quarto )
p r i n t " R e s p o s t a QM: Os s e g u i n t e s q u a r t o s n o e s t o o c u p a d o s , com a
informa
o c o r r e n t e >"
for a in range (0 ,12) :
i f p e r t e n c e T i p o Q u a r t o ( a , 4 ) == 0 :
p r i n t " Q u a r t o %d " % ( a + 1 )
3.4 Dificuldades
16
auxSub = aux [ : 1 4 ]
i f auxSub == " c o m p u t e r _ a p p l e " :
p r i n t " R e s p o s t a QN : A Mary p r e f e r e c o m p u t a d o r e s da Apple "
auxSub = aux [ : 1 6 ]
i f auxSub == " c o m p u t e r _ w i n d o w s " :
p r i n t " R e s p o s t a QN : A Mary p r e f e r e c o m p u t a d o r e s Windows "
i f f l a g == 0 :
p r i n t " R e s p o s t a QN : Ainda n o v i a Mary "
Nesta funo responde-mos pergunta: A mary prefere computadores da Apple ou Windows. A ideia calcular as coordenadas da Mary e
usar as coordenadas dos computadores observados para calcular a distncia euclediana e verifico o mais prximo a Mary. Desta maneira concluo
o que preferido.
Falta O P
.
.
.
.
rospy . spin ( )
Apesar do conhecimento limitado da bibliotecas usadas no ROS, nomeadamente a funo roscpy. Altera-mos uma linha de modo a subscrever um novo mtodo,mainperguntas,ou seja, quando feita uma pergunta chamada uma funo criada por ns. E a partir daqui todo o
programa se origina.
3.4
Dificuldades
No inicio do projeto a dificuldade estava em perceber como funcionavam as funes de devolver valores pelos sensores. Um dos problemas
que nos apercebe-mos ao testar o robot no mundo foi que ele reconhecia
objetos vazios que no existiam. S mais tarde com ajuda do professor
percebemos que isto na realidade era rudo no sensor(algo que acontece
tambm na realidade). Ultrapassa-mos esta dificuldade inserindo apenas objetos que no fossem nulos. Quando come-mos a resolver as
3.4 Dificuldades
17
respostas para as perguntas, surgiu outra dificuldade: por vezes o robot detetava vrios objetos,estava a menos de 1 metro de dois objetos,
ultrapass-mos este problema com a funo parteTuplos que usava o split
com o delimitador ",".
Um dos problemas mais complexos foi o de definir quartos, o problema quando o robot no comea no quarto 1 dificil difinir os outros
por comparao. A soluo talvez seria uma lista circular onde 12 apontaria para 1.
O problema mais complexo e sem dvida o que perde-mos mais
tempo tanto a pensar numa soluo como a implementar, foi a de calcular a posio de um objeto. Neste momento estamos a assumir que as
coordenadas de deteo de um objeto so as coordenadas desse objeto,
mas isso no verdade.
Se pensarmos num circulo volta do robot e assumirmos que ele est
a dirigir-se na direo de sentido vertical no instante de deteo de um
objeto(fig.4.1)
Figura 3.1: Viso robot com movimento vertical no instante deteco objeto
3.4 Dificuldades
18
Assim percebe-mos que quando o robot, que est no centro do circulo, est nesse instante . Ento as coordenadas do objeto no so o
centro do crculo. As suas coordenadas so umas quaisquer no arco da
circunferncia dentro dos 180o da direo do robot.
Tentamos calcular o ponto mdio do arco, algo que no conseguimos,
no entanto penso que esta estratgia no iria funcionar pois no algo
calculvel. Usmos clculo de reas,trigonometria.
A prxima abordagem que nos despertou interesse foi trilaterao(fig.1.2)
3.4 Dificuldades
19
3.4 Dificuldades
20
3.5 Concluses
21
3.5
Concluses
3.5 Concluses
22
quanto mais tempo perder-mos a construi-la mais fcil vai ser o desenvolvimento de funes e reparao de bugs. Por vezes existem situaes
onde no h respostas perfeitas ou boas, cabe-nos a ns programadores
escolher e programar a melhor resposta possvel na situao correspondente.
Captulo 4
Concluses Principais
Este tipo de trabalho permitiu-nos adquirir uma viso do mundo da Inteligncia artificial e tudo o que se encontra por trs do seu desenvolvimento. O facto de o programa ter interagido com os sensores de um
robot fez com que nos apercebssemos de uma forma mais realista, dos
passos que se tm em conta para construir um robot.
4.2
Trabalho Futuro
23