martes, 11 de diciembre de 2012


Práctica IV

Hoy ha llegado el día de la despedida de Gorki. Vamos a presentar la cuarta y última práctica de la asignatura de Robótica. En esta ocasión Gorki deberá seguir un camino, el cual estará formado por una línea negra en un fondo blanco.
Además de esto, Gorki tiene que recoger una lata que se encontrará en medio de su camino y volver con ella a su punto de salida.
Contaremos para esta tarea con la ayuda de dos sensores, el sensor de ultrasonidos y el sensor de luz de forma activa.
El primero lo usaremos para percibir nuestro objetivo, mientras que el sensor de luz nos guiará por el camino correcto.


La primera dificultad con la que nos encontramos es que al tener solo un sensor de luz, no sabemos cuando Gorki se desvía del camino si es en una dirección o en otra (en este caso derecha o izquierda). La forma con la que la hemos afrontado, ha sido hacer que Gorki oscile de un lado a otro con cada vez mayor amplitud hasta encontrar la salida correspondiente.

Una vez ajustado adecuadamente las variables utilizadas para su funcionamiento, podemos ver como Gorki se mueve fácilmente a través del circuito:


Por último tenemos que recoger nuestro objetivo, en este caso una lata o algo por el estilo, y llevárnoslo a nuestro punto de salida. Para ello nos serviremos de una cesta que hemos fabricado como se ve antes para capturar la lata. El sensor ultrasonido la detectará y daremos la orden de tomar el objetivo.

Aquí podéis ver a Gorki superar su última prueba!!




Bueno, hasta aquí han llegado las aventuras de nuestro robot Gorki, espero que os hayan sido interesantes!



martes, 4 de diciembre de 2012

Práctica III

Hoy vamos a enseñaros los resultados de nuestra práctica número tres.
Esta práctica es bastante completa, ya que juntaremos los conocimientos de la práctica anterior con los sensores de luz.
Gorki esta semana ha conseguido un nuevo "look" , y ahora está equipado con dos sensores sensibles a la luz, unos ojos realmente mejorados (¡Por fin tiene un "cuello" con que girar su cabeza!), y un sensor de contacto por si le da por chocar por detrás.




  • Evitar obstáculos con el sensor de contacto
     
 En primer lugar, vamos a crear un comportamiento en lazo abierto, esto es, que nuestro robot actuará automáticamente y de forma "ciega" ante un evento que especifiquemos. En este caso, nos serviremos del sensor de contacto, con el que averiguaremos cuándo nos chocamos contra un objeto.
El sistema es sencillo: Una vez que Gorki ha detectado un obstáculo, hará una serie de movimientos siempre iguales. De la forma que lo hemos implementado para que rodee nuestro objeto y siga su curso como si nada hubiera pasado.

  • Radar
  Antes de empezar nuestro siguiente problema, debemos implementar una función radar, que nos recopilará las distancias de una pasada de nuestros infrarrojos mientras éstos se mueven un número determinado de ángulos.
Para ello nos hemos servido de la clase ReadReadings que viene en nuestra biblioteca robotics.

Esta clase nos proporciona un array donde almacenamos a que distancia de nuestro robot tenemos obstáculos. De manera que nuestro pequeño Gorki puede hacerse una idea del entorno que le rodea a través de unos algoritmos que aplicaremos para ejercicios posteriores.

A continuación podéis ver un vídeo en el que Gorki va tomando estas distancias con un ángulo de giro total de 180 grados.




  •  Evitar obstáculos con el sensor de ultrasonido

 Ahora nos enfrentamos a un nuevo reto, nuestro robot no debe tocar en ningún momento un obstáculo. Para que Gorki pueda conseguirlo, hará uso de sus ojos (el sensor de ultrasonido). Pero esso no es todo, vamos a utilizar un método específico: el algoritmo de vectores de fuerzas virtuales (VFF).
Su funcionamiento es el siguiente: Vamos a tener tres vectores distintos, un vector atractivo, que será el que nos indique el camino que queremos seguir, un vector repulsivo, que nos indicará los obstáculos que nos encontraremos en nuestro camino y nos variará nuestra ruta para rodearlos, y por último un vector de fuerza resultante, que es la suma de los dos vectores anteriores.



Éste ejercicio fue el que más quebraderos de cabeza nos dio. Ya que la implementación de estas fuerzas no es algo tan sencillo como los otros ejercicios que habíamos implementado con anterioridad. 
Utilizando nuestra clase Radar, los datos que recopilábamos cada vez que nuestro robot tomara una acción los agrupábamos en tres datos totales. Estos datos nos mostrarán los posibles obstáculos que tiene Gorki a su alrededor. Uno nos mostrará la menor distancia de estos posibles obstáculos a la izquierda, otro nos enseñará esta distancia con respecto al frente, y el último dirá esta distancia a su derecha.
Una vez recopilados estos datos, las definiremos como tres vectores distintos de repulsión. 
Ahora lo difícil es saber qué importancia tiene cada vector en cada momento para que nuestro robot siga el vector de atracción o haga caso a un vector específico de repulsión. Esto es lo que más problemas nos ha dado, ya que requiere mucho tiempo de "prueba y error" para poder ajustar cada valor de forma correcta.

Este es el resultado que Gorki nos ha podido ofrecer:


 
  • Siguiendo la luz
 Ahora se nos pide que Gorki siga la luz. Para esto hemos puesto dos sensores, uno a la derecha y otro a la izquierda de manera equidistante del centro del robot. Con esto conseguimos que si el sensor de la derecha capta mas cantidad de luz irá hacia ese sentido sino, irá en sentido contrario. Y en caso de que estos sensores midan más o menos lo mismo Gorki seguirá recto ya que la luz estará de frente.

Es importante decir que los sensores hay que ponerlos mirando hacia el suelo ya que ponerlo de otra manera su medición no sería válida y Gorki  estaría desorientado.

 Aquí podemos ver como Gorki juega con la luz de una linterna.




  •  Siguiendo la luz evitando obstáculos

 El último objetivo que tenemos es la combinación de todos los problemas anteriores. Gorki debe seguir una luz objetivo esquivando todo los obstáculos.
Para este ejercicio lo que hemos hecho únicamente ha sido utilizar el código de evitar obstáculos mediante el ultrasonido y añadirle el de seguir la luz. Lo único que debíamos decidir es la prioridad de una acción u otra. Gorki seguirá la luz hasta que detecte un obstáculo, donde tomará prioridad esquivarlo.


 El resultado final del entrenamiento de Gorki lo podéis ver aquí!!


martes, 13 de noviembre de 2012

Práctica II

Seguimos con las actualizaciones de nuestro blog. En este caso explicaremos nuestra práctica 2. A continuación explicamos los sucesos que han ocurrido en la realización de la práctica. 
En estas semanas hemos experimentado con todos los sensores de Gorki. Por fin ha empezado a enterarse un poco de lo que hay en el mundo, aunque ha necesitado bastante ayuda!

  • Obteniendo información

En primer lugar hemos diseñado un programa que nos muestre todos los datos que reciba Gorki a través de varios de sus sensores:

  • Distancia de ultrasonido
  • Valor del sensor lumínico (en crudo y en porcentaje)
  • Tensión de la batería
  • Memoria libre



Hay que tener cuidado con el sensor de la luz, ya que a la hora de calibrarlo, tenemos que tener el sensor en modo pasivo para medir la intensidad de la luz.
Nuestra imagen muestra la memoria FLASH, aunque podríamos mostrar la memoia RAM libre.

  • Control del robot por sonido

El primer sensor donde nos vamos a centrar es en el micrófono. Gorki ya es capaz de escucharnos, por lo que hemos aprovechado a enseñarle un par de ordenes básicas. La mayor dificultad que hemos tenido a la hora de hacerlo ha sido en calibrar los rangos de intensidad del sonido al recibir una orden, ya que si poníamos un umbral de acción bastante bajo, nos obedecía aun sin quererlo, mientras que si introducíamos el umbral demasiado alto, se convertía en un rebelde y sólo obedecía a gritos!
Aquí podéis ver una muestra de Gorki una vez que más o menos estaba calibrado.



Como veis se para o mueve en línea recta a son de nuestras palmadas. Y con una capacidad de reacción bastante aceptable. Aunque cometa algunos errores por el ruido de fondo.

  • Bump & Go! usando sensores de contacto

Nuestro Gorki ya camina a son de nuestras palmadas. Pero tenemos un problema, si no le decimos que pare, Gorki es especialmente propenso a chocar con todo obstáculo que encuentra e intenta atravesarlo con excesiva confianza.
Es el momento de añadirle un nuevo sensor a nuestro robot, un sensor de contacto. Básicamente cuando Gorki se estrelle con algo, recibirá una señal de contacto, por lo que retrocederá unos segundos y girará aleatoriamente para seguir un nuevo camino.




El problema que hemos encontrado en esta parte de la practica, fue el movimiento aleatorio en el giro del robot. En principio pusimos un número aleatorio de 45 grados. Pero nos surgió un nuevo problema, y es que a veces hacía un giro innecesariamente largo para girar solo 45 grados. (en verdad para Gorki giraba 315 grados). Por lo que lo arreglamos mirando si giraba en un sentido o en otro.
Random aleatorio = new Random();
robot.rotate(180 -(aleatorio.nextInt(7)+1)*45);
 
  • Bump & Go! usando sensor ultrasonido
 
Ahora vamos a repetir el mismo ejercicio pero esta vez no dejaremos que Gorki contacte con nada. Para ello haremos uso de sus ojos. (el sensor ultrasonido) Miraremos la distancia que nos señala nuestro sensor y pondremos un límite. A partir de ese límite retrocederá y girará de manera aleatoria.
Utilizamos también el código del apartado anterior sobre este número aleatorio.
 
 

  • Comportamiento sigue-pared para salir de un laberinto
 Ahora ya se empieza a complicar todo. No es que tengamos que hacer que Gorki se estrelle contra una pared y rectifique su camino, sino que directamente no llegue a chocar nunca mientras sigue una pared. todo esto usando sólo sus ojos!
En este ejercicio realmente si que dio quebraderos de cabeza, pero lo logramos solucionar mediante el viejo método de prueba y error.
Para poder realizar la práctica, empezamos asignando unos parámetros de distancia respecto la pared, donde cada uno de ellos indicará una orden a Gorki. Si se acerca en exceso, Gorki girará para evitar el choque, mientras que si se aleja demasiado, Gorki girará para acercarse.
El gran problema que tuvimos fue la forma de evaluar estas constantes, en principio pusimos una sola constante que dependiera proporcionalmente de nuestra distancia en tiempo real a la pared. Este método no fue el más correcto, ya que da demasiados problemas y muchas oscilaciones.
Asique decidimos cambiar la formad e plantear el ejercicio, y poner unas constantes de distancias preestablecidas. Por lo que Gorki girará con una intensidad constante según estos parámetros.
Así sólo nos quedaba ajustar las constantes según la velocidad de nuestro robot. Por lo que tras varios intentos, mejor dicho, tras innumerables intentos. Mas o menos nos quedó un resultado así:
 
 
 
Definitivamente Gorki está creciendo y aprendiendo muy deprisa! Podemos ver que nuestro robot gira de manera bastante aceptable en el final de nuestra pared. Aunque sea demasiado tímido al verlo en un directo!
 
  • Calibración del sensor de ultrasonidos
 
Por último, tenemos que estudiar realmente bien los ojos de Gorki (el sensor ultrasonido), por lo que vamos a dedicarnos a tomar medidas y recopilar todos los datos posibles sobre este sensor.
 
Empezamos con algo muy simple, queremos medir el error que nos señala Gorki en distintas distancias. Lo vamos a comprobar cada 10 cm.
 
 
 
 
Podemos calcular a partir de nuestras medidas, el error medio que tenemos en cada distancia.
Ahora nos centraremos en el ángulo de visión de nuestro sensor. Vamos a calcular la incertidumbre en nuestro vector Y. Lo haremos de manera que determinamos a qué distancia del eje X comienza a detectar un obstáculo que introduciremos en el rango de visión de nuestro robot:
 
 
 
 
Tomamos la tabla que se ve a continuación:
 
 
 
Vemos como en mayor o menor medida el rango de visión del ultrasonido es en forma de cono. la diferencia del eje y va aumentando a medida que nos alejamos del punto donde se encuentra Gorki (0,0)
 
Por último calculamos la matriz de covarianza, que nos dirá si nuestro sensor tendrá una variación mayor o menos en sus errores al recopilar información.
 
Dándonos como resultado:
 
En conclusión a todos estos datos obtenidos, vemos que el cono de visión es bastante pequeño e inestable, ya que depende mucho del sensor específico que recibimos.
 
 

lunes, 22 de octubre de 2012

Práctica I

Esta es nuestra primera actualización de nuestro blog. Correspondiente a la práctica 1. Ahora vamos a contar en mayor o menor medida los sucesos que nos han ocurrido en estas dos semanas:

Preparacion y montaje de Gorki:

No pudimos esperar demasiado a poner nuestras manos sobre el robot, así que en un tiempo record lo montamos a nuestro gusto (exacto, igual que en el manual de instrucciones)
La verdad es que daba gusto ver a Gorki entero, pero para desilusión nuestra, ya por fin leída la práctica 1, acabaríamos desmontándolo para poder hacer los ejercicios.




Primeros ejercicios:

La verdad es que el primer ejercicio no dio excesivas dificultades.Con estos sencillos ejercicios aprendimos las nociones básicas para poder interactuar con nuestro robot a través de los botones para los ejercicios posteriores.

Ya en el ejercicio de odometría, el cual se trababa de que aprendiésemos como se distribuían los píxeles por nuestra pantalla, pero de manera muy sencilla, mostrando el ángulo que nuestro motor recorría.
Para hacer este ejercicio tuvimos algún problema con los grados ya que lo máximo que debería de girar el motor eran 360 grados y nos salía mucho más. Por otro lado si el motor del robot rotaba en dirección contraria teníamos grados negativos lo cual tampoco es del todo correcto.

Además que los números nos aparecían de manera intermitente en la pantalla. Esto era
porque procesábamos demasiado rápido y no daba tiempo a enseñarlo asique lo arreglamos
con una pequeña espera.

  Creo que donde mas hemos sufrido ha sido en este ejercicio, donde nos hemos pasado bastante tiempo en arreglar la forma de mostrar por pantalla los datos que recopilábamos. El problema consistía que aunque el código para calcular nuestras variables eran correctos, las ordenes para mostrarlos no (nos parpadeaba la pantalla, mostraba unos números sin lógica..)
  Se consiguió solucionar al darle un pequeño respiro en enviar los datos a nuestro robot, haciéndolo cada cierto tiempo.




Cuadrado:

A partir de entonces, la verdad es que todo ha sido un poco mas fácil. Los problemas que tuvimos con el cuadrado, como son lógicos fueron la calibración de Gorki. Aquí dejamos un ejemplo de un cuadrado de 20 cm:

 

Se nos pedía que nuestro robot hiciese un cuadrado de 40 cm en una hoja.
En este punto tuvimos problemas de calibración es decir, teníamos que asegurarnos de que
cada una de las ruedas estaba a la misma distancia respecto del eje ya que sino nuestro robot
aumentaba su error en el giro y el cuadrado que tenía que pintar era amorfo.

Este problema era más visible cuando se nos pedía calcular la matriz de covarianza a partir de
varias repeticiones ya que si dejábamos mal equilibrado el robot te salían valores demasiados
elevados y no éramos capaces de pintar dos cuadrados seguidos. Cuando averiguamos sus covarianzas, conseguiamos calcular la media de nuestras desviaciones de cada eje de nuestro robot. verdaderamente útil ya que nos daba la respuesta de qué eje era menos constante.

Visualización de la trayectoria:

Por último el mayor problema que tuvimos en el ejercicio de mostrar por pantalla el recorrido de Gorki, fue el de mostrarlo "en tiempo real". Lo conseguimos de manera parecida a el ejercicio 2 de esta práctica. Cada décima de segundo enviamos una actualización de nuestros píxeles y los imprimimos por pantalla.  No hay mucho más que comentar sobre esto.



Y estos son nuestros primeros pasos con Gorki, espero que os haya gustado, y tranquilos que próximamente habrá mas. saludos!

domingo, 30 de septiembre de 2012

Presentación


¡Bienvenidos! este será el blog donde podréis seguir nuestro progreso con la asignatura de robótica.
 Nuestro robot "Gorki" estará en breves en pleno funcionamiento, tened un poco de paciencia.

¡Actualizaremos en breves!