Terminator-Robot 

Prácticas de Introducción a la Robótica (URJC)


Desarrolladores:

Jóse Luis Pujante Montoya

Helmuth Winkovics 

 

Enlaces 

Tutor 

Francisco Martin Rico  

Curiosidades 

NXT Jingle Bells

NXT Segway (P2)

NXT Johnny 5

NXT Rubik Cube Solve (Recomendado)

Desarrolladores 

José Luis Pujante Montoya

 

 

 
 
 
 
 
 
 
 
 
Helmuth Winkovics

He

Práctica 5: Segway (09/01/08)

La primera idea fué dividir el funcionamiento en fases, de una forma parecida a como lo realizamos en la práctica del SigueLineas. La idea se puede ver como:

    public static void main(String[] args) {
        LightSensor ls = new LightSensor(SensorPort.S2);
        Motor.B.setSpeed(SPEED);
        Motor.C.setSpeed(SPEED);
        //Calibracion del LightSensor
        calibrarse(ls);
        estabilizarse(ls);
    }

La fase de calibración tomaría un conjunto de muestras para acotar el rango de valores en los que se debería de mover el robot. La fase de estabilización se encargaría de comprobar si el robot se encuentra en la región deseada para el equilibrio o no, en cuyo caso intentaría estabilizarlo dependiendo de hacia que lado se haya movido.


Una segunda aproximación fué mejorar el código conseguido anteriormente introduciendo una actualización del umbral de forma dinámica. La idea era conseguir auto-ajustar el umbral de forma que dinámica para que las condiciones de luminosidad afectaran lo menos posible.

Tras númerosas pruebas, el tiempo máximo de estabilización conseguido fue de aproximadamente 5seg.

 

Imagenes



Práctica 4: Rescate (16/01/08)

Enunciado: Descargar

Fase 1: En esta primera fase se realiza un exhaustivo plan de calibración de los diferentes colores que hay que diferenciar usando el sensor de Luz. Para realizar esto de programa el robot para que realice series de 50 muestras por color y nos muestre los resultados finales en la pantalla LCD, tal y como se puede ver en la siguiente imagen:

Los colores son: Plata, Verde, Negro y Blanco. Tras la calibración nos damos cuenta de que el histograma de colores nos ordena los colores en el siguiente orden (de menor a mayor intensidad luminosa):

Verde -> Negro -> Blanco -> Plata

Fase 2: En esta fase intentaremos ajustar el robot para conseguir sobrepasar las zonas discontinúas en la linea que señala el camino. Hay dos tipos de discontinuidades: discontinuidades largas de entre 5-10cm aproximadamente y conjunto discontinuidades seguidas de entre 2-3cm. Dado que el tratamiento de las discontinuidades es distinto al comportamiento actual del robot a la hora de volver a buscar la línea cuando se pierde, decidimos calibrar el robot para que cuando realizase un número determinado de escaneos en ambas direcciones determinase que estaba en una línea discontinúa y cambiase de comportamiento. Una vez conseguido dicho ajuste, la siguiente tarea que nos encontramos era como conseguir ajustar el nxt para que obtuviese un comportamiento adecuado en las dos situaciones de discontinúidad posibles.

Una primera idea fué la de realizar los escaneos junto con un pequeño avance de unos 3cm aproximadamente. Esta propuesta nos daba problemas ya que el robot al volver a su posición original tras el pequeño avance volvía un poquito más hacia detrás volviendo a detectar la línea del camino que habíamos dejado con anterioridad, perdiéndose así en la búsqueda de la línea que había tras la discontinuídad detectada antes.

Una segunda idea fué la de realizar un avance de aproximadamente 15cm y posteriormente realizar el escaneo que se realizaba por defecto cuando se nos perdía la línea. Esta idea era buena para sobrepasar las grandes discontinuidades pero no tan buena para las discontinudades pequeñas.
Una tercera idea nos llevó a realizar un algoritmo de búsqueda que realizara pequeños avances hacía delante seguidos de escaneos rápidos en ambas direcciones. Esta idea nos servía tanto para las discontinuidades grandes como para las pequeñas.

La primera prueba nos generó algunos problemas ya que a veces el robot se nos perdía al detectar alguna esquina de la línea. También encontramos problemas durante el escaneo.


Video resultado 1


 

Así que modificamos ligeramente el código y ampliamos el ratio de escaneo de búsqueda, obteniendo unos buenos resultados.

Video resultado 2



Imagenes

PROTOTIPO 1:

PROTOTIPO 2:







PROTOTIPO 3 (FINAL): 

 

 

 

 

 

 

Práctica 3: Radar (09/01/08)

Enunciado: Descargar

En la realizadión de esta práctica se ha seguido el diseño propuesto en el enunciado. Se han creado las clases TestRadar y Radar. La primera sigue el patrón propuesto en la documentación proporcionada y no merece la pena dar demasiados detalles, ya que los puntos más importantes los encontramos en la otra clase implementada.

En la clase Radar se han implementado los dos métodos solicitados: newScan y ShowOnScreen. El primer método realiza los siguientes pasos:

1º. Obtiene el número máximo de muestras que debe tomar, según los parámetros dados.

2º. Toma cada una de las muestras y las almacena en un array para su posterior uso. Además, actualiza la pantalla del radar con la información que va obteniendo en todo momento.

3º. Actualiza la dirección del giro de sensor de ultrasonidos.

Para actualizar la pantalla, se debe realizar un cambio de coordenadas cartesianas a coordenadas polares, para poder obtener el punto destino de la recta a dibujar. La pantalla utilizada para mostrar los resultados obtenidos tiene unas dimensiones de 100x64 pixeles. Para poder mostrar de forma gráfica y legible los resultados que se van obteniendo, el punto de origen del radar en la pantalla será el (50,64).

Las forma de obtener el 2º punto de la recta, se cálcula como:

x1 = x0 - (distN * cos(alpha))

y1 = y0 - (distN * sin(alpha))

siendo:

distN = Distancia Normalizada

alpha = ángulo en radianes

Una vez obtenidas coordenadas de los 2 puntos necesarios para dibujar una recta, se dibuja haciendo uso de la clase Graphics de Java.

NOTA: paquete: javax.microedition.lcdui.Graphics

Referencias

http://es.wikipedia.org/wiki/Coordenadas_polares

Duración

5h00 aproximadamente.

Videos Finales

Video 1:

Video 2:

Práctica 2: Sigue Lineas (12/12/07)

Enunciado: Descargar

Para la realización de esta práctica se ha diseñado un algoritmo dividido en fases. Dichas fases son las siguientes: inicialización, calibración, posicionamiento, avance y búsqueda del camino.

La fase de inicialización tiene como objetivo preparar al robot para su posterior auto-calibración.

Una vez que el robot está listo para calibrarse, éste comienza dicho proceso de forma autónoma. La calibración se lleva a cabo tomando una serie de muestras de los valores proporcionados por el sensor de luz. Dichas muestras son tomadas realizando un giro de 360º sobre la posición actual del robot.

Una vez finalizada la calibración del sensor de luz con las condiciones de luminosidad de ese momento, el robot pasa al modo de 'posicionamiento'. Dicho modo tiene como objetivo posicionar al robot de forma correcta para comenzar a avanzar sobre la línea negra que dibuja el circuito.

Tras el posicionamiento el robot pasa a modo 'avance', en el cuál el robot avanza hacia delante hasta salirse de la línea que delimita el circuito. Cuando el robot se sale de la línea, pasa a modo 'búsqueda del camino', en el cuál se encuentra el algoritmo más importante para esta práctica, dado que será dicho algoritmo el que hará más o menos eficiente al robot a la hora de seguir el camino propuesto. Este último modo, comprueba el historial de movimientos anterior para optimizar la búsqueda del camino perdido. Si NO existe historial antigúo (al inicio de la marcha) o dicho historial no nos ayuda a encontrar rápidmente la línea, realizamos una búsqueda de tipo barrido hacia ambos sentidos aumentando la zona de búsqueda de forma incremental hasta encontrar de nuevo la línea del circuito.

