Capı́tulo 1 Virtualização de Robôs Adailton de J. Cerqueira Jr., Adriano Veiga, Ayran Cruz, Camila Laranjeira, Diego G. Frı́as Suárez, Josemar R. Souza, Marco A. C. Simões, Murilo Alves, Mario Bortoli e Rafael O. Factum 1.1. Introdução Os robôs são indiscutivelmente uma das grandes invenções que dominam a ciência do século XXI. A união da robótica clássica é inteligência artificial, gerando o termo robótica inteligente, apresenta à humanidade a perspectiva de ter robôs autônomos capazes de solucionar problemas e desafios que até o momento demandam intervenção humana. Desde os sonhados e desejados robôs de apoio às atividades domésticas capazes de limpar e organizar uma residência, executar tarefas de manutenção e pequenos reparos domésticos, ou mesmo cozinhar e servir pessoas até os não menos esperados veı́culos autônomos não-tripulados, a expectativa é que todos estes artefatos sejam corriqueiros para a humanidade ao final deste século. Nos últimos anos a robótica tem apresentado grandes avanços tanto em relação à sua propriedade de autonomia e inteligência artificial quanto à sua capacidade mecânica de executar movimentos que exigem força e precisão fina. Robôs que assemelham-se a veı́culos, animais e até mesmo aqueles com anatomia semelhante aos humanos, os chamados robôs humanóides, são comuns no noticiário cientı́fico. Desde meados da década de 1990, cientistas de diversos paı́ses do mundo começaram a vislumbrar este cenário que avança nos dias atuais e reuniram-se em torno de uma iniciativa denominada Robot World Cup ou simplesmente RoboCup. A idéia era eleger um desafio padrão a ser perseguido por cientistas de todo o mundo para ser vencido por seus robôs. Em 1996 foi fundada a RoboCup Federation, uma sociedade cientı́fica responsável por organizar anualmente a copa do mundo de robôs e fomentar o desenvolvimento de sociedades com escopo nacional e continental ao redor do planeta com o mesmo objetivo. Desde então, anualmente acontece o referido evento - RoboCup - que envolve um simpósio cientı́fico tradicional com apresentações de trabalhos e contribuições cientı́ficas, debates e discussões sobre o estado da arte da robótica inteligente mas também com o viés prático através das competições cientı́ficas. O principal desafio padrão eleito na origem da RoboCup foi o futebol de robôs. Pegando carona na popularidade do esporte e unindo a isto o fato de ser um desafio que reduz a maior parte dos problemas em aberto nas demandas do mundo real, foi definido que os cientistas iriam ter como meta desenvolver até o ano de 2050 um time de robôs humanóides autônomos jogadores de futebol capazes de vencer a seleção de humanos campeã do mundo. Para atacar este complexo o problema, o mesmo foi dividido em partes que geraram as diversas ligas da RoboCup. Desta forma enquanto uma liga dedicava-se mais aos desafios impostos pela engenharia mecânica, elétrica e controle, outras ligas dedicavam-se mais às questões relacionadas à inteligência artificial, sistemas multiagentes, por exemplo. Devido às limitações do hardware dos robôs atuais, as questões mais avançadas de inteligência artifical são tratadas na liga de Simulação. Nesta liga ocorre um processo completo de Virtualização dos Robôs e de seu ambiente associado. No desafio de futebol de robôs, tanto o campo de futebol, com suas marcações, traves e bola quanto os próprios robôs são virtuais. Desta forma a liga de simulação permite reproduzir tanto robôs reais que existem atualmente permitindo a realização de diversos experimentos com custos e riscos reduzidos, quanto a simulação de robôs com capacidades de hardware ainda não disponı́veis no estado da arte de forma viabilizar o desenvolvimento da inteligência artificial que irá mover os robôs do futuro. Neste laboratório será apresentada uma visão introdutória de uma das mais populares competições cientı́ficas disputadas anualmente na RoboCup: futebol de robôs na liga de simulação 3D. Nesta competição times de robôs humanóides virtuais disputam uma partida de futebol num campo também simulado. Além dos benefı́cios conhecidos e citados da simulação, este ambiente é excelente para estudantes e cientistas que elegeram como foco central dos seus estudos as questões de controle e inteligência artificial e que pretendem deixar as disciplinas de design e engenharia dos robôs em um segundo plano. Além de ser uma plataforma ideal para as pesquisas cientı́ficas, o ambiente do futebol de robôs simulado 3D adequa-se muito bem ao aprendizado para aqueles estudantes inciantes na matéria. Também é uma excelente oportunidade para grupos de pesquisa iniciantes na área começarem a desenvolver trabalhos com baixo custo, uma vez que todo o software que suporta o ambiente é livre e gratuito, desenvolvido pela comunidade que compõe a RoboCup Federation. Inicialmente será apresentada a RoboCup com suas diversas categorias e ligas com ênfase na liga de Simulação 3D. Em seguida será exibido um passo a passo de como começar a programar um time de futebol de robôs 3D nas duas abordagens possı́veis. Ferramentas auxiliares que são fundamentais para os primeiros passos como o IFAS3D - desenvolvido pelos autores deste laboratório - e o Scilab. Utilizando estas ferramentas e mais o time base Delta3D os alunos terão a oportunidade de ter os primeiros contatos práticos com o ambiente do futebol de robôs Simulado 3D e deverão estar aptos para utilizar este ambiente como ferramenta para os seus estudos ou mesmo para inicar um projeto visando participar das competições oficiais RoboCup em nı́vel nacional ou mundial. 1.2. RoboCup A Robocup [11], originalmente chamada de Robot World Cup Initiative, teve sua origem no ano de 1997. Trata-se de uma iniciativa à pesquisa e desenvolvimento tanto da robótica, como da Inteligência Artificial, cujo incentivo é uma competição internacional composta de diversas categorias seguida de um simpósio onde os avanços cientı́ficos são apresentados e discutidos. Sua principal meta é ter em 2050 um time de futebol composto por robôs humanóides completamente autônomos que devem derrotar a atual seleção campeã do mundo. Por trás de todo o estı́mulo à competitividade está o real objetivo de tal iniciativa, dinamizar a evolução de Sistemas Autônomos Multi-Agente para futuramente desenvolver tecnologias capazes de lidar com as complexidades do mundo real, atuando social e economicamente. Ainda que inicialmente o principal foco da RoboCup tenha sido o futebol, ela conta com quatro diferentes categorias, como pode ser visto na tabela 1.1. RoboCup Categoria Liga Subliga a RoboCupHome Soccer RoboCup Junior Dance Rescue Robot league RoboCup Rescue Simulation league Middle size league Small size league RoboCup Soccer Standard Platform Humanoid league Kid-size, Teen-size e Adult Size Simulation league Simulation 2D e Simulation 3D Tabela 1.1: Tabela das ligas e subligas da RoboCup RoboCup Rescue: Para os competidores é simulado um cenário de catástrofe e seu objetivo é criar estratégias de busca e salvamento de vı́timas também simuladas. Essa categoria foi criada em 2001 devido, principalmente, ao abalo sı́smico ocorrido em 1995 no Japão. Sua aplicação prática é desenvolver soluções robóticas em ambientes que apresentem alto risco às equipes humanas de salvamento. É composta por duas ligas: • Robot League: Zonas de diferentes nı́veis de dificuldade representam um edifı́cio em ruı́nas onde vı́timas esperam por salvamento(figura 1.1). Nessa liga é requerido dos robôs mobilidade, percepção sensorial, planejamento e mapeamento da área durante o salvamento. Os robôs podem ser autônomos ou tele-operados. • Simulation League: Dotada de um ambiente mais dinâmico, aqui são também simuladas as consequências da tragédia durante o resgate, tais Figura 1.1: RoboCup Rescue: Robot League como princı́pios de incêndio, novos abalos sı́smicos e desabamentos. Além das habilidades fı́sicas, nesse caso, o robô precisa saber responder às mudanças de estado, sendo necessário um planejamento mais robusto. RoboCup Soccer: O futebol é a principal motivação da RoboCup. Esse esporte, além de ser mundialmente popular atraindo um público ainda maior, constitui também uma importante pesquisa na área de Inteligência Artificial, desenvolvendo os robôs individual e coletivamente. O ambiente dinâmico proporciona diversos desafios aos agentes, os quais precisam sempre verificar sua posição no mundo, detectar aliados e oponentes e se manter coerente com a estratégia do time. Sendo a categoria de maior expressão, o futebol de robôs tem o maior número de ligas e sub ligas. • Middle size league: As equipes competem com robôs de porte médio - entre 50cm e 90cm - completamente autônomos(figura 1.2), podendo haver comunicação entre o agente e o ambiente via sensores e entre os robôs via wireless, sem nenhum tipo de intervenção humana. Figura 1.2: Middle size League: Robô Middle size • Small size league: Inicialmente conhecida como F180 league trata-se de uma das ligas mais antigas de futebol de robôs. Os jogadores são de pequeno porte(figura 1.3), não ultrapassando 15cm de altura e 180mm de diâmetro. Duas câmeras são colocadas acima do campo, detectando o status atual da bola e do robôs, os quais são enviados aos computadores das equipes. A partir da análise dos dados o software envia ao seu time novos comandos. Figura 1.3: Small size League: Robô Small size • Standard Platform league: Nesta liga existe a padronização dos robôs, limitando a preocupação dos competidores apenas ao software. Inicialmente a disputa era entre os cachorros robóticos AIBO, da Sony, e levava o nome Four-legged league. Hoje temos os humanóides Nao, da Aldebaran Robotics (figura 1.4). Não há controle remoto de humanos ou computadores durante o jogo. Figura 1.4: Standard Platform League: Robô Nao • Humanoid league: Sendo a que mais se aproxima da meta para 2050, a liga Humanóide apresenta os desafios de maior complexidade. Os principais desafios são fazer o robô correr e chutar a bola sem perder o equilı́brio, além de desenvolver a percepção em relação à bola, aos oponentes e à sua propria localização no campo. Aqui a intervenção humana parcial é permitida. Os robôs são autônomos, mas é possı́vel que humanos reposicionem, quando autorizados pelo juiz, ou evitem quedas dos mesmos durante o jogo.É a liga mais atrativa, dada a similaridade global dos robôs com a aparência humana (figura 1.5). Divide-se em três classes de tamanho: Kid Size (30-60cm de altura), Teen Size (100-120cm de altura) e Adult Size (acima de 130cm de altura). Figura 1.5: Humanoid League: Robô KidSize • Simulation league: Esta é uma liga onde tudo é simulado, desde o ambiente até os agentes, assim o foco se mantém na Inteligência Artificial e estratégias de jogo, não havendo a preocupação com o hardware. Os agentes virtuais são inteiramente independentes, dotados de caracterı́sticas individuais. Ela divide-se em duas subligas que diferem entre si no ambiente de simulação: 2D e 3D. RoboCup@Home: Robocup@Home existe desde 2006 e é a maior competição internacional de robôs autônomos, foi criada com o objetivo de desenvolver a tecnologia de robôs autônomos e móveis em ambientes domésticos e principalmente a interação entre homem e máquina, para que esses robôs possam auxiliar as pessoas na suas tarefas cotidianas, como arrumar a casa, servir comida, etc (figura 1.6). Um dos principais fatores responsáveis por acelerar a pesquisa e desenvolvimento nessa área de pesquisa é a gama de benefı́cios que esta pode trazer, pois os robôs, nesse caso, funcionam como facilitadores do nosso cotidiano. Na competição são feitos diversos testes de performance - benchmarks - para testar o nı́vel das habilidades dos robôs em ambientes caseiros não padronizados. Dentre as áreas de foco da Robocup@Home temos visão computacional, interação e cooperação entre humano e robô, navegação e mapeamento em ambientes dinâmicos, comportamento adaptativo, normalização e integração de sistemas e reconhecimento de objetos. A cada ano a complexidade das tarefas aumenta, medindo assim o avanço das tecnologias já existentes. Figura 1.6: RoboCup@Home RoboCup Junior: É uma iniciativa educacional com o objetivo de introduzir os objetivos da Robocup a estudantes do ensino fundamental e médio. Seu foco é estimular nos jovens competidores a cooperação e a competitividade, dandolhes a chance de fazer parte de um programa internacional ainda que não tenham condições de participar das categorias de alta complexidade. Atualmente é dividida em três ligas: • Soccer: Nessa liga as equipes competem com apenas dois robôs autônomos, participando de jogos em um pequeno campo de futebol onde a bola possui um transmissor no seu interior para facilitar a sua detecção por parte dos robôs. • Dance: As equipes devem criar os robôs e programá-los para fazer uma apresentação de dois minutos de uma coreografia musical também criada por eles. O vencedor é decidido a partir de jurados que avaliam utilizando diversos critérios como programação, coreografia e etc. • Rescue: O desafio das equipes é desenvolver robôs capazes de se locomover em um ambiente, encontrar as vı́timas simuladas e enfrentar os obstáculos apresentados (figura 1.7). Todas as ações do robô são autônomas. A equipe campeã é aquela que fizer em menor tempo o maior número de tarefas bem-sucedidas. 1.2.1. RoboCup Brazil Algumas atividades da Robocup ocorrem no Brasil desde 2004 [7], entretando a Robocup Brasil só se tornou oficial em 2007. Atualmente o comitê é formado por Figura 1.7: RoboCup Junior: Rescue League pesquisadores de diversas universidades importantes do paı́s, dentre eles estão professores especializados em robótica educacional. O foco da Robocup Brasil é dinamizar o estudo da Robótica e da Inteligência Artifical no paı́s. Anualmente a Robocup Brazil promove a Competição Brasileira de Robótica (CBR) que inclui a RoboCup Brazil Open. A competição é aberta para equipes de todos os paı́ses em qualquer categoria, as competições ocorrem cada ano em um estado, sempre associadas a eventos acadêmicos, onde competidores apresentam soluções de desenvolvimento da robótica e discutem as tendências, evoluções e tecnologias da robótica inteligente. O evento acadêmico também está associado as conferências conjuntas da Sociedade Brasileira de Computação (SBC) e a Sociedade Brasileira de Automática (SBA). 1.3. Simulação 3D Na década de 90 surgiu na RoboCup a disputa de futebol de robôs simulada em um ambiente de duas dimensões. Menos de dez anos depois, começou a surgir uma nova sub liga para a categoria simulada, a 3D. O surgimento dessa nova liga se fez necessário por um simples motivo: a vida real é em 3D. No ambiente em três dimensões é possı́vel simular caracterı́sticas realı́sticas tais como gravidade, inércia, atrito, fazendo com que a Inteligência Artificial aplicada às soluções sejam ainda mais próximas à realidade. O ambiente do simulador 3D é considerado parcialmente observável, ou seja, os robôs possuem uma espécie de campo visual limitado, recebendo informações referentes apenas a essa zona. A percepção do ambiente é feita através de sensores enviados do servidor para cada agente. São inúmeros os sensores, cada qual responsável por detectar uma atividade diferente. A exemplo podemos citar o sensor auditivo. Como não é permitida a comunicação direta entre os agentes, estes são equipados de um sensor fonético, o qual recebe mensagens de 8 bytes enviadas ao servidor por outros jogadores a até 50 metros de distância. Outro bom exemplo são os sensores visuais, que a partir da versão 0.5 limitou o campo visual de 360 para 120 graus. Essas limitações fazem com que a simulação alcance um nı́vel de complexidade cada vez mais próximo do real. A primeira simulação em três dimensões era bastante similar à liga 2D(figura (a) Simulação 2D (b) Simulação 3D com esferas oni-direcionais Figura 1.8 1.8a), onde os jogadores eram representados como esferas oni-direcionais(figura 1.8b) com 0,44m de diâmetro e 75kg, sendo seu campo visual ilimitado. Com o passar dos anos, surgiu o primeiro modelo de agente simulando as caracterı́sticas humanas, conhecido como SoccerBot(figura 1.9b), este baseado no robô HOAP da Fujitsu(figura 1.9a). Como o primeiro sistema de simulação era bastante limitado, isso implicou na implementação do agente em diversos aspectos, a exemplo da falta de mobilidade da cabeça e do quadril. Com o surgimento de sistemas mais robustos, a simulação dos agentes tornou-se mais sofisticada. Além de um novo simulador, surge também um novo robô, dessa vez baseado no Nao(figuras 1.10a e 1.10b). 1.3.1. SimSpark O SimSpark [6] é o simulador oficial da subliga de Simulação 3D, é um sistema de simulação multi-agente em ambientes tridimensionais. Tem como objetivo proporcionar um alto grau de flexibilidade para criação de novos tipos de simulação. Dessa forma o SimSpark se torna uma ótima ferramenta para diferentes pesquisas referentes à sistemas multi-agentes. O SimSpark foi Baseado no Spark [12], que é um simulador genérico de fı́sica multi-agente para ambientes tridimensionais. O Spark tem sua estrutura baseada (a) HOAP-2 (b) SoccerBot Figura 1.9 (a) Robô NAO (b) Agente simulado Figura 1.10 em três componentes principais, na figura 1.11 é mostrada a interação entre estes componentes e seus fluxos de dados. Estes componentes são: • Gestor de memória e objetos; • Motor de simulação fı́sica; • Motor de simulação O componente central do sistema é chamado Zeitgeist [9], responsável por fornecer acesso a todos os servidores do simulador. Existem basicamente três tipos de objetos gerenciados pelo Zeitgeist: Objetos representando o cenário atual; objetos encapsulando a funcionalidade central do simulador e fábricas para criação de novos objetos com base em texto. Essa caracterı́stica é importante para a flexibilidade e extensibilidade, pois permite a alteração da configuração do simulador sem a necessidade de recompilar o código inteiro [12]. O segundo componente principal do Spark é o motor de simulação fı́sica. Este motor é responsável pela detecção de colisão e atualização das posições e velocidades dos objetos simulados. A principal biblioteca utilizada neste componente é o ODE - Open Dynamics Engine [17]. O Figura 1.11: Fluxo de controle e dados entre os principais componentes do simulador. Modificado de [6] terceiro componente é responsável pelo controle de loop principal do simulador e da interação entre o simulador e os agentes. Para este componente foi utilizado o middleware Spades [10]. O Spades mantém o controle dos eventos entre os agentes e o simulador. 1.3.2. Agente Simulado Atualmente a liga de Simulação 3D da Robocup utiliza como agente fı́sico uma simulação do robô Nao produzido pela empresa Aldebaran Robotics[4]. O Nao está sendo utilizado atualmente devido a mobilidade na sua arquitetura, que possui 22 graus de liberdade(figura 1.12), foram implementados 22 motores posicionados nas juntas do Nao para simular esses graus. Segundo Stuart Russel e Peter Norvig[13], um agente é uma entidade que percebe o ambiente através de sensores e atua sobre ele por meio de atuadores.Dessa forma podemos classificar os sensores como dispositivos que possibilitam o robô perceber o ambiente em que se encontra e os atuadores como dispositivos que possibilitam o robô modificar o estado desse ambiente. O SimSpark utiliza de um sistema de troca de mensagens com o agente para simular os atuadores e os sensores, estas mensagens são baseadas em uma estrutura de dados S-expresions[15]. Elas são conhecidas pela utilização na famı́lia Lisp de linguagens de programação, onde são utilizadas tanto para código, como para dados. Uma das vantagens de usar S-expressions sobre outros formatos de dados é que ela proporciona uma análise fácil e uma sintaxe compacta que é, de certa forma ainda mais legı́vel por seres humanos para fins de debug, além de minimizar o tráfego de informações na rede. Foram implementados também, sensores de visão, sensores de audição e de aceleração. Para o robô simulado foram implementados 5 tipos de sensores e 1 atuador, além das juntas. O sensor Gyrorate fornece informações sobre a orientação de um corpo. Atualmente apenas a parte superior do tronco contém o gyrorate. A mensagem contém o identificador GYR, o nome do organismo a que pertence o sensor e três ângulos de rotação. Estes ângulos descrevem a orientação do corpo em relação ao sistema Figura 1.12: Graus de liberdade das juntas do NAO de coordenadas global. Formato da Mensagem : (GYR (n <name>) (rt <x> <y> <z>)) Mensagem de Exemplo : (GYR (n torso) (rt 0.01 0.07 0.46)) O sensor Hingejoint recebe informações sobre o ângulo correspondente a um eixo simples de juntas comum. Contém o identificador HJ, o nome do sensor e o ângulo do eixo. Zero graus corresponde a corpos excessivamente alinhados. Formato da Mensagem : (HJ (n <name>) (ax <ax>)) Mensagem de Exemplo : (HJ (n laj3) (ax -1.02)) O sensor ForceResistance informa sobre a força que age sobre um corpo, atualmente ele está disponı́vel para o pé esquerdo e o pé direito (LF,RF). Contém um identificador FRP e o nome do corpo contendo dois vetores, que indicam o ponto do corpo sobre o qual a força é aplicada e a força vetorial sobre sı́ mesmo. Formato da Mensagem : (FRP (n <name>) (c <px> <py> <pz>) (f<fx> <fy> <fz>)) Mensagem de Exemplo : (FRP (n lf) (c -0.14 0.08 -0.05) (f 1.12 -0.2613.07)) O sensor de visão possui duas instâncias, a visão regular, onde a visão do robô é de 360 graus e a visão restrita(que se tornou padrão na versão 0.5), que é de 120 graus (isto é configurável no rcssserver3D.rb). A direção da visão (pan e tilt) pode ser alterado com o atuador pan-tilt. A câmera pode ir pra qualquer ângulo pan, e inclinar em torno do plano horizontal. O sensor de visão fornece uma listas de objetos visto, onde os objetos podem ser os outros robôs, a bola, ou marcadores do campo. Atualmente existem 8 marcadores no campo: um ponto em cada canto do campo e um em cada trave. Ao detectar um objeto, o sensor de visão fornece os seguintes dados: • A distância entre o jogador e o objeto. • O ângulo no plano horizontal. Zero grau sempre aponta para o gol adversário. • O ângulo latitudal. Aqui zero grau significa horizontal. Contrariamente à simulação de futebol 2D, o sistema de visão não informa a velocidade dos objetos. Objetos podem ser obstruı́dos por outros objetos (ainda não está completamente implementado). Todas as distâncias e ângulos são dados em relação à posição da câmera. A câmera está atualmente localizada no centro do tronco do robô. Os parâmetros de ruı́do do sistema de visão, são os seguintes: • Um pequeno erro de calibração é adicionado à posição da câmera. Para cada eixo, o erro é uniformemente distribuı́do entre -0,005 m e 0,005 m. O erro é calculado uma vez e permanece constante durante todo o jogo. • O ruı́do dinâmico é distribuı́do normalmente em torno de 0.0 + erro de distância + erro de ângulo (plano xy) + erro de ângulo (latitudal). erro de distância: sigma 0,0965 erro de ângulo (plano xy): sigma 0.1225 erro de ângulo (latitudal): sigma 0.1480 A mensagem do sensor de visão é iniciada com a palavra ”See” seguido pelos objetos visı́veis. Possı́veis objetos são: • Flags: Os marcadores das flags nas laterais do campo são F1L, F1R, F2L, F2R. • Goalposts: As traves de ambos os gols são G1L, G1R, G2L, G2R. • Players: O jogador P com informações adicionais (team <teamname>) (id <playerID>). Formato da Mensagem : (See (<name> (pol <distance> <angle1> <angle2>)) (P (team <teamname>) (id <playerID>) (pol <distance> <angle1> <angle2>))) Mensagem de Exemplo : ( See (F1L (pol 19.11 111.69 -9.57)) (F2L (pol 16.41 -115.88 -11.15)) (F1R (pol 46.53 22.04 -3.92)) (F2R (pol 45.49 -18.74 -4.00)) (G1L (pol 9.88 139.29 -21.07)) (G2L (pol 8.40 -156.91 -25.00)) (G1R (pol 43.56 7.84 -4.68)) (G2R (pol 43.25 -4.10 -4.71)) (B (pol 18.34 4.66 -9.90)) (P (team RoboLog) (id 1) (pol 37.50 16.15 -0.00))) O sensor de estados de jogo contém informações sobre o tempo atual da partida, que se inicia em zero a partir do KickOff em cada metade do jogo. Contém também o estado atual do jogo. A primeira mensagem recebida é um sensor adicional com informações sobre algumas das variáveis do jogo, como peso da bola e tamanho do campo. Todas as outras mensagens começam com o GS e contém o tempo atual da simulação com o valor dos segundos em float e os playmode. Possı́veis playmodes são: • PM BeforeKickOff = 0, !<before kick off: antes do jogo • PM KickOff Left = 1, !< kick off left: kick off para o time da esquerda • PM KickOff Right = 2, !< kick off right: kick off para o time da direita • PM PlayOn, !< play on: jogo regulamentar • PM KickIn Left, • PM KickIn Right, • PM CORNER KICK LEFT, !< corner kick l: corner kick para o time da esquerda • PM CORNER KICK RIGHT, !< corner kick r: corner kick para o time da direita • PM GOAL KICK LEFT, !< goal kick l: goal kick para o time da esquerda • PM GOAL KICK RIGHT, !< goal kick r: goal kick para o time da direita • PM OFFSIDE LEFT, !< offside l: offside para o time da esquerda • PM OFFSIDE RIGHT, !< offside r: offside para o time da direita • PM GameOver, • PM Goal Left, • PM Goal Right, • PM FREE KICK LEFT, !< free kick l: free kick para o time da esquerda • PM FREE KICK RIGHT, !< free kick r: free kick para o time da direita • PM NONE !< qualquer modo de reprodução. Esta deve ser a última entrada Formato de Mensagem : (GS (t <time>) (pm <playmode>)) Formato de Exemplo : (GS (t 0.00) (pm BeforeKickOff)) O sensor de estado do agente dá informações sobre o estado interno do agente. É um relatório com informações sobre o estado atual da bateria e da temperatura do agente. Formato da Mensagem : (AgentState (temp <degree>) (battery <percentile>)) Mensagem de Exemplo : (AgentState (temp 48) (battery 75)) O sensor auditivo atua servindo como um sensor fonético que recebe as mensagens faladas dos outros jogadores, pois os processos de agentes não estão autorizados a comunicar uns com os outros, somente podem trocar mensagens através do servidor simulação. Na verdade esse modelo deriva da simulação 2D e foi integrado no servidor de simulação 3D na versão 0.4. O sensor tem o seguinte formato: Formato da Mensagem : (hear <time> ‘self’|<direction> <message>) Mensagem de Exemplo : (hear 12.3 self “helloworld”) O valor do time é um número real e reflete o momento em que a mensagem foi ouvida, direction é a aparente direção en grays de onde o som foi geraado, ou self se o próprio jogador gerou a mensagem. Mensagens são formadas de caracteres baseados no ASCII[0x20, 0x7E], entre as quais os sı́mbolos alfanuméricos e operadores matemáticos podem ser encontrados por exemplo. Três caracteres estão excluı́dos desta lista: O espaço em branco e os parênteses. O sensor auditivo possui algumas limitações: 1. As mensagens são limitados a um tamanho máximo (atualmente 8bytes). 2. Mensagens faladas de uma distância máxima (atualmente 50 metros), não podem ser ouvidas. 3. O número de mensagens que podem ser ouvidos ao mesmo tempo é limitado: Cada jogador tem a capacidade máxima de ouvir uma mensagem por um time especı́fico, recebido de dois em dois ciclos (assim a cada 0,4 segundos por equipe). Existem canais separados para cada time, pois assim as equipes não são capazes de bloquear o sensor auditivo de seus adversários por sobrecarregar o canal. Se mais mensagens de jogadores de uma equipe chegam, elas são processadas na ordem de chegada, enquanto as mensagens restantes são simplesmente descartadas. O atuador de criação é utilizado pelo agente para dizer ao servidor como construir uma cena de acordo com a descrição de um arquivo de configuração passado por parâmetro. Esse arquivo é utilizado para construir toda a parte fı́sica e os sensores e outros atuadores. Formato de Mensagem : (scene <filename>) Mensagem de Exemplo : (scene rsg/agent/NAO/NAO.rsg) Após a representação do agente na simulação o mesmo deve fazer mais configurações especı́ficas como por exemplo cada agente é obrigado a registrar-se em um time e adquirir um número único de jogador. Para estas tarefas geralmente é utilizado um atuador especial chamado SoccerInitEffector. Os atuadores hingejoint são atuadores para todos os eixos com uma única junta. O primeiro parâmetro é o nome do eixo, o segundo e o terceiro são as variações dos ângulos das juntas. A ordem das juntas é a mesma dos nomes. Formato da Mensagem : (<name> <ax1> <ax2>) Mensagem de Exemplo : (lae1 2 -2.3 1.2) O comando Init é enviado uma vez por cada agente após o atuador de criação enviar o comando contando a cena. Ele registra o time e o numero do jogador. Os jogadores de uma mesma equipe devem ter o mesmo teamname e um numero diferente. Se o jogador enviar o numero 0 como playnumber o número atribuı́do a ele é o próximo número vago. O máximo de jogadores em uma equipe atualmente é 6 e uma partida pode ter no máximo 12 jogadores, entretando já existem estudos para aumentar o número de jogadores. Formato da Mensagem : (init (unum <playernumber>)(teamname <yourteamname>)) Mensagem de Exemplo : (init (unum 1)(teamname FHO)) O atuador Beam permite aos jogadores se posicionar no campo antes da partida começar, as coordenadas x e y são as coordenadas do campo onde o jogador irá começar a partida. O valor root é o ângulo de rotação do jogador, com o ângulo em zero graus a posição do robô está no eixo positivo de X e em noventa graus a posição do jogador está no eixo positivo de y. Formato da Mensagem : (beam <x> <y> <rot>) Mensagem de Exemplo : (beam 10.0 -10.0 0.0) O atuador sonoro permite aos jogadores se comunicar através de mensagens de broadcasting. A mensagem deve ser no seguinte formato para que os jogadores se comuniquem: Formato da Mensagem : (say <message>) Mensagem de Exemplo : (say “helloworld”) As mensagens são formadas por caracteres baseados na tabela ASCII[0x20, 0x7E], entre as quais podem ser encontrados por exemplo, sı́mbolos alfanuméricos e operadores matemáticos. Três caracteres estão excluı́dos dessa lista: O espaço em branco e os parênteses. Em versões anteriores existiam outros atuadores como os atuadores Driver Effector(atuador que funciona como motor do agente), Catch Effector(atuador de pegar) e Kick Effector(atuador de chute). Mais informações sobre os sensores e atuadores do SimSpark podem ser encontradas em [16]. 1.3.3. Instalando o simulador SimSpark Para a competição na categoria de simulação da RoboCup é preciso fazer a instalação do servidor. As versões antigas desse servidor continham o pacote de simulação da RoboCup 3D juntamente com o simulador SimSpark. Hoje eles são disponibiliza- dos separadamente. O simulador SimSpark conta com duas partes[16], um servidor responsável pela simulação das leis da fı́sica, tornando o ambiente o mais realı́stico possı́vel, e um monitor, para que tanto o ambiente como o agente possam ser visualizados. É importante lembrar que o rcssserver3d (RoboCup Soccer Simulator Server 3D) deve ser instalado no sistema operacional Linux, pois é nele que todos os testes e simulações são realizados além de ser o sistema usado nas competições oficiais. Abaixo temos um detalhamento de como instalar o simulador SimSpark nos principais sistemas operacionais. • Linux: Como sabemos, existem diversos sistemas baseados no Linux, serão destacados aqui, os principais usados para simulação 3D. Fedora A instalação nas versões mais recentes do Fedora tornou-se bem simples pois os pacotes para instalação do SimSpark já estão inclusos em seu repositório. O objetivo foi tornar o Fedora um sistema facilitador para o desenvolvimento de aplicações robóticas. Basta, então, apenas instalar o RoboCup Soccer Simulator Server 3D, digitando um simples comando via terminal: yum install rcssserver3d // ou // run yum install rcssserver3d rcssserver3d-devel (se você deseja desenvolver agentes usando as bibliotecas do simulador.) Ubuntu A maneira mais fácil de instalar o SimSpark e o rcssserver3d é através do repositório da RoboCup no Ubuntu. Basta apenas seguir os passos que aqui serão descritos. – Habilite os repositórios Universe e Multiverse com os seguintes comandos: $ sudo gedit /etc/apt/sources.list (Siga as instruções no arquivo para habilitar os repositórios. Não esqueça de salvar as alterações). $ sudo apt-get update – Instale os programas e bibliotecas listadas na tabela 1.2, caso não os possua. A instalação desses itens é feita via terminal, através do comando $ sudo apt-get install parâmetro desejado. – Baixe as versões mais recentes do SimSpark e do rcssserver3D. Uma maneira é utilizar o código mais recente do repositório SVN. Para isso, é usada a seguinte linha de comando: $ svn co https://simspark.svn.sourceforge.net/svnroot/simspark Programas g++ subversion cmake libfreetype6-dev libode0-dev libsdl-dev e Bibliotecas ruby1.8 ruby1.8-dev libdevil-dev libboost-dev libboost-thread-dev libboost-regex-dev Tabela 1.2: Tabela das dependências para instalação do servidor de simulação no Ubuntu – Após isso, basta configurar os pacotes instalados através dos seguintes blocos de comando: SimSpark $ cd simspark/trunk/spark $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig Rcssserver3D $ cd trunk/rcssserver3d $ mkdir build $ cd build $ cmake .. $ make $ sudo make install $ sudo ldconfig – Agora você está pronto para rodar simulações 3D no Ubuntu. • Forma Genérica: Para qualquer dos sistemas Linux, basta seguir os passos genéricos descritos abaixo, lembrando sempre que em cada sistema esses passos funcionam de uma maneira especı́fica. – Primeiro baixe o Ruby, preferencialmente a versão 1.9, configurando com o parâmetro –enable-shared. – Baixe e instale as bibliotecas Boost, versão 1.30.2 ou superior, descompacte o pacote e copie a pasta boost 1 3x x/boost (a depender da versão) para textit/usr/local/include/boost - nenhuma configuração é necessária. – Baixe e instale a biblioteca ODE (Open Dynamics Engine), para simulação de corpos dinâmicos - muito usada em jogos de computadores. A versão 0.9 é fortemente recomendada. – Configure o SimSpark via terminal, desabilitando o modo Debug para acalerar o processo de configuração: ./configure –disable-debug. – O próximo passo é adicionar o path da biblioteca rcssserver3D ao seu ambiente: export LD LIBRARY PATH=$LD LIBRARY PATH:/usr/local/lib/rcssserver3d. Seguindo os passos acima descritos, qualquer que seja o seu sistema baseado em Linux, você conseguirá instalar o servidor de simulação. • Windows: Primeiro é preciso instalar a versão mais recente do MS Visual C++, uma ferramenta criada pela Microsoft, caracterizada por permitir uma programação relativamente simples, apresentando porém resultados a nı́vel profissional, permitindo o desenvolvimento de aplicações de janela, console, bem como de APIs para Windows. Em seguida baixe os instaladores mais recentes do SimSpark e do rcssserver3d. Caso não tenha o Ruby instalado, baixe preferencialmente as versões 1.9.0 ou 1.9.1, pois estas já foram previamente testadas para esta finalidade. Completando todos os passos, basta agora reiniciar o Windows e usufruir dessa excelente ferramenta para simulação 3D. Caso deseje desinstalá-los, é possı́vel de duas maneiras, seguindo o caminho do menu iniciar, ou então escrevendo no terminal as seguintes linhas de comando: C:\Program Files\simspark\Uninstall.exe C:\Program Files\rcssserver3d 0.6.3\Uninstall.exe 1.4. Construindo um time de futebol de robôs 3D Para construir um time de futebol de robôs para simulação 3D é possı́vel optar por construir um time do inı́cio ou utilizar times bases. 1.4.1. Iniciando do zero Ao iniciar um time na liga de simulação 3D deve-se resolver alguns pontos iniciais: Conexão: Verificar formas de como conectar seu time ao Simspark. Atualmente, o Simspark opera em uma conexão via socket utilizando o protocolo TCP na porta 3100; Sincronização: Estudar formas de sincronização com o Simspark para o envio e recepção de mensagem; Parser: Construir uma estrutura que receba a mensagem do Simspark e decomponha ela em informações úteis para o agente. É necessário também que se desenvolva formas de calcular e efetuar os movimentos do agente, além da elaboração de uma estratégia de jogo de forma cooperativa. 1.4.2. Times base Para dar os primeiros passos na virtualização de robôs não é necessário começar do zero, atualmente muitos times participantes da liga de simulação na RoboCup disponibilizam seus códigos gratuitamente, ou pelo menos uma base. Obviamente, não é permitido fazer uso desses códigos para participar das competições, servem somente como uma orientação para facilitar o entendimento e implementação do seu próprio time. Podemos citar como exemplo o Delta3D, uma equipe orientada por Saeid JafariZadeh e Arash Harang. Essa equipe disponibilizou o código fonte completo do time com o qual participaram do GermanOpen2010. É possı́vel encontrá-lo em [1]. Outro exemplo que pode ser citado de equipe que disponibiliza seu código é o Nexus 3D([2]) que tem como orientador Mohammad Shokri. 1.5. Ferramentas para construção de movimentos A construção de movimentos para simulação 3D é uma tarefa muito complexa. Para auxiliar nesta construção indicamos duas ferramentas: O IFAS3D, que foi uma ferramenta desenvolvida pelo Núcleo de Pesquisa ACSO [3] e que auxilia em teste interativos com o agente simulado. E o Scilab, que é uma linguagem de alto nı́vel utilizada para resolução de problemas matemáticos. Utilizando essas ferramentas em conjunto é possivel a construção de movimentos, como por exemplo o movimento de andar. 1.5.1. IFAS3D O IFAS3D, sigla para InterFace Analı́tica do Simulador 3D, é uma ferramenta que permite a conexão com o simulador e através do envio de valores de entrada e análise das saı́das correspondentes, com isso auxiliando na compreensão empı́rica da fı́sica simulada pelo SimSpark, a qual atua sobre os agentes. Além das saı́das, é possı́vel analisar também as atitudes do agente ao obedecer um determinado comando. As principais informações sobre o robô mapeadas são: o posicionamento atual das juntas, o valor do giroscópio, o valor do acelerômetro e os valores referentes ao sensor ForceResistance(FRP). Outras informações que são mapeadas são relativas a tempo de simulação, estado atual da simulação (PlayMode) e ciclo de atualização do simulador. A ferramenta foi desenvolvida utilizando a linguagem de programação C++, juntamente com a framework Qt. A princı́pio foi feito um esboço em Java, este apresentou um alto consumo de memória, se comparado ao C++. Na figura 1.13 é mostrada a tela do IFAS3D. Figura 1.13: Tela do IFAS3D Com IFAS3D é possı́vel avaliar, de forma interativa, variações de movimentos fora do jogo. Estabelecendo uma conexão com o Simspark, simulando um agente, a ferramenta permite que o usuário envie velocidades para as juntas e visualise, em tempo real, as alterações causadas nas juntas. Essas velocidades podem ser enviadas de forma simples, através da interface, ou através de scripts em formato XML que contenha uma sequência de juntas e suas respectivas velocidades e durações. Na forma de envio simples, o usuário insere o valor da velocidade (em rad/s) e da duração (em ciclos) na linha da junta que deseja movimentar e clicar em start (figura 1.14). Com isso, o IFAS3D busca as juntas que possuam algum valor diferente de zero, na velocidade e na duração, e em cada ciclo envia aquela velocidade para junta. O usuário também pode informar o ciclo inicial (T.Initial) de cada junta, fazendo com isso que uma junta inicie seu movimento primeiro que as demais. Por padrão todas as juntas iniciam no ciclo zero de envio. Outra funcionalidade do modo simples de envio é a possibilidade de informar os angulos iniciais das juntas (Ang.Init). Com isso, a ferramenta primeiro colocará as juntas no angulo indicado e só depois começará o envio das velocidades. Como exemplo, efetuamos três movimentos com a posição inicial de 0 graus e com duração de 50 ciclos. Na tabela 1.3 é mostrada a relação entre as juntas, ângulos e velocidades utilizadas. as juntas estão numeradas de acordo com a figura 1.12. • Movimento (A) - enviada uma velocidade para uma única junta do ombro (figura 1.15), fazendo com que o robô erguesse o braço esquerdo; Figura 1.14: Tela do envio de juntas do IFAS3D • Movimento (B) - enviada simultaneamente uma velocidade para as quatro juntas localizadas nos ombros (figura 1.16), fazendo com que o robô erguesse os braços; • Movimento (C) - enviada uma velocidade para seis juntas simultaneamente (figura 1.17). As juntas utilizadas foram dos quadris, joelhos e pés, fazendo com que o robô se agachasse. Tabela 1.3: Tabela de relação de juntas, ângulos e velocidades utilizadas nos testes. Relação Juntas, Ângulos e Velocidades Movimento Juntas Posição Final(graus) Velocidade(rad/s) A 4 90 1.57 3 90 1.57 4 90 1.57 B 5 -45 -0.785 6 45 0.785 15 90 1.57 16 90 1.57 17 -90 -1.57 C 18 -90 -1.57 19 45 0.785 20 45 0.785 Na forma de envio por script, o usuário deve construir um arquivo em formato XML, com a extensão .ifas, que deve conter a seguite sintaxe: • Iniciar o arquivo com a tag <script>. Essa é a tag raı́z do arquivo; • Cada passo deve iniciar com a tag <step> e conter a tag que indica a duração daquele passo (<duration>) e a tag que indica as juntas que serão movidas naquele passo (<joint>); Figura 1.15: (A) Movimento de levantar o braço esquerdo do robô utilizando o IFAS3D Figura 1.16: (B) Movimento de abrir os braços do robô utilizando o IFAS3D • As juntas são especificadas com uma tag contendo seu nome (<nome>) e a velocidade que será enviada. Como exemplo, construimos um script para o movimento (B): <script> <step> <duration>50</duration> <joint> <laj1>1.57</laj1> <raj1>1.57</raj1> </joint> </step> <step> <duration>50</duration> <joint> <laj2>0.785</laj2> <raj2>-0.785</raj2> </joint> Figura 1.17: (C) Movimento de agachar utilizando o IFAS3D </step> </script> Ainda em fase de desenvolvimento, o IFAS3D foi utilizado no processo de melhoria dos movimentos básicos do agente. Além disto, possibilitou uma maior compreensão do ambiente de simulação, por parte dos integrantes do grupo. Esta interface será disponibilizada assim que uma versão mais estável estiver pronta. 1.5.2. Scilab O Scilab é uma linguagem de alto nı́vel, com sintaxe baseada no Matlab, gratuita e com código aberto, utilizada para resolução de problemas matemáticos através da codificação de fórmulas ou uso de suas bibliotecas. Possui um ambiente simplificado e de facil utilização, onde matrizes são o principal tipo de dado (referenciar primer.pdf - scilab). Possui inumeras particularidades, que o destaca perante às linguagens de programação mais utilizadas (principalmente em relação ao tamanho do código), dentre elas estão a facilidade de gerar resultados, gráficos em 2D ou 3D e facilmente incorporáveis a documentos, diminuição do custo de tempo na resolução de grandes problemas; além de uma biblioteca que possui algoritmos capazes de solucionar equações diferenciais, otimizar problemas, interporlar e fazer quadratura. Ainda é possivel a integração do código em Scilab com as linguagens C, C++, Java e Fortran. O Scilab está disponı́vel para Linux, Windows e Mac. É possivel fazer o download do Scilab diretamente do site oficial [14], ou por terminal no Linux através do comando sudo aptitude install scilab [5]. Além de ser possivel o download no site, há a documentação do Scilab também, caso queira alterar o código fonte. Ao abrir o Scilab pode-se observar na barra superior a presença do botão Help, ao clica-lo aparecerá um index com uma lista de comandos e funções disponı́veis. Assim como C, Scilab é case sensitive e os comentários podem ser feitos através de duas barras, onde o resto da linha se torna comentário, ou entre barras com asterisco, i.e. /* comentário */. As variáveis podem começar com qualquer letra entre “a” a “z” ou “A” a “Z” ou qualquer número entre 0 e 9, os caracteres ”%”, ” ”, ”#”, ”!”, ”$”, ”?” podem ser adicionados ao nome da variável, após a primeira letra ou número. • Exemplos de código em Scilab [8]: --> A=2 --> Z=56 // a variavel A recebe o valor 2 // a variavel Z recebe o valor 56 --> A A = 2 // imprime a variavel A --> A+Z ans = 58 // imprime a soma das variaveis A e Z --> Y=A+Z // Y recebe o valor da soma das variaveis A e Z // e logo apos eh impresso o resultado --> Y = 58 -->Y=A+Z; // impressao resultante // impressao resultante // impressao resultante // Y recebe o valor da soma das variaveis A e Z, // mas nao eh impresso, pois o ";" suprime a impressao • Além dos operadores matemáticos básicos, o Scilab ainda possui alguns outros, como: ˆ ou ** para potênciação, i.e. yˆ2 = y2 “ ’ ” para transposição de conjugado em matrizes / ou \ para divisão, i.e. 2/4 =0.5; 4/2 =2; 2\4 =2; 4\2 =0.5 • Funções trigonométricas, como cosseno e seno também estão presentes: --> x = cos(60) x = 1/2 --> y = sin (30) y = 1/2 • O caractere “%” apresenta um significado especial, se vier na frente da váriavel: %pi representa a constante Pi (3,14..) %e representa a constante de Euler e %i representa a constante imaginária i • Expressões lógicas e booleanas: %T ou %t significa verdade %f ou %F significa falso “&” representa and “|” representa or “ ˜” representa a negação da váriavel 1.6. Conclusão Neste laboratório os alunos tiveram uma visão introdutória do futebol de robôs simulado 3D conforme a liga de simulação definida pela RoboCup Federation. Além de apresentar os princı́pios por trás do desafio e os passos para configurar e instalar o ambiente, os alunos obtiveram uma visão passo a passo de como construir um agente e puderam praticar as fases iniciais da construção de movimentos básicos bem como a programação a partir de um time base. Apesar de possuir um comitê nacional RoboCup e organizar eventos nacionais oficiais RoboCup desde 2007, o Brasil ainda tem uma participação tı́mida na comunidade internacional RoboCup. A popularização dos ambientes de simulação, pelo seu custo reduzido, representam uma oportunidade aumentar esta representatividade permitindo o crescimento na quantidade e qualidade das equipes brasileiras que disputam regularmente a RoboCup Brazil e a copa do mundo RoboCup. Até o momento o Brasil nunca sediou uma edição mundial da RoboCup, mas há uma forte perspectiva disto acontecer em 2014. Até lá existe um grande esforço da comunidade nacional de robótica para atrair mais estudantes e fomentar a formação de mais times para que nosso paı́s possa ter uma representação de bom nı́vel quando formos anfitriões do evento. Todo o processo tanto de software de infra-estrutura (como simuladores e ferramentas de apoio) quanto de times de futebol de robôs é feito num modelo de comunidade de software livre e, portanto, participar das listas de discussões e fóruns é a melhor forma de estar atualizado, receber contribuições e fornecer contribuições para a comunidade RoboCup. As experiências já iniciadas no Brasil desde a última década demonstram o potencial dos nossos estudantes e pesquisadores e motiva a todos para continuar trabalhando para fortalecer a comunidade cientı́fica RoboCup Brasil que conta com o valioso apoio da SBC e da SBA. Esperamos que este texto bem como o laboratório apresentado durante a XI ERBASE 2011 possam ajudar na criação de mais e melhores times RoboCup nas instituições da região-alvo do evento contribuindo na disseminação e fortalecimento da pesquisa cientı́fica e educacional em robótica nesta região. Referências [1] Delta 3D. Página do time delta 3d, Março 2001. [2] Nexus 3D. Página do time nexus 3d, Março 2011. [3] ACSO. Acso - núcleo de arquitetura de computadores e sistemas operacionais, Fevereiro 2011. [4] Aldebaran. Aldebaran robotics, Fevereiro 2011. [5] M. Baudin et al. Introduction to Scilab. Consortium Scilab. January, 2010. [6] Joschka Boedecker and Minoru Asada. Simspark concepts and application in the robocup 3d soccer simulation league. In Proceedings of the SIMPAR-2008, 2008. [7] RoboCup Brazil. Página oficial da robocup brazil, Março 2011. [8] E. de Mattos Silva. Introdução ao Scilab. 2007. [9] Marco Kogler. Simulation and visualization of agents in 3d environments. Technical report, Koblenz-Landau University, 2003. [10] Patrick Riley and George Riley. Spades - a distributed agent simulation environment with software-in-the-loop execution. In Winter Simulation Conference Proceedings, 2003. [11] RoboCup. Robocup - página oficial da organização, Fevereiro 2011. [12] Markus Rollmann. Spark - a generic simulator. Master’s thesis, Koblenz-Landau University, 2004. [13] Stuart Russel and Peter Norvig. Artificial Intelligence. Prentice-Hall, 2 edition, 2002. [14] Scilab. Scilab página oficial. http://www.scilab.org/, Março 2011. [15] Peter Seibel. Practical Common Lisp. Apress, 2005. [16] SimSpark. Simspark wiki, Fevereiro 2011. [17] Russell Smith. Open Dynamics Engine (ODE) User Guide, 2004.