You are here

Atividade 1

LIDA: Controlando o WorldServer3D

 

LeafletLIDA

 

    O LIDA 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 arquitetura LIDA trabalha o conceito de consciência: o mecanismo operacional do LIDA seleciona as informações, dos sensores da criatura artificial, mais relevantes para o contexto operacional atual da criatura (robô do WorldServer3D) e seleciona as ações mais adequadas, baseando-se nessas informações conscientes. Para esta aplicação, há informações sensoriais que representam o contexto deste experimento, além de ações (regras) que executam os devidos comandos, no robô, segundo o contexto sensorial que alcança a consciência do agente LIDA.

Recebendo os Leaflet's do Robô

    Os leaflet's do robô serão lidos e armazenados num vetor, conforme o código abaixo:

       // método updateWS3DState()

         Vector<Leaflet> leaflets = c.getLeaflets();

    Essas informações sempre serão lidas durante a execução de uma task (BackgroundTask) que chama os métodos responsáveis pela aquisição das informações sensoriais (updateWS3DState()) e execução das ações (processWS3DCommands()) do robô. Após ler os leaflet's do robô, essas informações serão usadas para verificar as cores e suas quantidades de jóias que devem ser coletadas (colorRED, ...), além de contabilizar as jóias que já foram coletadas (collectedRED, ...); essas tarefas são implementadas pelo método SetJewelsLeaflet(), e serão usadas para controlar a direção (cor da jóia) para a qual o robô deve se mover, na sua busca pelas jóias, além de determinar a condição de parada do robô: todas as jóias dos leaflet's coletadas.

