lunes, 23 de junio de 2008

Probando ARToolKitPlus




Aunque hasta ahora he trabajado con ARTK, me comentaron el otro día que existe una variante, el ArtoolkitPlus [1], que minimiza la necesidad de procesamiento (lo cual es bastante interesante para el limitado procesador del robot). Pero esta versión de la libreria se encuentra con los siguientes grandes problemas:


  • Carece practicamente de DOCUMENTACIÓN. En teoría y según ellos la documentación de ARTK debería ser suficiente, pero se supone que previamente has debido trabajar con esta.

  • Apenas hay ejemplos solo incluye dos que son muy simples.

  • ARTK+ no dispone de librerias de acceso a camaras (ARTK si dispone de ellas). Si queremos utilzar esta funcionalidad en ARTK+ debemos fabricarnos nuestras propias librerias de acceso.

  • Por último los creadores de ARTK+ han dejado su desarrollo paralizado su desarrollo y lo han dejado de lado. Actualmente estan trabajando en un nuevo proyeto que realizaría estas funcionalidades de una forma más optimizada. Su nombre es STUDIERSTUBE TRACKER. Pero también aqui tenemos otro problema, puesto que este proyecto no se distribuye bajo el mismo tipo de licencia que los anteriores y si deseas obtenerlo debes ponerte en contacto con su creador y solicitarselo.
Por tanto ante estos problemas, según se vea la experiencia con esta librería se hará uso de ella o no.

[1] http://studierstube.icg.tu-graz.ac.at/handheld_ar/artoolkitplus.php

viernes, 13 de junio de 2008

Diseñando la implementación

Buenas,

ya despues de todos los exámenes superados con éxito :D, retomo el desarrollo del proyecto y ahora ya toca ir trabajando la implementación.

Como buen analista, el primer paso consta en analizar el problema y esbozar un diagrama que refleje el funcionamineto. Para eso he diseñado el siguiente diagrama de clases, que aunque es un prototipo muy temprano, da una idea de la estructura y el funcionamiendo del proyecto:


El fucionamiento un poco por encima sería el siguiente:

-El servidor (o clase principal) se crea un objeto contexto con la información que le pasa el cliente al establecer la conexión.
-Posteriormente se crea un objeto de "control robot" al que le pasa como parametro el objeto "contexto" (ya que lo van a modificar) y que contiene dos objetos: "control camara" y "control Movimiento".
-Se crea un objeto "Estimacion Posición mediante Artoolkit" que es la parte que accede a la capturadora de vídeo para tomar un fotograma y calcular su posición respecto al fotograma, aparte de poder devolver vídeo frame a frame.
-Todos los objetos creados son pasados como parámetros a un objeto "Strategy" según el tipo de estrategia que decida utilizar el usuario y estas pueden ser:

1) Contol manual del robot y la cámara,
2) Funcionamiento autónomo buscando las marcas cercanas a la ruta para calibrarse
3) Funcionamiento autónomo sin buscar las marcas pero teniéndolas en cuenta si se encuentra con alguna de forma casual.

De momento voy a ver como empiezo a implementar todo esto porque son muchas cosas y ya iré comentando como va la cosa.

Saludos!!

martes, 15 de abril de 2008

Ya tengo las fuentes de vídeo

Tras mucho cacharrear, he conseguido sacar el vídeo frame a frame en formato JPEG, tanto para la imagen real, como para la aumentada. Para esta última he utilizado la función de OpenGl "glReadPixels" [1], la cual captura lo último que se ha pintado OpenGl y lo almacena en un buffer, que posteriormente comprimo a JPEG. Aunque para el proyecto no es el objetivo insertar gráficos aumentados en la imagen pienso que esto podría ser de utilidad para futuros proyectos.

Para la compresión de JPEG he usado la librería libjpeg [2], bastante extendida en el tema.

A continuación se muestra una captura del mismo instante de la imagen real y la aumentada

Imagen real:


Imagen aumentada:


El próximo objetivo será estudiar las apliaciones cliente-servidor y realizar el envío de imágenes entre ambas.

[1] http://www.rootr.net/man/man/glReadPixels/3G
[2] http://en.wikipedia.org/wiki/Libjpeg

lunes, 14 de abril de 2008

Modelando el problema

Buenas,

tras una reunión con mis tutores de proyecto (Arturo y José Pascual), hemos planteado el problema según el siguiente diagrama, donde se propone el desarrollo como un módulo independiente, cuyas entradas y salidas serán:
-Entradas: inicialización del módulo y diferentes comandos con el objetivo de parametrizar la salida.
-Salida: datos de la posición del robot, salida de vídeo real o salida de vídeo aumentado.


Por este tipo de arquitectura, a priori se plantean los siguientes problemas:
-Hacer una apliación clienteso-servidor
-y lo que será mas problemático, comprimir el vídeo en tiempo real y enviarlo.
Para esta última tarea adelanto que trataré de abordarla usando el estandar JPEG. La compliación vendrá si no es capaz de realizar una compresión en tiempo real frame a frame, aunque según parece el cliente-servidor de vídeo que proporciona MobileRobots [1] comprime en tiempo real en JPEG.

