Proyecto Fin de Carrera

Robótica, software y telecomunicaciones.

Documentación en la API de RoboComp

En una entrada anterior mostraba un esquema con las relaciones entre las funciones del worker de mi componente, y os contaba cómo escribiendo doxygen Doxyfile se nos generaba automáticamente toda la documentación y se nos guardaba en un nuevo directorio doc.

Pero lo ideal es que esa documentación esté integrada en la API de RoboComp junto a la información de los demás componentes. Es una lástima que Doxygen no soporte ICE de forma que  mostrase los proxies, puertos e interfaces. Pero al menos la gente de RoboComp tiene un scrip que genera los archivos *.cpp y *.h a partir de los *.ICE para que Doxygen pueda enterarse de algo.

Realmente subir la documentación a la API lo hace ese script que se genera en el servidor, por lo cual se necesita que algún administrador dé de alta tu componente, después de esto, todo es automático. El script está programado para ejecutarse una vez a la semana, mientras que nosostros simplemente tenemos que escribir comentarios en nuestro código con el formato de Doxygen.

De momento la documentación de mi componente ya está publicada, ahora queda comentar bien para que sea útil.

¡Ah! Se me olvidaba, por si no ha quedado claro, no seais tan bestias de subir la documentación con un svn ci porque eso sólo te serviría como copia de seguridad, pero son demasiados archivos y cada vez que alguien haga un svn up de tu componente se los tendría que bajar, cuando es más rápido generarlos desde el propio código. Hacer doxygen Doxyfile te puede venir bien para comprobar cómo sería si se generase en el servidor, o para llevártela a otro ordenador, imprimirla, etc.

Anuncios

19 abril 2011 Posted by | all | , , , | Deja un comentario

Realidad Aumentada — World Builder

Hace bastante tiempo vi un vídeo en Youtube que me llamó la atención, en aquel entonces aprendía tímidamente a usar Blender y a crear mapas (escenarios 3D para mods de juegos) con Radiant.

Siempre había visto ese vídeo como un corto de ciencia ficción, pero según voy aprendiendo sobre la realidad aumentada y la visión por computador, me doy cuenta que la idea no es tan imposible. Ahora, quisiera compartirlo con los lectores del blog.

Hablando con Pablo Bustos sobre la interacción hombre-máquina y la broma del April’s Fool de Google (Gmail Motion) coincidíamos en que tener que hacer gestos y movimientos para tareas cotidianas y repetitivas, puede llegar a ser agotador y poco productivo.

Pero por otro lado, seguramente lo mismo pensó la gente de Nintendo, cuando uno de ellos propuso el WiiMote y que los jugadores de la nueva consola tuvieran que levantarse del sofá para jugar. Sin embargo fué un éxito y el que las otras consolas como XBOX360 o PlayStation3 hayan intentado copiar y mejorar el modelo con la Kinect o el Move respectivamente.

Sin embargo no es lo mismo jugar que trabajar, y seguramente las empresas que decidan apostar fuerte por llevar estas tecnologías al terreno profesional estén arriesgando mucho. Mientras tanto la investigación va dando pequeños pasitos para eliminar las restricciones de la tecnología.

Cada vez son más las herramientas que tenemos a nuestra disposición y cada vez funcionan mejor, sin embargo tener una buena idea para aplicarlas a un entorno productivo no es tan secillo, y hay veces que aunque la idea sea bueno, lo complicado es llevarla a cabo.

A continuación listo una serie de tecnologías interesantes que se pueden aplicar en el mundo real a través de la Realidad Aumentada:

  • Reconocimiento y transcripción de voz. Reconocimiento e identificación de fragmentos musicales.
  • Síntesis de voz.
  • Reconocimiento y tracking facial, Reconocimiento de retina.
  • Tracking  e identificación de objetos.
  • RFID. Identificadores mediante circuitos (microchips) sensibles a radiofrecuenta.
  • Bluetooth y redes Zigbee. Redes de acceso WiFi. Transmisión de vídeo por conexión inalámbrica WHDI.
  • Detección de marcas y códigos QR o códigos de barras.
  • GPS y otros sistemas de detección de posición por triangulación.
  • Sónar y Láser para medir distancias.
  • Gafas para la proyección de mundos virtuales o mundos de realidad aumentada.
  • Cámaras estéreo o sensores tipo Kinect para obtener vídeos imagen-espacio.
  • Pantallas con proyección 3D con gafas activas o pasivas, o sin gafas.
  • Cámaras esteroscópicas.
  • Proyección tridimensional sobre humo y otras técnicas para crear hologramas.
  • Pantallas LCD flexibles.

18 abril 2011 Posted by | all | , , , | Deja un comentario

Tips para Doxygen

