Ahora que me encuentro en Lisboa, descansando de la conferencia CIAWI 2008 es hora de escribir sobre el proyecto de fin de carrera que he realizado durante el último año. Este trata sobre realidad aumentada (Augmented Reality – AR) y más exáctamente centrada en los dispositivos móviles (teléfonos/celulares móviles, PDA, Smartphone, iPhone, …) en los que previamente existe una pantalla y una cámara (sin necesidad de usar sistemas como HMD).
Primeros pasos
La idea del proyecto es permitir que cualquiera de estos dispositivos pueda ejecutar software de realidad aumentada. Para ello la primera premisa es que el proyecto esté desarrollado en Java (J2ME) de tal forma que llegue a la mayor cantidad de dispositivos posibles. Esto supone un gran inconveniente: en la actualidad no existe ningún sistema de realidad aumentada en J2ME. Así que por ahí es por donde empecé.
El primer paso que dí fué analizar los diferentes sistemas de AR existentes en la actualidad y mi primera intención fué portar el famoso ARToolkit a J2ME. Tras realizar una gran análisis y portar parte de los algoritmos de visión artificial, me di cuenta que existía una parte (relacionada con el posicionamiento del marcador) que requería del uso de matrices. Esto suponía un gasto computacional muy grande para el microprocesador de los teléfonos móviles. así que decidí crear un nuevo algoritmo de posicionamiento, manteniendo la parte de visión artificial que había portado de ARToolkit.
Y así nació el proyecto que desarrollé, que básicamente es una librería en J2ME para el posicionamiento de marcadores circulares.
El proyecto
Como ya sabeis un sistema de realidad aumentada se compone de 3 partes:
- Algoritmos de preprocesamiento de imagen y extracción del marcador en 2D
- Algoritmos de posicionamiento de la cámara con respecto del marcador
- Sistema de renderizado 3D
Como ya he dicho anteriormente, este proyecto es una librería que engloba las dos primeras partes, mientras que la tercera nos la proporciona el API M3G (Mobile 3D Graphics). Aqui no voy a explicar el algoritmo utilizado (ya que tardaría mucho tiempo) pero si alguien está interesado en la explicación matemática del sistema que he utilizado o en el código que he creado, no dudeis en contactar conmigo en sergio.rodriguez.vaamonde/\@/\gmail.com (ya sabeis, sin las barras /\
), y en cuanto tenga tiempo os puedo comentar alguna cosa.
También es cierto que la librería creada funciona sin ningún problema en J2SE, ya que se usan tipos de datos primitivos y algoritmos poco específicos de J2ME. Realmente lo más específico es la captura de imágenes (con MMAPI) y la generación de los elementos 3D (con M3G), pero para ello existen soluciones java de escritorio (J2SE), como son Java Media Framework (JMF) y Java 3D. Como prueba de concepto también he utilizado ambos junto a mis librerías para desarrollar una aplicación de realidad aumentada para el escritorio y ha funcionado de forma excelente.
Conclusiones
Tras la realización del proyecto he comprobado que las máquinas virtuales de Java para los dispositivos móviles no son lentas, y el algoritmo de posicionamiento creado es lo suficientemente rápido como para usarlo en tiempo real. Si bien existe un problema: la captura de las imágenes. Ésta se hace mediante el MMAPI que proporcionan los fabricantes, y es EXTREMADAMENTE lento (suele tardar 1 segundo en realizar una captura). Esto hace que la solución más fácil (y futuros proyectos) sea portar todo el código de Java a C/C++ para que funcione sobre Symbian o Windows Mobile (de tal forma que las imágenes se capturen mucho más rápido).
[...] Actualizado: Ya está disponible la información sobre el proyecto de fin de carrera en el post de Realidad Aumentada en Dispositivos Móviles [...]
Por: Proyectos que me tienen ocupado « Blog profesional de Sergio Rodriguez Vaamonde el Diciembre 13, 2008
a las 11:16 pm
Flaco, estyoy comenzando con lode realidad aumentada y quiero implementar en mi aplicasion que no se detecten patrones predefinidos a blanco y negro si no que detecte partes fisicas, es eso posible.
Por: ...RA... el Mayo 21, 2009
a las 5:26 pm
Si que es posible, pero es bastante dificil. Me explico:
La detección de unos patrones predefinidos no es tarea fácil, pero tampoco es muy dificil. Si tu aplicación sabe el patrón a buscar, será relativamente fácil entcontrar dicha figura. Además, como conoces la geometria a priori del patrón, una vez lo detectes, y veas su deformación, podrás conocer en qué posición está la cámara con respecto a él.
El caso de la realidad aumentada sin patrones es mucho más dificil. La aplicación no sabe exactamente qué buscar, y por tanto deberá analizar toda la imagen y extraer sus conclusiones.
Para empezar a entender lo que necesitas te recomiendo que leas algún paper. Por ejemplo este trata sobre realizar un tracking en tiempo real de objetos, sin usar marcadores:
http://hal.inria.fr/docs/00/35/02/85/PDF/2006_ieee_tvcg_comport.pdf
¡Espero que vuelvas por aquí y me cuentes que tal ha salido la aplicación!
Por: Sergio Rodriguez Vaamonde el Mayo 22, 2009
a las 9:08 am