En cualquier caso, ya iré contando los progresos.

[1] Aplicacion cliente-servidor de vídeo: http://robots.mobilerobots.com/SAV/

lunes, 7 de abril de 2008

Por fin tengo la imagen!

Algunos compañeros mios tienen el dicho de que "cuando un tonto sigue un camino, el camino acaba pero el tonto sigue". Pero en este caso, aunque parecía que no se podría utilizar la cámara en el proyecto al no ser compatible con DirectShow y este cámino parecia descartardo, indagando en la SDK grauita y limitada que proporcionan los fabricantes de la capturadora, encontré la forma de pasar el buffer que contiene la imagen directamente al artoolkit haciendo uso de los adorables punteros de c++ que suelen dar muchos dolores de cabeza, pero en ocasiones te sacan de muchos lios, como es el caso. La importancia de este hecho radica en que al estar trabajando directamente con la capturadora del robot, en teoría toda cámara conectada a ella trabajaría con Artoolkit, lo cual le da gran flexibilidad a la hora de cambiar la cámara del robot.

Así pues en este punto, las siguentes tareas a realizar son:
- Calibrar la cámara para un mejor uso de artoolkit.
- Manejar el movimiento Pan&Tild y zoom de la cámara.
- Hallar la ditancia y posición del robot basándose en la posición con que vé la marca.
- Empezar a mover el robot sobre un mapa (del I3A a ser posible).
- Integrar y estructurar todo en un proyecto

Dicho esto...manos a la obra!

viernes, 29 de febrero de 2008

Primeros problemillas

Hola a todos, como siempre que se intenta integrar HW y SW han surgido los primeros problemas, pues como cada uno viene de su padre y su madre es dificil que trabajen en armonia. En este caso, el problema fue al intentar probar Artoolkit con la cámara PTZ canon vc-c50i :
Que la verdad, es una cámara muy completa, pues tiene Pan & Tild, un zoom increible, visión nocturna, resolución enorme... pero en realidad ella no tiene la culpa, pues esta conectada a una capturadora de video Sensoray 311 que no ofrece soporte para DirectShow y por tanto no funciona con Artoolkit.
Otra prosibilidad podría haber sido que la capturadora guardara vídeo .AVI y pasárselo a Artoolkit como entrada, pero según me comentan los fabricantes de Sensoray 311 solo captura video sin comprimir y para el limitado procesador del P3AT sería demasiado tener que comprimir vídeo y realizar el procesamiendo del Artoolkit en tiempo real, por tanto esta opción por el momento queda descartada.
Así que en este punto, como solución se plantea usar otro tipo de cámara como una webcam USB que suelen dar menos problemas al usar estas librerias.

Hasta aqui el primero de mis problemas y seguramente no será el último,

saludos!

lunes, 25 de febrero de 2008

Augmented Reality Aracnophobia Therapy

Hola a todos de nuevo,

ya adentrándome un poco en el mundo Artoolkit he realizado un trabajo para ponerlo en funcionamiento y hacer algunas pruebas. Primero, para quien le interese haré una breve descripción sobre "qué es Artoolkit" y "cómo se instala" (si ya lo conoce puede saltar este paso).

¿Qué es Artoolkit?
ArToolKit es un conjunto de librerías para C/C++ que sirven para la creación de aplicaciones de realidad aumentada. Para ello proporciona una serie de funciones para la captura de vídeo y para la búsqueda de ciertos patrones, en las imágenes capturadas, mediante técnicas de visión por computador. También proporciona una serie de ejemplos y utilidades de gran ayuda al programador que quiera realizar este tipo de aplicaciones.

Instalación y puesta en marcha de Artoolkit
A continuación se detalla cómo se ha realizado la instalación y puesta en marcha de Artoolkit en su última versión (2.72.1) bajo Windows XP usando el entorno Visual Studio .NET 2003 en C++.

Prerequisitos:
- Entorno de desarrollo: donde se ha usado .NET 2003 pero también es posible usar Microsoft Visual Studio 6
- DSVideoLib-0.0.8b-win32: librería usada para controlar la comunicación con el driver de la cámara.
- GLUT: con el kit estas librerías deberían estar en los siguientes directorios si no existieran ya:
  • glut32.dll en c:\widows\system32
  • glut.dll en C:\widows\system
  • glut.h en (*)\Include\gl\
  • glut32.lib en (*)\Lib\
- DirectX Runtime: librerías de DirectX en su versión 9.0b o posterior
- Entrada de vídeo: en este caso mediante una cámara web (hay que apreciar que para el correcto funcionamiento si se tiene otra fuente de vídeo, como pudiera ser una capturadora de televisión, es necesario deshabilitarla).
- OpenVRML-0.14.3-win32: para trabajar con VRML como será el caso.
*Nota: para nuestro caso (*) se corresponde con la ruta “C:\Archivos de programa\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK”


