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
Un ejemplo: DifferentialPilot
, que permite que el robot mediante un controlador interno calcule cuánto
se ha movido.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).
Dejo unos enlaces que podrían ser de interés:
Cad de diseño con las piezas de lego
http://ldd.lego.com/
Manual sobre java
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html
Manual sobre LeJOS
http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm
Manual sobre java
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html
Manual sobre LeJOS
http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm
No hay comentarios:
Publicar un comentario