lunes, 16 de mayo de 2011

Proyecto final videos






Video con sensor ultrasonic 

Codigo: wumpus proyecto final

CODIGO:


import lejos.nxt.*;
import lejos.robotics.subsumption.*;
import lejos.robotics.navigation.*;

/**
 * Demonstration of use of the Behavior and Pilot classes to
 * implement a simple line following robot.
 *
 * Requires a wheeled vehicle with two independently controlled
 * wheels with motors connected to motor ports A and C, and a light
 * sensor mounted forwards and pointing down, connected to sensor port 1.
 *
 *
 */
public class otro {
               
                public static void main (String[] aArg)
                throws Exception
                {
               
                               final Pilot pilot = new TachoPilot(5.6f,16.0f,Motor.A, Motor.Cfalse);
                               final LightSensor light = new LightSensor(SensorPort.S1);
                               final LightSensor light2 = new LightSensor(SensorPort.S3);
                               final UltrasonicSensor ul = new UltrasonicSensor(SensorPort.S2);
        pilot.setTurnSpeed(180);
        /**
         * this behavior wants to take control when the light sensor sees the line
       
                               Behavior DriveForward = new Behavior()
                               {

                                               public boolean takeControl() {return light.readValue() <= 40 ;
                                               }
                              
                                               public void suppress() {
                                                               //pilot.stop();
                                               } //suppress
                                              
                                               public void action() {
                                                              
                                                              
                                                              
                                                               pilot.forward();
                                                              
                                                               Motor.A.setSpeed(1200);
                Motor.C.setSpeed(1200);
               
                               
                while(light.readValue()  <=40) Thread.yield(); //action complete when not on line
                                                               }//action
                                                                                                             
                               }; //drive forward
                              
                               Behavior OffLine = new Behavior()
                               {
                                               private boolean suppress = false;
                                              
                                               public boolean takeControl() {return light.readValue() > 40;
                               }//take control

                                               public void suppress() {
                                                               suppress = true;
                                               }//suppress
                                              
                                               public void action() {
                                                               int sweep = 9; //9
                                                               while (!suppress) {
                                                                             
                                                                              pilot.rotate(sweep,true);
                                                                              while (!suppress && pilot.isMoving()) Thread.yield();
                                                                              sweep *= -2; //-2
                                                               } //while
                                                               pilot.stop();
                                                               suppress = false;
                                               } //action
                               }; //behaviour
                                              
                              
                               Behavior[] bArray = {OffLine, DriveForward};
        LCD.drawString("WUMPUSSSSSS GRRRRRRRR...!!! ", 0, 1);
        Button.waitForPress();
       
        int c;
        for(;;)
        {
            c =ul.getDistance();
            LCD.drawString("La distancia es" + c, 0,0);
       
            if(c<100)
            {
                    (new Arbitrator(bArray)).start();
                   
            } //end if
            else
            {
                                               Motor.B.rotateTo(150);
                                               Motor.B.rotateTo(-150);
            } //end else
               
        }// end for
               
}//en main
                } // end class


PRÁCTICA FINAL: Comunicación entre agentes

En un planeta lejano y hostil hay varios agentes terrícolas trabajando para abastecer a la Tierra de ciertos recursos muy valiosos. En este planeta se han establecido dos bases terrícolas para almacenar los recursos y darle abrigo y refugio a los agentes. En un campo que se encuentra más o menos a la misma distancia de ambas bases hay un yacimiento importante de los recursos, la mala noticia es que este yacimiento es el hogar de un extraterrestre poco amigable conocido como Wumpus.

WUMPUS

El Wumpus es un ente gordo y feo, con un mal temperamento y una fuerza extremas y cada vez que ve a uno de los agentes terrícolas lo ataca y lo destroza. La buena noticia es que el

Wumpus es tan enojón como tonto, y solamente se mueve alrededor de su madriguera sin salirse nunca de una línea que sus propias feromonas han marcado.

La tarea del Wumpus es proteger la madriguera y no permitir que los robots saquen los recursos de ella.
Por lo que se programó al wumpus de la siguiente manera para realizar esta tarea:


El algoritmo que utilizamos fue repetitivo pues el wumpus va detectando la línea negra, mientras esta cuidando la madriguera y los objetos valiosos que se encuentran adentro. En el momento que va a realizar un giro es su punto débil pues tarda un poco en girar. Ya que vuelve a detectar la línea va más rápido  para alcanzar a destruir a los robots.
El wumpus maneja dos sensores que lo hace todavía aun más poderoso para tener mejor control de su base y pueda ser más veloz para la destrucción de los robots.


Con estos dos sensores se lleva un mejor control el Wumpus.
Así mismo se le añadió un sensor UltraSonico para que el Wumpus no gaste sus energías y solamente 
avance cuando detecte que un objeto extraño se acerca a su base y de esta manera pueda atacar.





Restricciones:
·         Solamente un agente puede estar dentro de cada base en un momento dado (de lo
               contrario las bases explotan ya que consideran al segundo agente una violación de
               seguridad)
·         Solamente puede estar un agente dentro de la madriguera del Wumpus.
·         El wumpus solamente se mueve en círculo sobre una línea alrededor de su
              Madriguera, pero puede moverse en cualquier sentido.
·         Si el wumpus toca a alguno de los agentes, el agente es destruido.
·         Si los dos agentes están al mismo tiempo dentro de una base, ambos agentes son
               destruidos.
·         Si los dos agentes están al mismo tiempo dentro de la madriguera del wumpus,
              ambos agente son destruidos


lunes, 25 de abril de 2011

PROGRAMANDO LOS LEGO NXT

Ejercicios


        1. HUIR DE LA LUZ (ROBOT ESPÍA O CUCARACHA ARTIFICIAL)

El robot se encuentra inicialmente en un cuarto oscuro. Utiliza su sensor infrarrojo para detectar cualquier posible haz de luz y huir de ella. Es decir, irse por otro camino.

import lejos.nxt.*;
import lejos.robotics.subsumption.*;
import lejos.robotics.navigation.*;

public class Light {
    
     public static void main (String[] aArg)
     throws Exception
     {
          final Pilot pilot = new TachoPilot(5.6f,16.0f,Motor.A, Motor.B, false);
          final LightSensor light = new LightSensor(SensorPort.S2);
        pilot.setTurnSpeed(300);//100

          Behavior DriveForward = new Behavior()
          {
                public boolean takeControl() {return light.readValue() <= 40;}
               
                public void suppress() {
                     pilot.stop();
                }
                public void action() {
                     pilot.forward();
                while(light.readValue() <= 40) Thread.yield();
                }                        
          };
         
          Behavior OffLine = new Behavior()
          {
                private boolean suppress = false;
               
                public boolean takeControl() {return light.readValue() > 40;}

                public void suppress() {
                     suppress = true;
                }
               
                public void action() {
                     int sweep = 5;//5, 10
                     while (!suppress) {
                          pilot.rotate(sweep,true);
                          while (!suppress && pilot.isMoving()) Thread.yield();
                          sweep *= -2.5;//5
                     }
                     pilot.stop();
                     suppress = false;
                }
          };

          Behavior[] bArray = {OffLine, DriveForward};
        LCD.drawString("HUYE DE LA LUZ!!", 0, 1);
        Button.waitForPress();
         (new Arbitrator(bArray)).start();
     }
}


2.     UBICAR Y ENCONTRAR UNA FUENTE DE SONIDO
Programar el robot para que utilizando el sensor de sonido (micrófono) pueda ubicar y llegar hasta una fuente de sonido que si bien está fija, funciona de manera episódica. La fuente de sonido puede encontrarse en cualquier dirección con respecto de la dirección inicial del robot y dentro de un área de 15 m2

import java.util.*;

import lejos.nxt.*;

public class Sonido
{
    public static void main(String[] args)
    {
        SoundSensor sonido = new SoundSensor(SensorPort.S2);
        boolean flag = false;
      
        Motor.B.setSpeed(300);
        Motor.C.setSpeed(300);
      
        int c;
        for(;;)
        {
            c=sonido.readValue();
            System.out.println(c);
            if(c>70)
            {
                Motor.B.forward();
                Motor.C.forward();
            }
            else
            {
                Motor.B.forward();
                Motor.C.backward();
            }
        }
    }
}


3.     RODEAR UN OBJETO

El robot está programado para que utilizando el sensor de toque pueda encontrar y rodear un objeto siguiendo su contorno. El objeto puede tener cualquier forma (rectangular como una caja o cilíndrica como un bote, el objeto será suficientemente pesado como para que el robot no lo mueva, dentro de límites razonables.


import lejos.nxt.*;

/**
 * Simple test of the Lego UltraSonic Sensor.
 *
 * @author Lawrie Griffiths
 *
 */
public class rodear{
  
    public static void main(String[] args) throws Exception {
      
        boolean flag = false;
      
        UltrasonicSensor sonic = new UltrasonicSensor(SensorPort.S1);
      
        TouchSensor ts = new TouchSensor(SensorPort.S4);
      
     
        while(!Button.ESCAPE.isPressed()) {
          
            Motor.B.forward();
            Motor.C.forward();
          
            LCD.clear();
            LCD.drawInt(sonic.getDistance(), 0, 3);
            LCD.refresh();
          
            Thread.sleep(50);
                      
            if(ts.isPressed() || sonic.getDistance() < 20)
            {
                flag = true;
                Motor.B.stop();
                Motor.C.stop();
              
                Motor.B.resetTachoCount();
                Motor.C.resetTachoCount();
              
                Motor.B.forward();
                Motor.C.backward();
              
                System.out.println("ciclo 1");
                int count = 0;
                while(count < 160 )
                {
                    count = Motor.B.getTachoCount();
                }
              
                Motor.B.forward();
                Motor.C.forward();
              
                Thread.sleep(1000);
              
              
              
                Motor.B.stop();
                Motor.C.stop();
              
                Motor.C.resetTachoCount();
                Motor.B.resetTachoCount();
              
                Motor.C.forward();
                Motor.B.backward();
                              count = 0;
                while(count < 160 )
                {
                    count = Motor.C.getTachoCount();
                }
              
                Motor.B.stop();
                Motor.C.stop();       
            }else if(flag == true)
            {
                Motor.B.forward();
                Motor.C.forward();
                Thread.sleep(1500);
                  
                Motor.B.stop();
                Motor.C.stop();
                  
                Motor.C.resetTachoCount();
                Motor.B.resetTachoCount();
                  
                Motor.C.forward();
                Motor.B.backward();
                  
                               int count = 0;
                while(count < 180 )
                {
                    count = Motor.C.getTachoCount();
                }
              
                Motor.B.stop();
                Motor.C.stop();

                Thread.sleep(1000);

            }
          
        }
    }  
}  




4.    SALIR DE UN LABERINTO

El robot está programado para que utilizando el sensor ultrasónico pueda localizar obstáculos y girar para evitarlos. El robot también se debe programar para que utilizando estas habilidades (localizar obstáculos y girar) pueda salir de un laberinto de ángulos rectos.

5.    SEGUIR UNA LÍNEA NEGRA
Programar el robot para que utilizando el sensor de luz pueda encontrar y seguir una trayectoria marcada con una línea negra pintada sobre una superficie plana. La trayectoria puede ser recta, con giros en varios ángulos, zig-zag, etc.
Para este ejercicio utilizamos los puertos A y C para las llantas y el sensor de luz al frente y apuntando hacia abajo en el puerto 1.
El robot sigue avanzando mientras detecte la línea (mientras regrese el valor menor igual a 40)
import lejos.nxt.*;
import lejos.robotics.subsumption.*;
import lejos.robotics.navigation.*;

public class LineaNegra {
               
                public static void main (String[] aArg)
                throws Exception
                {
                               // Change last parameter of Pilot to specify on which
                               // direction you want to be "forward" for your vehicle.
                               // The wheel and axle dimension parameters should be
                               // set for your robot, but are not critical.
                               final Pilot pilot = new TachoPilot(5.6f,16.0f,Motor.A, Motor.C, false);
                               final LightSensor light = new LightSensor(SensorPort.S1);
        pilot.setTurnSpeed(180);
        /**
         * this behavior wants to take control when the light sensor sees the line
         */
                               Behavior DriveForward = new Behavior()
                               {
                                               public boolean takeControl() {return light.readValue() <= 40;}
                                              
                                               public void suppress() {
                                                               pilot.stop();
                                               }
                                               public void action() {
                                                               pilot.forward();
                while(light.readValue() <= 40) Thread.yield(); //action complete when not on line
                                               }                                                                            
                               };
                              
                               Behavior OffLine = new Behavior()
                               {
                                               private boolean suppress = false;
                                              
                                               public boolean takeControl() {return light.readValue() > 40;}

                                               public void suppress() {
                                                               suppress = true;
                                               }
                                              
                                               public void action() {
                                                               int sweep = 10;
                                                               while (!suppress) {
                                                                              pilot.rotate(sweep,true);
                                                                               while (!suppress && pilot.isMoving()) Thread.yield();
                                                                              sweep *= -2;
                                                               }
                                                               pilot.stop();
                                                               suppress = false;
                                               }
                               };

                               Behavior[] bArray = {OffLine, DriveForward};
        LCD.drawString("Line ", 0, 1);
        Button.waitForPress();
                    (new Arbitrator(bArray)).start();
                }
}