You are here

Atividade 1

Clarion: Controlando o WorldServer3D

 

LeafletsCLARION

    O CLARION será utilizado neste experimento para criar a mente de uma criatura artificial cuja tarefa é navegar pelo seu ambiente e coletar certos tipos de jóias disponíveis no seu ambiente. O ambiente de simulação usado será o WorldServer3D. O robô do WorldServer3D deverá coletar as jóias descritas nos seus leaflet's de forma rápida e direta. No entanto, existem outros objetos disponíveis no ambiente do robô: comida e jóias que não precisam ser coletadas. Esses objetos podem surgir no caminho traçado pelo robô até a sua meta (jóia do leaflet). Portanto, será necessário coletar, também, tais objetos que obstruem a passagem do robô pelo seu ambiente.

    A lógica deste programa CLARION trabalha apenas com regras. A criatura artificial já "nasce" sabendo realizar a sua tarefa. Inicialmente, o robô gira à procura de jóias, dos seus leaflet's, no seu campo visual. Ao detectar alguma jóia (cor) requisitada, o robô move-se na direção dessa jóia. Ao se aproximar de alguma jóia, o robô coletará tal jóia mesmo se esta não pertencer aos seus leaflet's. O robô também coleta comida que esteja próxima no seu caminho. Conforme coleta as jóias, dos seus leaflet's, o número dessas jóias (cores) é incrementado e, ao atingir determinado valor (leaflet), essa cor de jóia não será mais perseguida e o robô se move apenas na direção de outras jóias que restam ser coletadas. Após coletar todas as jóias dos seus leaflet's, o robô pára de se mover pelo seu ambiente.

Recebendo os Leaflet's do Robô

    Antes de receber os leaflet's, estes precisam ser gerados. O método NewLeaflet(), da classe WorldServer.cs, envia a mensagem ("leaflet") que gera os leaflet's do robô. Este método é chamado na classe Main.cs (worldServer.NewLeaflet(creatureId)) após a criatura artificial (robô) ter sido instanciada. Nessa classe, Main.cs, também são geradas as jóias e comida disponíveis no ambiente do robô. Tais objetos são gerados "manualmente" por meio de chamadas aos métodos NewJewel() e NewFood() da classe WorldServer.cs. O ideal seria criar uma outra Thread para instanciar, aleatoriamente, de tempos em tempos, esses objetos. (Como foi feito no programa exemplo, em Java, do DemoSOAR estudado anteriormente). Tendo sido gerados os leaflet's do robô, resta ler as informações disponíveis neles (números de jóias, de cada cor, a serem coletadas e quantas já foram coletadas). O trecho de código abaixo ilustra como foi implementado esse procedimento:

    O código acima é parte do método ParseGetCreatureStateResponse() da classe WorldServer.cs. Esse método lê as informações da resposta gerada pela mensagem "getcreaturestate", do método SendGetCreatureState() dessa mesma classe, e retorna uma lista com os objetos (Thing) detectados pelo campo visual da criatura (robô). Um desses objetos é o próprio robô (Creature). O objeto creature, no código acima, refere-se ao robô (Creature) que será retornado, como um objeto, pelo método. O número de jóias, de cada cor, que devem ser coletadas, de cada leaflet, é lido e o total de jóias (da mesma cor de cada leaflet) é computado. O mesmo ocorre para as jóias (de mesma cor) já coletadas em cada leaflet.

    Não foi criada uma nova classe Leaflet. Ao invés disso, optou-se por criar variáveis e métodos, dentro da classe Creature.cs, para armazenar e trabalhar as informações dos leaflet's do robô. Alguns métodos (SetLeafletRED(), ... , SetCollectedRED(), ...) armazenam o número de jóias, de cada cor, que devem ser coletadas e o número já coletado. Outros métodos (GetLeafletRED(), ... , GetCollectedRED(), ...) retornam as informações armazenadas sobre os leaflet's do robô. Os métodos, abaixo, são responsáveis por trabalhar as informações dos leaflet's do robô:

    O primeiro método, GetLeaflets(), retorna uma lista (String) com o nome de cada cor de jóia que o robô deve coletar. Conforme o robô coleta as jóias, caso o número de jóias a serem coletadas (para uma cor) já tiver sido atingido, essa cor será removida da lista. O segundo método, Deliver(), verifica se todas as jóias dos leaflet's já foram coletadas.

