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();
                }
}



lunes, 4 de abril de 2011

AGENTES Y AMBIENTES


EJERCICIOS
2. ¿Qué agente para qué problema?
Para los siguientes problemas señala que tipo de agente podría resolverlo mejor (reflexivo o deliberativo.) Justifica tu respuesta.
-         -   Salir de un laberinto
-          - Explorar habitaciones y reconocer los objetivos encontrados dentro de éstas.
-          - Jugar ajedrez.
-          - Jugar dominó. (en parejas)
-          - Cuidar una persona mayor en su casa.
-          - Asistir a un ejecutivo en el manejo de su agenda.
-          - Asistir a un ejecutivo en la preparación de sus viajes de negocios.

Todos los ejemplos se pueden resolver mejor con un agente deliberativo ya que se necesita un razonamiento para lograr el objetivo.

 2.1 METODOLOGÍA PAGE
Una forma para responder la pregunta anterior es construir una definición PAGE de cada uno de los agentes. Esta definición consiste de 4 partes:
-          Perceceptions: Qué cosas será capaz de percibir el agente.
-           Actions: Qué acciones será capaz de llevar a cabo el agente.
-           Goals (Objetivo): Cuál es el objetivo del agente.
-          Environment (Ambiente): Qué características tiene el ambiente en el que el agente va a llevar a cabo su tarea y que pueden afectarlo.

1.       Salir de un laberinto
a)      Si ya pasó por un lugar y si ese lugar no tuvo salida, ya no regresar por ese camino.
b)      Recorrer el laberinto descartando los caminos que no tienen salida.
c)       Salir del laberinto
d)      Una serie de caminos que llevan a diferente destino y solo uno lleva a la salida.
2.       Explorar habitaciones y reconocer los objetivos encontrados dentro de éstas.
a)      Objetos
b)      Analizar si conoce el objeto
c)       Reconocer objetos dentro de habitaciones.
d)      Muchos objetos en distintas habitaciones.
3.        Jugar ajedrez
a)      El tablero del contrincante y el suyo con sus respectivas fichas.
b)      Mover sus fichas de acuerdo a las circunstancias.
c)       Ganar el juego haciendo jaque mate.
d)      Distintos movimientos a lo largo del juego. Le puede afectar al agente la forma en la que reacciona el otro jugador.
4.       Jugar dominó en parejas
a)      A su pareja, sus fichas y a los demás.
b)      Contar las fichas y hacer su jugada.
c)       Terminarse las fichas o tener el menor número  en sus fichas.
d)      Diferente reparto de fichas.
5.       Cuidar una persona mayor en su casa.
a)      El estado de la persona.
b)      Atenderla cuando sea necesario y estar atento en todo momento.
c)       Cuidarla.
d)      Que la persona puede tener distintas necesidades.
6.       Asistir a un ejecutivo en el manejo de su agenda.
a)      Saber las actividades del ejecutivo.
b)      Organizarlas de acuerdo a tiempos y prioridades.
c)       Ayudarle a un ejecutivo con su agenda de manera que cumpla con todas sus actividades.
d)      Que pueden surgir actividades.

7.       Asistir a un ejecutivo en la preparación de sus viajes de negocios.
a)      Fechas disponibles, mejores rutas, costos, etc.
b)      Decidir y planear.
c)       Ayudar en la preparación de los viajes.
d)      Cambios en los planes.
e)      Asistir a un ejecutivo en la preparación de sus viajes de negocios.
3 MAS PROBLEMAS…
Para los siguientes problemas señala qué tipo de agente podría resolverlo mejor (reflexivo o deliberativo). Es importante justificar la respuesta y dar ejemplos de situaciones en los que uno u otro tipo de agente podría desempeñarse mejor.
-          Controlar el tráfico de aviones en el aeropuerto.
-           Monitorear el tráfico de automóviles en la ciudad de Guadalajara.
-           Monitorear las condiciones del bosque de la primavera para evitar y/o responder ante incendios forestales.
Se podrían utilizar ambos agentes, ya que se necesita de un razonamiento para poder lograr el objetivo, y a la vez necesitamos que el agente actúe de acuerdo a una condición y acción para llegar a una mejor decisión.

Haz una descripción PAGE de los agentes.
-          Controlar el tráfico de aviones en el aeropuerto.
a)      Conocer los vuelos, los horarios, las rutas, las conexiones.
b)      Determinar el siguiente turno y el tiempo de espera de un despegue a otro.
c)       Un mejor control de tráfico de aviones.
d)      Que puede haber cancelaciones de vuelo por circunstancias externas, o aterrizajes de emergencia, etc.
-           Monitorear el tráfico de automóviles en la ciudad de Guadalajara.
a)      Conocer el número de automóviles circulando y existentes.
b)      Llevar un control de los automóviles.
c)       Monitorear el tráfico y llevar una cuenta.
d)      Que siempre esta variando pero manteniendo un rango.
-           Monitorear las condiciones del bosque de la primavera para evitar y/o responder ante incendios forestales.  
a)      Condiciones actuales del bosque, cambios climáticos, número de personas que lo visitan, etc.
b)      Darse cuenta cuando hay peligro de incendio o ya hay un incendio y estar bien preparados.
c)       Monitorear las condiciones del bosque de la primavera para evitar y/o responder ante incendios forestales. 
d)      Que no siempre puede ser predecible.
 ¿En qué son diferentes estos problemas con respecto de los del punto 2?
En que pueden ser resueltos con ambos tipos de agente.
 ¿Qué necesita un agente para poder resolverlos?
Percepciones, acciones, saber la meta y conocer al ambiente.