Implementando a Tarefa do Robô

    O projeto deste agente LIDA inclui os módulos WS3DEnvironment (interface entre o ambiente do agente e a arquitetura LIDA) e WS3DSensoryMemory (recebe as informações sensoriais, vindas do ambiente, e repassa-as para o agente). Também foram criadas classes para trabalhar as informações sensoriais do agente: FoodFrontDetector (comida detectada na frente do robô), JewelFrontDetector (jóia detectada na frente do robô), JewelLeafletDetector (jóia dos leaflet's detectada), JewelNoneDetector (nenhuma jóia dos leaflet's detectada) e JewelsDeliveryDetector (todas as jóias dos leaflet's coletadas).

Classe WS3DEnvironment

    A classe WS3DEnvironment implementa os métodos necessários para trabalhar o ambiente do agente LIDA (robô do WorldServer3D) e repassar as informações do ambiente para o agente, executando as ações do agente no seu ambiente. O método init() inicializa o ambiente do WorldServer3D, chamando o método initializeWS3D(), descrito abaixo:

    private void initializeWS3D() throws CommandExecException{
        
        c = proxy.createCreature(100,100,0);
        w = proxy.getWorld();
        c.start();
        w.grow(1); }

    Essa classe também implenta os métodos responsáveis pela aquisição das informações sensoriais do agente (updateWS3DState()) e pela execução de suas ações (processWS3DCommands()). São lidas as informações dos leaflet's do robô (c.getLeaflets()), suas informações visuais (c.getThingsInVision()), além de atualizar a posição atual do robô em relação ao seu ambiente (c.getPosition()). O agente trabalha com cinco ações possíveis: procurar as jóias dos leaflet's (CommandUtility.sendSetTurn()), coletar comida na frente do robô (c.eatIt()), coletar jóias na frente do robô (c.putInSack()), mover-se até uma jóia dos leaflet's (CommandUtility.sendGoTo()), e entregar as jóias coletadas (c.stop()); essa última ação apenas faz o robô parar de se mover; houve também a necessidade de parar o robô sempre antes de coletar comida ou jóias, ligando seus motores novamente antes de fazer o robô girar ou mover-se na busca pelas jóias. (Essas últimas modificações geraram um "melhor" comportamento do robô).

    Para executar as ações do robô, foram necessários alguns métodos para adquirir as informações relevantes à execução dos comandos: método SetJewelsLeaflet(), trabalha as informações dos leaflet's; método SetJewelTarget(), determina para qual jóia, dos leaflet's, detectada pelo robô, este deverá se mover (a jóia mais próxima do robô); método SetJewelFrontName(), recupera o nome da jóia muito próxima ao robô; método SetFoodFrontName(), recupera o nome da comida muito próxima ao robô. São usadas informações (variáveis) para determinar as condições de "não-detecção" de nenhuma jóia dos leaflet's e término do experimento (todas as jóias coletadas): jewelTarget, possui as jóias, que pertencem aos leaflet's, que foram detectadas pelo sensor visual do robô (caso seja nula, o robô gira procurando por jóias no seu campo visual); jewelsLeaflet, possui as cores das jóias que o robô deve buscar (se torna nula quando o robô coleta todas as jóias).

    O método processAction() processa as informações recebidas do agente LIDA, determinando as devidas ações (commands) que serão executadas pelo robô. O método getState() passa as informações sensoriais do robô para o agente LIDA. Essas informações são: jewelsLeaflet, cores das jóias a serem coletadas ("leaflet"); jewelTarget, jóia a ser coletada ("target"); jewelFrontName, nome da jóia na frente do robô ("jewel"); foodFrontName, nome da comida na frente do robô ("food").

Classe WS3DSensoryMemory (e classes Featuredetectors)

    A classe WS3DSensoryMemory recupera as informações sensoriais do robô, vindas da classe WS3DEnvironment, e as repassa para o agente LIDA (classes que trabalham as informações sensoriais). Essa classe possui o método runSensors() que recupera as informações ("mode","leaflet"; "mode","target" ; "mode","jewel"; "mode","food") sensoriais da classe WS3DEnvironment, além do método getSensoryContent() que repassa essas informações para as classes que trabalham-nas.

    As classes do tipo Featuredetectors são responsáveis pela parte perceptual do agente LIDA. São essas classes que serão configuradas, no arquivo factoryData.xml, para gerar as tasks que enviam informações sensoriais para o módulo PAM (Perceptual Associative Memory) da arquitetura LIDA.

    A classe FoodFrontDetector detecta a situação de "comida na frente do robô" ("mode", "food"), disparando a task FoodFrontDetector. A classe JewelFrontDetector detecta a situação de "jóia na frente do robô" ("mode", "jewel"), disparando a task JewelFrontDetector. A classe JewelLeafletDetector detecta a situação de "jóia dos leaflet's detectada" ("mode", "target"), disparando a task JewelLeafletDetector. A classe JewelNoneDetector detecta a situação de "nenhuma jóia dos leaflet's detectada" ("mode", "target"), disparando a task JewelNoneDetector. A classe JewelsDeliveryDetector detecta a situação de "todas as jóias dos leaflet's coletadas" ("mode", "leaflet"), disparando a task JewelsDeliveryDetector. A única tarefa dessas classes é verificar se os objetos da classe WS3DEnvironment, repassados pela classe WS3DSensoryMemory, estão vazios (nulos) ou preenchidos com alguma informação.

Arquivos de configuração

    O arquivo lidaConfig.properties carrega os arquivos de configuração da arquitetura LIDA; dentre estes, o arquivo factoryData.xml e o arquivo leafletAgent.xml. O arquivo factoryData.xml configura as classes responsáveis pela detecção das informações sensoriais do agente. O arquivo leafletAgent.xml configura as propriedades do agente LIDA. Nesse arquivo, são configuradas as tasks da PAM que captam as informações sensoriais, criando os nodes sensoriais: noneJewel, indica a ausência de jóias dos leaflet's no campo visual do robô; jewelLeaflet, indica a detecção de alguma jóia dos leaflet's no campo visual do robô; jewelFront, indica a presença de uma jóia muito próxima ao robô; foodFront, indica a presença de comida muito próxima ao robô; deliveryJewels, indica que todas as jóias dos leaflet's foram coletadas.

    No módulo AttentionModule são configurados os attentional codelets do agente. Esses codelets monitoram as informações (ativação) dos nodes, tornando tais informações conscientes para o agente. Uma modificação foi necessária, nesta configuração, para implementar o correto funcionamento do robô; duas tarefas competem durante a busca do robô pelas jóias: se mover para uma jóia detectada (jewelLeaflet) e coletar a jóia (ou comida) detectada (jewelFront / foodFront). Para resolver esse conflito, o parâmetro refractoryPeriod, referente ao node jewelLeaflet, é bem maior do que os dos outros dois nodes (jewelFront e foodFront). Assim, o robô fará mais tentativas de coletar uma jóia (ou comida) do que tentar se mover na direção dessa jóia.

    O módulo ProceduralMemory declara as ações que o agente (robô) deverá executar, e o módulo SensoryMotorMemory dispara os algoritmos referentes as ações a serem tomadas pelo agente.

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.

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

    O robô coletou todas as jóias dos seus leaflet's, inclusive aquelas no caminho do robô e que não pertencem aos seus leaflet's, e, em seguida, parou de se mover. Durante a execução da sua tarefa, o robô aproxima-se de uma jóia, pára na frente da jóia, coleta a jóia (essa operação pode levar um breve tempo), inicia seu movimento (também leva alguns instantes), e continua a busca pelas demais jóias, até coletar todas e parar de se mover. A figura abaixo exibe a tela da GUI do LIDA para este agente:

    Pode-se observar os nodes referentes às informações sensoriais do agente. Deve-se observar que o robô apenas inicia sua busca pelas jóias após ser pressionado o botão "Start / Pause" da GUI.

 

Arquivos Disponibilizados:

  Projeto Completo: LeafletLIDA.rar

  Programa LeafletLIDA: launch_1.jnlp

  WorldServer3D (executável): launch.jnlp

 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer