UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL

,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
1

Resumen—En este laboratorio se desarrolló dos
experimentos, el primero que consiste en hacer
deambular un carrito evitando obstáculos, y el
segundo consiste en que dicho carrito se dirija hacia
la zona de mayor luminosidad.

Abstract—This laboratory developed two
experiments, the first thing is to make a shopping
stroll avoiding obstacles, and the second is that the
basket is directed towards the area of greatest
brightness.

Palabras claves— Java, Comportamiento, Control,
Acción, Sensor.

Keywords— Java, Behavior, Control, Motion, Sensor.
I. INTRODUCCIÓN

os comportamientos pueden ser reactivos ó
deliberativos, y cada comportamiento contiene
acciones tan complejas como se quieran. Para el
manejo de comportamientos Lejos cuenta con un
paquete dedicado con funciones como Arbitrator,
takeControl, action y supress usados en el desarrollo
de la práctica.

En este laboratorio se define la estructura de
comportamientos, los sensores usados y las salidas que
arrojarán para los dos experimentos, el primero
“Wandering” ó deambulador y el segundo un seguidor
de luz que evita obstáculos usando el kit Lego
Mindstorms.
II. OBJETIVOS

► Comprender y poner en práctica la programación
orientada a comportamientos vista en clase.

► Adquirir la experticia en la programación del paquete
josx.robotics.* que implementa la programación
orientada a comportamientos para la plataforma
RCX.

► Comprender que en el campo de la robótica un
problema complejo puede ser dividido en metas de
menor complejidad, que en suma proporciona una
solución al problema planteado inicialmente.
III. MATERIALES

Con el fin de llevar a cabo la práctica es necesario tener
lo siguiente:

 Kit LEGO MINDSTORMS (plataforma)
 Modulo RCX (comando del robot)
 Sensor IR
 Sensor de contacto
 Torre IR
 Software Eclipse
 Cajas para formar un laberinto – Proporcionadas
en clase.
 Linterna – Llevada por el grupo de estudiantes.
 Sensor de luz adicional – Proporcionado en clase.
IV. MARCO TEÓRICO

La programación orientada a comportamientos es una
estrategia de desarrollo de aplicaciones para robótica
que puede ser tan compleja como se desee. Su base es
que hay un árbitro que decide qué comportamiento se va
a ejecutar o si ya ha terminado la ejecución de otro
comportamiento. Estos comportamientos son
jerarquizados de acuerdo a la prioridad dada por el
programador.

El comportamiento de menor prioridad tendrá el control
hasta que un comportamiento de mayor prioridad lo
pida, esto se hace con un método pre-establecido que
asigna un valor verdadero o falso indicando que el
comportamiento se va a ejecutar o no. Si varios
comportamientos están activos en un momento dado,
Control Usando La Programación Orientada A
Comportamientos – Lejos
Jorge Luis Enríquez González, Jair Alejandro Aristizabal, Alejandra Bejarano Rincón
L
UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
2
estos entran en una lista de espera y se ejecutaran
de acuerdo a su prioridad.

Para poder programar estos comportamientos se hace
uso del paquete josx.robotics.*, en este encontramos dos
clases:

o josx.robotics.Behavior se compone de tres
métodos. boolean takeControl() que permite
activar la ejecución del comportamiento, Void
action() que permite determinar las acciones que
se harán cuando el comportamiento este activo
y Void suppress() para detener la ejecución de
dicho comportamiento.

o Josx.robotics.Arbitrator se compone del método
constructor Public Arbitrator(Behavior []
behaviors) para crear un arbitro que regula las
ejecuciones de los comportamientos, y un método
Public void start() que inicia la ejecución del
arbitro.

V. ACTIVIDAD

Las actividades consisten en montar dos experimentos
de uso común en robótica:

El primero es conocido como Wandering o
deambular, pero cuyo objetivo es explorar un
ambiente evadiendo obstáculos y desplazándose
aleatoriamente. Por lo tanto se pide que el grupo de
estudiantes:

