Objetivos
O objetivo desta aula é oferecer aos alunos um primeiro contato com o ambiente de trabalho a ser utilizado no curso. Para tanto, as seguintes atividades devem ser realizadas:
- Primeiras Instalações e Preparações (se necessário)
- Primeiros Passos com o WorldServe3D (WS3D)
- Geração de um Controlador Manual para o Ambiente Virtual
Atividade 1: Primeiras Instalações e Preparações (se necessário)
Este curso está estruturado de tal forma que em cada aula, os alunos deverão desenvolver um conjunto de atividades, envolvendo o uso de programas computacionais. Utilizaremos principalmente as linguagens Java e C#, a partir de seus computadores pessoais. Utilizaremos preferencialmente o ambiente Linux, que é onde os programas serão testados. Esta atividade não precisa ser realizada se você estiver utilizando o ambiente do LE27, pois todos os softwares necessários já estão instalados no sistema. Entretanto, se você quiser instalar os pacotes no seu notebook ou desktop, precisará providenciar as instalações a seguir. Todos os experimentos funcionam também em ambiente Windows. Em ambiente Windows, podem ser necessários pequenos ajustes para que tudo funcione adequadamente. Se você usa o ambiente Windows 10 ou 11, sugerimos instalar o WSL2: Windows Subsystem for Linux 2, e o Ubuntu for Windows e ferramentas que permitem executar um Kernel Linux nativo, em paralelo com o próprio Windows 10/11. Será necessário também instalar um servidor X. Recomendamos o VcXsrv. Caso tenha problemas, contacte o professor. Além disso, será necessário instalar o Docker, pois o novo WS3D roda a partir de um container Docker. Caso o seu ambiente seja Linux, você poderá instalar o docker a partir da sua distribuição. O link anterior é somente para ambiente Windows. Todas as atividades estarão disponíveis no Moodle, e ao final de cada sequência temática de aulas (indicadas na página principal da disciplina), cada aluno deverá subir o código com seus programas no Google Drive ou outro assemelhado, e encaminhar o link de acesso ao código para o professor, utilizando o Moodle. Durante as aulas imediatamente subsequentes às datas de entregas de atividades, o professor irá solicitar que cada aluno faça uma demonstração do código desenvolvido, chamando individualmente cada aluno, durante o horário da aula, para avaliação.
Atividade 2: Primeiros Passos com o WorldServer3D (WS3D)
Neste curso, utilizaremos um ambiente virtual desenvolvido pelo grupo de pesquisa do Prof. Gudwin, o WorldServer3D (WS3D). Neste ambiente virtual, é possível criar um conjunto de criaturas virtuais, que são controladas por seus sensores e atuadores, gerenciados por meio de Sockets. Neste semestre, estaremos utilizando uma nova versão do WS3D desenvolvida sobre o simulador de robôs CoppeliaSim. Para isso, iremos executar o mesmo utlizando o Docker, um executor de containers que se responsabilizará por baixar o simulador e os scripts de compatibilização necessários para executar as simulações. Nesta atividade, executaremos o WS3D e um programa de controle do robô de demonstração que faz uso do WS3DProxy, uma biblioteca Java que dá acesso ao WS3D.
Para executar o WS3D, é necessário criar o seguinte arquivo em script BASH:
#! /bin/bash
xhost +
docker run --rm -it --name coppelia-sim \
-e DISPLAY \
--net=host \
--privileged \
-p 4011:4011 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
brgsil/ws3d-coppelia "$@"
Para testar o WS3D, carregue o programa de exemplo (WS3DApp), que faz uso da biblioteca WS3DProxy, que controla o WS3D:
git clone https://github.com/rgudwin/WS3DApp.git
Abra o código do programa com o Netbeans e analise o código do mesmo, tentando entender seu funcionamento.
Inicialmente criamos uma instância do Proxy, capturamos uma instância para o mundo virtual na forma de um objeto da classe World, e a partir desse objeto podemos efetuar uma série de ações, tais como resetar o mundo, criar instâncias de comidas, jóias e criaturas. Tendo-se uma referência para uma criatura, é possível iniciar a mesma, ler seus sensores e enviar comandos via atuadores. Há diversos outros comandos para sensores e atuadores além dos mostrados acima.
Baixe também o código do WS3DProxy para conseguir estudar as suas principais classes e métodos. Você não precisa compilar o WS3DProxy, pois o WS3DApp baixa esse código direto do GitHub usando o gradle. O propósito de você baixar o código fonte é somente para poder estudar as classes de acesso que podem ser utilizadas no seu programa. Estude, principalmente as seguintes classes:
- ws3dproxy.WS3DProxy
- ws3dproxy.model.World
- ws3dproxy.model.Creature
Atividade 3: Geração de um Controlador Manual para o Ambiente Virtual
Para finalizar as atividades desta aula, desenvolveremos um template de um sistema de controle de uma criatura virtual, para gerar um controlador manual que possa operar uma criatura no WS3D, e da mesma maneira geraremos uma Aplicação Java com esse controlador. Ao final da aula de hoje, deve ser enviado ao professor, via e-mail, um arquivo ZIP contendo o seguinte:
- Código Fonte (Java) da aplicação de controle manual do WS3D
- Código Executável (arquivo JAR) com sua versão compilada da aplicação de controle manual do WS3D
- Arquivo Shell Script (BASH) com os comandos para executar o WS3D e em seguida a App de controle manual
O acesso a uma aplicação WS3D sendo executada é feito por meio de um socket, aberto na porta 4011. Por meio desse socket, foi criado um protocolo muito simples, onde comandos podem ser enviados ao WS3D e uma resposta deve ser capturada no retorno. Essa resposta pode ser somente um acknowledgment, ou pode conter informações solicitadas, dependendo do comando enviado. Para facilitar o acesso ao WS3D, entretanto, nosso grupo de pesquisa desenvolveu uma biblioteca Proxy, que abstrai toda a camada de rede, e permite que outros programas escritos em Java possam acessar o WS3D sem a necessidade de tratar os detalhes operacionais do processamento de sockets. O projeto WS3DProxy pode, a semelhança do WS3D ser obtido a partir do seu repositório no GitHub.
Para finalizar o exercício da aula de hoje, deve-se utilizar o WS3DProxy para se gerenciar a movimentação da criatura manualmente, através do uso do teclado e/ou do mouse. No relatório desta atividade, devem estar disponibilizados tanto o código fonte gerado como o executável do programa de controle, na forma de uma AppJava. Os alunos devem gerar um shell script que inicialize tanto o WS3D como seu software de controle e disponibilizar tudo em um arquivo ZIP em seu repositório de atividades, conforme indicado acima.
A especificação do programa de controle manual a ser gerada é a seguinte:
O programa de controle deve abrir uma interface gráfica, onde os seguintes comandos devem ser possibilitados, por meio de botões:
- Criação de uma nova Criatura
- Criação de diferentes tipos de Things: maçãs, nozes, cristais de diferentes cores. Você deve criar uma interface gráfica que permita a escolha dos itens a serem inseridos e sua localização.
- Criação de Bricks (paredes) em diferentes localizações.
- Caso exista mais de uma criatura no ambiente, deve haver uma maneira de selecionar uma das criaturas criadas para serem movimentadas manualmente.
- Você deve usar as teclas de setas para movimentar a criatura para frente, para trás, rotacionar para a direita e rotacionar para esquerda. Descubra os comandos do WS3DProxy necessários para realizar esses movimentos, capture os eventos de teclado e integre o acesso do teclado com os movimentos no WS3D.
- Da mesma forma, você deve criar em sua interface uma maneira de definir um ponto no ambiente, com coordenadas x,y e mandar a criatura selecionada se movimentar até ele.
- Utilize o comando getThingsInVision da classe Creature, para capturar uma lista de todas as Things no campo de visão da criatura. Insira na sua interface uma maneira de visualizar as coisas visíveis.
- Crie na sua interface uma visualização para o Leaflet corrente. Crie um botão para gerar um novo leaflet no sistema.
- Crie na sua interface uma visualização para a Bag da criatura, mostrando os itens nela armazenados. Atualize essa visualização com os itens correntes na Bag de cada criatura.
- Caso a criatura esteja a uma distância próxima de um Thing, crie uma maneira do seu programa capturar essa Thing e colocá-la na Bag.
- Após possuir na Bag os itens necessários a cumprir um Leaflet, crie uma maneira para que por meio do seu programa, você consiga manualmente trocar os itens por pontos e visualize sua quantidade de pontos atual em sua interface gráfica.
- Ao comer um alimento (maçã ou noz), a criatura ganha energia. Coloque na sua interface uma indicação da quantidade de energia atual da criatura, e faça com que a criatura se movimente até uma maçã ou noz e a coma, verificando se os pontos adicionais foram computados na quantidade de energia da criatura.
- 23 views