Tenía pensado escribir una entrada explicando lo básico para comenzar a documentar con Doxygen en nuestro código, pero antes de ponerme a ello descubro que en el blog del proyecto Infant ya tienen una entrada así.

Documentación de proyecto con Doxygen

El proyecto Infant participa en el CUSL y se encarga de detectar objetos de una imagen en distintos entornos, aprendiendo parámetros de estos objetos. En palabras del autor:

Infant es un proyecto/experimento en el que se tratará, mediante el uso de algoritmos de aprendizaje automático y visión por ordenador crear una aplicación capaz de identificar objetos por medio de diferentes técnicas.

17 abril 2011 Posted by | all | , , | Deja un comentario

WAVI Xtion — La Kinect de ASUS

Como cabía esperar, ya ha aparecido un nuevo dispositivo similar a la Kinect de Microsoft, en este caso de la mano de ASUS.

Y si bien la Kinect aparecía como un accesorio de la videoconsola XBOX360, la WAVI Xtion surge como accesorio para los televisores de ASUS. En realidad tanto Kinect como WAVI Xtion llevan chip de PrimeSense.

Por tanto la Kinect se plantea como un “mando” para la XBOX360 y la WAVI Xtion es un elemento clave para los televisores de ASUS que pretenden volverse más interactivos con su portal Xtion.

Realmente creo que ASUS ha elegido muy mal el nombre para su dispositivo porque por un lado está WAVI, por otro Xtion Portal y por otro lado la Xtion (que la comercializan como WAVI Xtion).

WAVI es un dispositivo de conexión inalámbrica de alta capacidad que utiliza el protocolo WHDI, el cual permite la transmisión inalámbrica de vídeo en Alta Definición, además de otros datos.

Xtion Portal es la interfaz que te permite conectar el televisor a ASUS@vibe a través del ordenador. ¿Pero qué es ASUS@vibe? Pues otra tienda de juegos y aplicaciones, del estilo que la APP Store de Apple, la Ovi Store de Nokia o el Android Market de Google. Está claro que aquí hay negocio, incluso Telefónica está montando la suya.

Además ASUS ha lanzado la plataforma de desarrollo para Xtion conocida como Xtion PRO Developer Kit, la cual es completamente compatible con OpenNI.

Por lo demás parece que Xtion lleva el mismo chip que la Kinect, el PS1080. Sin embargo tiene menos extras que la Kinect, como el cuello motor o el acelerómetro.

16 abril 2011 Posted by | all | , , , , , , , | Deja un comentario

El Worker de Camimic

Estos días he estado trasteando con Doxygen y la verdad es que me gustaría aprender más, pues me parece una herramienta muy útil.

De momento he generado la información gracias a que RoboComp ya viene con Doxygen, y es tan sencillo como desplazarte a la carpeta de tu componente (…/micomponenteComp) y ejecutar el siguiente comando:

doxygen Doxyfile

Y de manera automática se nos creará una carpeta llamada doc con otra llamada html llena de los archivos necesarios.

Os dejo una imagen que he creado trasteando con Doxygen:

16 abril 2011 Posted by | all | , | 1 comentario

Avahi — maquinafoo.local

Ya he comentado alguna vez que el mayor potencial de RoboComp es la utilización de hardware simultáneamente por varios equipos. En nuestro caso podemos usar la Kinect desde varios ordenadores de RoboLab gracias a que RoboComp utiliza ICE, sin embargo hasta el momento, yo siempre había usado la Kinect desde mi ordenador y habían sido los compañeros quienes se conectaban a ella desde la red local.

Hoy me ha tocado a mí conectarme a la Kinect mientras esta estaba conectada en otro ordenador, y lo único que tenía que modificar era el archivo config que se encuentra en …/micomponenteComp/etc/ y cambiar localhost por la IP de la máquina donde corre la Kinect.

Gracias a Avahi no es necesario tratar con IP’s mientras éstas estén en la misma red local, simplemente podemos poner maquinafoo.local y Avahi se encargará de buscar la máquina con el nombre maquinafoo, obtener su IP real y sustituir maquinafoo.local por la misma.

Avahi es un demonio (similar a un servicio en Windows), que se encarga de obtener las IP’s de una red local y asociarlas a los respectivos nombres de máquina. Es similar al Bonjour de Apple, y a este tipo de servicio también se les suele llamar descubridores de servicios de red o se los puede comparar a un servicio de DNS a nivel local.

15 abril 2011 Posted by | all | , , , , | Deja un comentario

Algoritmo Predator — OpenTLD

Hace unos días leía en el Grupo de discusión de OpenKinect sobre un algoritmo de tracking(rastreo o seguimiento) revolucionario conocido como Predator Algorithm.

Predator usa una combinación de tracking + detección + ROI (Region Of Interest), y como sus autores comentan, el algoritmo aprende sobre la marcha.