► Defina cual es la estructura de comportamientos
► Los sensores a los que pondrán atención
► Y las salidas que arrojarán.
► Luego, implementar un programa que recoja estas
premisas y las codifique en comportamientos
para la plataforma RCX.

El segundo es conocido como Homing, cuyo
objetivo es conducir al robot hacia una zona
definida como el punto de llegada o “casa”. Sin
embargo, conducir el robot hacia este punto no
implica que hará caso omiso de los obstáculos, esto
es, debe evadirlos; además, el robot deberá saber
en qué momento alcanza su objetivo. Por lo tanto
se pide que el grupo de estudiantes:

► Defina la estructura de comportamientos.
► Los sensores a los que pondrán atención
► Y las salidas que arrojarán.
► Luego, implementar un programa que recoja estas
premisas y las codifique en comportamientos
para la plataforma RCX.

VI. PROCEDIMIENTO

Para llevar a cabo el desarrollo de la práctica de
programación orientada por comportamientos, se utilizó
el kit de LEGO MINDSTORMS mostrado en la Fig.1.


Fig.1 Robot con sensor de contacto.


Para la realización de la actividad del Robot que
deambula, se busco una forma de modificar la
trayectoria del Robot de manera aleatoria. Para
lograr esto se declararon cuatro comportamientos
donde se buscaba lo siguiente:

 Evitar un obstáculo.
 Ir hacia la derecha.
 Ir hacia la izquierda.
 Ir hacia adelante.

Para lograr que el movimiento de la plataforma fuera
aleatorio, se hizo que los últimos tres comportamientos
nombrados anteriormente tomaran el control en tiempos
distintos y de forma aleatoria uno de otro. Lo anterior
se realizo con el uso de la función random(), la cual
estaba presente en cada una de las tres clases que
permite tomar el control, lo que indicaba que un
comportamiento de estos tres podría tener el control si
se satisface una condición que involucrara la función
random(). Con esto se logro que la plataforma se
moviera hacia adelante, hacia la derecha y hacia la
izquierda de forma aleatoria.

Para que el robot evitara los obstáculos se usó el cuarto
comportamiento, evitar un obstáculo, el cual tenia
mayor grado de prioridad que los tres anteriores y que se
UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
3
activaba por medio de dos sensores de contacto
presentes en frente de la plataforma.

A continuación se describen los comportamientos
usados desde el comportamiento de menor prioridad
hasta el de mayor prioridad:

► goForward:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 100 a 150.
 Acciones: Siempre orienta el robot hacia
delante y toca una pequeña canción cuando
termina el comportamiento.

► motor1:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 160 a 170.
 Acciones: Orienta el robot hacia el lado
izquierdo y toca una pequeña canción
cuando termina el comportamiento.

► motor2:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 160 a 170.
 Acciones: Orienta el robot hacia el lado
derecho y toca una pequeña canción cuando
termina el comportamiento.

► avoidObstacles:

 Entradas – Sensores de contacto izquierdo y
derecho.
 Activación – Si algún sensor detecta un
obstáculo el comportamiento se activa.
 Acciones: Dependiendo de cual sensor ha
detectado un obstáculo se retrocede y gira
hacia la derecha o hacia la izquierda según
el sensor activo.

El código implementado para esto es:



import java.beans.beancontext.BeanContext;
import java.util.Random;
import josx.robotics.*;
import josx.platform.rcx.*;
import josx.robotics.TimingNavigator;

