martes, 12 de febrero de 2013

Primera practica - Choca-gira v1



Programación reactiva

La programación reactiva es muy buena en prácticas simples,  hace que el comportamiento del robot sea fluido, y adaptable al entorno.
La idea es que el programador  piense con que problemas se va a encontrar el robot y los separe  en decisiones excluyentes.
El robot capta la información y ejecuta  la tarea.
----------------------------------------------------------------------------------------------------------------------------------


Principales componentes

<Sensores>
El choca-gira tiene 2 sensores de contacto que le dirán  por que lado ha chocado.



<Actuadores>
Cuenta con 2 motores  para generar su movimiento.


<Procesador>
El ntx será el que tome las decisiones.


----------------------------------------------------------------------------------------------------------------------------------

Que se pide

 El robot avanza hasta chocar. Una vez ha detectado el choque deberá retroceder un poco. Y si el choque lo detecto el sensor derecho girar a la izquierda, si fue con el izquierdo girar a la derecha, el ángulo de giro será aleatorio.


_________________________________________________________________________________

 Solución


El primer problema viene del mundo físico:
¿Cuál sería la mejor posición de los sensores?
    --Una solución sería colocar cada uno  a un lado del robot apuntando hacia el frente.
 ¿Detectaría siempre?
    --La detección está limitada a la superficie del sensor. Para aumentarla he diseñado un parachoques.




¿Cómo se moverá?
    --Aquí teníamos libertad, pero lo más lógico era con 2 ruedas motrices por tracción diferencial y una rueda loca.


  -----------------

Una vez tenemos planteado el chasis, tenemos que programarlo:

El nxt tiene ya unos paquetes donde él considera que los motores servirán para el desplazamiento.(lejos.robotic.navigation.*)
Y en el paquete básico (lejos.nxt.*)  están los objetos que sirven para controlar los sensores.
Para configurar los sensores, primero se pone el tipo, después el nombre que va a tener, y finalmente, se llama al constructor para que haga el objeto pasándole como argumento el puerto que quieres que use.
Un ejemplo:
    TouchSensor sensorS1 = new TouchSensor(SensorPort.S1);


Para controlar el movimiento, al principio usamos la abstracción de
DifferentialPilot, que permite que el robot mediante un controlador interno calcule cuánto se ha movido.
 Un ejemplo:
    
DifferentialPilot p1 = new DifferentialPilot(diámetro_ruedas, distancia_ruedas,Motor.A,Motor.B);

La clase
DifferentialPilot permite calibrar la velocidad de desplazamiento. 
Un ejemplo:
    p1.setSpeed(400);

Así como controlar la dirección del desplazamiento recto o giro de forma no bloqueante 
Un ejemplo recto:
    p1.travel(10.0, true);
Un ejemplo giro:
   p1.rotate(90, true);

Ahora venía clasificar los casos, 2 sensores 2^2= 4 informaciones
    -si choca por la izquierda se le dice al robot que gire (0-180º) negativos.
    -si choca por la derecha se le dice al robot que gire (0-180º) positivos.
    -si no choca avanza.  
    Un último caso sería que chocase de frente, que se englobaría  en un choque  de algún lado  indistintamente según el punto en el que se halle  la ejecución.
  -----------------


Ya hecho el prototipo procedemos a probarlo:
Primero en un pasillo sin obstáculos:
    - Aquí funciona como lo esperado, los choques frontales activan uno de los sensores.

A continuación, se enfrenta a un entorno más agresivo como es el salón; hay mesas, sillas, sofás, una estantería, cables y una lámpara de pie.
   -Aquí muchos choques frontales no los detecta, tiene muchos obstáculos por debajo de la posición de los sensores, por  lo que rediseño el  parachoques para  que los choques frontales  los detecte mejor.







Esta nueva pieza permite que si se da contra una pata  de frente, alguno de los sensores se dé por enterado.

A continuación, intento hacerle fotofóbico, pero el sensor de luminosidad no funciona según lo esperado, y cuando Pilot se hace cargo de la navegación, pierde componente reactiva, se mueve solo con información interna (a ciegas del mundo).

Intentaré  realizar algunas mejoras a la programación. Será el Choca-gira v2

Dejo unos enlaces que podrían ser de interés:
Cad de diseño con las piezas de lego

No hay comentarios:

Publicar un comentario