Archivos de Categoría: Realidad Aumentada

ARSlides v1.0: Aplicación de presentación de diapositivas en realidad aumentada

Me alegra informaros de que (por fin) he publicado el código de la aplicación en realidad aumentada que he estado desarrollando últimamente. Esta es una pequeña demo de cómo funciona (perdón por la mala calidad de la imagen):

Esta aplicación puede mostrar diapositivas de imágenes (JPG, GIF y también imagenes con transparencia PNG y TGA) y modelados 3D (DAE, 3DS, OSG, OBJ y FBX). Tan solo tienes que añadir la ruta de tus ficheros al archivo de configuración XML del programa y usar la tecla derecha para avanzar a la siguiente o la tecla izquierda para retroceder. También puede mostrar textos en diferentes colores y tipografías pero aún tengo que hacer algunos cambios para poder integrarlos en el fichero de configuración XML.

Ahora mismo estoy trabajando en añadir diapositivas de video (AVI, MOV, etc.) y sonido (WAV, MP3, etc.) y aunque he conseguido que funcione en el pasado algunos problemas con FFMpeg hacen que la aplicación casque de manera aleatoria. Es por eso que no lo he añadido en la primera versión. He creado un nuevo branch en Github por si alguien quiere ver como va el proceso de desarrollo de esta parte.

Podéis descargaros el código fuente desde este repositorio de Github. Y por supuesto podéis contribuir al proyecto si queréis. ¡Me alegraría mucho!

Esta aplicación usa ARToolKit, Collada-dom, OpenSceneGraph y osgART así que si necesitas ayuda para instalarlos en tu sistema puedes usar los scripts que hice hace un tiempo. También hay varias guias en este blog donde se explica paso a paso como instalar las diferentes librerías.

demo1

Solución a texturas negras en modelos 3D de Collada-dom

Antes tenía problemas al cargar modelos 3D con Collada-dom porque salían algunas texturas en negro. Como en este caso por ejemplo:

Hace un tiempo descubrí que se debía al locale (idioma) en el que estaba instalado el sistema operativo Ubuntu. Yo siempre lo instalo en inglés y por eso no había tenido el probema, pero una vez un compañero me dejo su Ubuntu en español para que le instalara todo y me surgió el fallo. Estuve todo el fin de semana intentando encontrar el problema, pero como no recibía ningún tipo de mensaje de error no tenía ninguna pista. Al final me di cuenta de que el problema era el idioma y como no teníamos tiempo para encontrar otra solución mejor instalamos el Ubuntu en inglés y listo.

Hoy he cometido el error de instalar las locales de español junto con las de inglés para poder ver las fechas y los números a nuestra manera y entonces… texturas en negro otra vez. Así que sin más he quitado las locales en español y entonces la aplicación cascaba al intentar cargar un modelo 3D con Collada-dom… pero esta vez si que tenía un mensaje de error en la consola!

locale::facet::_S_create_c_locale name not valid

Con esto ya podía empezar a buscar. Y he descubierto que el causante del problema es la librería boost. En función de la versión que uses (yo uso la 1.46 pero se supone que en la 1.48 esto ya está arreglado) falla si no tienes la locale configurada a “C”.

Así que un arreglo rápido es configurar la variable de entorno LC_ALL al valor C. Se puede hacer de manera permanente en el sistema poniéndolo en tu fichero profile (en tu carpeta home) o sin más ejecutando esto en el terminal antes de ejecutar tu aplicación (en ese mismo terminal claro):

export LC_ALL=C

Como yo uso Eclipse-CDT para desarrollar la manera más fácil es configurar la variable de entorno solo para mi aplicación usando las Debug/Run Configurations. Haz click en la flecha pequeña de los botones Degug o Run y selecciona “Debug Configurations…” o “Run Configurations…”. Luego ve a la pestaña de “Environment” y configura la variable así:

Espero que esto os sirva de ayuda porque la verdad ¡a mi me ha dado muchos dolores de cabeza! Y así es como se debería ver el modelo en 3D:

UPDATE: Una vez había cambiado los locales me di cuenta de que al intentar instalar cualquier cosa con apt-get me aparecía el siguiente error diciendo que mis locales no estaban bien configuradas:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = "en_US:en",
	LC_ALL = (unset),
	LC_TIME = "es_ES.UTF-8",
	LC_MONETARY = "es_ES.UTF-8",
	LC_ADDRESS = "es_ES.UTF-8",
	LC_TELEPHONE = "es_ES.UTF-8",
	LC_NAME = "es_ES.UTF-8",
	LC_MEASUREMENT = "es_ES.UTF-8",
	LC_IDENTIFICATION = "es_ES.UTF-8",
	LC_NUMERIC = "es_ES.UTF-8",
	LC_PAPER = "es_ES.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory

Como se puede ver mis locales para time, monetary, address, telephone, name, measurement, identification, numeric y paper están configuradas a español (es_ES.UTF-8), mi idioma está configurado a inglés (es_US.UTF-8) pero no tengo nada configurado para LC_ALL. Para arreglar este error ejecuté los siguientes comandos en un terminal:

export LC_ALL=en_US.UTF-8
sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales

Y ahora ya el problema está solucionado porque todas mis locales están configuradas a en_US.UTF-8. Se puede ver como se tienen configuradas las variables de locale ejecutando “locale”:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Sources: https://svn.boost.org/trac/boost/ticket/4688
https://svn.boost.org/trac/boost/ticket/5928
http://www.becodemyfriend.com/2011/11/perl-warning-falling-back-to-the-standard-locale-%E2%80%9Cc%E2%80%9D/

