Terminator-Robot
Prácticas de Introducción a la Robótica (URJC)
Desarrolladores:
Jóse Luis Pujante Montoya
Helmuth Winkovics
Enlaces
TutorCuriosidadesNXT Rubik Cube Solve (Recomendado) DesarrolladoresJosé Luis Pujante Montoya
Helmuth Winkovics
| 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) { 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.
Tras númerosas pruebas, el tiempo máximo de estabilización conseguido fue de aproximadamente 5seg.
ImagenesPrá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. 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 2ImagenesPROTOTIPO 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 Referenciashttp://es.wikipedia.org/wiki/Coordenadas_polares Duración5h00 aproximadamente. Videos FinalesVideo 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ón5h30 aproximadamente. Video FinalCircuito usado para la prueba finalImagen FinalPrá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ón1h40 aproximadamente. CódigoVideo FinalPrá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ón1h20 aproximadamente. Código Video Final Imagenes FinalesMontaje del Robot (23/11/07)
Práctica 0 (15/11/07)Descripción: No hemos encontrado dificutades en la realización de la práctica, una vez configurado el entorno correctamente. Duración30min aproximadamente. CódigoCaptura 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 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". |