Implementando a Tarefa do Robô

    Houve a necessidade de modificar o método delegado, OnNewVisualSensorialInformation(creature), para receber as informações dos leaflet's do robô (Creature). Essas informações devem estar disponíveis na classe Main.cs para permitir que o robô desempenhe corretamente suas tarefas; também são necessárias na classe ClarionAgent.cs para disparar corretamente as regras que geram o comportamento da criatura (robô).

    O agente CLARION, responsável pela mente da criatura artificial, possui as seguintes ações: SEARCH_THINGS, MOVE_JEWEL, SACK_IT, EAT_IT, DELIVERY_JEWELS. A percepção do agente trabalha com as seguintes entradas. InputJewelAhead, informa uma jóia próxima à criatura. InputFoodAhead, informa comida próxima à criatura. InputJewelDetected, informa a visualização de uma ou mais jóias dos leaflet's no campo visual da criatura. InputDeliveryJewels, informa que todas as jóias dos leaflet's já foram coletadas. As atuações do agente são as seguintes. OutputSearchThings, faz a criatura procurar pelas jóias dos seus leaflet's no ambiente. OutputMoveJewel, faz a criatura se mover até uma jóia detectada. OutputSackIt, faz a criatura coletar uma jóia que esteja próxima a ela. OutputEatIt, faz a criatura coletar comida que esteja próxima a ela. OutputDeliveryJewels, responsável pela entrega das jóias. As regras (métodos delegados) usadas por este agente estão descritas a seguir:

    A regra ruleSearchForThings dispara a ação de procurar as jóias dos leaflet's enquanto nenhuma jóia (InputJewelDetected) desse tipo tiver sido detectada. A regra ruleMoveToJewel dispara a ação de mover a criatura até uma jóia quando alguma jóia (InputJewelDetected) dos leaflet's tiver sido detectada. A regra ruleGetJewel dispara a ação de coletar uma jóia quando houver alguma (InputJewelAhead) próxima à criatura. A regra ruleEatFood dispara a ação de coletar comida quando houver alguma (InputFoodAhead) próxima à criatura. A regra ruleDeliveryJewel dispara a ação responsável pela entrega das jóias coletadas quando todas as jóias (InputDeliveryJewels) dos leaflet's tiverem sido coletadas. As entradas sensoriais do agente são trabalhadas pelo código abaixo:

    O método Deliver(), da classe Creature.cs, informa se todas as jóias dos leaflet's já foram coletadas; caso afirmativo, a entrada InputDeliveryJewels será ativada com valor máximo. As entradas InputFoodAhead e InputJewelAhead serão ativadas com máximo valor quando houver alguma comida ou jóia, no campo visual, próximas à criatura. A entrada InputJewelDetected terá máximo valor quando ocorrer alguma jóia, no campo visual da criatura, cuja cor esteja na lista (jewelsLeaflet) das cores requisitadas pelos leaflet's. O trecho de código abaixo, da classe Main.cs, executa as ações do robô:

    A ação DELIVERY_JEWELS faz o robô parar de se mover. A ação SEARCH_THINGS faz o robô girar à procura de objetos no seu campo visual. As ações SACK_IT e EAT_IT coletam jóias ou comida próximas ao robô. A ação MOVE_JEWEL move o robô até a jóia mais próxima a ele, detectada pelo sensor visual. Essas últimas ações trabalham com informações (visuais, além da própria criatura) disponibilizadas pelo método agent_OnNewVisualSensorialInformation(). As variáveis jewelName e foodName referem-se aos nomes dos objetos JEWEL e FOOD que estão próximos ao robô. A lista jewels contém as jóias detectadas pelo sensor visual e cuja cor pertença aos leaflet's do robô (Leaflet = creature.GetLeaflets()). O robô se move até a mais próxima (jewelTarget) das jóias contidas nessa lista.

Resultados da Simulação

    Para executar adequadamente este programa, foi necessário usar a versão do WorldServer3D (modificada) disponibilizada pelo aluno Eduardo F. Jucá de Castro. As versões anteriores não computavam, nos leaflet's do robô, as jóias que foram coletadas. O código e executável desta versão estão disponibilizados no final deste relatório.

    A figura a seguir ilustra o início da simulação:

    O robô navega pelo seu ambiente à procura das jóias contidas nos seus leaflet's. Essas jóias estão descritas na janela (Leaflets) no canto superior esquerdo da figura. Algumas jóias já foram coletadas, inclusive aquelas no caminho do robô e que não pertencem aos seus leaflet's.

    A próxima figura ilustra o final da simulação:

    O robô coletou todas as jóias dos seus leaflet's e, em seguida, parou de se mover. Não foi implementada a entrega das jóias, no DeliverySpot, ao invés disso, o robô apenas pára de se mover. Pois, sua tarefa já foi realizada. Às vezes, o robô exibe um comportamento "indeciso" sobre para qual jóia se mover, entre duas jóias no seu campo de visão. Nesse caso, o robô tende a desistir de buscar essas jóias e decide procurar por outras jóias.

Arquivos Disponibilizados:

  Projeto Completo: LeafletsCLARION.rar

  Arquivos Executáveis: LaunchCLARION.zip

  WorldServer3D (executável): launch.jnlp

 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer