• Sonuç bulunamadı

Grup Bağlılığı Modeli

4.2. Örgütsel Adalet

4.2.4. Örgütsel Adaletin Temelini Oluşturan Modeller

4.2.4.7. Grup Bağlılığı Modeli

Este exemplo consiste em uma aplicação em que o robô realiza o patrulhamento de uma área em um ambiente fechado. O robô deve realizar uma sequência de tours nesse ambiente, completando um percurso padrão de forma regular, visitando sempre pontos conhecidos do ambiente. Cada ponto a ser visitado representa uma porta, e ao passar por esse ponto, o robô deve fazer uma leitura para verificar se a porta está aberta.

7.3.1 Implementação da parte Eletromecânica

A implementação dessa aplicação foi efetuada com o reúso do código referente ao robô implementado no exemplo anterior. As classes MyRobot, MyPorts, MyUltrasonicSensor e MyTouchsensor foram reaproveitadas. Nesse ponto, é importante

destacar que um dos requisitos dessa aplicação foi a necessidade de gerenciar o consumo de bateria. Assim, foi necessário implementar uma classe chamada MyBatery que informa a

quantidade de energia restante nas baterias do robô. Apesar de não ser um sensor físico, essa classe é uma oportunidade para demonstrar que para adicionar mais dispositivos basta implementar a classe e adicioná-la à coleção de sensores do robô. Assim, depois que ela estiver instanciada, estará disponível junto com os outros sensores do robô.

7.3.2 Implementação do Controle do Robô

O controle do robô é composto por um conjunto de classes que representam comportamentos com prioridade definida. Todas as classes estendem a classe MyBehavior e

SARAMR

é responsável pela locomoção do robô pelo caminho planejado no tour, parando em frente aos pontos que representam cada porta no percurso. A classe CheckOpenDoor é implementada

para o comportamento que deverá verificar se a porta está aberta a cada parada durante o tour. O robô inicia em um ponto denominado como “base”, realiza o tour completo até retornar a base. A classe ReturnToBase é implementada um comportamento para conduzir o robô de

volta até a base caso os níveis de energia estejam baixos, impossibilitando a continuação do tour. Esse comportamento recebe um Path, que é o caminho mais curto entre a localização

do robô e a base.

7.3.3 Implementação da Representação do Ambiente

Para essa aplicação em particular, a forma de controle do robô é feita de forma mista, deliberativa e reativa, ou seja, o robô possui uma representação interna do ambiente que é usada como um mapa pelo robô para conhecer o ambiente. O mapa possui uma grade, como em um plano cartesiano, com coordenadas X e Y, e os elementos do ambiente são demarcados na grade de ocupação. A locomoção é feita com base em pontos de referência que são coordenadas no plano cartesiano e, também na leitura de informações oriundas de sensores e atuadores.

O controle do robô consegue estimar o deslocamento pela grade de ocupação utilizando um sistema de odometria. As informações odométricas são obtidas dos atuadores que estão acoplados às rodas do robô, e à partir do movimento das rodas, é possível calcular o deslocamento. A classe MyNavigator utiliza a classe Navigator da API LeJOS NXT que

possui a implementação d sistema de odometria e é responsável pela correta "navegação" pelo ambiente.

Na Figura 7.10 é mostrado o mapa do ambiente implementado para este estudo de caso.

SARAMR

Figura 7.10: Mapa de ocupação do ambiente.

O bloco de código do método configureEnvironment() é um exemplo de como

foi implementada a representação do ambiente utilizando a abordagem de grade de ocupação.