Instalación:
Para poner en marcha Artoolkit, se recomienda seguir los siguientes pasos, aunque algunos en esta última versión ya vienen configurados dentro del directorio de Artoolkit:

1. Descomprimir ARToolKit.zip en cualquier directorio, siempre y cuando el directorio que contenga todo se llame ARToolKit.
2. Descomprimir DSVideoLib zip dentro {ARToolKit}. Asegurarse de que este directorio se llama "DSVL".
3. Copiar los archivos DSVL.dll y DSVLd.dll desde {ARToolKit}\DSVL\bin dentro de {ARToolKit}\bin.
4. Instalar GLUT DLL dentro de la carpeta de Windows System32, y la librería y cabeceras dentro de las carpetas de la plataforma VS SDK .
5. Ejercutar el script {ARToolKit}\Configure.win32.bat para crear include/AR/config.h.
6. Abrir ARToolKit.sln (VS.NET) o ARToolkit.dsw (VS6).
7. Ejecutar Artoolkit.
8. La libreria de renderizado de VRML y el ejemplo son opcionales pero para nuestro caso necesarios:
9. Descomprimir OpenVRML zip dentro de {ARToolKit}.
10. Copiar js32.dll desde {ARToolKit}\OpenVRML\bin dentro de {ARToolKit}\bin.
11. Habilitar libARvrml y simpleVRML projects en el controlador de configuración del VS.

Caso de estudio
En nuestro caso pretendemos que cuando la cámara detecte determinados patrones, superponga modelos VRML de arácnidos, dando lugar a una realidad aumentada que mezcle el entorno real con estos modelos virtuales añadidos.
Para esto vamos a trabajar sobre el ejemplo “simpleVRML.vcproj” ubicado en “ARToolKit\examples\simpleVRML”.
Para que funcione correctamente en dicho directorio necesitamos tener las carpetas “Data” (que contiene datos de configuración, patronest, etc) y “Wrl” (que contiene los archivos VRML y los datos de configuración de estos). Estos directorios se encuentran {Artoolkit}/bin/.
Una vez hecho esto, iniciamos Visual Studio .Net 2003 y abrimos un nuevo proyecto, donde uscaremos en la siguiente ruta ARToolKit\examples\simpleVRML\ simpleVRML.vcproj
Al ejecutar el proyecto debe aparecer una ventana que nos deja personalizar los parámetros de la cámara y posteriormente la imagen capturada por la cámara. Ahora cuando detecte algún patrón de los configurados mostrará añadirá información a la imagen capturada con la imagen virtual. En el siguiente ejemplo se aprecia cómo en un entorno real introduce una abeja volando cuando detecta el patrón “hiro”, que básicamente consiste en un modelo VRML.

Con todo esto ya sólo faltaría encontrar unos modelos de arañas para nuestro caso de estudio y modificar los archivos de configuración para que los muestre de acuerdo con los patrones que asociemos a cada uno.
Para esto, primero modificamos el en ARToolKit\examples\simpleVRML\Data\ el archivo object_data_vrml con el notepad de la siguiente manera:

#the number of patterns to be recognized
3

#pattern 1
VRML Wrl/spider1.dat

Data/patt.kanji

80.0
0.0 0.0

#pattern 2
VRML
Wrl/spider2.dat

Data/patt.hiro
80.0
0.0 0.0

#pattern 3

VRML Wrl/spider3.dat

Data/patt.sample1
80.0
0.0 0.0

Y también habría que modificar los archivos .dat con el archivo .wrl que carga y las transformaciones que le realizará. Por ejemplo para el ejemplo 1 (spider1.dat) sería:

spider1.wrl 0.0 0.0 50.0
# Translation
0.0 0.0 0.0 0.0
# Rotation
5 5 5
# Scale

En total se han realizado tres casos, una araña estática (para ponerla en la pared o una mano), otra con movimiento de translación (para que se mueva por el suelo) y otra que cuelga de un hilo y sube o baja (para ponerla en una pared).

Resultados:

Para los tres casos desarrollados estos son los resultados visuales:
Para el ejemplo 1 (araña estática):

Para el ejemplo 2 (araña en movimiento)

Como puede observarse en este ejemplo se ha creado un polígono que oculta el patrón, este método podría ser usado para ocultar las marcas con la textura de la zona donde se pone la
marca, así incrementaría la sensación de realidad.
Para el Ejemplo 3 (que sube y baja sobre su hilo):
Observaciones:
Todo este desarrollo podría aplicar en cámara web sobre la cabeza del usuario que realice las funciones descritas de realidad aumentada y un visiocasco de realidad virtual para incrementar la sensación de realidad que percibe el usuario. Algo parecido a como se muestra en la figura siguiente.


Y de momento esto es todo, espero que os haya gustado e incluso os pueda ser de utilidad.

saludos,
Alberto.