public class test {
public static void main(String[] args) {
Sensor.S1.setTypeAndMode

(SensorConstants.SENSOR_TYPE_TOUCH,SensorConstants.SENSO
R_MODE_BOOL);

Sensor.S3.setTypeAndMode(SensorConstants.SENSOR_TYPE_TOU
CH,

SensorConstants.SENSOR_MODE_BOOL);
Sensor.S1.activate();
Sensor.S3.activate();
Motor.A.setPower(7);
Motor.C.setPower(7);
Behavior goForwardB0 = new goForward();
Behavior avoidObstaclesB1 = new avoidObstacles();
Behavior motor1a= new motor1();
Behavior motor2a= new motor2();
Behavior[] arrayBehaviors = { goForwardB0, motor1a, motor2a,
avoidObstaclesB1};
Arbitrator myBasicApp = new Arbitrator(arrayBehaviors);
myBasicApp.start();
}
}
class goForward implements Behavior {
public boolean takeControl(){
int ran=1+ (int)(Math.random()*250);
boolean ver
if(ran>=100 && ran<=150){
ver=true;
}else{
ver=false;
}
return ver;
}
public void action() {
Motor.A.forward();
Motor.C.forward();
}
public void suppress() {
Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class motor1 implements Behavior {
public boolean takeControl() {
int ran=1+ (int)(Math.random()*250);
boolean ver;
if(ran>=160 && ran<=170){
ver=true;
}else{
ver=false;
}
return ver;
}

public void action() {
Motor.A.forward();
Motor.C.backward();
}



} catch (InterruptedException ie) {
}
}
}

UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
4


Para la realización de la segunda actividad que
consiste en hacer que el Robot llegue a un punto
determinado o “llegue a casa”, se establecieron los
siguientes requerimientos:

 El robot debe deambular.
 El robot debe evitar obstáculos.
 El robot debe buscar una lámpara que esta
encendida.
 El robot se detenga cuando llegue donde esta la
lámpara.

Para lograr que el robot deambule se usó lo hecho en la
actividad anterior, luego se calibró un sensor de luz para
saber que valor daría al llegar al punto donde estaría la
lámpara, teniendo este valor se crearon dos
comportamientos más a los anteriores. El primer
comportamiento tenía como fin seguir en línea recta
cuando detectara un valor cercano e inferior al obtenido
cuando llegara a la lámpara, el otro comportamiento
tenia como fin detener la plataforma cuando el sensor de
luz leyera un valor igual o superior al valor registrado al
momento de la calibración.

Los comportamientos son descritos a continuación
desde el de menor prioridad hasta el de mayor prioridad:

► goForward:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 100 a 150.
 Acciones: Siempre orienta el robot hacia
delante y toca una pequeña canción cuando
termina el comportamiento.
public void suppress() {

Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class motor2 implements Behavior {
public boolean takeControl() {
int ran=1+ (int)(Math.random()*250);
boolean ver;
if(ran>=160 && ran<=170){
ver=true;
}else{
ver=false;
}
return ver;
}
public void action() {
Motor.C.forward();
Motor.A.backward();
}

public void suppress() {
Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class avoidObstacles implements Behavior {
boolean myS1State;
boolean myS3State;
boolean myTakeControl;
boolean whichSensor;

public boolean takeControl() {
myS1State = Sensor.S1.readBooleanValue();
myS3State = Sensor.S3.readBooleanValue();
if (myS1State)
{
myTakeControl = true;
whichSensor = true;
}
else
if (myS3State)
{
myTakeControl = true;
whichSensor = false;
}
else
myTakeControl = false;

return myTakeControl;
}

public void action() {
Sound.systemSound(false, 2);
if (whichSensor) {
Motor.A.backward();
Motor.C.backward();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) { }
Motor.A.forward();
Motor.C.backward();
try {
Thread.sleep(500);


} catch (InterruptedException ie) {
}
} else {
Motor.A.backward();
Motor.C.backward();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
}
Motor.A.backward();
Motor.C.forward();
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}

public void suppress() {
Motor.A.stop();
Motor.C.stop();
}
}
UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
5

► motor1:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 160 a 170.
 Acciones: Orienta el robot hacia el lado
izquierdo y toca una pequeña canción
cuando termina el comportamiento.

► motor2:

 Entradas – Ninguna
 Activación – El comportamiento se activa
cuando un número aleatorio generado de 0 a
250 se encuentra en el rango de 160 a 170.
 Acciones: Orienta el robot hacia el lado
derecho y toca una pequeña canción cuando
termina el comportamiento.

► avoidObstacles:

 Entradas – Sensores de contacto izquierdo y
derecho.
 Activación – Si algún sensor detecta un
obstáculo el comportamiento se activa.
 Acciones: Dependiendo de cual sensor ha
detectado un obstáculo se retrocede y gira
hacia la derecha o hacia la izquierda según
el sensor activo.

► seguirluz:

 Entradas – Sensor de luz.
 Activación – Si el sensor de luz al detectar
iluminación da un valor menor a 700.
 Acciones: Dependiendo de cual sensor ha
detectado un obstáculo se retrocede y gira
hacia la derecha o hacia la izquierda según
el sensor activo.

► luzdetect:

 Entradas – Sensor de luz.
 Activación – Si el sensor de luz al detectar
iluminación da un valor entre 490 y 545 que
es el valor caracterizado cuando se
encuentra muy cerca a la linterna.
 Acciones: Dependiendo de cual sensor ha
detectado un obstáculo se retrocede y gira
hacia la derecha o hacia la izquierda según el
sensor activo.

El código implementado para esto es:


import josx.robotics.*;
import josx.platform.rcx.*;

public class test {
public static void main(String[] args) {

Sensor.S1.setTypeAndMode(SensorConstants.SENSOR_TYPE_TOU
CH,SensorConstants.SENSOR_MODE_BOOL);

Sensor.S2.setTypeAndMode(SensorConstants.SENSOR_TYPE_LIGH
T, SensorConstants.SENSOR_MODE_RAW);

Sensor.S3.setTypeAndMode(SensorConstants.SENSOR_TYPE_TOU
CH, SensorConstants.SENSOR_MODE_BOOL);

Sensor.S1.activate();
Sensor.S2.activate();
Sensor.S3.activate();

Motor.A.setPower(7);
Motor.C.setPower(7);

Behavior goForwardB0 = new goForward();
Behavior avoidObstaclesB1 = new avoidObstacles();
Behavior motor1a= new motor1();
Behavior motor2a= new motor2();
Behavior seguirluza= new seguirluz();
Behavior luzdetecta=new luzdetect();

Behavior[] arrayBehaviors = { goForwardB0, motor1a, motor2a,
seguirluza, avoidObstaclesB1, luzdetecta};

Arbitrator myBasicApp = new Arbitrator(arrayBehaviors);
myBasicApp.start();
}
}

class goForward implements Behavior {
public boolean takeControl(){
int ran=1+ (int)(Math.random()*250);
boolean ver;

if(ran>=100 && ran<=150){
ver=true;

}else{
ver=false;
}

return ver;

}

public void action() {

Motor.A.forward();
Motor.C.forward();

}


UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
6

public void suppress() {

Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class motor1 implements Behavior {
public boolean takeControl() {

int ran=1+ (int)(Math.random()*250);
boolean ver;

if(ran>=160 && ran<=170){
ver=true;

}else{
ver=false;
}

return ver;

}

public void action() {

Motor.A.forward();
Motor.C.backward();

}

public void suppress() {

Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class motor2 implements Behavior {
public boolean takeControl() {

int ran=1+ (int)(Math.random()*250);
boolean ver;

if(ran>=160 && ran<=170){
ver=true;

}else{
ver=false;
}
return ver;
}

public void action() {

Motor.C.forward();
Motor.A.backward();
}

public void suppress() {

Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class seguirluz implements Behavior {
public boolean takeControl() {
boolean ver;
int myS2State;
myS2State = Sensor.S2.readRawValue();
LCD.showNumber(myS2State);

class seguirluz implements Behavior {
public boolean takeControl() {
boolean ver;
int myS2State;
myS2State = Sensor.S2.readRawValue();
if(myS2State<=700){
ver=true;

}else{
ver=false;
}
return ver;
}

public void action() {

Motor.C.forward();
Motor.A.forward();
}

public void suppress() {
Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class luzdetect implements Behavior {
public boolean takeControl() {
boolean ver;
int myS2State;
myS2State = Sensor.S2.readRawValue();
LCD.showNumber(myS2State);

if(myS2State>=490 && myS2State<=545){
ver=true;

}else{
ver=false;
}
return ver;
}

public void action() {

Motor.C.stop();
Motor.A.stop();
}

public void suppress() {

Sound.systemSound(false, 3);
Motor.A.stop();
Motor.C.stop();
}
}

class avoidObstacles implements Behavior {
boolean myS1State;
boolean myS3State;
boolean myTakeControl;
boolean whichSensor;

public boolean takeControl() {
myS1State = Sensor.S1.readBooleanValue();
myS3State = Sensor.S3.readBooleanValue();
if (myS1State)
{
myTakeControl = true;
whichSensor = true;
}
else
if (myS3State)
{
myTakeControl = true;
whichSensor = false;
UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
7



VII. CONCLUSIONES

El kit de LEGO MINDSTORMS cuenta con sensores de
luz los cuales no son los mejores para realizar este tipo
de prácticas donde el sensor está ubicado en la parte
frontal del carro, pues la luz del ambiente influye en la
luz de la lámpara, además de que no se tiene un rango de
valores que otorguen precisión a la medida.

El método de programación mediante comportamientos
es un método modular que permite añadir o quitar
distintos comportamientos sin necesidad de cambiar la
estructura del programa. (por eso después de hacer el
robot deambular y evitar obstáculos, se pudo añadir un
nuevo comportamiento que era seguir luz sin necesidad
de generar otro proyecto.)

Gracias a la API proporcionada por lejos se pudo
implementar estos comportamientos pero el concepto se
puede llevar a un gran número de lenguajes de
programación.

El uso de retardos dentro de los comportamientos hace
que se produzca una respuesta lenta de los
comportamientos, porque se puede dar el caso de
encontrarse en un retardo cuando se active un
comportamiento y este no será atendido sino cuando se
termine dicho retardo. Esto también ocurre cuando
dentro del comportamiento se desarrollan muchas
actividades.
VIII. REFERENCIAS


[1] Sitio WEB de LEJOS - http://lejos.sourceforge.net

[2] Sitio WEB de LEGO – http://lego.mindstorms.com

IX. AUTORES

Jorge Luis Enríquez González
Nació en Pasto, Nariño el 30 de abril de 1991, estudio la
primaria en el colegio Nuestra señora de Belén, Culmino
el bachillerato en el colegio CASD y actualmente cursa
octavo semestre de ingeniería electrónica en la
Universidad del Quindío y pertenece al grupo de
investigación GITUQ del área de telecomunicaciones de
la universidad del Quindío.

Alejandra Bejarano Rincón
Nació en Calarcá, Quindío el 8 de junio de 1991, estudio
la primaria en el colegio Rafael Uribe Uribe de Calarcá,
Culmino el bachillerato en el colegio San José de
Calarcá y actualmente cursa séptimo semestre de
ingeniería electrónica en la Universidad del Quindío y
pertenece al grupo de investigación GAMA del área de
control y automatización de la universidad del Quindío.

Jair Alejandro Aristizabal

else
if (myS3State)
{
myTakeControl = true;
whichSensor = false;
}
else
myTakeControl = false;

return myTakeControl;
}

public void action() {
Sound.systemSound(false, 2);
if (whichSensor) {
Motor.A.backward();
Motor.C.backward();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) { }
Motor.A.forward();
Motor.C.backward();
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
} else {
Motor.A.backward();
Motor.C.backward();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
}
Motor.A.backward();
Motor.C.forward();
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}

public void suppress() {
Motor.A.stop();
Motor.C.stop();
}
}

UNIVERSIDAD DEL QUINDIO, INGENIERÍA ELECTRÓNICA, LABORATORIO #3 DE ROBÓTICA MÓVIL,
PRESENTADO DURANTE EL SEGUNDO PERIODO DEL AÑO 2012
8
Nació en Armenia, Quindío el 2 de mayo de 1988,
estudio la primaria en el León de Greiff de Calarcá,
Culmino el bachillerato en el colegio Jorge Isaacs de
Armenia y actualmente cursa noveno semestre de
ingeniería electrónica en la Universidad del Quindío.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.