En primer lugar debemos tener una captura del objeto a seguir, que se puede indicar en el momento que iniciamos el algoritmo, posteriormente escaneará cada frame buscando similitudes con el objeto que debe seguir, un vez se detectan objetos similares, se toman capturas de estos y se añaden en la base de datos, mientras tanto vamos obteniendo más y más capturas en la base de datos, se analizan las capturas y se clasifican como positivas o negativas en base a una restricciones que nosotros queramos, por ejemplo una ROI.

Cuando se tiene un número considerable de capturas, automáticamente descartamos las que aparecen con menos probabilidad, tanto de las negativas como de las positivas, creando un método muy robusto que “va aprendiendo” y mejorando.

En el siguiente vídeo se puede ver varias demostraciones de su potencial:

Pues bien, a los pocos dias se publicó el código con licencia GPLv3, lo que ha aumentado las espectativas sobre este nuevo algoritmo, ya que de este modo es posible que se porte a diversos entornos y entre todos podamos mejorarlo.

De momento se ha creado otro Grupo de Discusión  para OpenTLD, ya que el algoritmo Predator también se conoce como TLD (Tracking+Learning+Detection), y en dicho grupo ya hay gente con ganas de portarlo a GNU/Linux y MacOSX.

Uno de los mayores problemas de Predator es que hasta ahora sólo funciona bajo Windows con Matlab 2009a y archivos MEX, en el grupo de discusión comentaban sobre eliminar la dependencia con MatLab y pasarse a Octave.

También se puede encontrar más información en la página de uno de los desarrolladores.

14 abril 2011 Posted by | all | , , , , , , , , | Deja un comentario

Documentación de OpenCV 2.2

Hasta ahora no había encontrado la documentación de OpenCV 2.2 y estaba usando la disponible para OpenCV 2.1, pensando que la nueva aún no estaría disponible por encontrarse en desarrollo. Sin embargo parece ser que no es así, sino que por algún motivo la documentación de OpenCV 2.2 se encuentra en la página con el dominio de Japón, es la siguiente:

http://opencv.jp/opencv-2.2_org/cpp/index.html

12 abril 2011 Posted by | all | | Deja un comentario

Filtrando con OpenCV2.2

Como he comentado en otras entradas, en OpenCV2.2 se trabaja con Mat en lugar de las típicas IplImage o cvMat, por lo que la mayoría de la documentación existente que hace referencia a estas clases no nos sirve.

En ese caso, lo mejor es buscar la forma de hacer lo que necesitemos desde la documentación de OpenCV.

Hasta el momento he conseguido realizar un suavizado (blur) usando el filtro de mediana y una binarización por umbral (threshold), los cuales se pueden observar en la siguiente captura.

El código utilizado ha sido el siguiente:

 cv::cvtColor(imageCVrgb, imageCVrgb, CV_BGR2RGB);
 cv::cvtColor(imageCVrgb,imageCVir,CV_BGR2GRAY);
 cv::medianBlur(imageCVrgb, imageCVrgb, 7);
 cv::adaptiveThreshold(imageCVir, imageCVir, 255, 0, 0, 7, 0);
 imshow("newWindow",imageCVrgb);
 imshow("newWindow2",imageCVir);
 waitKey(2);

Por supuesto, ha sido necesario declarar las variables correspondientes en worker.h y la inicialización de las ventanas en el constructor de worker.cpp.

11 abril 2011 Posted by | all | | Deja un comentario

Ideas para Camimic

En algunas de las entradas publicadas se puede ver la GUI de mi componente, ya sea a través de las capturas de pantalla o con el video que he publicado recientemente. Sin embargo ese no será el aspecto definitivo, la GUI que he usado hasta el momento ha sido simplemente un método para aprender lo básico sobre GUI con QT y para comprobar algunos efectos de la kinect más cómodamente. De hecho estoy considerando pasar parte de este código y GUI al componente evaluationkinectComp.

Este fin de semana he estado reflexionando sobre cómo llevar a cabo las funciones de Camimic y el aspecto preliminar que debería tener la GUI, ya que ahora me siento con los conocimientos necesarios para desarrollar, pues hasta ahora me he dedicado a adquirir conocimientos básicos sobre C++, QT, KDevelop, etc.

En la siguiente imagen tengo notas con ideas que me gustaría plasmar en Camimic hacíendolas realidad.

Gracias a Pencil (programa de diseño de esquemas y mockups de GUI) la idea tiene un toque más simpático.

Idea-GUI-Camimic

Idea de GUI diseñada con Pencil y Gimp, usando OpenClipArt.

Por último he dibujado un diagrama de flujo con Dia, el cual aún necesita una mayor profundización.

Camimic-Flux-Diagram

10 abril 2011 Posted by | all | , , , , , | Deja un comentario

A %d blogueros les gusta esto: