25 marzo 2009

Android: TimerTask y GUI

Voy a retomar después de meses el blog, a ver si consigo documentar cada problema que me encuentro mientras programo con Android.

Hoy me he topado con un problema típico cuando programas con GUI gráfica, y es que muchas veces necesitamos actualizar o interactuar con la interfaz gráfica desde un thread que no es el principal, en jerga de Android: cuando queremos modificar el GUI de una Actividad desde otro thread. Concretamente en este caso, necesito que una tarea periódica (thread) muestre un pop-up en la interfaz (actividad) informando que está buscando señal GPS.

Lo primero es saber como ejecutar un método periódicamente en Android. Para ello podemos utilizar la clase nativa de Java llamada TimerTask. Podemos configurar el delay (de la primera ejecución) y el periodo(de la siguientes ejecuciones). Si desde el método run de esta TimerTask intentamos modificar cualquier cosa relacionado con la interfaz gráfica que se ejecuta en el thread principal, veremos como la aplicación se queda congelada, o simplemente muestra un error indicando que sólo se puede acceder a la interfaz desde el thread principal (actividad).

A continuación os dejo el código de cómo configurar y crear una TimerTask (intentad obviar la línea en negrita, que posteriormente explicaremos):

private void launchTask()
{
  int delay = 1000; // delay for 1 seconds
  int period = 120000; // repeat every 2minutes

  mTimer = new Timer();
  mTimer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
      handler_ProgressDiaglog.sendEmptyMessage(0);
    }
  }, delay, period);
}


La línea que aparece en negrita en el cuerpo del método run, es la clave para la solución de nuestro problema. Básicamente lo que implementa por debajo es un paso de mensajes entre threads y que Java nos lo abstrae con la clase Handler(). Para que a nuestro thread principal (que tiene acceso al GUI) le llegue el mensaje que genera la TimerTask, tenemos que crear un atributo privado de tipo Handler. A continuación os dejo el código del Handler:

private Handler handler_ProgressDiaglog = new Handler() {
  @Override
  public void handleMessage(Message msg) {

    // We can modify the GUI here.

  }
};

NOTA: Es posible que un mismo handler recoga más de 1 mensaje, por lo que no es necesario crear un handler por mensaje que queramos transmitir. En nuestro caso, no nos interesa un mensaje en concreto, nada más que nos avise cuando la TimerTask ejecute.

Espero que os siva de ayuda esta recetilla de cómo solucionar en Android un problema típico que se da cuando queremos acceder al GUI desde un thread, que no es el principal.

16 septiembre 2008

Presentación del Proyecto Fin de Carrera

Después de bastante trabajo y esfuerzo, terminé el proyecto fin de carrera del ciclo superior de Ingenieria Informática.

El proyecto se basa en desarrollar un sistema de reconstrucción 3D basado en atención visual. En otras palabras, mediante características de atención comunes en el ser humano (como los bordes, el contraste de color o el movimiento) vamos a obtener puntos interesantes de la escena, y situar dichos puntos en un espacio 3D. Además uno de los puntos fuertes de este proyecto, es que hemos añadido características de más alto nivel o cognitivas, que son capaces de realizar hipotesis de atención sobre objectos que no están en la imagen pero podrían estar.

La presentación del proyecto será:

Día: Jueves 18 de Septiembre 2008
Lugar: Salón de grados - Departamental 2 - Universidad Rey Juan Carlos
Hora: 12:00h
Título: "Reconstrucción 3D mediante un sistema de atención visual."


Es recomendable echar un ojo al link de videos, ya que son bastante intuitivos e interesantes.

Más información en:
Ficha del proyecto
Memoria PDF
Videos

31 agosto 2008

Snow, Snow, Snow!!!

Al fin! Después de casi un mes de trámites y búsquedas para encontrar el envío más barato, ya tengo en casa la tabla y fijaciones burton que tanto deseaba. En concreto la tabla es una Burton Royale 1.62 y las fijaciones son unas burton Cartel Lo-Black.





Lo pero de todo es que, ahora que tengo el material en casa, por lo menos hasta dentro de dos semanas no podré ir a probarlo al Xanadú. El proyecto fin de carrera me está quitándo demasiado tiempo!!

[Al fín Teo descansará de que le dé la plasta con este tema! o no? ;-)]

13 julio 2008

Amabilidad ante todo

De vuelta de vacaciones de Almería, paramos cerca de Valdepeñas (Ciudad Real) a comer algo y menuda la impresión que te da cuando ves semejantes carteles en la puerta del restaurante en cuestión. Alguien habrá pagado esos 0.40 centimos? ;-)



02 julio 2008

Empezando con la fotografía

Desde hace poco más de un mes que tengo una reflex nueva, he tenido un par de viajes donde poder intentar sacar el provecho a esta cámara. De primeras noté una gran diferencia con la campacta, en cuanto a colores y nitidez de las fotografías.

