miércoles, 9 de marzo de 2011

Práctica 3 { parte 1: Comportamiento de evitación de obstáculos usando sensores de contacto}

El objetivo en esta parte será que el robot camine por el terreno, y cuando el sensor de contacto detecte un objeto lo esquive retrocediendo y haciendo un arco adecuado.

El montaje será el robot con las ruedas y un sensor de contacto en el centro como vemos en la foto:



En la parte del código, en esta práctica usaremos una nueva forma de programar el robot. Esta forma es mediante comportamientos.
Los comportamientos se heredan de la clase behavior. Hay que implementar tres métodos:
- boolean takeControl(). Devuelve verdadero si se dan las condiciones necesarias para que cierto comportamiento tome el control del robot.
- void action(). El código de este método se ejecuta cuando el comportamiento se activa.
- void suppress(). Este método debe terminar inmediatamente el código que
ejecuta el método action(). Puede terminarlo de inmediato (si es un bucle
infinito, o la ejecución es larga) o esperar a que termine, si la ejecución es
corta.

A lo largo de toda esta práctica vamos a usar los siguientes comportamientos:


>>Andar


import lejos.robotics.subsumption.Behavior;

import lejos.nxt.*;

public class Andar implements Behavior {

    public boolean takeControl() {

      return true;

    }

    public void suppress() {

      Motor.B.stop();

      Motor.C.stop();

    }


    public void action() {

      Motor.B.forward();

      Motor.C.forward();

    }

}



>>Evitar



import lejos.robotics.navigation.TachoPilot;

import lejos.robotics.subsumption.Behavior;

import lejos.nxt.*;


public class Evitar implements Behavior {

    TouchSensor touch = new TouchSensor(SensorPort.S4);

    TachoPilot viajar = new TachoPilot(5.6f,10.85f,Motor.C,Motor.B);

    public boolean takeControl() {

      return touch.isPressed();

    }

    public void suppress() {

      viajar.stop();

    }


    public void action() {

      viajar.stop();

      viajar.travel(-5);

      viajar.rotate(-90);

      viajar.steer(40,120);

      viajar.rotate(-45);


    }

}


>>Luz


import lejos.robotics.navigation.TachoPilot;

import lejos.robotics.subsumption.Behavior;

import lejos.nxt.*;

import lejos.nxt.addon.RCXLightSensor;


public class Luz implements Behavior {

    RCXLightSensor LuzIzda = new RCXLightSensor(SensorPort.S1);

    RCXLightSensor LuzDcha = new RCXLightSensor(SensorPort.S2);

    TachoPilot viajar = new TachoPilot(5.6f,10.85f,Motor.C,Motor.B);

    int Izda,Dcha,i;

    public boolean takeControl() {

      Izda=LuzIzda.getNormalizedLightValue();

      Dcha=LuzDcha.getNormalizedLightValue();

      return (((Izda-Dcha)>30)||((Dcha-Izda)>30));

    }

    public void suppress() {

      viajar.stop();

    }


      public void action() {

      Izda=LuzIzda.getNormalizedLightValue();

      Dcha=LuzDcha.getNormalizedLightValue();

      if ((Izda-Dcha)>30){

        viajar.rotate(5);


        if ((Dcha-Izda)>30){

          viajar.rotate(-5);

        }

      }
    }


    Para esta primera parte que consistía en esquivar un obstáculo usaremos andar y evitar, y el árbitro será obstáculos:

    Para el comportamiento evitar nos definiremos touch de la clase TouchSensor y viajar de la clase TachoPilot. En take control pondremos si está presionado el sensor para que de control al comportamiento. En supress haremos que el robot se pare, y en action haremos que se pare, retroceda y gire mediante el steer para bordear el obstáculo. Antes y después del steer usamos rotate para que el robot se oriente en su dirección de destino, es decir, que después de esquivar el objeto siga con la dirección que llevaba.



    Aquí podemos ver el código:



    import lejos.robotics.subsumption.Arbitrator;

    import lejos.robotics.subsumption.Behavior;


    public class Obstaculos {

      public static void main(String [] args) {

        Behavior b1 = new Andar();

        Behavior b2 = new Evitar();

        Behavior [] bArray = {b1, b2};

        Arbitrator arby = new Arbitrator(bArray);

        arby.start();

      }
    }

    Aquí podemos ver el vídeo del funcionamiento

    No hay comentarios:

    Publicar un comentario