Archivos de Tags: Ubuntu

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.

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.

Instalar osgART 2.0 RC3 con OpenSceneGraph 2.8.3 o 2.9.6 y soporte para Collada en Ubuntu 12.04

Antes de instalar osgART tenemos que instalar ARToolKit, collada-dom y OpenSceneGraph así que echar un vistazo a los siguientes post antes de continuar:

  • Install ARToolKit 2.72.1 en Ubuntu 11.10 y 12.04
  • Instalar la librería collada-dom en Ubuntu 10.04, 10.11, 11.04, 11.10 y 12.04
  • Instalar OpenSceneGraph 2.8.3 con soporte para Collada en Ubuntu 12.04
  • Instalar OpenSceneGraph 2.9.6 con soporte para Collada en Ubuntu 12.04

Una vez instaladas las dependencias para osgART descargarse el código de osgART 2.0 RC3 de aquí y descomprimirlo. Ejecutar los siguientes comandos:

mkdir build
cd build
cmake .. -DCMAKE_CXX_FLAGS=-fpermissive -DCMAKE_MODULE_LINKER_FLAGS=-lgstreamer-0.10 -DCMAKE_SHARED_LINKER_FLAGS=-lgstreamer-0.10
make
sudo make install

Se puede quitar la opción “-DCMAKE_CXX_FLAGS=-fpermissive” si se añaden los siguientes includes en el fichero “include/osgART/Utils” justo después de “#include “:

#include 
#include 

Configurar la variable de entorno ARTOOLKIT_CONFIG (ya deberías tenerla configurada al instalar ARToolKit):

export ARTOOLKIT_CONFIG="v4l2src device=/dev/video0 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24 ! identity name=artoolkit ! fakesink"

Y ejecutar el ejemplo mientras se muestra el marcador de “Hiro” a la cámara:

cd /usr/local/bin/
./osgartsimple

Si te aparece este error:

Plugin '-1' unknown!
Could not initialize video plugin!

Se debe a que no se han copiado correctamente las librerías de osgART a la carpeta de librerías (“/usr/local/lib“) o a la carpeta de librerías de OSG (“/usr/local/lib/osgPlugins-X.X.X“). Verifica que hay un fichero llamado “libosgART.so” en “/usr/local/lib” y que tienes los ficheros “osgdb_osgart.so“, “osgart_tracker_artoolkit2.so” y “osgart_video_artoolkit2.so” en la carpeta de librerías de OSG (que debería ser “/usr/local/lib/osgPlugins-2.8.3“o “/usr/local/lib/osgPlugins-2.9.6” en función de la versión de OSG que instalaste). Ten en cuenta que si instalas varias versiones de OSG es posible que el plugin de osgART no se copie a la carpeta de plugins de la versión de OSG que tu quieres. Ejecuta esto también por si acaso:

sudo ldconfig /etc/ld.so.conf

Si se ve el fondo negro se debe a un pequeño bug en ARToolKit. Se puede arreglar modificando en ARToolKit la función “ar2VideoCapNext” en el fichero “lib/SRC/VideoGStreamer/video.c en la línea 378 par que devuelva un 0 en vez de TRUE O modificando el fichero de osgART “src/osgART/Video/ARToolKit/ARToolKitVideo.cpp” en la línea 310 de esto:

if (0 == ar2VideoCapNext(video))

A esto:

if (ar2VideoCapNext(video))

Para utilizar la opción de ARToolKit donde cada fotograma se compara con los anteriores para obtener un tracking más suave del marker, se debe cambiar una línea de código de osgART. Dentro del fichero “src/osgART/Traker/ARToolKit/SingleMarker.cpp” descomentar la línea 76 y comentar la línea 77. Es decir pasar de esto:

//arGetTransMatCont(markerInfo, patt_trans, patt_center, patt_width, patt_trans);
arGetTransMat(markerInfo, patt_center, patt_width, patt_trans);

A esto:

arGetTransMatCont(markerInfo, patt_trans, patt_center, patt_width, patt_trans);
//arGetTransMat(markerInfo, patt_center, patt_width, patt_trans);

Fuentes: http://projects.springlobby.info/issues/1575
https://github.com/bitcoin/bitcoin/pull/456
https://code.ros.org/trac/opencv/ticket/1020
http://forum.openscenegraph.org/viewtopic.php?t=7755

Instalar OpenSceneGraph 2.9.6 con soporte para Collada en Ubuntu 12.04

Aunque normalmente uso OpenSceneGraph 2.8.3 para trabajar con osgART 2.0 RC3 también se puede usar OpenSceneGraph 2.9.6 (de hecho es la última versión compatible con osgART ACTUALIZACIÓN: leer este post para hacer funcionar osgART 2.0 RC3 en la versión 2.9.7 y superiores). Te lo puedes descargar usando SVN:

svn checkout http://www.openscenegraph.org/svn/osg/OpenSceneGraph/tags/OpenSceneGraph-2.9.6 OpenSceneGraph-2.9.6

Los pasos para instalar OSG 2.9.6 con soporte para Collada en Ubuntu 12.04 son los mismos que expliqué en “Instalar OpenSceneGraph 2.8.3 con soporte para Collada en Ubuntu 12.04“, solo que hay que hacer unos cambios más al código fuente por culpa de FFMpeg. Así que tan solo añade estos cambios a los que ya expliqué para OSG 2.8.3 y luego procede a la instalación de manera normal:

/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp
- En la línea 276 cambia esto:

const int bytes_decoded = avcodec_decode_audio2(m_context, reinterpret_cast(buffer), &data_size, m_packet_data, m_bytes_remaining);

Por esto:

#if LIBAVCODEC_VERSION_MAJOR >= 53 || (LIBAVCODEC_VERSION_MAJOR==52 && LIBAVCODEC_VERSION_MINOR>=32)
            AVPacket avpkt;
            av_init_packet(&avpkt);
            avpkt.data = const_cast(m_packet_data);
            avpkt.size = m_bytes_remaining;

            const int bytes_decoded = avcodec_decode_audio3(m_context, reinterpret_cast(buffer), &data_size, &avpkt);
#else
            // fallback for older versions of ffmpeg that don't have avcodec_decode_audio3.
            const int bytes_decoded = avcodec_decode_audio2(m_context, reinterpret_cast(buffer), &data_size, m_packet_data, m_bytes_remaining);
#endif

/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp

- En la línea 168 cambia esto:

const int bytes_decoded = avcodec_decode_video(m_context, m_frame.get(), &frame_finished, m_packet_data, m_bytes_remaining);

Por esto:

#if LIBAVCODEC_VERSION_MAJOR >= 53 || (LIBAVCODEC_VERSION_MAJOR==52 && LIBAVCODEC_VERSION_MINOR>=32)
            AVPacket avpkt;
            av_init_packet(&avpkt);
            avpkt.data = const_cast(m_packet_data);
            avpkt.size = m_bytes_remaining;

            const int bytes_decoded = avcodec_decode_video2(m_context, m_frame.get(), &frame_finished, &avpkt);
#else
            // fallback for older versions of ffmpeg that don't have avcodec_decode_video2.
            const int bytes_decoded = avcodec_decode_video(m_context, m_frame.get(), &frame_finished, m_packet_data, m_bytes_remaining);
#endif

Fuentes: http://code.metager.de/source/xref/OpenSceneGraph/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp

  • Page 1 of 3
  • 1
  • 2
  • 3
  • >