Este pasado fin de semana estuve en el Parque Nacional de Monfragüe de camping, y pase de refilón por Trujillo. Sin quererlo ni desearlo saqué una de las fotos que más me gustan hasta día de hoy. Es un reflejo en las gafas de María de la plaza mayor de Trujillo. La verdad es que no sabía si quedaba bien que saliera yo en ese reflejo, pero la verdad es que me gusta como queda (además del encuadre y la nitidez).

dsc_0091-R

Si la quieres ver a mayor resolución: 1024x768

02 junio 2008

Vaya Regalazo!!!

Después de pasar una semana de "aupa" con los regalos de mi cumpleaños: un video emotivo de mis amigos, una psp, unos pedales super chulos para el coche, ropa y demás pijadillas ... llegó el Viernes, día que tenía reservado para celebrar mi cumpleaños con mi novía Maria y cuál es mi sorpresa cuando abro el regalo y .....



veo esta preciosa cámara reflex nikon D40 ... dios!! no me lo creía!! Llevaba mucho tiempo interesado en estas cámaras ya que te ofrecen mucha potencia, aunque no es facil sacarles provecho en comparación con las compactas.
Pero no había terminado todo, ya que venía además acompañado de una bolsa porta-cámaras, un tripode y una tarjeta SD de 2GB.

Ya iré comentando las impresiones que tengo de esta camara, pero de momento ....

¡¡¡GRACIAS MARIA!!!

26 enero 2008

Atención Visual - movimiento (1.2.1)



[Ver el vídeo a resolución original]

En este otro vídeo, se puede observar el termino de atención visual y saliencia asociado al movimiento. Ahora nuestro esquema, muestra un alto interés por todo lo que se mueve en la imagen.

[*] En esta atención por el movimiento no está definido ningún tipo de difusión de saliencia (los pixeles con saliencia no influyen en la saliencia de los pixeles vecinos).
[*] Computamos la saliencia en una frecuencia de 150ms. Por tanto cada segundo somos capaces de calcular unas 5-6 veces la saliencia y decidir el movimiento del "ojo". (En un futuro la acción de calcular saliencia y decisión de movimiento tiene que desacoplarse e ir cada una a un ritmo independiente).
[*] El movimiento lo calculamos en base a la diferencia del valor del pixel entre 2 frames consecutivos. En esta y en muchas otros videos, puede existir ruido debido a la calidad del video, por ello para que "exista movimiento" el pixel debe variar como mínimo 15 unidades en terminos absolutos.

22 enero 2008

Capacidad de atención

Por medio de Ánibal (un ex-compañero de trabajo y amigo), me ha hecho llegar un link bastante interesante sobre la atención humana. Si quieres hacer la prueba y comprobar tu capacidad de atención te recomiendo que lo hagas.

http://www.oviedo.es/personales/comecoco/ilusiones%20opticas/prueba%20de%20atencion.htm

Una vez realizado el ejercicio, es interesante comprobar como somos capaces de concentrarnos en un aspecto en concreto y obviar la información restante. Para relacionarlo con el proyecto que tenemos entre manos, sería equiparable a implementar una saliencia parametrizada mediante el color blanco, de este modo solo atenderíamos a las personas de color blanco.

Intentaré, cuando tenga un rato, utilizar este video de demostración para nuestro sistema, a ver que tal se comporta utilizando la característica de color como saliencia principal.

17 enero 2008

Atención Visual ( v1.2.0 )



[Ver el vídeo a resolución original]

Esta es la primera demo funcional que tengo del proyecto. Como se observa, el sistema le llama la atención las cosas de color, en nuestro caso el color rojo. Podemos definir la saliencia como la característica que hace que nos llame más la atención cierto estímulo.

Aspectos añadidos al algoritmo:
* Únicamente tiene interés las cosas de color (en nuestro caso el rojo), y jugamos con 4 objetos: 3 del mismo tamaño y un cuarto más pequeño. A partir de ahora lo denominaremos "saliencia"
* Si un pixel tiene saliencia, afecta positivamente a la saliencia de los pixeles vecinos. De ahí que veamos que las figuras que genera el sistema (derecha) no son iguales que las figuras rojas de la izquierda. De ahora en adelante lo llamaremos "Difusión de Saliencia". Esta característica produce un rapido crecimiento en la saliencia de los objetos interesantes.
* Cuando visitamos un punto con nuestro "ojo", ese punto y todos los que conforman nuestro ojo pasan a tener saliencia 0. A partir de ahora llamaremos a este proceso "Inhibición de Retorno"

Teniendo una primera versión funcional, podemos ir ajustando y cambiando el algoritmo para dotar al sistema de un mayor número de características que produzcan atención (colores, bordes, movimiento, caras) y may

08 enero 2008

WebService en JDE

Desde hace unos años, los webservice se vienen utilizando bastante y en concreto en entornos .NET, ya que se basan en ellos para realizar la comunicación entre aplicaciones ( Microsoft Robotics Studio).
En la arquitectura de JDE, hace poco añadimos un nuevo driver capaz de ofrecer un servicio web. Dicho servicio web está implementado en c++ ayudándonos de GSOAP. Este paso es muy importante, ya que permite a la arquitectura JDE poder comunicarse con el mundo exterior mediante un protocolo estándar como es SOAP (XML+HTTP).
Más abajo veréis una pequeña demo, donde somos capaces de gobernar y obtener información de la pantilt, mediante un cliente SOAP programado en .NET corriendo sobre una PDA. La idea es que en un tercer ordenador que tiene comunicación fisica con la pantilt y gobernado por JDE, seamos capaces (gracias a una PDA y conexión wi-fi) de poder controlar el cuello mecánico.



[Ver vídeo a resolución original]

10 diciembre 2007

Ruta por Riolago de Babia

En uno de los viajes que he hecho recientemente con mi novia (Maria) y unos amigos (Juan Carlos y Rocío) acabamos en un pueblecito bastante bonito llamado Riolago de Babia. Justo desde lo mas alto del pueblo, donde estaba situada la casa rural donde nos alojamos (Mirador de Babia), salía el camino hacia la ruta que hicimos el primer día.

Distancia: 7km aprox. (ida y vuelta).
Duración: 3horas.
Dificultad: baja.

La ruta tiene unas vistas bastantes buenas, siempre con las montañas al fondo con la cumbre nevada. Además durante la travesía nos acompaña un río a mano izquierda, con lo que el sonido del agua bajando se hace compañero de camino.

Unas fotos de las vistas que teníamos durante casi todo el trayecto.




Nuestro fin de ruta fué este, a mano izquierda en el punto B del mapa que encontrarás un poco más abajo, donde encontramos un refugio.


Aquí dejo reflejada la ruta sobre el mapa de Google Maps, para que veáis por donde discurre la ruta. Si os fijáis después del punto B hay como 1km más de ruta, pero la noche se acercaba y no dio tiempo a hacerla entera.


Ver mapa más grande

01 diciembre 2007

libcolorspaces

Del trabajo dedicado al proyecto y a hacer cosillas para JDE, de vez en cuando conseguimos que salga algo chulo y reutilizable para éste y demás proyectos.

libcolorspaces es una librería estática programada en C que es capaz de generar una tabla de traducción entre espacios de color. La versión actual crea una tabla de traducción RGB->HSV, de esta manera los cálculos para pasar de RGB a HSI se realizan una sola vez (para rellenar la tabla), y así las consultas se realicen simplemente consultarán un array.

La tabla que se construye tiene una resolución de 6 bits por componente R,G,B, de este modo se reduce considerablemente el tiempo de creación de la tabla. Por ahora esta resolución es suficiente, y la creación de la tabla supone un tiempo de 0.220 ms.

El algoritmo para traducir RGB a HSV lo hemos obtenido de las especificaciones de la wikipedia (http://es.wikipedia.org/wiki/HSV). La entrada son las componentes RGB entre 0 y 255, y la salida son las componentes HSV normalizadas tal cuál refleja la wikipedia.

Si te ha convencido, te la puedes descargar libcolorspaces de aquí, con licencia GPL. A disfrutarlo!!

25 septiembre 2007

[Video] Sigue Persona con Visión Direccional

Aquí os dejo el vídeo colgado en youtube de la presentación de mi proyecto de la técnica. En el vídeo podéis observar el robot pioneer realizando una navegación mediante VFF (Virtual Forces Fields) siguiendo un objetivo (mediante color) utilizando para ello el cuello mecánico o pantilt.



Links:
Sobre el proyecto
Sobre VFF

19 septiembre 2007

JDE: Jerarquía Dinámica de Esquemas

Mi intención es contar en este blog todo lo relacionado con la robótica que me incumbe, ya sea por parte del proyecto fin de carrera, o por los ratos trasteando que paso.

JDE es la arquitectura que ya utilicé en el proyecto de la técnica para conseguir un comportamiento sobre un robot, y también la utilizaré ahora para el proyecto de la superior. JDE es el resultado de un duro trabajo de tesis de Jose María Cañas Plaza (tutor y compañero).

JDE se basa en la interacción y ejecución simultanea de pequeños comportamientos (denominados esquemas), cuya fusión emula comportamiento complejos. JDE está actualmente en desarrollo y avanzando gracias a las ganas y esfuerzo de su creador y de los apoyos continuos de los alumnos. Se han llegado a conseguir comportamientos interesantes y avanzados como seguimiento y guia de personas, aplicaciones de video-vigilancia, reconocimiento de movimientos ...

Actualmente tiene soporte para: robot pionner, simuladores, láser, sonnars, cámaras firewire, cuello mecánico ...

Para más información:
Web principal JDE
Seguimiento de proyecto JDE

15 septiembre 2007

Iniciando PFC Superior

Bueno, al fin parece que tenemos algo de tiempo para pode empezar el proyecto de fin de carrera de la Ing. Inf. Superior.

Este proyecto lo realizaŕe con JoseMaria Cañas como tutor, y se implementará con comportamiento en el Pionner basado en técnicas como: VFF, flujo óptico, segmentación, memoria del escenario, representación en 3D.

Poco a poco iré añadiendo los avances y cosas curiosas que nos vamos encontrando en la implementación de este proyecto.

saludetes!!