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.
Download

Virtualização de Robôs (Marco Costa Simões)