Como último detalle solo decir que el robot cumple con el requisito de ser reactivo, es decir, que se adapta a los cambios de luminosidad del ambiente a lo largo de la pista.

Por último solo comentar que se ha conseguido obtener un buen rendimiento (tal y como se puede ver en el video) en las curvas más cerradas del circuito como son la curva 7 y 8.

Duración

5h30 aproximadamente.

Video Final


Circuito usado para la prueba final


Imagen Final

Práctica 1 -- Parte 2 (29/11/07)

Esta parte es una modificación o mejora de la parte 1 de la práctica. Esta vez se usará un sensor de ultrasonidos para evitar el choque con los obstáculos que se encuentre el robot.

El modelo de programación seguido para esta parte será cambiado con respecto a la primera parte para así usar varios tipos de soluciones. El modelo seguido en esta segunda parte lo que hace es avanzar el robot hacia delante hasta que capte un obstáculo a 25cm del robot (suficiente para no chocar), es ese momento el robot se parará, se alejará del obstáculo en dirección opuesta y girará aleatoriamente entre 45º-315º. Tras esta serie de maniobras, el robot continuará su marcha hacia delante.

La velocidad de movimiento del robot se ha establecido como:

1'5 ruedas/seg = 8'2 cm/seg (Perímetro rueda: 5'6 cm)

Duración

1h40 aproximadamente.

Código

Pincha aqui

Video Final


Práctica 1 -- Parte 1 (28/11/07)

Enunciado: Descargar

Para realizar el projecto BumpAndGo se ha seguido el modelo de 'Comportamientos' visto en clase anteriormente. En dicho modelo se crea un conjunto de comportamientos ('Behavior') los cuales implementaran cada uno de los comportamientos que deseemos tener. De entre este conjunto de comportamientos, se elige uno para que pueda ejecutarse. La elección del comportamiento la realiza un 'árbitro' que selecciona uno u otro dependiendo de las pre-condiciones ('takeControl') de cada uno. Una vez elegido el comportamiento a ejecutar, el árbitro le quita el control de ejecución al que se estaba ejecutando hasta ese momento ('suppress') y se lo pasa al comportamiento seleccionado ('action').

Los comportamientos se nuestro robot para esta práctica son: Andar hacia delante y retroceder si choca. La funcionalidad del segundo, es el descrito en el enunciado, es decir, el robot al chocar contra un obstáculo retrocederá 30cm y realizará un giro aleatorio entre 45º-315º.

La velocidad de movimiento del robot se ha establecido como:

1'5 ruedas/seg = 8'2 cm/seg (Perímetro rueda: 5'6 cm)

Duración

1h20 aproximadamente.

Código

Pincha aqui : 123

Video Final



Imagenes Finales


Montaje del Robot (23/11/07)

Practica 1 (IR)

Práctica 0 (15/11/07)

Enunciado: Descargar

Descripción: No hemos encontrado dificutades en la realización de la práctica, una vez configurado el entorno correctamente.

Duración

30min aproximadamente.

Código

Pincha aqui

Captura Final:

Imagen Final:


Configuración de eclipse (14/11/07)

Lo primero que se hizo fué configurar las variables de entorno del sistema necesarias para trabajar con el framework. Dichas variables son las siguientes:

export JAVA_HOME=/usr/local/java/j2sdk1.5.0
export NXJ_HOME=/usr/local/lejos
export PATH=$JAVA_HOME/bin:$PATH:$NXJ_HOME/bin

La variables NXJ_HOME es necesaria para que la aplicación nxjflash actualizara el firmware del "Ladrillo" de nuestro robot. Las otras dos variables son para que el eclipse encuentre la version de Java 1.5 necesario para la compilación de las aplicaciones.

Posteriormente se ha configurado en entorno eclipse con la inclusión de la clase 'Classes.jar', la cual contiene la API de lejos. Además se han creado dos 'External Tools' para compilar, enlazar y subir las aplicaciones desde eclipse hasta el "Ladrillo".