Upload
lehanh
View
214
Download
0
Embed Size (px)
Citation preview
Dênis Schneider Strassmann
DESENVOLVIMENTO DE UMA ARQUITETURA
BASEADA EM SUBSUNÇÃO PARA UM TIME DE
FUTEBOL DE ROBÔS
Florianópolis - SC
Agosto de 2006
Dênis Schneider Strassmann
DESENVOLVIMENTO DE UMA ARQUITETURA
BASEADA EM SUBSUNÇÃO PARA UM TIME DE
FUTEBOL DE ROBÔS
Monografia apresentada ao programa de
Bacharelado em Ciências da Computação da
Universidade Federal de Santa Catarina como
requisito parcial para a obtenção do grau
Bacharel em Ciências da Computação.
ORIENTADOR:
Prof. Mauro Roisenberg
UNIVERSIDADE FEDERAL DE SANTA CATARINA
CENTRO TECNOLÓGICO
Florianópolis -SC
Julho de 2006
“Ciência da computação tem tanto a ver com o computador como a Astronomia com o
telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não
estuda ferramentas, mas o que fazemos e o que descobrimos com elas."
Edsger Dijkstra
RESUMO
Este trabalho de conclusão de curso aborda uma estratégia reativa baseada na arquitetura de
subsunção na implementação de uma equipe de futebol de robôs, apresentando desde o projeto
até sua implementação. O projeto mostra os algoritmos de controle, visão artificial, e
comunicação utilizados juntamente com a definição dos comportamentos, através de autômatos
finitos, relevantes em uma partida de futebol. A implementação relata as questões tecnológicas
que o projeto se submeteu, assim como suas dificuldades e seus resultados.
ABSTRACT
This B. Sc. thesis presents an reactive strategy based on the architecture of subsumption in the
implementation of a team of robot soccer, presenting design and implementation. The designt
shows the control system algorithms, artificial vision, and communication used in definition of
behaviors, through finite automatas, relevant in a soccer game. The implementation reliefs the
technological tricks that the project is submitted, as well as its difficulties and its results.
Lista de Figuras
Figura 1: O Desafio Grand Challenge. (a) Read Team em 2004. (b) Logotipo de 2007
Figura 2: Robôs exploradores. (a) Sojourner em 1996. (b) Spirit e Opportunity em 2004
Figura 3: Perspectiva futura de sistemas computacionais.
Figura 4: Dentro do mundo de sistemas embutidos, 6% pertence a robótica.
Figura 5: Arquitetura robótica tradicional.
Figura 6: Arquitetura robótica de subsunção.
Figura 7: Robô da Honda no torneio da RoboCup 2003.
Figura 8: Logo da RoboCup.
Figura 9: Infraestrutura RoboCup 2004.
Figura 10: Logo da FIRA.
Figura 11: Jornada de Robótica Inteligente em Campo Grande - MS, 2006.
Figura 12: EyeBots projetados pela UWA.
Figura 13: Arquitetura Hibrida adotada.
Figura 14: Diagrama final da arquitetura de controle.
Figura 15: Arquitetura de subsunção dos jogadores.
Figura 16: Automato da camada Procurar
Figura 17: Automato da camada desviar.
Figura 18: Autômato da camada Carregar.
Figura 19: (a) Diagrama do sistema realimentado. (b) Coordenadas da bola em um frame.
Figura 20: Função de correção para perseguir a bola.
Figura 21: Autômato da camada Chutar.
Figura 22: Autômato da camada Fazer Gol.
Figura 23: Automato responsável pela comunicação entre os robôs.
Figura 24: Máquina de estados da comunicação do módulo externo.
Figura 25: Cone de cores do espaço HSV
Figura 26: Cubo de cores do espaço RGB.
Figura 27: Conversão de RGB para Hue.
Figura 28: (a) Fluxograma do algoritmo de procura em uma linha. (b) Função de avaliação da
concentração de cor em uma linha.
Figura 29: Curva de relação entre distância e número da linha.
Figura 30: Diagrama com a otimização no cálculo da média e o refinamento de novas buscas.
Figura 31: Tarefas principais do sistema
Figura 32: Código da execução principal do programa (main.c).
Figura 33: (a) Thread mediadores. (b) Thread Subsuncao. (c) Thread Menu.
Figura 34: Código das threads (main.c).
Figura 35: Um modelo padrão para o header.
Figura 36: Um modelo padrão para o \u201ccorpo\u201d do módulo.
Figura 37: Arquitetura do software
Figura 38: Modelo das ações de uma máquina de estados.
Figura 39: Modelo de uma máquina de estados.
Figura 40: Algoritmo de realimentação para perseguir a bola
Figura 41: Erro angular da bola aplicado na correção
Figura 42: (a) Fator de correção aplicado ao tamanho do objeto. (b) Resultado da correção para
um objeto de 2cm.
Figura 43: Matriz de correção usada no software (visao.c).
Figura 44: Código da conversão de RGB para Hue (visao.c).
Figura 45: Fator de erro dos sensores de distância.
Figura 46: Conversação do estado dos sensores feita pelo módulo de sensores (sensores.c).
Figura 47: Conversão das mensagens de navegação para os motores (navegação.c)
Figura 48: (a) Controle Remoto do SoccerBot. (b) Janela estendida para observação da
comunicação de rádio.
Sumário
Resumo
Abstract
Lista de Figuras
1. Introdução....................................................................................................................... 9
1.1 Objetivos............................................................................................................. 9
1.2 Motivação............................................................................................................ 10
1.3 Organização do Trabalho.................................................................................... 13
2. Contextualização............................................................................................................ 14
2.1 Robótica Móvel................................................................................................... 14
2.2 Sistemas Baseados em Comportamentos............................................................ 18
2.3 Futebol de Robôs................................................................................................ 20
2.3.1.RoboCUP............................................................................................ 22
2.3.2.FIRA................................................................................................... 25
2.3.3.No Brasil............................................................................................ 27
2.4 EyeBot............................................................................................................... 28
2.5 UFSC-Team....................................................................................................... 30
3. Projeto............................................................................................................................ 32
3.1 Arquitetura Hibrida............................................................................................ 32
3.2 Comportamentos................................................................................................ 35
3.2.1.Procurar.............................................................................................. 35
3.2.2.Desviar............................................................................................... 37
3.2.3.Carregar............................................................................................. 38
3.2.4.Chutar................................................................................................ 40
3.2.5.Fazer Gol........................................................................................... 41
3.3 Modelagem de Dados........................................................................................ 41
3.3.1.Sensores............................................................................................. 42
3.3.2.Atuadores.......................................................................................... 42
3.3.3.Comunicação..................................................................................... 43
3.3.4.Controle Externo............................................................................... 45
3.3.5.Tratamento de Imagem..................................................................... 46
4. Implementação................................................................................................................ 52
4.1 Aspectos Tecnológicos........................................................................................ 52
4.1.1.Questões do Sistema Embarcado........................................................ 52
4.1.2.Programação Modular......................................................................... 58
4.1.3.Arquitetura do Software...................................................................... 60
4.1.4.Máquinas de Estado Finito.................................................................. 61
4.2 Camadas de Subsunção....................................................................................... 63
4.3 Módulos.............................................................................................................. 64
4.3.1.Visão................................................................................................... 64
4.3.2.Comunicação...................................................................................... 65
4.3.3.Sensores............................................................................................. 66
4.3.4.Navegação.......................................................................................... 67
4.3.5.Controle Remoto................................................................................ 70
5. Conclusão....................................................................................................................... 72
Referências........................................................................................................................... 74
1 Introdução
Este trabalho visa desenvolver uma arquitetura baseada na arquitetura de subsunção como
estratégia de controle de um time autônomo de futebol de robôs, implementado sobre a
plataforma Eyebot, aproveitando todas suas características, como câmera rádio, sensores e
atuadores. A arquitetura passará por testes de avaliação e por uma prova de participação de uma
campeonato de futebol de robôs.
1.1 Objetivos
A importância de estudos nessa área se deve à necessidade de substituição de tarefas humanas
realizadas em ambientes de risco ou de difícil acesso, como pesquisas dentro de vulcões,
manutenção de turbinas hidrelétricas, explorações interplanetárias, inclusive em testes de novas
tecnologias. Muito mais do que ambientes que necessitam de simples regras baseadas em
percepção e ação, são ambientes que precisam de planejamento de ações, e classificação dos
dados a partir de uma avalanche de informações vindas de diversos tipos de sensores. E para o
sucesso de tais tarefas é imprescindível o experimento e validação de técnicas de
reconhecimento, planejamento e controle, assim como o eventual desenvolvimento de novas
técnicas, em plataformas reais interagindo com ambientes reais.
Seguindo esta necessidade uma arquitetura de nível reativo é estudada, a arquitetura de
9
subsunção, a fim de avaliar sua utilização em um ambiente real de competição de futebol de
robôs.
Será desenvolvido durante o projeto toda a arquitetura dentro da plataforma Eyebot de robôs
móveis, juntamente com seus comportamentos, modelação das informações de sensores,
incluíndo algoritmos de visão computacional, manipulação de atuadores, e construção de um
protocolo de comunicação entre os robôs e um módulo de controle externo.
Um controle remoto simples deve ser desenvolvido para sinalizar o início e o fim de uma
partida de futebol aos robôs, juntamente com um controle simples de navegação do mesmo, que
será utilizado em etapas de teste e posicionamento remoto do robô.
1.2 Motivação
Robôs móveis autônomos são encontrados hoje em toda a gama de veículos não tripulados. Os
veículos terrestres são projetados para uso na entrega de alimentos em hospitais, para mover
contêineres em docas de carga e em operações de resgate acompanhando equipes anti-bomba.
Outros tipos de robôs autônomos incluem veículos aéreos comumente usados para vigilância,
pulverização de lavouras e operações militares, e os veículos subaquáticos, usados em
exploração no fundo do mar.
Dentro da área da área de Robótica Móvel Autônoma existem muitos exemplos motivadores de
aplicações ambiciosas totalmente funcionais, como é o caso do desafio da DARPA no Grand
Challenge, e os robôs de exploração espacial da NASA que estão atualemtne em Marte os jipes
Spirit e Opportunity.
O Grand Challenge é um desafio anunciado pela DARPA, em fevereiro de 2003, onde veículos
robóticos auto navegáveis, que não podem receber qualquer tipo de sinais de humanos (exceto
uma ordem de parar), competem numa corrida de 322 km no deserto, em 10h ou menos. Os
veículos percorrem sobre terreno desconhecido e acidentado, podendo ser trilhas arenosas,
passagens sob viadutos estreitos, torres de eletricidade e curas muito sinuosas, sem ultrapassar
limites de percurso estipulados pela organização. O trajeto, assim como os limites laterais, são
entregues a cada equipe horas antes da partida, contendo coordenadas de GPS ao qual os
veículos utilizam para se guiar na corrida.
10
O primeiro evento ocorreu em março de 2004 com a participação de 15 equipes, e nenhuma
conseguiu percorrer sequer 0,5 % (meio por cento) do trajeto exigido. O melhor desempenho
foi alcançado pela equipe da Universidade Carnegie Mellon com 11 km de corrida. O que,
apesar da grande quantidade de pesquisas, mostra que ainda há um longo caminho a ser traçado
no desenvolvimento de veículos totalmente autônomos. A figura 1 mostra o carro automatizado
de uma das equipes e o desafio lançado para 2007, que é percorrer parte do percurso em área
urbanizada.
(a)
(b)Figura 1: O Desafio Grand Challenge. (a) Read Team em 2004. (b) Logotipo de 2007
Outro desafio, mas não a caráter de competição, é a exploração robótica de Marte. Atualmente
os jipes Spirit e Opportunity, figura 2, estão coletando dados fundamentais para pesquisas sobre
o planeta vermelho. Apesar dos veículos não precisarem ser totalmente autônomos e nem se
movimentar numa velocidade tão alta como os veículos do desafio da DARPA, eles apresentam
uma outra dificuldade a ser vencida, estão a cerca de 360 milhões de km da Terra, o que
inviabiliza qualquer tipo de controle remoto em tempo real. Para superar este obstáculo uma
equipe, no laboratório de propulsão a jato na NASA, planeja cautelosamente todo movimento
executado no planeta vizinho, e envia um código calculado especificamente para uma manobra.
Mas isso não ausenta os robôs de autonomia, eles precisam continuar a executar tarefas de
sobrevivência em casos de risco em que a equipe não pode responder a tempo. Aqui novamente
é possível perceber a quantidade de pesquisa ainda necessária nesse ramo, pois apenas 9 das 33
missões à Marte, cerca de 27%, obtiveram sucesso [App04].
11
(a)
(b)Figura 2: Robôs exploradores. (a) Sojourner em 1996. (b) Spirit e Opportunity em 2004
Além das aplicações práticas citadas acima, a área de sistemas embarcados que possui
aplicabilidade direta dentro da robótica, também possui desafios bastante motivadores pela sua
grande área de atuação e características, como restrições de tempo real, tamanho de código,
corretude, robustez e eficiência de algoritmos, que geram temas bastante atuais para pesquisa e
desenvolvimento.
Sistemas computacionais embarcados tendem cada vez mais para o mundo da miniaturização e
integração como pode ser visto na figura 3, que é um resumo histórico sobre a evolução dos
computadores e sua influência tecnológica.
Figura 3: Perspectiva futura de sistemas computacionais.
É uma área que apresenta grandes perspectivas de crescimento e precisa ser estudada para que o
desenvolvimento ocorrera sobre bases teóricas bem formalizadas e se consiga um melhor
12
aproveitamento e resultados robustos. A utilização de técnicas aprimoradas é de suma
importância para o desenvolvimento do projeto e garantias de corretudo, segurança e
longevidade, uma vez que os sistemas computacionais estão em toda nossa volta, como é
mencionado por Zelenovsky e Mendonça:
“O mundo atual oferece-nos uma grande quantidade de equipamentos para
desfrutarmos a vida moderna. Temos à disposição telefones que discam por
comandos de voz, televisores que se conectam à Internet, microondas
operados remotamente, máquinas fotográficas que não usam filmes e
automóveis que estacionam sozinhos.” [ZM06]
1.3 Organização do Trabalho
O trabalho basicamente é constituído de uma contextualização, o projeto e a implementação
divididas em quatro partes. A primeira parte é formada pelo capítulo de introdução, onde foi
apresentado o projeto e as áreas que ele abrange, juntamente com seus objetivos e sua
motivação. E o capítulo de contextualização onde é feita uma pesquisa bibliográfica,
apresentada as principais competições de Futebol de Robôs e relatado uma síntese do histórico
do UFSC-Team.
A segunda parte descreve a etapa de elaboração do projeto, onde a estratégia utilizada é
descrita, juntamente com o embasamento teórico dos algoritmos utilizados. Este capítulo
descreve todo o funcionamento da arquitetura e justifica as decisões tomadas pela estrutura
adotada.
A terceira parte constitui do capítulo de implementação, onde características tecnológicas são
levadas em consideração e o programa gerado a partir do projeto é explicado, juntamente com
justificativa e basamento teórico das soluções adotadas.
Por fim é relatada a conclusão, mostrando os objetivos que foram alcançados, as falhas de
algumas decisões adotadas e uma breve sugestão de trabalhos futuros que puderam ser
observados no decorrer deste trabalho de conclusão de curso.
13
2 Contextualização
2.1 Robótica Móvel
A robótica móvel ocupa-se de estudar e desenvolver máquinas capazes de se locomover, em
geral, em ambientes não controlados, ruidosos e desconhecidos. Para atender a estes objetivos, a
multidisciplinaridade faz-se necessária. Mecânica fina, elétrica/eletrônica e computação são
integradas para dar suporte a esta nova e importante área (Pazos, 2002).
Os desafios são cada vez maiores. Não bastam apenas serem capazes de desviarem de
obstáculos e evitarem colisões. Os robôs móveis de hoje devem ser dotados de alguma
"inteligência" que lhes possibilite, por exemplo, reconhecer um dentre vários objetos. A fusão
sensorial tem sido usada para tentar melhorar as respostas e com isto modelar o comportamento
dos robôs. Mas só isto não basta, é preciso algo mais. Neste sentido, a Inteligência Artificial
desempenha um papel fundamental. É ela a responsável por essa mudança, de simples máquinas
estáticas repetidoras de tarefas a robôs totalmente autônomos capazes de tomarem suas próprias
decisões.
Segundo Shimon [Nof99] os robôs podem ser classificados de acordo com sua complexidade:
● Primeira Geração: São robôs tipicamente utilizados em ambientes industriais,
desprovidos de "inteligência" senão aquela programada. O mundo onde atuam deve ser
preparado pois eles não são capazes de perceber os objetos ao seu redor com exatidão.
14
Poucos utilizam um computador dedicado embarcado. No entanto, ainda são usados em
fábricas devido ao aumento de produtividade e qualidade do produto gerado e da
durabilidade. Tendem a desaparecer à medida que as exigências em termos de
produtividade e velocidade aumentarem ainda mais.
● Segunda Geração: O rápida expansão do mercado de semicondutores fez com que
computadores se tornassem produtos baratos o suficiente para equipar robôs. Isto
permitiu um avanço significativo pois máquinas anteriormente muito limitadas puderam
ser equipadas com controladores que permitiram cálculos em tempo real e controle mais
preciso dos atuadores ao longo de trajetórias. Sensores de força, torque e proximidade
puderam ser integrados proporcionando maior adaptabilidade e precisão ao trabalho
desempenho pelo robô em seu ambiente. Entre as aplicações estão, pintura, montagem e
soldagem.
● Terceira Geração: Representam os modelos mais avançados hoje disponíveis.
Caracterimzam-se por incorporarem múltiplos processadores, cada um deles
funcionando de forma assíncrona e independente dos demais. Também possuem
sistemas supervisórios e de controle destes processadores utilizando funções de alto
nível. São capazes de se comunicarem com outros sistemas. Todo seu potencial ainda
não foi explorado. Entre suas aplicações estão aplicações extremamente delicadas e
especializadas como medicina.
O campo da robótica está atualmente entrando em uma fase de mudanças. Enquanto no passado
os robôs eram usados praticamente com exclusividade em fábricas, com o propósito de
participar nos processos de manufatura e transporte, agora uma nova geração de serviços
robóticos está começando a emergir, onde robôs precisam ter a capacidade de cooperar com
pessoas, e fornecer assistência em suas tarefas do dia a dia.
Os robôs não podem mais simplesmente ficar confinados a evitar colisões, mas detectar e
interagir com objetos, portanto existe a necessidade de estudos sobre a área de visão robótica.
No âmbito desta questão são realizados, em diversos centros de pesquisas ao redor do mundo,
experimentos que abrangem situações reais mas restritas a um objetivo específico, entre elas
pode-se citar o reconhecimento de bola, gol e companheiros dentro de um campo de futebol de
robôs, onde não existe somente a necessidade de detecção mas também de interação, no caso da
bola, servindo como um ótimo exercício para o treinamento de técnicas com a visão robótica.
Segundo Russel e Norvig [RN04] estão entre os domínios da tecnologia de robótica as
15
seguintes aplicações:
● Indústria e agricultura
● Transporte
● Atuação em ambientes arriscados
● Exploração
● Ferramentas médicas
● Serviços pessoais
● Entretenimento
● Ampliação da capacidade humana
Segundo o estudo publicado por Tennenhouse [Ten00], os sistemas embarcados ocupam uma
fatia em torno de 98% do mercado de sistemas microprocessados, dentro do qual cerca de 6%
são utilizados na área de robótica. Isso mostra a importância em se considerar também
conceitos atuais alcançados no estudo dentro da área de sistemas embarcados, além da
tradicional importância que a inteligência artificial oferece, no desenvolvimento de um sistema
robótico.
Figura 4: Dentro do mundo de sistemas embutidos, 6% pertence a robótica.
Sistemas embarcados são executados em dispositivos desde a eletrônica de consumo, como
TVs e microondas, até na indústria aeroespacial, por isso geralmente caracterizado de forma
demasiadamente genérica como simplesmente sendo um sistemas que não foi projetado para ser
de propósito geral, como notebooks, desktops e mainframes. Entre algumas de suas definições
temos:
“Hardware e software que forma um componente de algum sistema maior e que o
devido funcionamento é esperado sem a intervenção humana” [Fol06]
Apesar da dificuldade de expressar em poucos termos o que é um sistema embarcado, eles
possuem várias características em comum, entre elas Perter Marwedel, em [Mar03] identifica as
seguintes:
16
● Realização de uma função ou conjunto de funções específicas.
● Interagem com o ambiente através de atuadores e sensores.
● Sistemas reativos ao ambiente, normalmente expressados por Autômatos.
● Precisam ser confiáveis, pois possuem aplicações onde falhas podem causar catástrofes:
○ Estabilidade.
○ Recuperação.
○ Disponibilidade.
○ Segurança.
● A eficiência não se restringe à velocidade de execução, entre elas também estão:
○ Consumo de energia.
○ Tamanho de código.
○ Utilização de recursos de hardware.
○ Peso.
○ Custo.
● Interfaces dedicadas (botões, LEDs, Buzzers).
● Requisitos de tempo real.
● Sistemas híbridos com partes analógicas e digitais.
Devido a essa grande quantidade de características, o processo de desenvolvimento de software
para sistemas embarcados tende a ficar intimamente ligado a métodos formais de especificação
e validação de algoritmos, entre elas talvez a que mais apresente estudos relacionados a
formalização, é a questão de tempo real. A expressão “Sistemas de Tempo Real” [Hin83]
apareceu pela primeira vez na Série Especial sobre Integração de Sistemas publicada na revista
Electronic Design.
O software de tempo real é altamente acoplado ao mundo externo, ou seja, ele deve responder
ao domínio do problema (o mundo real) numa escala de tempo ditada por este. Uma vez que o
software deve operar sob rigorosas restrições de tempo, o projeto do software muitas vezes é
baseado na arquitetura de hardware e também de software, considerando características do
sistema operacional, da linguagem de programação e do seu compilador.
17
2.2 Sistemas Baseados em Comportamento
Em meados da década de 1980, alguns pesquisadores acreditavam que o planejamento de
ordem parcial e técnicas correlatas nunca poderiam funcionar com rapidez suficiente para gerar
comportamento efetivo para um agente no mundo real (Agre e Chapman, 1987). Em vez disso,
foram propostos os sistemas de planejamento reativo; em sua forma básica, esses sistemas são
agentes reativos, possivelmente com estado interno, que podem ser implementados com
qualquer uma dentre diversas representações para regras condição-ação. A arquitetura de
subsunção de Brooks (1986) utilizava máquinas de estados finitos dispostas em camadas
instaladas em robôs munidos de pernas e rodas para controlar sua locomoção e evitar
obstáculos.
Tradicionalmente é usada uma abordagem para a construção do sistema de controle dos robôs,
que decompões o problema em um série de unidades funcionais executadas sequencialmente
como é ilustrado na figura 5. Através de um estudo feito por Brooks [Bro85] foram analisadas
as necessidades computacionais de um sistema robótico autônomo e decompostas em tarefas
essenciais que o robô precisava executar. Cada tarefa foi implementada separadamente e todas
foram colocadas para funcionar de maneira competitiva. Muitas tarefas executam de modo
conflitante, partindo então para um arquitetura separada em camadas horizontais, chamadas
também de níveis de competência, onde camadas mais altas possuem prioridade sobre as
camadas inferiores, como é ilustrado na figura 6.
Figura 5: Arquitetura robótica tradicional.
18
Figura 6: Arquitetura robótica de subsunção.
Cada camada é conectada diretamente aos sensores e atuadores, funcionando de modo
totalmente independente. Frequentemente as tarefas mais básicas da arquitetura estão na
primeira camada (de baixo para cima) e executam comportamentos puramente instintivos, como
mostra na figura 6 que a primeira camada é de evitar a colisão com obstáculos. A medida que os
níveis vão aumentando, tarefas mais elaboradas vão sendo executadas, como exploração de
ambiente, construção de mapas, até um topo onde processos mais elaboradas como
identificação de objetos, planejamento de tarefas e identificação de comportamentos são
executados.
O design da arquitetura de Brooks para o desenvolvimento de robôs móveis autônomos é
baseado em nove princípios básicos que são discutidos em [Bro85]:
● Complexidade: comportamentos complexos não precisam necessariamente surgir de
sistemas de controle extremamente complexos. Comportamentos complexos podem
simplesmente emergir a partir de um ambiente complexo [Sim69].
● Tarefas precisam ser simples.
● Os robôs andam por ambiente desconhecido sem intervenção, ajuda ou controle
humano.
● Os robôs precisam modelar o mundo tridimensionalmente se quiserem executar tarefas
junto com humanos
● Uso de coordenadas relativas para diminuir a quantidade de erros de posicionamento.
● O ambiente possui obstáculos de diversas formas, não somente poliedros perfeitos como
modelados em ambientes artificiais.
19
● Dados visuais são mais apropriados para descrever o mundo.
● Os robôs precisa continuar funcionando caso um dos sensores ou atuadores falhar.
● Os robôs devem sobreviver por um longo período de tempo sem ajuda humana.
Os comportamentos reativos em uma arquitetura de Brooks são frequentemente montados a
partir de máquinas de estado finitos. Os nós dessas máquinas podem conter testes para certas
variáveis de sensores e, nesse caso, a condução da execução de uma máquina de estados finitos
estará condicionada ao resultado de tal teste. Os arcos são marcados com mensagens que são
geradas quando eles forem percorridos, e que serão enviadas aos atuadores do robô ou a outras
máquinas de estado finitos. Além disso, as máquinas de estados finitos frequentemente possuem
relógios internos que controlam o tempo de duração do percurso de um arco. As máquinas
resultantes normalmente são referidas como máquinas de estados finitos ampliadas, ou MEFAs,
nas quais a ampliação se refere ao uso de relógios internos.
2.3 Futebol de Robôs
Os Jogos ocuparam as faculdades intelectuais dos seres humanos – chegando algumas vezes a
um grau alarmante – desde que surgiu a civilização. Para pesquisadores de IA, a natureza
abstrata de jogos os torna um assunto atraente para estudo. É fácil representar o estado de um
jogo e, em geral, os agentes se restringem a um pequeno número de ações cujos resultados são
definidos por regras precisas. Jogos físicos, como críquete e hóquei sobre o gelo, têm descrições
muito mais complicadas, uma faixa muito maior de ações possíveis e regras bastante imprecisas
definindo a legalidade das ações. Com exceção do futebol de robôs, esses jogos físicos não
atraíram muito interesse na comunidade de IA [RN].
A participação em jogos foi uma das primeiras tarefas empreendidas em IA. Por volta de 1950,
quase ao mesmo tempo em que os computadores se tornaram programáveis, o xadrez foi
estudado por Konrad Zuse (o criador do primeiro computador programável e da primeira
linguagem de programação), por Claude Shannon (o criador da teoria da informação), por
Norbert Wiener (o criador da moderna teoria de controle) e por Alan Turing (o criador da
ciência da computação). Desde então, houve um progresso constante no padrão dos jogos, até o
ponto em que as máquinas ultrapassaram os seres humanos nos jogos de damas [Sam67] e
Othello [Bur97], derrotaram campeões humanos (embora não todas as vezes) em xadrez
20
(DeepBlue 1997) e gamão [Tes94], e são competitivos em muitos outros jogos.
A idéia do futebol robótico foi mencionada pela primeira vez pelo professor Alan Mackworth
da Universidade British Columbia, Canadá. Mas, independentemente dele, um grupo de
pesquisadores japoneses organizaram um workshop sobre os grandes desafios da Inteligência
Artificial em outubro de 1992, em Tóquio. Este evento desencadeou uma série de discussões
sobre como utilizar o jogo de futebol para fomentar a pesquisa em ciência e a tecnologia. Foi
feita então uma investigação sobre a viabilidade tecnológica, financeira e o impacto social.
Juntamente, foram desenvolvidos regras e protótipos de robôs-jogadores e simuladores. Como
resultado destes estudos, concluíram que o projeto era possível e desejável. Assim, em junho de
1993, Minoru Asada, Yasuo Kuniyoshi e Hiroaki Kitano decidiram iniciar uma competição,
primeiramente com o nome de Robot J-League (O "J" deve-se a japanese). Esta acabou se
transformando na primeira liga profissional de futebol robótico do mundo. Logo a seguir,
devido a pedidos de pesquisadores de todo mundo também interessados, mudou-se o nome da
liga e do projeto como um todo para Robot World Cup Initiative, ou simplesmente RoboCup.
O interesse ao redor do tema atingiu proporções mundias, a ponto de serem criadas federações
para organizarem workshops e outros eventos de cunho científico onde são apresentadas as
inovações e propostas de cada equipe bem como campeonatos reais - e por vez divertidos -
onde pode-se comprovar na prática as melhores estratégias e as táticas usadas pelas equipes.
Existem atualmente duas federações internacionais envolvidas em pesquisas com futebol
robótico; a Robot World Cup Soccer Games and Conferences (RoboCup) e a Federation of
International Robot-soccer Association (FIRA). Cada uma delas possui seus próprios
regulamentos e categorias, sendo a mais notável diferença entre estas duas federações o
enfoque. Enquanto a RoboCup está mais empenhada em fomentar pesquisas na área de IA,
dando grande ênfase às inovações e ao aspecto teórico, a FIRA está mais voltada à robótica em
si e nas tecnologias de construção dos robôs. São abordagens diferentes com importantes
influências nos resultados.
Há também a participação de grandes empresas do setor de tecnologia. Elas foram atraídas pelo
enorme leque de oportunidades que pesquisas como estas representam para o futuro e hoje são
patrocinadoras destes eventos. Na figura 7 pode ser visto uma foto do robô humanóide FirsStep
da Honda International Technical School durante o evento da RoboCup em 2003.
21
Figura 7: Robô da Honda no torneio da RoboCup 2003.
Talvez a maior vantagem do futebol robótico seja a capacidade de integrar conceitos e
tecnologias como: inteligência artificial, sistemas de tempo-real, visão computacional, sistemas
multi-agentes colaborativos, fusão sensorial, eletrônica, mecânica fina, robótica móvel
autônoma. E entre algumas aplicações que os estudos nesta área proporcionam estão:
● Semáforos inteligentes que se comunicam entre si para desobstruir regiões inteiras de
uma cidade e não apenas cruzamentos [Nun02].
● Veículos autônomos para a exploração de ambientes perigosos e desconhecidos, como
robôs de exploração interplanetária [Zlo02].
● Transporte viário totalmente automatizado, que reconhece e consegue utilizar a malha
rodoviária existente atualmente.
2.3.1 RoboCup
Figura 8: Logo da RoboCup.
A RoboCup, figura 8, é uma iniciativa científica internacional que atualmente envolve mais de
300 grupos de pesquisa ativos em todo o mundo, e como a própria federação cita: “A RoboCup
é uma iniciativa internacional de pesquisa e educação. Ela encoraja pesquisadores de
Inteligência Artificial e Robótica Inteligente oferecendo um problema padrão onde uma grande
22
gama de tecnologias podem ser integradas e exploradas” [Rob06]. O futebol foi escolhido por
causa da grande quantidade de desafios que um robô precisa enfrentar para jogar efetivamente
uma partida. Por exemplo, ele precisa reagir em tempo real a um ambiente altamente dinâmico,
cooperar com os companheiros, distinguir os adversários e assim por diante. [Pag04]
Talvez a mais audaciosa das metas até então já estabelecidas por desafios internacionais
envolvendo pesquisa e desenvolvimento de tecnologias, a RoboCup formulou o objetivo de
“desenvolver até 2050 um time de robôs humanóides totalmente autônomos capazes de vencer
o time campeão mundial de futebol pelas regras oficias da FIFA” [Kit99].
Mesmo que o objetivo não seja alcançado, a iniciativa da RoboCup já conseguiu produzir o
resultado de criar interesse e disseminar conhecimento sobre Inteligência Artificial e Robótica,
crescendo de um pequeno encontro de poucos cientistas interessados para um evento sobre
robótica de escala mundial. De fato a RoboCup evoluiu, e a partida de futebol é somente uma
das atividades, que agora abrangem um campeonato mundial com diversas categorias;
conferências técnicas apresentadas durante o evento; desafios inteligentes (onde desafios são
projetados afim de encorajar a comunidade RoboCup à permanecer ativa em diferentes áreas de
pesquisa); programas educacionais para estudantes do primeiro e segundo ano ou graduandos; e
desenvolimento de toda uma infra-estrutura (por exemplo, todo ano, a arena de treinamento
para a liga de Resgate é construída no país cede do evento da RoboCup, como uma facilidade
aberta aos pesquisadores da área de robótica de resgate). A figura 9 mostra um pouco da arena
construída para o evento de 2004.
Em sua última edição [Rob06], realizada em Bremen na Alemanha, o evento cobriu três
competições distintas, a copa robótica de resgate (RoboCupRescue), a copa júnior de robôs
(RoboCupJunior), e a copa de futebol de robôs (RoboCupSoccer). Dentro do terceiro domínio
as competições são divididas nas seguintes ligas ou categorias:
● Simulation league: Tem o propósito de oferecer um ambiente para o desenvolvimento
de arquiteturas e algoritmos avançadas de controle explorando áreas como coordenação
de multi-agentes e estratégias de alto nível sem se preocupar com limitações e evolução
de hardware.
● Small Size league: Permite um enfoco no controle centralizado de vários robôs
pequenos, os times frequentemente optam pelo uso de uma câmera global e
processamento em um computador externo, direcionando as pesquisas para visão
artificial, dinâmica dos times e cooperação. Os robôs apresentam uma certa
23
convergência de projeto pelas soluções mais otimizadas, sendo as diferenças
principalmente no mecanismo de drible e chute.
● Midle Size league: Nesta categoria não é permitida qualquer interação entre os robôs e
uma central localizada fora do campo, ou seja, todo o processamento de visão, sensores,
estratégia, locomoção, chute e drible deve ser local. Isso permite que pesquisadores
desenvolvam arquiteturas e algoritmos para robôs totalmente autônomos. O tamanho
máximo também é maior que outras categorias, podendo chegar a robôs de até 1m de
altura.
● Four-legged league: Possui o foco principalmente no desenvolvimento de software para
robôs autônomos capazes de processar informações de sensores locais e cooperar com
outros robôs, sem o problema de hardware customizado por causa do uso de uma
plataforma estável, viável e padronizada (Sony AIBO robot).
● Humanoid league: Introduzida em 2002, robôs humanóides demonstram uma série de
habilidades que pesquisadores desenvolvem, sendo uma categoria mais voltada a
demonstração do que a competição, pois os times ainda não conseguem ser totalmente
funcionais para a realização de uma partida completa (devido a uma série de desafios
que ainda precisam ser superados), portanto os robôs competem apenas em alguns
aspectos de uma partida de futebol, como uma disputa de pênaltis.
Figura 9: Infraestrutura RoboCup 2004.
24
A plataforma EyeBot se encaixa na categoria de pequeno porte (small size league),
tecnicamente chamada de F180 pois seu tamanho não pode ultrapassar um cilindro de 18 cm de
diâmetro e 22cm de altura. A categoria pode tanto usar câmera embarcada como global, sendo
no segundo caso a altura máxima permitida para o robô de 15cm. Cada time é livre para
desenvolver seus próprios robôs, permitindo inclusive adaptações específicas para o goleiro, o
que permite pesquisas mais avançadas em outros aspectos ligados às engenharias, além da
programação.
Atualmente a categoria F180 joga em um campo de 3,4m de largura e 4,9m de comprimento e
uma abertura do gol de 70cm. Como a categoria pode jogar tanto com visão local ou global, um
gol é pintado de amarelo e outro de azul. A bola é um bola comum de golfe na cor laranja. A
partida é jogada em dois tempos de 10min com um intervalo de 5min. Durante o jogo não é
permitido nenhuma interação dos programadores, os robôs devem ter total autonomia até o fim
de cada tempo, sendo permitido mudanças somente durante o intervalo. Cada time pode ter
entre 1 a 5 jogadores. Existem regras para faltas, pênaltis, cobranças, lateral, substituição de
jogadores e muitas outras que podem ser vistas no página da organização [Rob04].
2.3.2 FIRA
Figura 10: Logo da FIRA.
A FIRA [Fir06], figura 10, surgiu a partir de um comitê internacional formado sob a liderança
do professor JongHwan Kim com o objetivo de promover o Micro-Robot World Cup Soccer
Tournament (MiroSot). Assim, um encontro foi marcado e em 29 de julho de 1996 regras e
regulamentos foram criados. Trinta times de treze países aceitaram o desafio. A primeira
MiroSot'96 aconteceu em KAIST (Korea Advanced Institute of Science and Technology), entre
9 e 12 de novembro do mesmo ano. Esta primeira edição contou com a participação de vinte e
três equipes de dez países diferentes. A equipe Newton, do Laboratório de Pesquisas Newton
foi a vencedora, seguido por SOTY da Coréia. A equipe do CMU foi a campeã na categoria S-
25
MiroSot, onde um partida é disputada por apenas dois robôs, um por equipe.
Assim como a RoboCup, o objetivo principal da FIRA é o desenvolvimento tecnológico,
especialmente na área da robótica e visão computacional. Os eventos promovidos pela FIRA
continuam ano após ano, sediando competições em vários países do mundo, inclusive no Brasil.
Novamente aqui são agregadas novas categorias a cada edição do evento, comprovando os
avanços obtidos desde o início das atividades desta federação.
A FIRA está dividida nas seguintes ligas:
● NaroSot (Nano Robot World Cup Soccer Tournament): Partida jogada por duas equipes,
cada uma composta por cinco robôs sendo que um deles pode ser o goleiro. Apenas três
humanos (um gerente, um técnico e um treinador) podem permanecer na área reservada
ao jogo. Não mais que um computador por equipe pode ser usado para o processamento
da imagem, identificação e localização. Cada robô possui as seguintes dimensões: 4cm
x 4cm x 5cm.
● MiroSot (Micro Robot World Cup Soccer Tournament): Nesta categoria uma partida é
jogada por duas equipes compostas de três robôs, sendo um deles o goleiro. Os robôs
não deverão exceder as seguintes medidas: 7 5cm x 7 5cm x 7 5cm. As regras restantes
são as mesmas da NaroSot. RoboSot (Autonomous Robot-soccer Tournament): Equipes
compostas de um à três robôs. Estes podem ser autônomos ou semi-autônomos. Cada
robô possui as dimensões: 20cm x 20cm x 40cm. HuroSot (Humanoid Robot-soccer
Tournament): O robô humanóde deverá ter apenas duas pernas (bípede). O robô não
deverá ter mais que 40cm de altura e 15cm de diâmetro total, ou seja, as pernas não
deverão exceder o espaço determinado por este círculo. Por ser uma categoria nova,
ainda não existem regras definidas. Exibições são feitas mais a título de demonstração.
● KheperaSot (Khepera Robot-soccer Tournament): Nesta categoria, equipes são
compostas por um robô Khepera. A participação humana esta restrita a duas pessoas
por time na área de jogo. Os robôs devem ser totalmente autônomos. Desta forma, o
processamento das imagens deve ser feito inteiramente on-board.
● QuadroSot (Quadruped Robot-soccer Tournament): Categoria recém criada que utiliza
robôs quadrúpedes. Utilizam, em sua maioria, robôs desenvolvidos pela Sony. São os
famosos cães-robô. SimuroSot (Simulated Robot-soccer Tournament): Categoria
dedicada ao desenvolvimento de programas clientes. Cada equipe codifica suas
estratégias para serem confrontadas com a ajuda de um simulador, onde atuam de cinco
a onze programas-jogadores. A grande vantagem neste caso é a ausência total de
26
hardware. Pesquisas podem ser feitas sem grandes custos envolvidos.
2.3.3 No Brasil
No Brasil as competições acontecem todo ano dentro da Jornada de Robótica Inteligente (JRI)
que promove as competições de robótica e o Encontro de Robótica Inteligente (EnRI). As
Competições de Robótica reúnem três eventos distintos: A Competição IEEE Brasileira de
Robôs, a RoboCup Brasil, e a RoboCupJunior Brasil. A Competição IEEE Brasileira de Robôs,
atualmente em sua IV edição é patrocinada pelo IEEE Latin American Robotics Council. Seu
objetivo é promover o desenvolvimento científico e tecnológicos nas áreas de Robôs
Autônomos e Mecatrônica, na América Latina. Estas competições possuem grande parte dos
desafios encontrados pela robótica móvel do mundo real, tais como, navegação em ambientes
dinâmicos, exploração de ambiente, realização de procedimentos de contingência em ambiente
perigosos ou insalubres, monitoramento ambiental. Esta competição promove torneios nas
categorias Lego, Very Small Robot Soccer e Livre.
A RoboCup Brasil atualmente em sua terceira edição, é um projeto conjunto internacional para
promover a IA, robótica e campos relacionados. Trata-se de uma tentativa de estimular a IA e a
robótica inteligente através do oferecimento de problemas padrão onde diversas tecnologias
podem ser empregadas. As categorias que a RoboCup Brasil possui competições são a F-180,
Simulação-2D, Simulação-3D, Resgate Simulado e Robôs Virtuais.
A RoboCupJunior Brasil atualmente em usa primeira edição, é uma iniciativa orientada à
educação que tem por objetivo introduzir a robótica aos jovens estudantes de ensino
fundamental, médio e técnico. Mais do que o desenvolvimento tecnológico, o foco neste liga é a
educação e o estímulo ao surgimento de futuros pesquisadores, promovendo competições nas
modalidades Dança e Resgate.
A Jornada de Robótica Inteligente de 2006 ocorreu em Campo Grande, Mato Grosso do Sul, no
Campus da Universidade Católica Dom Bosco (UCDB) onde a UFSC competiu nas categorias
de Lego, dentro da Competição IEEE Brasileira de Robôs, onde conseguiu o primeiro lugar no
desafio inteligente, e na categoria F-180, dentro da RoboCup, ficando em segundo lugar. A
figura 11 mostra a arena montada para a competição da categoria Very Small na Jornada de
27
Robótica Inteligente de 2006.
Figura 11: Jornada de Robótica Inteligente em Campo Grande - MS, 2006.
2.4 Robôs Eyebot
A Universidade Western Austrália desenvolve vários modelos de robôs, figura 12, todos com a
filosofia de poderem operar de forma totalmente independente, existem dois modelos com
rodas, o SoccerBot e o Omni, dois modelos bípedes, o Android e o Walker, e um terceiro
modelo hexapode. A UFSC adquiriu três unidades do SoccerBot, o qual foi projetado para
satisfazer as regras da liga de pequeno porte (small-size league) da competição mundial de
futebol de robôs RoboCup.
Figura 12: EyeBots projetados pela UWA.
28
Essas unidades móveis de pequenas dimensões e baixo consumo de energia, estão equipadas
com um microcontrolador de 32 bits MC68332 da Motorola, um display de LCD capaz de
exibir gráficos de baixa resolução (e com apenas 1 bit por pixel ), uma câmera digital CMOS
colorida (24 bits por pixel e resolução de 80x60 pixels), uma porta serial outra paralela, saídas
digitais, saídas analógicas, dois encoders, três sensores infravermelhos, quatro servo motores e
uma unidade de comunicação sem fio, modulada em 433MHz, permitindo o robô a se
comunicar com outros robôs ou uma estação de controle.
O microcontrolador MC68332 pertence a família de 32 bits MC68000 da Motorola, voltada
para a utilização em hardware de sistemas dedicados e projetada para suportar códigos que
exijam uma intensa carga de cálculos, fornecendo uma Unidade Lógica Aritmética completa
operando a 32 bits, além de módulos para o suporte de memória virtual, operação no módulo
loop, execução de instruções em pipeline, poderosos modos de endereçamento facilitando o
trabalho de compiladores das linguagens de alto nível, conjunto de instruções especiais para as
Lockup Tables, Interpolações e modos de espera em baixo consumo. Ele possui diversos
periféricos internos, como contadores de 16 bits, watchdog timers, monitor de clock, monitor de
barramento, uma unidade avançada para comunicação serial (USART), e acesso externo a um
barramento, facilitando a conexão de novos periféricos.
A câmera digital é baseada em um circuito integrado de imagem CMOS, com a resolução de
80x60 com 24bits por pixel, permitindo ao robô fazer aquisição e processamento de imagens
localmente, sem necessitar transmitir as informações da câmera para uma estação de trabalho.
Associado ao microprocessador de 32 bits da Motorola o pequeno robô consegue autonomia e
robustez dando uma excelente opção para pesquisa e desenvolvimento de algoritmos de visão
computacional em tempo real, aplicados à robótica móvel.
O sistema operacional RoBIOS (robot input output system), oferece um um pequeno sistema
de tempo real com funcionalidades de multi-threading e várias operações de E/S. Podem ser
encontradas funções para leitura de sensores de distância, teclado, câmera, configuração de
para controle PI em malha fechada dos servomotores, escrita no LCD, funções de áudio,
comunicação de rádio e RS232, converçoes analógico/digitais, leitura e escrita na porta
paralela, funções de sistema como multi-tasking, semáforos e timers e inclusive uma boa
quantidade de funções um pouco mais avançadas para o processamento de imagens da câmera.
Nele são encontrados algoritmos para escala de cinza IPColor2Grey(), transformação em preto
29
e branco IPDither(), detecção de arestas através do operador de Laplace, IPLaplace(), e
operador de Sobel, IPSobel(), e um subtrator de imagens IPDiffer(). Constituindo um kit
rudimentar para visão computacional e reconhecimento de padrões.
Por ser um sistema operacional voltado para a robótica móvel, ele também possui facilidades
para processamento de imagem, incluindo alguns dos algoritmos mais utilizados em sistemas de
visão artificial. Muitos sistemas móveis autônomos utilizam uma câmera para sua navegação,
desviando assim de obstáculos, e/ou definindo trajetórias a serem realizadas.
As funções de processamento de imagem, que o RoBIOS possui, utilizam como entrada
imagens em escala de cinza, enquanto que a câmera fornece uma imagem colorida. Para esta
conversão de cores o sistema oferece a função IPColor2Grey() que realiza a operação
matemática “(R+2*G+B)/4” em cada pixel de entrada, para produzir a imagem em cinza.
2.5 UFSC-Team
O Projeto UFSC-Team teve início no final do ano de 97, apenas um ano após a realização do
primeiro evento mundial de futebol robótico realizado em 1996. Inicialmente contando com a
participação de um aluno de doutorado e um professor, evoluiu para conter também alunos de
iniciação científica e mestrado. Tornou-se então um importante campo de estudos para a
validação de pesquisas principalmente para interessados em Inteligência Artificial. A primeira e
principal meta deste projeto era desenvolver um equipe para participar das competições de
futebol robótico na categoria simuladores e, talvez mais tarde também participar com robôs
reais de pequeno porte.
Após alguns meses de trabalho, em 1998 o primeiro time de futebol capaz de participar da
RoboCup na categoria simuladores ficou pronto. Um artigo descrevendo (da Costa e
Bittencourt, 1998) as inovações e a proposta foi apresentado no workshop da RoboCup. Este
evento acontece em paralelo às competições e serve para promover e incentivar as pesquisas
nesta área. Também é o lugar onde são expostas e apresentadas as inovações de cada time. O
simulador apresentava uma arquitetura de agentes concorrentes com o processo decisório
centralizado.
30
Em 1999 a versão do time simulado migrou de uma arquitetura de agentes concorrentes para
uma arquitetura de agentes concorrente autônomos, devido a problemas de timing e
sincronização ocorridos entre os agentes e o ambiente, interferindo nas respostas de tempo real.
O sistema baseado em conhecimento responsável pela tomada de decisões também havia se
tornado extremamente complexo possuindo regras destinadas a tratar todo tipo de informação,
inclusive de alto nível como o tipo de jogada ensaiada a ser utilizada.
Em 2000 chegaram os robôs Eyebot encomendados da Austrália, iniciando um estudo de seu
funcionamento e sua utilização por Rottava [Sil03] na sua dissertação de mestrado. A estratégia
adotada para a programação desses robôs era a de utilizar a câmera embarcada para transmitir
as imagens a um micro computador central localizado do lado do campo, este seria responsável
pela análise individual de cada imagem e decisão dos movimentos dos robôs. Porém como
conclusão a estratégia foi considerada totalmente inapta para estes robôs, por apresentar um
qualidade e velocidade de transmissão muito baixa no rádio.
Em 2006 a equipe foi retomada pelo Grupo de Robótica Inteligente (GPRI), com a intenção de
participar de duas categorias do campeonato nacional da Robocup, a Very Small Size, com
robôs de dimensôes de 7,5cm³ [Per06], e a Small Size [Sil06] com os robôs Eyebot, que
pretende utilizar os robôs adquiridos em 2000 com uma estratégia totalmente autônoma que se
encontra no âmbito deste trabalho.
31
3 Projeto
Este capítulo apresenta as questões de projeto levantadas no período de execução do trabalho,
onde as principais características do problema (a autonomia de um robô durante uma partida de
futebol) são salientadas e as formas conceituais de cada parte da solução são abordadas. Uma
arquitetura híbrida é sugerida juntamente com os motivos que identificaram a necessidade dela,
na sequência são explorados os comportamentos dessa arquitetura e por fim formalizados os
módulos que ela utiliza.
3.1 Arquitetura Híbrida
Uma arquitetura de subsunção pura, possui os sensores conectados diretamente em suas
camadas, permitindo que cada qual interprete as informações dos sensores do seu próprio modo,
porém em um sistema embarcado, essa abordagem acaba sendo prejudicada, devido ao uso de
recursos caros como aquisição e processamento de imagem. Por outro lado uma arquitetura
tradicional não oferece a expressividade reativa que a arquitetura de subsunção possui, e que
pode ser explorada em uma partida de futebol de robôs.
Em sistemas embarcados geralmente existe a escassez de memória, de processamento e de
energia e mesmo assim precisam ser respeitados requisitos de tempo real, robustez e
disponibilidade, interagindo de forma reativa ao meio ambiente. Dentro destas restrições,
32
processamento desnecessário e redundante devem ser evitados, concentrando tarefas similares
dentro de um único algoritmo, ótimo e formalmente correto, sendo executado somente quando
necessário.
Atendendo estas considerações, as informações brutas advindas dos sensores e utilizadas
largamente dentro do sistema, podem receber uma otimização a partir do momento que toda a
modelagem necessária seja executada de uma vez, e os dados já processados então consumidos
pelas tarefas dentro do sistema.
Assim uma abordagem hibrida, como mostra a figura 13, é adotada no desenvolvimento da
arquitetura dos robôs, separando o sistema em um estágio inicial de modelagem do ambiente
(como é feito em arquiteturas tradicionais), tirando proveito de questões importantes das
restrições de sistemas embarcados, seguido de um estágio de camadas com comportamentos
hierarquizados, aproveitando a característica reativa do modelo de arquitetura de subsunção.
Figura 13: Arquitetura Hibrida adotada.
A vantagem dessa abordagem é a possibilidade de reutilização das informações caras e
necessárias durante a realização efetiva de algumas tarefas, por exemplo, para descobrir a posse
de bola, as camadas certamente farão a consulta em momentos diferentes, no lugar de cada uma
requerer um frame da câmera ou analisá-lo separadamente, o frame e o processamento da
imagem são antecipados pela aquisição e o pré-processamento de todas as informações
necessárias pelas camadas. Assim elas usufruem de um dado já modelado, permitindo uma
atualização mais ágil do estado interno de cada camada, e o processamento de imagem é
realizado uma única vez, economizando tempo no ciclo do sistema.
Além da vantagem sobre os aspectos tecnológicos e de sistemas de tempo real do robô, esta
abordagem também contorna um problema, que Russel e Norvig caracterizam como sendo
intrínseco à arquitetura de subsunção:
33
“Primeiro, as MEFAs [Máquinas de estados finitos ampliadas]
normalmente são orientadas pela entrada bruta dos sensores, uma
organização que funciona se os dados dos sensores forem confiáveis e
contiverem todas as informações necessárias para a tomada de decisões,
mas que falha se os dados de sensores tiverem de ser integrados de modos
não-triviais ao longo do tempo” (Russel e Norvig, 2004).
Utilizando uma arquitetura hibrida a dificuldade é contornada através do pré-processamento das
informações fornecidas pelos sensores, onde os dados podem ser modelados de acordo com
necessidades temporais ou integração entre sensores, enviando para a entrada das camadas um
uma informação confiável e livre de ruídos.
Com os recursos de hardware que a plataforma EyeBot oferece, o diagrama de blocos da figura
14 foi definido para a estruturação do software, utilizando o rádio, os sensores de distância, a
câmera, os motores DC e os servo motores para a câmera e o mecanismo de chute. Os blocos de
tratamento de imagem e comunicação são evidenciado justamente como estágios de pré-
processamento para a arquitetura de subsunção, esta posicionada ao centro do diagrama e
responsável pelo comportamento efetivo do robô.
Figura 14: Diagrama final da arquitetura de controle.
34
3.2 Comportamentos
A arquitetura de subsunção do robô é decomposta em cinco comportamentos separados
segundo à importância das tarefas consideradas durante uma partida de futebol. São estas: Fazer
Gol, Chutar Bola, Carregar Bola, Desviar e Procurar Bola, como mostra a figura 15. Onde a
mais importante, representada ao topo da hierarquia, inibe as ações das camadas inferiores, e
assim sucessivamente caracterizando tarefas prioritárias sobre os comportamentos relacionados
à baixo dela.
Figura 15: Arquitetura de subsunção dos jogadores.
3.2.1.Procurar
O comportamento mais básico definido na arquitetura é o de procurar a bola, pois este deve
emergir quando nenhuma outra situação relevante estiver ocorrendo, ela também é responsável
pela ação de voltar para a defesa quando for solicitado.
O comportamento inicia sua tarefa relevando a informação de que o robô não possui a bola, e se
da em um sequência de cinco ações executadas continuamente, que são representadas pela
transição dos estados superiores na figura 16. Primeiramente é executado uma busca nas
proximidades, com a câmera abaixada e um giro angular de 90°, em seguida a mesma ação
porém no sentido contrário somando um ângulo de 90° novamente, ao que já foi percorrido,
totalizando 180°. Depois uma busca por localidades mais distantes é feita, dessa vez com a
câmera levantada, e em dois passos de 180° na mesma direção, totalizando um giro de 360°
sobre o próprio eixo. Para o robô não ficar infinitamente girando, é executado na quinta ação
35
uma navegação aleatória, denominada de passeio, onde o robô anda em linha reta durante um
determinado tempo para sair da posição atual de procura. E por fim o ciclo se repete.
Figura 16: Automato da camada Procurar
Os quatro estados inferiores realizam a busca por uma posição no campo, quando uma
mensagem de “voltar” for recebida pelo rádio significa que os robôs precisam assumir uma
posição defensiva. O posicionamento ocorre sobre dois pontos previamente definidos, um em
cada canto da área do goleiro, e são executados de forma competitiva pelos robôs, pois ambos
passam a girar sobre o próprio eixo e seguir em direção ao campo aliado a fim de encontrar uma
das duas posições. A primeira unidade que finalizar o processo de posicionamento avisa à outra
que já está à caminho de um dos lados, restando a outra unidade a busca pelo posicionamento
no outro lado.
36
3.2.2.Desviar
Esta camada camada é responsável por executar um reflexo defensivo do robô, que é desviar na
presença de qualquer obstáculo, seu autômato é demonstrado na figura 17. Basicamente ele atua
quando o sensor frontal (denotado por “F” no autômato) é estimulado, migrando seu estado
incicial para dentro de um grafo cíclico que define uma ação para cada sensor ativado.
Figura 17: Automato da camada desviar.
No primeiro estado desse ciclo é escolhido uma das direções para desviar, e executado um giro
em torno do próprio eixo até que o sensor frontal não esteja mais indicando obstáculo. Os dois
estados subsequentes determinam uma direção fixa de giro, uma vez que indicam, além do
sensor frontal, um dos sensores laterais (representados por “E” e “D”, esquerda e direita
respectivamente). O estado restante do ciclo indica a situação em que todos os sensores foram
ativados, lançando assim a ação de “Reh()”, fazendo com que o robô ande para trás até que um
dos sensores pare de indicar obstáculo. Toda transição para os estados “E” e “D” possuem
direção de desvio fixo, para o estado “F” a direção é escolhida de forma aleatória, e todo
estado possui uma transição para o estado inicial (gerada pelo fim da indicação de obstáculo
frontal - “!F”), onde nenhuma ação é executada.
37
3.2.3.Carregar Bola
O comportamento “Carregar Bola'', autômato da figura 18, emerge quando o robô encontra a
bola em seu campo de visão, partindo então para a sua direção a fim de conquistar sua posse.
Em seguida ela é conduzida levando em consideração duas situações, a primeira (grupo
superior direito de estados) é a detecção do campo dos companheiros através da informação
“golComp”, onde o robô executa uma curva de 180° conduzindo a bola a fim de seguir para o
campo adversário, e caso seja detectado algum obstáculo na direita ou na esquerda, uma das
direções de reversão em particular é executada. No grupo de estados mais abaixo, o robô reage
à presença de adversários, onde um drible é executado a partir dos sensores estimulados.
Figura 18: Autômato da camada Carregar.
A transição do primeiro para o segundo estado, apresenta uma característica muito importante
deste comportamento, que é a de seguir em direção da bola. Nesta ação é executado um
algoritmo de correção de rota a partir de um sistema simples com realimentação angular pela
câmera. Um sistema realimentado é um mecanismo de correção onde a informação da variável
controlada retorna ao sistema, a fim de comparar o sinal desejado com o sinal medido no
ambiente. Um diagrama simples é mostrado na figura 19a, demostrando as variáveis existentes
para o sistema realimentado na ação de perseguir a bola. O erro é aplicado ao módulo de
38
controle dos motores, que converte a informação de velocidade em corrente para o motor. A
câmera captura um frame do ambiente, do qual é possível calcular a posição da bola referente
ao centro do robô, figura 19b, realimentando o sistema com um sinal de posição angular da
bola, relativa ao robô, no mundo real.
(a)
(b)Figura 19: (a) Diagrama do sistema realimentado. (b) Coordenadas da bola em um frame.
A construção da equação que rege a correção da direção do robô em relação a bola, é mostrada
passo a passo na figura 20, onde w é a direção angular dos motores, e ela recebe o valor de erro
que existe entre o ângulo desejado (αref), e o ângulo medido (αmed) da bola em relação ao robô. O
ângulo desejado é fixo em 90°, uma vez que a bola deve permanecer no centro do campo de
visão, para o robô poder conduzir a bola. O ângulo medido precisa ser calculado a partir das
coordenadas cartesianas fornecidas pela posição da bola no frame, portanto o arco tangente é
calculado convertendo diretamente o eixo das ordenadas em cateto oposto, e o eixo das
abscissas em cateto adjacente, descontando a diferença das origens de cada sistema de medição,
no caso 30 pixels referentes ao centro da imagem. Como o sistema coordenado atua somente
nos dois primeiros quadrantes (y é sempre positivo), os resultados dos ângulos referentes ao
terceiro e quarto quadrante são espelhados para valores dentro dos primeiros dois quadrantes,
através da operação mod, com o ângulo de 180, existente dentro da aritmética modular.
39
w = erroerro = ref−med
ref = 90o
med = arctan c.o.c.a.
, c.o.= y e c.a.= x−30
med = arctan yx−30
mod 180
w = 90−arctan yx−30
mod 180
Figura 20: Função de correção para perseguir a bola.
Ao final a equação completa é exibida, seu cálculo é atualizado continuamente, enviando
valores de correção angular para o módulo de controle dos motores, até que a bola esteja de
posse do robô, permitindo a partir de então sua condução.
3.2.3.Chutar
O comportamento “Chutar Bola” tem prioridade quando o robô está com a bola porém
encontra-se cercado pelos adversários, cujo autômato está na figura 21. Sua função é de isolar
ou dividir a bola executando a ação de chute. O comportamento emerge a partir da informação
de posse de bola e ativação dos três sensores de distância, e o cuidado de não chutar contra o
próprio patrimônio é analisado através da informação de “golComp”, que acarreta em um giro
até que o gol companheiro não esteja mais sendo detectado, para então a execução do chute.
Figura 21: Autômato da camada Chutar.
40
3.2.5.Fazer Gol
O principal comportamento do robô é o “Fazel Gol”, está no nível mais alta e tem prioridade
sobre todas as camadas anteriores. Sua função é executar o chute em direção ao gol, a partir do
momento em que o gol adversário for detectado, e caso seja possível perceber que o goleiro não
está presente, um chute de uma distância mais longa é realizada. Enquanto a distância para o
chute não é alcançada, o robô segue em direção ao gol, corrigindo a rota para o lado com maior
abertura. O chute é realizado juntamente com um período de aceleração, a fim de passar para a
bola um máximo de velocidade.
Figura 22: Autômato da camada Fazer Gol.
3.3 Modelagem de Dados
A arquitetura definida possui 4 módulos que fornecem e consomem as informações das
camadas de subsunção. Os módulos de processamento de imagem e sensores são somente de
entrada para o sistema de comportamentos, enquanto que o módulo de motores, que controlam
os motores DC e os servo motores, são de saída. O quarto módulo, de comunicação, no entanto
pode fornecer e receber informações do sistema de comportamentos.
41
A troca de informações dentro do sistema se da através de mensagens, portanto além de funções
algoritmicas que cada módulo pode conter, existe também a necessidade de discretização das
mensagens, onde todas as possibilidades de valores usadas em cada módulo são resumidos em
alguns valores principais.
3.3.1.Sensores
O módulo de sensores é responsável pela utilização dos sensores de distância, ficando
responsável por ligar, desligar, executar a aquisição e principalmente discretizar o valor de
acordo com a necessidade dos comportamentos da arquitetura de subsunção.
Dentre as mensagens utilizadas, existe principalmente a necessidade do aviso de um obstáculo
perto, portanto a separação da faixa útil em três valores aceitável, e pode ser definido através do
seguinte conjunto:
Sensores = {PERTO , MEDIO , LONGE}
3.3.2.Atuadores
Os atuadores possuem o controle dos motores DC para navegação e dos dois servo motores,
para o chute e para a câmera. Para a navegação é necessário comandos para se locomover para
frente, para trás e girar para cada um dos lados, dessa forma a discretização parte
principalmente desses quatro comandos: frente, trás, direita e esquerda. Um conjunto mais
completo é elaborado para permitir um controle simples de velocidade (normal, lento e rápido),
juntamente com um comando de parar, portanto o conjunto fica definido da seguinte forma:
Navegacao = {parar , frentel , frente , frenter , reh , girohorl , giro hor , giroahorl , giro ahor}
Para o controle do servo motor responsável sobre o mecanismo de chute, dois valores são
apropriados para suprir a demanda dos comportamentos elaborados (levantar o chute e baixar o
chute), um terceiro comando é adicionado para a realização de passe de bola, onde o servo não
atua com a força máxima, e sim em uma intermediária. Ficando o conjunto de mensagens
definido da seguinte forma:
Chute={voltar , toque ,chute }
42
O servo motor da câmera é utilizado somente para a localização da bola, portanto dois valores
são suficientes para o seu controle, são eles: câmera reta, que é o posicionamento normal da
câmera e permite a visualização do campo de forma ampla; e câmera direcionada para baixo,
que serve para analisar a posse de bola ou verificar se ela está nas proximidades. O conjunto de
mensagens para o controle do servo da câmera pode então ser definido da seguinte forma:
Camera={cima , baixo}
3.3.3.Comunicação
O módulo de comunicação implementa um protocolo que pretende complementar o protocolo
usado pelo sistema operacional, oferecendo um serviço de transmissão de mensagens confiável,
ou seja, retransmissão de pacotes perdidos, pois a rede EyeNet somente oferece tolerância a
falhas, onde são descartados pacotes que possuem erros de transmissão. Este serviço é
implementado através de uma arquitetura de envio/resposta, caso a resposta não seja recebida
dentro de um tempo, ela é retransmitida.
O protocolo possui basicamente cinco tipos de mensagens: “com bola”, “sem bola”, “voltar”,
“posição” e “comando remoto”. Os dois primeiros são trocas de mensagens entre jogadores
durante uma partida, quando alguém está de posse da bola, avisa aos companheiros que está
com ela, dessa forma eles não precisam procurar ou disputar a bola e o goleiro não precisa ficar
atento caso a bola esteja vindo em sua direção. A estratégia adotada nesse estado é de manter os
robôs o máximo de tempo parado afim de economizar energia das baterias durante uma partida.
Enquanto que o aviso “sem bola” avisa uma perda dela, informando aos companheiros que
voltem a situação normal de jogo. Ambas as mensagens são implementadas por uma máquina
de estados, mostrada na figura 23, que ao enviar o comando esperam por duas confirmações,
caso elas não cheguem dentro de um tempo limite, o comando é reenviado.
O comando “voltar” é utilizado pelo goleiro, alertando os companheiros que a bola está
próxima ao gol e que precisam assumir uma posição defensiva, e a partir da posição de defesa
continuar com os comportamentos normais de procurar bola e disputar sua posse. Ao chamar os
companheiros o goleiro espera por duas confirmações, caso elas não cheguem dentro de um
tempo limite, o comando é reenviado. Ao receber a mensagem de voltar, os jogadores tem a
liberdade de procurar pelo lado mais próximo de sua posição atual, e ao se dirigir até ela,
43
informa ao seu companheiro que lado escolheu, através do comando “posição” seguida da
identificação deste lado, restando ao outro jogador procurar o lado oposto. Esta mensagem
espera somente uma resposta de confirmação, pois o goleiro não precisa participar da
negociação de posicionamento.
A mensagem “remoto” serve para a estação enviar ordens para cada jogador, ou a todos ao
mesmo tempo, informando-os do início da partida, uma paralisação ou final da partida. O
comando também oferecerá um controle das ações do robô, no qual ele deixa o estado
autônomo e passa para um estado escravo, seguindo unicamente as ordens vindas da estação.
Estes comandos podem ser do tipo “ir para frente”, “ir para trás”, “girar horário”, “girar anti-
horário”, “levantar o chute”, “abaixar o chute”, “levantar a câmera”, “abaixar a câmera”.
Figura 23: Automato responsável pela comunicação entre os robôs.
Para a realização da comunicação o pacote possui um tamanho fixo de quatro campos, sendo
eles: Mensagem, Complemento, Destino e Tipo. A mensagem pode assumir uma entre “com
bola”, “sem bola”, “voltar”, “posição” e “remoto”. O complemento serve para as mensagens de
44
posição e remoto, que exigem uma informação a mais a ser transmitida. O Destino informa para
quem a mensagem é enviada, podendo ser para um dos jogadores, o goleiro ou a estação. E por
último, o tipo, informa se é uma mensagem de envio ou de resposta. A resposta deve possuir a
mesma mensagem e complemento do pacote enviado, para garantir que a resposta é referente ao
comando correto.
O protocolo EyeNet já possui uma identificação de origem da mensagem, porém, para a estação
poder entrar em modo de escuta, onde as mensagens trocadas entre os jogadores durante a
partida podem ser visualizadas, todas são enviadas em modo broadcast, sendo a identificação
colocada no pacote transmitido. Dessa forma fica à cargo do protocolo de comunicação aceitar
ou negar um pacote.
3.3.4. Controle Externo
Um módulo externo é necessário principalmente para enviar os comandos ao robô sobre início e
fim de uma partida. Ele é utilizado também para a monitoração da comunicação entre os robôs,
onde toda troca de mensagens é exibida ao usuário através da forma de um texto corrido,
permitindo a avaliação do funcionamento do protocolo assim como observação do
comportamento dos jogadores.
O controle possui dois comandos principais, iniciar e finalizar uma partida, e habilitar e
desabilitar o modo remoto. Dentro do segundo comando podem ser enviados comandos para o
controle de navegação do robô, entre eles: “ir para frente”, “ir para trás”, “girar horário”,
“girar anti-horário”, “levantar o chute”, “abaixar o chute”, “levantar a câmera”, “abaixar a
câmera”. Cada mensagem possui a estrutura de pacotes relatada no módulo de comunicação, e
todo comando enviado espera uma resposta das unidades como confirmação de recebimento do
comando. A máquina de estados responsável pelo gerenciamento de envio e re-envio de pacotes
é mostrada na figura 24.
45
Figura 24: Máquina de estados da comunicação do módulo externo.
Cada comando pode ser enviado individualmente para cada unidade, portanto o número de
confirmações recebidas pode ser variável. Dessa forma a máquina de estados implementa um
estado que conta a quantidade de confirmações recebidas, e dependendo do número de vezes
que a mensagem já foi reenviada, decide se o pacote é definido como perdido ou se realiza um
novo reenvio. A contagem é realizada dentro da função “conf()”, a comunicação bem sucedida
é contabilizada através de “confAll()”, uma mensagem reenviada é executada através de um
“timeOut()”, e a perda de um pacote informada através de um “reset()”.
3.3.5.Tratamento de Imagem
Os sistemas de visão (conhecidos como visão artificial, visão computacional ou visão robótica)
fornecem uma imagem de relativa precisão, capaz de ser analisada e interpretada digitalmente.
A interpretação pode ser definida em termos computacionais como a transformação de um
conjunto de dados digitais representando uma imagem em uma estrutura de dados descrevendo
a semântica deste conjunto de dados em um contexto qualquer.
A Visão Computacional enfrenta uma série de desafios que vai desde aspectos teóricos, que
Russel e Norvig [RN04] definem em termos de percepção de agentes, que é a dificuldade de, a
partir de uma representação sensória modelar o estado do mundo, até questões tecnológicas que
esbarram na grande quantidade de informação gerenciada e todo o ruído que os dispositivos de
aquisição e digitalização introduzem. Portanto, é uma disciplina que se encontra ainda nos seus
primórdios, sendo a grande maioria de suas soluções e abordagens objeto de pesquisas, o que
pode ser percebido na colocação de Wangenheim:
“Uma das características mais marcantes do estado da arte em Visão
Computacional é que ainda não existe nenhum modelo genérico de percepção
visual passível de ser aplicado na prática. O conhecimento de como funcionam os
46
mecanismos de percepção visual nos animais tampouco é suficiente para a
aplicação de algum mecanismo de "engenharia reversa", utilizando por exemplo
técnicas de redes neurais para modelar ou imitar a percepçaõ visual biológica”.
(Wangenheim, 2005)
O que ocorre na prática, é que, para a resolução de uma determinada tarefa de interpretação de
imagens são utilizados um conjunto de algoritmos específicos, que são respectivamente
responsáveis por realizar subtarefas limitadas dentro do processo de interpretação dessa
imagem. Essas tarefas, segundo Groover et. al.[GW89], podem ser classificadas em: redução do
dados de imagem, extração de características e reconhecimento de objetos. Entre a variedade de
algoritmos é possível identificar vários grupos, como filtros de contraste, detectores de bordas
de objetos, segmentadores de imagens em regiões, classificadores de texturas e assim por
diante. Comumente um problema é resolvido encaixando um conjunto desses algoritmos um
após o outro para a obtenção de um resultado que só funcionará para um conjunto de imagens
com características muito específicas, deixando de funcionar para todas as outras.
Na robótica as principais tarefas realizadas pelo sistema de visão podem ser generalizados para
a inspeção de produtos na linha de produção, identificação de objetos e navegação autônoma
em ambientes reais. No domínio do problema de futebol robótico uma das finalidades da
câmera é a identificação da bola, do próprio gol e do gol adversário.
Tomando como base o artigo de Bräunl e Graf [BG99], que mostra a detecção de objetos com
robôs da familia EyeBot, os objetos (bola e gols) podem ser reconhecidos através da procura de
suas cores, no espaço de cores HSV, da imagem analisada. O padrão HSV (das iniciais de Hue,
Saturation, Value), é uma forma de representação das cores, desenvolvido por Smith [Smi78],
definido em um sistema de coordenadas cilíndricas em termos de tom, brilho e vibração,
normalmente representado por um cone, como mostra a figura 25. Nesse sistema todo o
espectro de cores é representado em somente uma coordenada (o ângulo), o que traz
basicamente duas vantagens, a facilidade na busca de uma cor dentro da imagem e uma certa
robustez com as variações de brilho do ambiente. É normalmente o sistema de cores mais
utilizado nos sistemas de visão computacional pois muitos algoritmos de processamento de
imagem usam como base tons de cinza, representado pelo eixo do brilho.
47
Figura 25: Cone de cores do espaço HSV
A câmera da família EyeBot fornecem a imagem em um sistema de cores RGB, em que o
espaço de cores é representado através das componentes primárias vermelho, verde e azul
definido em um sistema de coordenadas cartesiana, como mostra a figura 26. Este sistema é o
mais utilizado por dispositivos de aquisição e formação de imagem, pois possui uma relação
direta com uma grandeza física, que é a energia da onda eletromagnética.
Figura 26: Cubo de cores do espaço RGB.
A diferença dos sistemas coordenadas exige uma uma transformação, no caso da identificação
de cores somente o valor do tom é interessante, por isso a única coordenada que precisa ser
convertida é a coordenada angular, mostrada na figura 27.
48
Figura 27: Conversão de RGB para Hue.
Com a imagem representada pelo tom de cada pixel, é executado uma busca em cada linha pela
concentração da cor desejada. Para a obtenção dessa concentração de cor o algoritmo busca os
primeiros dois extremos de um possível objeto e realiza uma média aritmética de todas as
diferenças entre a cor do pixel da cor desejada. Se essa média for menor do que uma certa
tolerância para a cor do objeto, ele é aceito, caso contrário o algoritmo se repete até que os dois
pontos extremos se encontrem. Um diagrama pode ser mostrado na figura 28, juntamente com a
função do calculo para o reconhecimento da concentração de cor.
(a)
Avaliação do objeto:
∑i= primeiro
ultimo
∣pixel i−cor∣
ultimo− primeiro ≤ limiarCor
(b)
Figura 28: (a) Fluxograma do algoritmo de procura em uma linha. (b) Função de avaliação da
concentração de cor em uma linha.
49
Neste processo porém, o cálculo da média das diferenças entre as extremidades encontradas é
repetido toda vez que a média não atingir o valor de limiar. Um processo de otimização pode
ser realizado se após a primeira busca soma for armazenada e então a partir da segunda busca,
em que uma nova soma é calculada, o valor é subtraído da soma armazenada, e do resultado
final é gerada uma nova média consequentemente avaliada sua tolerância. O diagrama é
mostrado na figura 30. Um refinamento ainda pode ser alcançado ao executar as novas buscas
de forma alternada, dependente de qual lado o deslocamento é maior.
O algoritmo sugere três variáveis que podem ser escolhidas para a procura de um objeto, a cor,
a tolerância e o tamanho. A cor e a tolerância influem diretamente na função de avaliação,
identificando o intervalo de cores a ser procurado. O terceiro parâmetro no entanto depende da
linha em que a procura está sendo executada, que é proporcional a distância em que o objeto
está da câmera. Segundo experimentos realizados no artigo tomado como base [BG99], essa
correção do tamanho avaliado em relação a distancia do objeto sugere uma curva exponencial,
figura 29, que é uma função matemática custosa para ser executada pelo robô, portando no
lugar do uso da aproximação de uma função é preferível o uso de tabelas com valores pré
definidos, que permite um maior desempenho e maior acurácia quando adquirida através de
calibração.
Figura 29: Curva de relação entre distância e número da linha.
Para a busca dos pontos de extremidade de um objeto também é usado o mesmo valor de
tolerância que a função de avaliação da cor média usa. A avaliação de que determinado pixel
pertence ou não à cor procurada é definida da seguinte forma:
alike = {true , if ∣pixel−cor∣ limiarCorfalse , if ∣pixel−cor∣ limiarCor}
50
4 Implementação
4.1 Aspectos Tecnológicos
Nesta seção serão abordadas as questões tecnológicas que foram consideradas no
desenvolvimento da arquitetura do software, relevando questões do SO, técnicas de
programação e aspectos de linguagem de programação.
4.2.1.Questões do Sistema Embarcado
Na obra clássica de Tanenbaum [Tan03], os sistemas operacionais são classificados em:
Sistemas para computadores de grande porte, sistemas para servidores, sistemas para
multiprocessadores, sistemas para computadores pessoais, sistemas de tempo real, sistemas
embarcados e sistemas operacionais de cartões inteligentes.
Dentre as características de sistemas embarcados citadas no capítulo anterior, talvez a que
apresente a maior quantidade de estudos e aplicação seja a área de tempo real. Durante muitos
anos, os principais consumidores de sistemas de tempo real foram os militares. Hoje, porém,
significativas diminuições nos custos de hardware tornam possível que a maioria das empresas
se dêem ao luxo de possuir sistemas (e produtos) de tempo real para aplicações diversas, que
incluem controle de processos, automação industrial, robótica, pesquisa médica e científica,
52
computação gráfica, comunicações locais e em áreas extensas, sistemas aeroespaciais, testes
apoiados por computados e um amplo conjunto de instrumentação industrial.
O RoBIOS, é um sistema operacional embarcado com algumas características de tempo real,
pois o tratamento dos periféricos do robô, por exemplo, a aquisição de um frame da câmera, o
controle em malha fechada dos motores, e toda a comunicação via rádio, ocorre a medida que
as interrupções do hardware vão sendo geradas. A API, porém, se limita ao oferecimento de um
temporizador em tempo real para a utilização na programação, deixando outras características
de sistemas de tempo real a cargo do programador, o qual deve então se aproveitar das
funcionalidades do processador, fazendo uso das interrupções dos dispositivos não alocados ao
sistema operacional.
Apesar de sistemas embarcados poderem ser programados para a realização de uma única
tarefa, muitas aplicações chegam a ser sofisticadas o bastante a tal ponto que a expressão em
um único programa possa ser complexa e dificilmente gerenciável, mesmo inconveniente que
aparecem em sistemas de maior porte. Desta forma a realização de multitarefa [Woo90] ou
processamento concorrente, acabam também sendo muito importantes em sistemas de tempo
real, porém um pouco mais elaborados, pois o escalonamento de tarefas não depende somente
de um nível de prioridade, largamente utilizado pelos algoritmos clássicos, mas também da
janela de tempo que a tarefa precisa ser executada (deadline).
O RoBIOS, por ser um sistema embarcado, acaba não oferecendo suporte para o escalonamento
de tarefas em tempo real, que geralmente acaba sendo uma tarefa cara devido ao algoritmo de
escolha durante o processo de troca de contexto, portanto o sistema oferece um conjunto
funcionalidades somente para as duas formas clássicas para a realização de multitarefa,
chaveamento de processos cooperativo e preemptivo, que é escolhido na inicialização do do
ambiente multitarefa do sistema, executado pela função OSMTInit(). Para o gerenciamento de
threads existem as funções OSSpawn(), para criar uma thread, OSReady() para incluir a thread
na fila de ready, OSKill() para finalizar uma thread, OSRun() que seleciona a thread que
passará a ter o controle da CPU e OSSuspend() que coloca uma thread em modo suspenso.
Algumas funções só podem ser chamadas pela própria thread, é o caso de OSReschedule() que
coloca a thread atual na fila de ready e seleciona outra para ser executada, OSYield() que coloca
a thread atual em modo suspenso e OSExit() que finaliza a thread atual e escalona outra para ser
executada. O RoBIOS também oferece uma função para a execução de temporizações dentro de
53
um programa, executado pela primitiva OSSleep(), que implementa uma espera que
imediatamente escalona outra thread para utilizar a CPU, diferente do OSWait() que
implementa uma espera ocupada.
Para aplicações de tempo real, onde tempo precisam ser cumpridos, o RoBIOS oferece as
funções de OSSuspend() e OSPermit(), que podem ser utilizados para garantir o término de uma
tarefa sem que o escalonador, no modo preemptivo, a tire da CPU.
Em um sistema multitarefas, comumente existe a necessidade que as tarefas passem informação
umas às outras, portanto o sistema deve prever mecanismos de comunicação e sincronização
intertarefas. O RoBIOS não oferece nenhum mecanismo de comunicação entre threads, porém
eles podem ser elaborados através do suporte de semáforos [Dij65], que o sistema operacional
possui através das funções OSSemInit(), OSSemP() e OSSemV(). São utilizados atualmente três
tipos de comunicação entre processos: memória compartilhada, sistema de mensagens e um
bem simples, o signal, que não possibilita a passagem de dados. O método de memória
compartilhada, basicamente define uma área de memória que pode ser lida/escrita por diferentes
processos e para garantir a integridades dos dados, durante o processo de escrita, são usados
semáforos.
Com estas características do sistema operacional, é possível tirar vantagem do sistema
multitarefa na configuração preemptiva para a separação de tarefas que precisam atender as
restrições de tempo real, a arquitetura de subsunção que é o sistema reativo propriamente dito,
das tarefas que exigem alta carga de processamento, que é o caso do processamento da imagem.
Separando assim as tarefas de alta prioridade das de baixa prioridade. Como a câmera, principal
fonte de informação, apresenta um tempo de resposta que pode ser classificado como lento
diante da maioria das funcionalidades do sistema, ela e todos os módulos de acesso ao hardware
também foram inseridos na thread de baixa prioridade.
Para a comunicação entre as tarefas foi utilizado o método de memória compartilhada,
definindo uma área, ou buffer de comunicação, onde os sensores escrevem as informações pré-
modeladas do mundo real, que serão utilizadas pelas camadas de comportamento da arquitetura.
Basicamente funcionando em uma dinâmica do clássico problema produtor-consumidor. O
mesmo método foi adotado para a interação entre a arquitetura de subsunção e o módulo de
atuadores.
54
Da solução tradicional do problema produtor-consumidor os semáforos puderam ser adotadas
algumas simplificações drásticas na solução tradicional do problema produtor-consumidor
(praticamente descaraterizando-o de sua essência), que foi a eliminação dos semáforos, pois sua
utilização é irrelevante, para garantira a corretude de funcionamento do sistema, devido a
características bem particulares do domínio do problema sobre a sequência, integridade, e
condições de corrida sobre o buffer de comunicação.
A sequência de mensagens não chega a ser uma questão importante pois a dinâmica da
arquitetura responde basicamente de forma reativa aos estímulos lançados no buffer de
comunicação, portanto o que realmente importa é a resposta rápida do que atualmente está no
buffer, e não o que esteve. O fato de responder a todos os estímulos sem perda, é uma restrição
não crítica de tempo real, pois é desejável, mas não obrigatória.
A integridade da informação é garantida desde que o transporte dos dados ocorra de forma
atômica, o que ocorre na transferência de um valor com um tamanho menor ou igual a largura
do barramento de dados do processador, que no domínio em questão é de 32 bits. Como na
definição do projeto todas as informações foram apresentadas de forma discreta e enumerável, a
integridade é garantida desde que o tamanho do conjunto enumerável seja menor do que 232.
As condições de corrida também são evitadas a medida que só existe um produtor para cada
buffer de comunicação, o que também pode ser implementado sem infringir as definições do
projeto. No caso dos sensores a unicidade é garantida de forma inerente à definição do projeto,
pois existe somente um módulo responsável pela modelação do sensor. Para o módulo de
atuação a unicidade não pode ser garantida em termos de interação entre módulos, pois todas as
camadas escrevem de forma independente no módulo de atuadores, porém ela pode ser
garantida de forma temporal, obrigando o módulo de atuadores a somente modificar a saída
após a execução de todas as camadas, o que é efetivado com a inclusão do tratamento dos
atuadores, junto a thread de alta prioridade, onde está a arquitetura de subsunção.
A execução principal do programa foi definida de acordo com o diagrama da figura 31, com
três threads existentes no sitema, sendo a responsável pela atualização das camadas
comportamentais a thread de alta prioridade. A terceira thread é colocada para um controle
sobre o software, oferecendo um menu com opções de saída do programa e calibração do
mesmo.
55
Figura 31: Tarefas principais do sistema.
O código fonte a referente a função principal, pode ser observado na figura 32. O programa
inicia com a declaração das threads (subsuncao, mediadores e menu), seguido da inicialização
dos módulos e das threads, e do escalonamento da thread principal para a fila de preempção de
threads. Por fim o programa espera a finalização de todas as thread e finaliza todos os módulos
utilizados, desativando os dispositivos periféricos do hardware.
56
(...)14 struct tcb *thSub, *thMed, *thMen;15 void subsuncao();16 void mediadores();17 void menu();18 19 int main() {20 int err, myId;(...)24 OSMTInit(PREEMPT);25 26 err = comunicacao_init();27 if (err) LCDPutString("Radio Error\n");28 err = visao_init();29 if (err) LCDPrintf("Vision Error:%d\n", err);30 err = navegacao_init();31 if (err) LCDPrintf("Motor Error:%d\n", err);32 err = chute_init();33 if (err) LCDPutString("Kicker Error\n");34 sensores_init();35 procurar_init();36 desviar_init();37 chutar_init();(...)42 thSub = OSSpawn("camadas", subsuncao, 16384, MAX_PRI, 1);43 thMed = OSSpawn("mediadores", mediadores, 500000, MIN_PRI, 2);44 thMen = OSSpawn("menu", menu, 8192, MIN_PRI, 3);45 OSReady(thSub);46 OSReady(thMed);47 OSReady(thMen);48 OSPermit();49 OSReschedule();50 51 chute_release();52 navegacao_release();53 visao_release();54 comunicacao_release();55 sensores_release();56 return 0;57 }(...)
Figura 32: Código da execução principal do programa (main.c).
Cada thread é mostrada com seus serviços na figura 33, com o respectivo código na figura 34,
evidenciando a separação da execução dos módulos da execução das máquinas de estado
referentes aos comportamentos.
57
(a)
(b)
(c)
Figura 33: (a) Thread mediadores. (b) Thread Subsuncao. (c) Thread Menu.
(...)72 void mediadores() {73 while(1) {74 comunicacao();75 visao();76 sensores();77 }78 }(...)
(...) 59 void subsuncao() {60 while(1) {61 procurar();62 desviar();63 chutar();64 carregar();65 fazergol()66 67 navegacao();68 chute();69 }70 }(...)
(...)80 void menu() {81 while(KEYRead() != KEY4) {82 OSSleep(10);83 }84 LCDSetPos(6,0);85 LCDPrintf("Menu living!!");86 OSKill(thMed);87 OSKill(thSub);88 OSKill(0); // self89 }
Figura 34: Código das threads (main.c).
4.1.2.Programação Modular
Para a implementação do sistema foi selecionada a linguagem de programação C [KR78],
atualmente todos os softwares projetados dentro da UFSC para a plataforma EyeBot estão nesta
linguagem, assim como os exemplos disponibilizados pela página e pelo pacote de instalação.
58
Uma decisão conservadora, mas que para o estágio inicial de desenvolvimento contribuiu na
forma de suporte, sobre a utilização dos módulos de hardware e das funcionalidades específicas
ao sistema operacional do robô, encontrada nos projetos já implementados na UFSC e no
mundo que seguem a tendência do uso desta linguagem para a plataforma em questão.
A engenharia de software passou por uma série de paradigmas de programação, evoluindo da
programação não estruturada até os diversos paradigmas existes hoje em dia, passando pela
programação estruturada [Dij69], programação modular [Den73], programação orientada a
objetos [Abb83], programação orientada a sujeitos [HO93] e programação orientada a aspectos
[KLM97].
O mais alto nível de abstração que a linguagem C consegue expressar, é a programação
modular, que em C apresenta a estrutura nas figuras 35 e 36, onde o programa é separado em
dois arquivos, o primeiro apresentando a declaração das funçôes e variáveis acessadas por
todos, e o segundo declara as funções e variáveis escondidas do resto do projeto, e também
implementa as funções do próprio módulo.
/* * Modulo responsavel para servir de exemplo para uma estruturacao * comum de todos os modulos respectivos ao sistema. */
#ifndef __TEMPLATE_H#define __TEMPLATE_H
// public: ----------------------------------------------------------//-------------------------------------------------------------------struct TemplateRegister { int message;} tplReg;
enum TemplateMessages { tplMSG1, tplMSG2, tplMSG3};
int template_init();void template_release();void template();//-------------------------------------------------------------------#endif
Figura 35: Um modelo padrão para o header.
59
#include "Template.h"
// private: ---------------------------------------------------------//-------------------------------------------------------------------static const int NUM_ONE = 1;static const int NUM_TWO = 2;
static int internat;
static void do_nothing(void);//-------------------------------------------------------------------//-------------------------------------------------------------------
// module functions: ------------------------------------------------//-------------------------------------------------------------------int template_init() { return 0;}//-------------------------------------------------------------------void template_release() {}//-------------------------------------------------------------------void template() {}//-------------------------------------------------------------------static void do_nothing(void) {}//-------------------------------------------------------------------//-------------------------------------------------------------------
Figura 36: Um modelo padrão para o “corpo” do módulo.
4.1.3.Arquitetura do Software
A arquitetura final foi defnida como mostra a figura 37, em um diagrama de desenvolvimento,
onde fica claro que cada módulo é responsável por um periférico de hardware, e possui sua
caixa de mensagens onde as camadas da arquitetura de subsunção escrevem em lêem
respectivamente os sinais de sensores e os comandos para os atuadores.
Como o servo da câmera é somente utilizado pelo módulo da visão, fica ele responsável tanto
pela câmera como pelo servo motor que regula o ângulo de visão. Sendo este módulo de entrada
e saída de informações como o módulo de comunicação que é responsável pelo controle do
rádio.
60
Figura 37: Arquitetura do software
4.1.4.Máquinas de Estado Finito
As máquinas de estados segunda as definições da UML permitem diversas funcionalidades
como ações na entrada de estados, ações na saída de estados, ações de estado e testes
condicionais para a transição de estado e gatilhos de ações.
Como um modo de simplificar a implementação o projeto foi definido somente com ações de
transição, uma vez que este modelo equivale em expressividade ao modelo da UML. A
codificação segundo [Wol01] de uma máquina de estados em uma estrutura switch() e case de
um nível é mostrada nas figuras 38 e 39, onde e cada ação declarada como privada dentro do
próprio módulo responsável pela execução desta.
61
// private: ---------------------------------------------------------//-------------------------------------------------------------------static void action_dothis(void);static void action_doelse(void);//-------------------------------------------------------------------//-------------------------------------------------------------------
//-------------------------------------------------------------------//-------------------------------------------------------------------// #################### MACHINE STATE ACTIONS #####################//-------------------------------------------------------------------//-------------------------------------------------------------------static void action_dothis(void) {}//-------------------------------------------------------------------static void action_doelse(void) {}//-------------------------------------------------------------------//-------------------------------------------------------------------
Figura 38: Modelo das ações de uma máquina de estados.
//-------------------------------------------------------------------//-------------------------------------------------------------------// ######################## MACHINE STATE #########################//-------------------------------------------------------------------//-------------------------------------------------------------------void fms_update(void) {
static enum fmsState { FIRST, SECOND } state = FIRST;
switch (state) { case FIRST: // if (condition) { // state = NEXT_ONE; // action_some(); // break; } break; case SECOND: if (something) { state = SECOND; action_dothis(); break; } break; default: state = FIRST; }}
Figura 39: Modelo de uma máquina de estados.
62
4.2 Camadas de Subsunção
O comportamento Carregar Bola possui um sistema realimentado que tem por finalidade
perseguir a bola, ele foi implementado de acordo com a figura 40, onde a função módulo, que é
uma função cara dentro de sistemas embarcados, pode ser substituída por um desvio
condicional simples, que é executado em 2 ciclos de clock, enquanto a função modular de um
valor fora da base 2 precisa de uma divisão em software para ser executada.
(...) 33 static void action_perseguir() { 34 float x, angulo; 35 x = visReg.xbola - 30; 36 if (x <= -5 && x >= 5) { 37 navReg.navWSpeed = 0; 38 } 39 else { 40 angulo = atan(visReg.ybola/x); 41 if (angulo > 0) 42 angulo = M_PI/2 - angulo; 43 else 44 angulo = -(M_PI/2 + angulo); 45 navReg.message = navDIRECT; 46 navReg.navWSpeed = -angulo; 47 } 48 LCDSetPos(3,9); 49 LCDPrintf("%2.3f", navReg.navWSpeed); 50 navReg.navVSpeed = 0.1; 51 navReg.message = navDIRECT; 52 }(...)
Figura 40: Algoritmo de realimentação para perseguir a bola
O valor de erro da função de realimentação ficou da seguinte forma:
Figura 41: Erro angular da bola aplicado na correção
63
30 40 50 60 70 80 90 100 110 120 130 140 150
-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
Angulo
Cor
reca
o an
gula
r
4.3 Módulos
4.3.1.Visão
Para a constante do fator de correção de profundidade necessário no algoritmo de visão foi
utilizada a tabela da figura 42, produzindo um fator com o gráfico mostrado na figura 43a. A
saturação ao final do gráfico se deve a distâncias grandes da bola, pois a continuação da função
permitiria pontos de 1 pixel da cor laranja a serem identificados como bola, e que na realidade
são ruídos do meio de conversão. A figura 43b mostra a quantidade de pixels necessários para a
identificação da bola de acordo com sua altura, representada pelo eixo das ordenas da matriz de
um frame da câmera.
(...) 9 static float yfact[82] = 10 { 0.0017, 0.0017, 0.0018, 0.0018, 0.0018, 0.0018, 0.0019, 0.0019, 11 0.0019, 0.0019, 0.0020, 0.0020, 0.0020, 0.0021, 0.0021, 0.0022, 12 0.0022, 0.0022, 0.0023, 0.0023, 0.0023, 0.0024, 0.0024, 0.0025, 13 0.0026, 0.0026, 0.0027, 0.0027, 0.0028, 0.0028, 0.0029, 0.0029, 14 0.0030, 0.0030, 0.0031, 0.0031, 0.0032, 0.0033, 0.0033, 0.0034, 15 0.0034, 0.0035, 0.0035, 0.0036, 0.0036, 0.0037, 0.0038, 0.0039, 16 0.0040, 0.0043, 0.0045, 0.0048, 0.0050, 0.0054, 0.0058, 0.0061, 17 0.0065, 0.0069, 0.0080, 0.0093, 0.0100, 0.0106, 0.0110, 0.0124, 18 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 19 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 0.0124, 20 0.0124, 0.0124 };(...)
Figura 42: Matriz de correção usada no software (visao.c).
(a) (b)Figura 43: (a) Fator de correção aplicado ao tamanho do objeto. (b) Resultado da correção
para um objeto de 2cm.
64
A figura 44 apresenta o código de conversão do espaço de cores RGB para a coordenada hue do
espaço de cores HSV. É a função de maior consumo de processamento, devido a sua repetição
de 4800 vezes devido ao tamanho de um frame de video da câmera. Com esta estrutura o
algoritmo de conversão executa em cerca de 100ms, levando um terço do tempo necessário para
a aquisição de um novo frame, evidenciando sua eficiência e inclusive mostrando a capacidade
que o sistema ainda possui para o processamento de mais código.
(...)239 #define MIN(a,b) (a<b?a:b)240 #define MAX(a,b) (a>b?a:b)(...) 244 int RGBtoHue(BYTE r, BYTE g, BYTE b)245 {246 int hue, delta, max, min;247 248 max = MAX(r, MAX(g,b));249 min = MIN(r, MIN(g,b));250 delta = max - min;251 252 if (2 * delta <= max)253 return NO_HUE;254 if (r == max) hue = 42 + (42*(g-b)) / delta; /* 1*42 */255 else if (g == max) hue = 126 + (42*(b-r)) / delta; /* 3*42 */256 else /*(b == max)*/ hue = 210 + (42*(r-g)) / delta; /* 5*42 */257 /* now: hue is in range [0..252] */258 return hue;259 }(...)
Figura 44: Código da conversão de RGB para Hue (visao.c).
4.3.2.Comunicação
Para a comunicação a linha EyeBot possui uma unidade de comunicação sem fio para uma
conversação entre robôs, permitindo o estabelecimento de um plano, recepção das intenções ou
comandos de outros robôs ou uma seqüência de instruções vindas de estações de trabalho
controladas por humanos. O sistema operacional gerencia uma rede virtual tipo token ring com
aspectos de tolerância a falhas. A rede, denominada EyeNet, possibilita um numero ilimitado de
Robôs conectados e uma estação de trabalho opcional. A comunicação é realizada em 8 bits e
todos os pacotes possuem um checksum para detecção de erros, porém é não confiável pois não
oferece mecanismos de retransmissão de pacotes perdidos. A garantia de envio deve ser
gerenciada em uma camada mais acima.
O sistema operacional oferece as funções RADIOInit() e RADIOTerm() para ligar/desligar o
módulo de rádio, RADIOSend(), RADIOCheck() e RADIORecv() para o envio/recebimento de
65
pacotes. Como o modulo de rádio funciona conectado em uma porta serial, o sistema oferece
outras 3 funções para configurações de E/S, RADIOGetioctl(), RADIOSetIoctl() e
RADIOGetStatus().
4.3.3.Sensores
A família SoccerBot é equipada com 3 módulos PSD (Position Sensitive Detection) para
medição de distâncias e uma câmera colorida. Os sensores de distância são dispositivos
infravermelhos fabricados pela empresa Sharp, sob código de GP2D02, como solução de baixo
custo e que operam somente à distâncias entre 10 e 50cm e segundo a vários motivos podem
gerar falsas medições em alguns momentos. Sua curva característica pode ser obtido da folha de
dados do fabricante e pode ser visto na figura 45.
Figura 45: Fator de erro dos sensores de distância.
A conversão dos valores analógicos do sensor de distância para os valores discretos usados
dentro das camadas é mostrada na figura 46, onde os sensores laterais possuem os valores de
limiar nas linhas 7 e 8 do código, e o sensor frontal, por estar montado mais dentro do corpo do
robô possui valores diferenciados nas linhas 9 e 10.
66
(...) 7 static const int LIMIAR_ALTO = 120; 8 static const int LIMIAR_BAIXO = 90; 9 static const int LIMIAR_ALTOFRONTAL = 150;10 static const int LIMIAR_BAIXOFRONTAL = 120;(...)34 void sensores() {35 int dist;36 37 if ( !PSDCheck() )38 return;39 40 // Sensor Frontal41 dist = PSDGetRaw(psd_front);42 if ( dist > LIMIAR_ALTOFRONTAL ) senReg.SensFrontal = sLONGE;43 else if(dist>LIMIAR_BAIXOFRONTAL)senReg.SensFrontal = sMEDIO;44 else senReg.SensFrontal = sPERTO;45 46 // Sensor Direita47 dist = PSDGetRaw(psd_left);48 if ( dist > LIMIAR_ALTO ) senReg.SensEsquerda = sLONGE;49 else if ( dist > LIMIAR_BAIXO ) senReg.SensEsquerda = sMEDIO;50 else senReg.SensEsquerda = sPERTO;51 52 // Sensor Esquerda53 dist = PSDGetRaw(psd_right);54 if ( dist > LIMIAR_ALTO ) senReg.SensDireita = sLONGE;55 else if ( dist > LIMIAR_BAIXO ) senReg.SensDireita = sMEDIO;56 else senReg.SensDireita = sPERTO;57 }
Figura 46: Conversação do estado dos sensores feita pelo módulo de sensores (sensores.c).
4.3.4.Navegação
O SoccerBot possui dois motores DC controlados pelos módulos de PWM do microcontrolador,
cada motor possui um encoder conectado conectado ao seu eixo permitindo uma realimentação
de velocidade e um controle PI pelo sistema operacional. Dessa forma a velocidade pode ser
controlada de forma mais precisa, porém como as duas rodas não possuem as mesmas
características não é possível garantir um controle de posição do robô confiando unicamente na
informação advinda destes sensores.
Os parâmetros de P e I, dos controladores PI, foram obtidos de forma deliberativa, segundo a
noção qualitativa da influência de cada parâmetro, que o método de ajuste pela resposta a um
degrau juntamente com técnicas para calibração de sistemas de controle PID em campo
[Oga98] oferece.
Para o controle dos motores DC, o RoBIOS oferece as funções MotorInit() e MotorRelease(),
para inicializar e desligar respectivamente os controladores, e MotorDrive() para alterar a
velocidade e direção dos motores.
67
A plataforma possui mais 4 saídas para controle de servo motores, das quais uma é utilizada
para controle do mecanismo de chute instalado na parte frontal do robô e outro no
posicionamento da câmera, que possui uma rotação lateral imitando o movimento de uma
cabeça para os lados. Para controle dos servo motores, o sistema operacional possui as funções
SERVOInit() e SERVORelease() para ligar/desligar respectivamente os módulos de controle, e a
função SERVOSet() que ajusta o ângulo de posicionamento do servo em questão.
68
(...) 6 static const int CTR_P_ESQ = 6; 7 static const int CTR_I_ESQ = 0.45; 8 static const int CTR_P_DIR = 6; 9 static const int CTR_I_DIR = 0.1; 10 11 static const int PARADO = 0; 12 static const int BAIXA = 3; 13 static const int ALTA = 5; 14 static const int MAX = 7;(...) 37 VWStartControl(vw,6,0.45,6,0.1);(...)(...) 68 switch(lastMsg) { 69 case navPARAR: 70 s.v = 0.0; s.w = 0; 71 VWSetSpeed(vw,s.v,s.w); 72 break; 73 case navDIRECT: 74 s.v = navReg.navVSpeed; 75 s.w = navReg.navWSpeed; 76 VWSetSpeed(vw, s.v, s.w); 77 break; 78 case navFRENTELENTO: 79 s.v = 0.3; s.w = 0; 80 VWSetSpeed(vw, s.v, s.w); 81 break; 82 case navFRENTE: 83 s.v = 0.4; s.w = 0; 84 VWSetSpeed(vw,s.v,s.w); 85 break; 86 case navFRENTERAPIDO: 87 s.v = 0.6; s.w = 0; 88 VWSetSpeed(vw, s.v, s.w); 89 break; 90 case navREH: 91 s.v = -0.4; s.w = 0; 92 VWSetSpeed(vw,s.v,s.w); 93 break; 94 case navGIR_HORLENTO: 95 s.v = 0.0; s.w = -0.5; 96 VWSetSpeed(vw,s.v,s.w); 97 break; 98 case navGIR_HOR: 99 s.v = 0.0; s.w = -0.7;100 VWSetSpeed(vw,s.v,s.w);101 break;102 case navGIR_AHORLENTO:103 s.v = 0.0; s.w = 0.5;104 VWSetSpeed(vw,s.v,s.w);105 case navGIR_AHOR:106 s.v = 0.0; s.w = 0.7;107 VWSetSpeed(vw,s.v,s.w);108 break;109 default:110 s.v = 0.0; s.w = 0;111 VWSetSpeed(vw,s.v,s.w);112 break;113 }(...)
Figura 47: Conversão das mensagens de navegação para os motores (navegação.c).
69
4.3.5.Controle Remoto
Antes do desenvolvimento dos comportamentos foram realizados testes sobre os módulos de
hardware oferecidos pelo robô, afim de garantir o funcionamento, enfrentar eventuais
dificuldades de utilização antes do desenvolvimento dos comportamentos e levantar as
condições e limitações reais do periférico em questão para o desenvolvimento de um software
“sintonizado” com o hardware.
O primeiro componente de hardware testado, foi o módulo de rádio, a fim de testar a
comunicação entre os robôs e entre um robô e o computador. Para o teste foram utilizados dois
programas exemplos disponibilizados pelo pacote do próprio EyeBot, são eles eye2pc e
eye2eye, por serem programas simples a análise de como utilizar o rádio foi bastante simples. O
primeiro programa faz uma comunicação entre um SoccerRobot e um microcomputador onde
se estabelece uma repetição infinita em cada um dos códigos onde a estação espera por uma
mensagem, que é somente um número, soma ela em uma unidade e reenvia para quem mandou,
enquanto que o robô faz o caminho inverso, primeiro envia a mensagem, espera por uma
resposta e soma um para reenvio.
Após o teste da comunicação via rádio, foi iniciado o desenvolvimento do controle remoto do
robô, para a implementação foi selecionada a ferramenta RAD (Rapid Application
Development) C++ Builder da Borland devido ao fácil acesso de seus componentes visuais na
construção da interface gráfica. O maior problema de utilizar a IDE da Borland é que as
bibliotecas reconhecidas pelo seu compilador possuem um formato diferente das bibliotecas
geradas pelo GCC, que é o cross-compiler (para o processador embarcado do EyeBot M68332
da Motorola), utilizado pela Universidade de UWA no desenvolvimento do RoBIOS e as
bibliotecas para criação de aplicações usando as funcionalidade do SO. A solução foi a
conversão de bibliotecas sugerida por Norlander [Nor06], onde é realizada a criação de uma
biblioteca dinâmica (dll) no formato reconhecido pelas aplicações de Windows, e
conseqüentemente utilizável pelo o compilador de C++ da Borland.
O controle desenvolvido é mostrado na figura 48, que possui basicamnte 5 campos com funções
distintas. Em sua parte superior é configurada a porta serial em que a antena do host está
conectada, informada em vermelho quando a conexão não pode ser estabelecida e o periférico
não está pronto, e com fundo branco quando a comunicação pode ser efetuada. Logo ao lado
existem duas indicações de transmissão e recepção de pacotes no módulo de antena.
70
Os comando de controle fornecem as opções de iniciar e finalizar o jogo através do botão Game
e habilitar e desabilitar o modo de funcionamento remoto através do botão Remote. Este modo
habilida os botões a baixo dele que fornecem as mensagens responsáveis pelo controle a
distância do robô, com comando simples de frente, ré, giro para direita, gira para esquerda, e
chute. Alguns comandos de técnico também estão disponíveis, como mandar se movimentar
para o canto esquerdo da área (posição defensiva 1) através do botão LFT, e para o canto direito
da área (posição defensiva 2) através do botão RGT. O botão DEF avisa aos robôs para tomar a
posição defensiva dentro do campo.
A direita existem três botôes responsãveis pelo selecionamento de cada robô, e o botâo com
uma seta abre o menu da figura 48b, ativando o modo promiscuo, onde todas as mensagens
entre robôs e entre robô e central são impressos.
(a)
(b)Figura 48: (a) Controle Remoto do SoccerBot. (b) Janela estendida para observação da
comunicação de rádio.
71
5 Conclusão
No desenvolvimento do projeto foram encontradas dificuldades relacionadas ao hardware,
utilização do sistema operacional do robô e no desenvolvimento dos autômatos referentes aos
comportamentos de cada camada na arquitetura de subsunção.
As principais dificuldades encontradas no hardware foram em relação a câmera e ao sensores. A
Câmera possui uma taxa de amostragem muito baixa reflete em uma baixa atualização no
sistema das informações de posse de bola e lado do campo através da identificação da core dos
gols. E os sensores apresentam uma resposta não linear e nem monotônica o que acarreta em
informações não realistas em certos casos onde o obstáculo está muito perto do robô. Outros
inconvenientes foram encontrados, como o mal contado e baixa carga das baterias, e os
conectores dos servos também com mal contado, porém estes não apresentaram um impecílio
no desenvolvimento e inclusive os sensores foram arrumados.
No aprendizado do sistema operacional houve uma certa latência devido a falta de
documentações mais elaboradas e códigos simples de exemplos referentes a utilização de certos
conjuntos de funções. Algumas funções são apresentadas de forma tão simplista na
documentação que gerou a necessidade de elaborar um programa exemplo para a verificação de
sua efetiva semântica. A falta de acesso ao código fonte do sistema operacional podem causar
demora na correção de bugs, e não permitem otimizações realizadas pelos desenvolvedores de
aplicação para os robôs EyeBot. Porém a utilização do GCC como compilador cruzado para a
arquitetura M68K da Motorola, diminui o tempo de desenvolvimento de um programa pois
72
possui suporte completo ao padrão da linguagem e não restringe o desenvolvimento a um
sistema operacional de mercado, devido ao porte à diferentes arquiteturas.
A elaboração dos autômatos apresentaram um tempo de desenvolvimento no projeto
comparável a praticamente todo o período de projeto da arquitetura e dos módulos somado ao
período de implementação, caracterizando a dificuldade de decompor um problema grande,
jogar uma partida de futebol, em máquinas de estado representando problemas menores.
Levando em consideração a simplificação do domínio já representada por comportamentos,
executados em um jogo efetivo, dentro de uma arquitetura de Subsunção. O tempo se deve
principalmente a dificuldade de expressar quais os estados em que o comportamento pode estar,
assim como as ações que devem ser tomada, usando somente os sensores de distância
informações simples da imagem adquirida, que não precisam complexidade no processamento
de imagem
O desenvolvimento do projeto foi impulsionado por um certo estímulo adicional, que foi a
participação no campeonato nacional da RoboCup, que apesar de não ter retornado com
resultado interessantes das partidas, derrota por 8x0 e 10x0, trouxeram observações construtivas
para a determinação de desenvolvimentos futuros, definição de novas metas e reflexão das
decisões tomadas sobre o projeto elaborado. Por exemplo, nas partidas ocorreram um grande
número de choques entre robôs e uma demora excessiva na procura da bola, que se deve à alta
movimentação dos robôs adversários e velocidade na trajetória da bola, respectivamente, que
evidenciam componentes de alta dinâmica em uma partida de futebol.
A quantidade de colisões refletem alterações necessárias em hardware, como maior número de
aquisições de imagem e maior velocidade nos motores, para a realização de respostas reativas
em menor tempo ao ambiente. Já a procura da bola sugere a investigação de técnicas mais
apuradas de software (como auto-localização no ambiente e cooperação de tarefas), que podem
ser exploradas pelos robôs para a finalidade de encontrar a bola, realizando uma coordenação
entre eles para a procura em regiões distintas, e para o compartilhamento de informações como
a localização da bola. Dessa maneira é evitada a execução de tarefas redundantes entre os robôs
(no caso da procura da bola em uma mesma região), que na concepção atual do projeto, elas são
realizadas de forma extremamente individualista, apresentando um baixo desempenho na
disputa de partidas.
Além do desenvolvimento de técnicas de cooperação e localização no espaço, também puderam
73
ser observadas as necessidades de inclusão de um sistema de previsão de trajetórias,
recuperação ao ficar preso e algumas alterações no sistema de visão. Um sistema de previsão da
trajetória de objetos para o melhoramento das ações de perseguir e carregar a bola, visando
também suprir as limitações da câmera que oferece uma baixa taxa de amostragem das imagens
do ambiente. Um comportamento pode ser adicionado a fim de tentar resolver o problema de o
robô ficar preso em outros robôs ou em algum canto do campo, fato que ocorreu varias vezes
durante a realização das partidas. E o sistema de visão pode ser melhorado, uma vez que o
algoritmo atual ainda permite mais processamento sem degradação das respostas reativas do
sistema, afim de inserir melhorias no sistema de identificação de objetos, se aproveitando de
filtros de ruído ou algoritmos de segmentação, inserir algoritmos para identificação de
obstáculos permitindo cálculo de trajetórias, auxiliando o sistema de navegação. Para a A
inclusão de um módulo de previsão
Outro inconveniente encontrado foi a baixa persistência do robô em disputar a bola, pois a ação
de seguir a bola era constantemente interrompida pelo comportamento reativo de procurar bola,
pois o estímulo necessário para a atuação dessa ação é a a não presença da bola no campo de
visão, que ocorre de forma bastante frequente mediada que outros jogadores passam na frente
ou a bola sai do campo de visão, gerando uma grande quantidade de ruído interna fazendo com
que o robô intercale tarefas de forma indesejável, deixando assim de executar a ação pertinente
que é a de perseguir a bola. Entre todas as consequências observadas, talvez essa seja a de
maior significância referente ao reflexo do modelo adotado pelo projeto na performance do
robô durante as partidas realizadas, pois explícita a dificuldade de expressar na forma
puramente reativa comportamentos que sugerem uma ação não dependente exclusivamente de
estímulos sensoriais, mas também de comportamentos realizados no passado. Essa
característica reflete diretamente a introdução no sistema de modelos mais elaborados de
processos cognitivos, como planejamentos e decisões de alto nível.
De forma geral o desenvolvimento do projeto contribuiu de uma forma construtiva, reunindo
estudos em disciplinas bem diferenciados como inteligência artificial, visão computacional e
sistemas embarcados, o que é inerente dentro da pesquisa e desenvolvimento em robótica por
ser uma área em que a informática, eletrônica e mecânica se fundem, trazendo desafios
interdisciplinares bastante motivadores e interessantes a serem superados. Entre eles a
realização de uma partida de futebol robótico totalmente autônomo.
74
Referências
[Abb83] ABBOTT, R.J., Program Design by Informal English Descriptions, CACM, vol. 26, nº 11, novembro de 1983, pp. 882-894.
[App04] APPELL, David. O pai do Spirit e do Opportunity. Scientific American Brasil, São Paulo, ano 2, n. 30, p. 20-21, nov. 2004.
[Ark98] R. C. Arkin. Behavior Based Robotics. The MIT Press, Cambrige-Massachusetts, 1998
[Bra04a] BRAUNL, Thomas; GRAF, Birgit. Autonomous mobile robots with on-board vision and local intelligence. Disponível em: < http://robotics.ee.uwa.edu.au/papers/AutMobRob-1999.pdf>. Acesso em: 26 novembro 2004.
[Bra04b] BRAUNL, Thomas. EyeBot: A family of autonomous mobile robots. Disponível em:< http://robotics.ee.uwa.edu.au/papers/EyeBotFamily-1999.pdf>. Acesso em: 26 novembro 2004.
[Bro85] Rodney A. Brooks. A Robust Layered Control System for a Mobile Robot. Massachusetts Institute of Technology. Setembro, 1985
[Bro86] Rodney A. Brooks. Achieving Artificial Intelligence Through Build Robots. Massachusetts Institute of Technology. Maio, 1986.
[Bro90] Rodney A. Brooks. Elephants Don't Play Chess. In Maes, P. (ed.) Designing Autonomous Agents. MIT Press, paginas 3-15, 1990.
[Bro91] Rodney A. Brooks. Inteligente Without Reason. Computers and Thought. Abril 1991
[Bur97] BURO, Michael. The Othello Match of the Year: Takeshi Murakami vs. Logistello , ICCA Journal 20(3) 1997, 189-193
[Den73] DENNIS, J. Modularity. Advanced Course on Software Engineering (F. L. Bauer, ed.), Springer-Verlag, 1973, pp. 128-182.
[Dij65] DIJKSTRA, E.W. Cooperating sequential processes. In: Genuys, F. (ed.) Programming languages. Londres: Academic Press, 1965.
[Dij69] Edsger Wybe Dijkstra. Notes on Structure Programming. In Structured Programming. Academic Press. Londres, UK, 1969.
[Per06] Anderson L. F. Perez, et. al. Arquitetura de Controle do Time de Futebol de Robôs UFSC-Team Categoria Very Small. Congresso Sociedade Brasileira de Computação. Julho de 2006
[FIR06] FIRA. FIRA | Federation of International Robot-soccer Association. Disponível em: <http://www.fira.net/>. Acessado em: 22 julho 2006.
[Fol06] FOLDOC. The Free On-line Dictionary of Computing. Disponível em: <http://foldoc.org>. Acessado em 22 julho 2006.
[Gib04a] GIBBS, W. Wayt. Uma nova geração de robôs. Scientific American Brasil, São Paulo, ano 2, n. 22, p. 36-45, mar. 2004.
[Gib04b] GIBBS, W. Wayt. Do fim ao começo. Scientific American Brasil, São Paulo, ano 2, n. 28, p. 20-21, set. 2004.
[HO93] William H. Harrison, Harold Ossher. Subject-Oriented Programming (A Criteria os Pure Objects). In Proceeding of the 8th Conferece of Object Oriented Programming Systems Languages and Applications, p. 411-428, Washington, U.S.A., September 1993.
[Kit99] KITANO H. 1999. Preface, Special Issue: RoboCup the First Step. Artificial Intelligence 110(2); 189-191.
[KLM97] Gregor Kicczales, John Lamping, Anurag Mendhekar, Chris Maeda, Cristina Videira Lopes, Jean Mare Loingtier, John Irwin. Aspect Oriented Programming. Proceeding of the European Conference on Object-Oriented Programming '97. vol. 1241. Lecture Notes in Computer Science, p. 220-242. Jyväskylä, Finlandia, Junho 1997.
[KR84] Brian W. Kernighan e Dennis M. Ritchie. The C Programming Language. Printice-Hall. 1984.
[Nof99] Shimon Y. Nof. Handbook of Industrial Robotics. John Wiley e Sons, 2a edição. 1999.
[Nor06] Anders Norlander. Linking with Borland C. Disponível em: <http://www.cygwin.com/ml/cygwin/1998-09/msg00458.html>. Acessado em: 22 Julho 2006
[Nun02] NUNES, Luís Eugenio. On Learning by Exchanging Advice. Second Symposium on Adaptive Agents and Multi-Agent System. 2002.
[Pag04] PAGELLO, Enrico; et. al. RoboCup-2003: New Scientific and Technical Advances. AI-MAGAZINE. 81-98. Volume 25; Numero 2; 2004.
[Paz02] PAZOS, F. Automação de Sistemas e Robótica. Editora Axcel. 2002.
[RN04] RUSSEL, S. J.; NORVIG, P. Inteligência artificial. Tradução de Vandenber D. de Souza. Rio de Janeiro: Elsevier, 2004. 1025 p. Titulo Original: Artificial intelligence, 2nd ed.
[Rob04] ROBOCUP. RoboCup World Championship. Disponível em: <http://www.robocup.org/02.html>. Acessado em: 22 novembro 2004.
[Rob06] ROBOCUP. RoboCup 2006 – Bremen / Germany. Disponível em: <http://www.robocup2006.org>. Acessado em: 22 julho 2006.
[Sam67] SAMUEL, Arthur. Some studies in machine learning using the game of checkers. II-Recent progress. IBM Journal on Research and Development, 11:601-617, 1967
[Sil98] SILVA, Luciano Rottava da. Análise e programação de robôs móveis autônomos da plataforma EyeBot. Dissertação de Mestrado. 2003
[Sil06] Flávio A. Silva, et. al. Estratégia para o Controle dos Robôs Eyebot do UFSC-Team: Categoria Small Size do Futebol de Robôs. Congresso da Sociedade Brasileira de Computação. Julho de 2006
[Sim69] Herbert A. Simon. Sciences of the Artificial. MIT Press. 1969.
[Smi78] A. R. Smith, Color gamut transform pairs, in SIGGRAPH '78: Proceedings of the 5th annual conference on Computer graphics and interactive techniques. New York, NY, USA: ACM Press, 1978, pp. 12--19.
[Ten00] TENNENHOUSE, David. Proactive Computing. Communications of the ACM, 43(5):45 -50, Maio 2000.
[Tes94] TESAURO, Gerry. TD-Gammon, a self-teaching backgammon program, achieves master-level play. Neural Computation, 6(2): 215-219, 1994
[Wan05] WANGENHEIM, Aldo von. Visão Computacional. Disponível em: <http://www.inf.ufsc.br/~visao/>. Acessado em: 03 julho 2005.
[Wol01] Wayne Wolf, Computer as Componentes: Principles of Embedded Computing System Design. Morgan Kaufman. 2001
[Woo90] Wood, M. e Barrett, T. A Real-Time Primer, Embedded Systems Programming, vol 3, nº 2, pp.20-28. Fevereiro 1990.
[Zlo02] ZLOTZ, L. M., STENTZ, A. T., DIAS, M. B., THAYER, S. Market-driven Multi Robot Exploration Technical Report. CMU-RI-TR-02-02, Robotics Institute, Carmegie Mellon University, Pittsburg, PA.
[ZM06] Ricardo Zelenovsky e Alexandre Mendonça. PC: um Guia Prático de Hardware e Interfaceamento, 4ª edição. MZ Editora. 2006