public EnvironmentMap configureEnvironment() {

// Map Frontier( x, y, width, height)

Rectangle bounds = new Rectangle(0, 0, 160, 210);

// Map all walls in the closed environment // to delimit the corridors

// Line (x1, y1, x2, y2)

Line[] lines = new Line[6];

lines[0] = new Line(30, 0, 30, 80); lines[1] = new Line(30, 80, 160, 80); lines[2] = new Line(30, 110, 30, 180); lines[3] = new Line(30, 110, 130, 110); lines[4] = new Line(30, 180, 130, 180); lines[5] = new Line(130, 110, 130, 180);

// Map by grid when start and finish all doors in all corridors // numbering doors by follow base path.

List<Door> doors = new ArrayList<Door>();

doors.add(new Door(new Waypoint(30,40), new Waypoint(30,50))); doors.add(new Door(new Waypoint(160,140), new Waypoint(160,150))); doors.add(new Door(new Waypoint(80,210), new Waypoint(70,210))); doors.add(new Door(new Waypoint(0,170), new Waypoint(0,160))); doors.add(new Door(new Waypoint(30,140), new Waypoint(30,150))); doors.add(new Door(new Waypoint(130,150), new Waypoint(130,140)));

return new EnvironmentMap(bounds, lines, doors); }

SARAMR

Código 7.8: Classe EnvironmentMap.

O bloco de código do método configureStopWaypoints() é um exemplo de

como foi implementada a localização das portas que devem ser monitoradas no ambiente.

public static List<Door> configureStopWayPoints(){ List<Door> stopWayPoints = new ArrayList<Door>();

//Door 1

stopWayPoints.get(0).setDoorIni((new Waypoint(20,40))); stopWayPoints.get(0).setDoorEnd((new Waypoint(20,50))); stopWayPoints.get(0).setDoorNumber(1);

//Door 2

stopWayPoints.get(1).setDoorIni((new Waypoint(150,140))); stopWayPoints.get(1).setDoorEnd((new Waypoint(150,150))); stopWayPoints.get(0).setDoorNumber(2);

//Door 3

stopWayPoints.get(2).setDoorIni((new Waypoint(80,200))); stopWayPoints.get(2).setDoorEnd((new Waypoint(70,200))); stopWayPoints.get(0).setDoorNumber(3);

//Door 4

stopWayPoints.get(3).setDoorIni((new Waypoint(10,170))); stopWayPoints.get(3).setDoorEnd((new Waypoint(10,160))); stopWayPoints.get(0).setDoorNumber(4);

//Door 5

stopWayPoints.get(4).setDoorIni((new Waypoint(20,140))); stopWayPoints.get(4).setDoorEnd((new Waypoint(20,150))); stopWayPoints.get(0).setDoorNumber(5);

//Door 6

stopWayPoints.get(5).setDoorIni((new Waypoint(140,150))); stopWayPoints.get(5).setDoorEnd((new Waypoint(140,140))); stopWayPoints.get(0).setDoorNumber(6);

return stopWayPoints; }

Código 7.9: Classe EnvironmentMap.

7.3.4 Implementação do Loop de Controle

Nessa aplicação, houve a necessidade de monitorar a a quantidade de energia restante nas baterias do robô durante as atividades de patrulhamento de segurança. Uma opção seria a implementação de um loop de controle com essa finalidade, porém, a abordagem escolhida foi a implementação de um novo comportamento do robô quando o nível de carga assume um valor crítico. A capacidade de carga máxima do kit Lego NXT é 9,0 volts. O nível crítico de carga é 7,5 volts, por isso o valor do evento padrão foi ajustado para 8,0 volts.

SARAMR

Quando a carga da bateria atinge esse valor padrão, um algoritmo Dijkstra é utilizado para calcular o menor caminho entre a localização do robô e a base. O algoritmo produz um Path que é uma sequência de coordenadas que representa esse caminho. O caminho de retorno é atribuído ao comportamento que, ao assumir o controle, conduz o robô de volta a base.

7.4 Considerações Finais

Neste capítulo, foram apresentados dois exemplos de aplicações para robôs móveis autoadaptativos. Nos dois exemplos, foram experimentadas a implementação de diferentes funcionalidades do domínio desse tipo de aplicação. A arquitetura de referência SARAMR foi utilizada e cumpriu com sucesso ao propósito pelo qual foi projetada. Os quatro cenários de evolução identificados neste trabalho de mestrado ocorrem com frequência e a arquitetura de referência aqui proposta mostrou-se como uma forma eficiente para produzir software para o domínio de RMAs.