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.