Scripts para instalar ARToolKit, Collada DOM, OpenSceneGraph y osgART

He creado unos scripts y parches para que la instalación de todas estas librerías sean menos “dolorosa”. Los parches solucionan los problemas de compatibilidad de OpenSceneGraph con Ubuntu 11.10 y 12.04 como ya expliqué en otro post y unos pequeños bugs en osgART y ARToolKit (tambien se puede añadir soporte para V4L2 a este, creditos a Kameda Yoshinari por esto). Todavía me falta probarlos en las versiones de Ubuntu aunque si tienes algún problema son bastante fáciles de entender y los podrás arreglar sin problemas (estaría bien que me dijeras qué has cambiado para arreglarlos y así los actualice para que todos los tengamos disponibles ;)). Si encuentras algún error o alguna manera de mejorarlos no dudes en escribirme aquí o en mi página de Github. Puedes descargarte todos los ficheros de aquí:

https://github.com/enekochan/installation-scripts

Tienes que bajarte todos los ficheros y ponerlos en la misma ruta para ejecutar la instalación. El orden correcto para ejecutarlos es:

  1. installARToolKit.sh
  2. installCollada.sh
  3. installOpenSceneGraph.sh
  4. installosgART.sh

Una vez tengas todas las librerías instaladas podrás usar osgART con ficheros Collada (.dae) de la misma manera que hago yo en esta imagen:

No te preocupes que pronto explicaré (con código fuente por supuesto) cómo se hace.

ACTUALIZACIÓN: Puedes encontrar aquí el código fuente para esta aplicación de realidad aumentada.

osgART 2.0 RC3 con OpenSceneGraph 2.9.7 o posterior (incluyendo 3.0.0)

Hace bastante tiempo tuve problemas para usar osgART 2.0 RC3 con OpenSceneGraph 2.9.7 o cualquier versión posterior, no conseguía que el video de la cámara web se mostrara en el fondo así que siempre me limitaba a usar OpenSceneGraph 2.9.6. Hoy me he dado cuenta de que mi aplicación osgART podía funcionar con OpenSceneGraph 2.9.7 o superior (la versión actual 3.0.0 también funciona!), pero como siempre me quedaba en la 2.9.6 no sabía que había solucionado el problema!

NOTA: Si quieres instalar OpenSceneGraph 3.0.0 en Ubuntu 11.10 o Ubuntu 12.04 tendrás que aplicar los parches que he creado y subido a mi repositorio de github.

La clave del problema esta que al configurar el osgART::VideoGeode para el fondo se puede usar TEXTURE_2D o TEXTURE_RECTANGLE. Si usas TEXTURE_RECTANGLE funcionará en versiones nuevas de OpenSceneGraph. Se puede ver un ejemplo en la línea 40 de “examples/osgartsimple/osgartsimple.cpp” en el código fuente de osgART 2.0 RC3:

osg::Group* createImageBackground(osg::Image* video) {
	osgART::VideoLayer* _layer = new osgART::VideoLayer();
	_layer->setSize(*video);
	osgART::VideoGeode* _geode = new osgART::VideoGeode(osgART::VideoGeode::USE_TEXTURE_2D, video);
	addTexturedQuad(*_geode,video->s(),video->t());
	_layer->addChild(_geode);
	return _layer;
}

Si tienes instalado OpenSceneGraph 2.9.7 o superior con osgART 2.0 RC3 tal cual viene el código fuente, al ejecutar este ejemplo desde “/usr/local/bin/osgartsimple” verás algo como esto al mostrar el típico patrón “Hiro” a la cámara:

Si modificas el código anterior a esto:

osg::Group* createImageBackground(osg::Image* video) {
	osgART::VideoLayer* _layer = new osgART::VideoLayer();
	_layer->setSize(*video);
	osgART::VideoGeode* _geode = new osgART::VideoGeode(osgART::VideoGeode::USE_TEXTURE_RECTANGLE, video);
	addTexturedQuad(*_geode,video->s(),video->t());
	_layer->addChild(_geode);
	return _layer;
}

Y luego compilas e instalas osgART 2.0 RC3 otra vez, “/usr/local/bin/osgartsimple” funcionará sin problemas.

ARToolKit con OpenKinect usando la cámara IR

Hace más de un año me puse a añadir el soporte para Kinect a ARToolKit usando para ello libfreenect. Obtuve buenos resultados pero no tenía tiempo para publicar un código que estuviera lo suficientemente probado. Aunque ahora ya no tiene demasiado sentido porque al menos en Ubuntu se puede usar el Kinect en ARToolKit mediante el video input de GStremaer (ya que Ubuntu crea un dispositivo /dev/videoX al conectarlo, o al menos eso me ha sucedido a mí en Ubuntu 12.04 ACTUALIZACIÓN: He descubierto que esto sucede por el módulo gspca_kinect introducido a partir del kernel Linux 3.0). De todas maneras quería aprender como funciona ARToolKit por dentro. Ahora le he añadido no solo el soporte para la cámara RGB, sino tambien para la cámara IR, el motor y el LED.

La propia naturaleza de la cámara IR hace que usarla con ARToolKit sea muy difícil si el marker no está muy cerca del Kinect, pero oye es divertido programar con libfreenet. Trataré de publicar el código lo antes posible. Cuando lo tenga un poco más depurado.