viernes, 9 de noviembre de 2012

Instalación de un servidor WPS

El estándar OGC Web Processing Service (WPS) permite ofrecer servicios de procesamiento de datos, principalmente para el tratamiento de de datos espaciales de modo que sean accesibles desde un cliente con solo conocer las especificaciones de un determinado proceso.

La forma mas fácil (y libre) de crear un servidor de este tipo de aplicaciones es gracias a 52°North WPS una completa aplicaciones que nos crea un servidor WPS por medio de Tomcat. Entre sus características cuenta con la incorporación de los algoritmos disponibles en Sextante y GRASS, a parte de la posibilidad de ejecutar scripts en Python y en R, podemos también utilizar cualquier librería Java como GeoTools por lo que las posibilidades de los procesos ofrecidos   Para su instalación y posterior uso para crear nuestros procesos en Eclipse debemos seguir los siguientes pasos:

0. Instalación y configuración de Java JDK

Antes de empezar debemos asegurarnos que ya hemos instalado la versión 1.6. del JDK de Java. Si no es así debemos descargar el instalable y después asegurarnos que la variable de sistema JAVA_HOME marca al directorio de instalación del JDK (algo como C:\Program Files\Java\jdk1.6.0_37)

1. Instalación de Eclipse Indigo
Si aun no lo tenemos instalado el siguiente paso es descargar e instalar Eclipse Indigo.

2. Instalación de Maven 2
Maven es una herramienta para la gestión de proyectos similar a Ant. Para su instalación en primer lugar nos debemos bajar la versión 2.2.x y descomprimir el archivo en el directorio de instalación que queráis (por ejemplo C:\Program Files\Apache Software Foundation\maven-2.2.1)

A continuación deberemos anadir a la variable PATH del sistema la dirección del directorio bin de Maven (por ejemplo C:\Program Files\Apache Software Foundation\maven-2.2.1\bin). Una vez hecho esto debemos ejecutar los siguietes comandos desde la consola de MS-Dos:
    > mvn --version       (para comprobar que la instalación es correcta)
    > mvn                      (para crear el repositorio de Maven)

3. Instalación de Tomcat 6
Tomcat es un servidor de aplicaciones Java o servlets en el cual se basa el servidor WPS asi como el resto de los procesos que creéis para ser expuestos en el servidor. Para su instalación solo debemos descargarnos el instalable del servicio e instalarlo.

4. Instalación de Subclipse
Ahora ya de vuelta a Eclipse necesitamos instalar un par de plugins para facilitarnos el trabajo con Maven. En primer lugar para instalar Subclipse solo debemos entrar en Help - Eclipse Marketplace y buscar el plugin e instalarlo.


5. Instalar m2e-subclipse
Este plugin nos permite conectar Subclipse con Maven para su instalación debemos ir a Window - Preferences - Maven - Discovery y hacer clic sobre Open Catalog.




A continuación deberemos buscar e instalar el plugin m2e-subclipse:

6. Instalar Mongrel
Este plugin nos permite conectar eclipse con Tomcat . Para su instalación solo debemos acceder nuevamente al Marketplace de Ecplise (Help - Eclipse Marketplace) y buscar el plugin.

7. Descargar el código del WPS
Para ello solo debemos entrar en Eclipse -> File -> Import -> Maven -> Check out Maven Projects from SCM.


Y después descargarlo mediante SVN desde la dirección https://svn.52north.org/svn/geoprocessing/main/WPS/trunk/WPS/





La operación puede tardar un rato pero una vez finalizada tendréis disponibles todos los componentes del servidor WPS.

8. Compilación
 Para compilar el servidor y comprobar que todo se ha descargado correctamente solo tenéis que hacer clic sobre el módulo 52n-wps-webapp - Run As - Maven install y una vez terminado deberéis ver en la consola un mensaje similar a:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 40.813s
[INFO] Finished at: Fri Nov 09 14:45:23 CET 2012
[INFO] Final Memory: 10M/24M
[INFO] ------------------------------------------------------------------------

9. Ejecución
Para ejecutar el servidor en Tomcat en primer lugar debeis configurar el plugin Mogrel para ello hay que acceder a Window - Preferences -Mongrel y seleccionar la versión 6 y anadir el directorio de instalación de Tomcat (por ejemplo C:\Program Files\Apache Software Foundation\Tomcat 6.0)



Ahora con solo pulsar el icono de Tomcat desde eclipse o Mongrel - Start Tomcat ejecutaremos el servidor en Tomcat y para comprobar que funciona correctamente podemos solicitar el servicio GetCapabilities (por ejemplo http://127.0.0.1:8080/52n-wps-webapp-3.0/WebProcessingService?Request=GetCapabilities&Service=WPS) que muestra un XML con los processos disponibles y las propiedades del servidor.



Mas información:



miércoles, 26 de septiembre de 2012

Instalando openkinect en Fedora

Aunque actualmente existe un excelente SDK para Kinect no podremos utilizarlo en nuestro SO favorito, aka Linux. A continuación os dejo paso por paso todos los pasos para poder utilizar libfreenect en Fedora:

En primer lugar debemos instalar libusb

$yum install libusb1*

Y después todo esto aunque la mayoría espero que ya lo tengáis:

$yum install git cmake gcc gcc-c++ libXi libXi-devel libXmu libXmu-devel freeglut freeglut-devel

Después descargamos el código desde el repositorio GIT con en el directorio actual (así que os recomiendo crear un directorio para el proyecto)

$ git clone git://github.com/OpenKinect/libfreenect.git
 

Y ahora queda configurar la compilación:

 
$ cd libfreenect
$ mkdir build
$ cd build
$ ccmake ..

Una vez ejecutado el editor ccmake presionar c para configurar.
Debereis comprobar que la variable LIBUSB_1_INCLUDE_DIR es /usr/include/libusb-1.0  aunque deberia estar bien por defecto.
Pulsar intro para terminar.
Pulsar c para seguir la configuración.
Si todo esta bien hay que pulsar g que generara el fichero de configuración y terminara la operación.


Ahora queda construir todo e instalar:

$ cmake ..
$ make
$ sudo make install

Y listo.

Para probar si todo funciona podemos conectar nuestro kinect al puerto USB (recordar que tiene que ser un puerto 2.0 (si yo he estado un par de horas tratando de hacer que funcione en un USB 3.0)) e ir a la carpeta build y ejecutar el programa de ejemplo:

$ bin/glview

Ahora ya podemos empezar a utilizar la librería. Para ello solo tenemos que anadir la carpeta inlclude de la libreria que deberia estar por defecto en /usr/local/include/libfreenect/ y anadir al proyecto la libreria  freenect que deberia estar en /usr/local/lib64 (si usais una version de 64 bits de fedora).

Si al compilar os da un error parecido a "error while loading shared libraries: libfreenect.so.0.1: cannot open shared object file: No such file or directory" si vuestro sistema es de 32 bits debeis anadir el directorio a la path de librerias del sistema con:

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

o si contáis con Fedora de 64 bits:

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

Para más información:






viernes, 15 de junio de 2012

Creación de librerias en Matlab para su uso en aplicaciones en C

Estos días estoy trabajando en la integración de una aplicación creada en Matlab (2008b) junto con otra en una aplicación en C\C++ en Visual Studio (2005) y la verdad es que aunque a primer vista parezca un proceso fácil en realidad es algo bastante enrevesado.

A lo largo de este tutorial trabajaremos con el siguiente código Matlab que debemos guardar en un archivo llamado getCorrelation.m y que calcula la coeficiente de correlación entre dos matrices (que indica si son o no similares las diferencias entre sus valores):

function cor = getCorrelation(temp, comp)
    tsize = size(temp);
    csize = size(comp);
   
    if (tsize == csize)   
        %media de los valores de la matriz temp 
        aver_temp = median(median(temp)); 
        %media de los valores de la matriz comp
        aver_comp = median(median(comp));
       
        tc = 0.0;
        vaa = 0.0;
        vab = 0.0;
        for nr=1:tsize(1)
            for nc=1:tsize(2)
                tc = tc + double((temp(nr, nc)-aver_temp) * (comp(nr, nc) - aver_comp));
                vaa = vaa + double((temp(nr, nc)-aver_temp)^2);
                vab = vab + double((comp(nr, nc)-aver_comp)^2);       
            end
        end      
        % Calculo de la fórmula completa.
        cor = tc/sqrt(double(vaa * vab));
    end 


Antes de crear una librería en C de este código desde Matlab debemos configurarlo para que compile utilizando el compilador de Visual Studio para lo que se debe utilizar el siguiente comando en Matlab:

>> mbuild -setup

Tras lo cual se nos preguntara si queremos cambiar el compilador y que lo seleccionemos de una lista de entre los disponibles en el sistema. Como trabajaremos con VS2005 sera este el que se debe elegir. Este paso genera un script de configuración que por lo menos en mi caso no ha resultado funcionar por defecto por lo que lo debemos editar modificando un par de lineas. Para ello buscamos el archivo compopts.bat (que se encuentra en la carpeta de configuración de aplicaciones del sistema algo similar a C:\Documents and Settings\TU_USER\Datos aplicaciones\MathWorks\MATLAB\R2008b). En este archivo debemos modificar las siguientes asignaciones de variables:

set VSINSTALLDIR=C:\Program Files\Microsoft Visual Studio 8   
(O donde este instalada vuestra versión de VS)

set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%LINKERDIR%\INCLUDE;%VSINSTALLDIR%\SDK\v2.0\include;%VCINSTALLDIR%\PlatformSDK\Include;%INCLUDE%

set LIB=%VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%LINKERDIR%\lib;%VSINSTALLDIR%\SDK\v2.0\lib;%MATLAB%\extern\lib\win32;%VCINSTALLDIR%\PlatformSDK\Lib;%LIB%


Ahora ya podemos generar la librería sin problemas y con solo escribir en Matlab el comando:

>> mcc -B csharedlib:libcorrelation getCorrelation.m

Que generará entre otro, los siguientes ficheros que son los que utilizaremos después para crear la aplicación que utilizará esta librearía desde Visual Studio:

libcorrelation.c
libcorrelation.h
libcorrelation.dll
libcorrelation.lib

Ahora ya podemos olvidarnos de Matlab y comenzar a trabajar en Visual Studio. En primer lugar debemos configurar nuestro proyecto para lo que debemos indicar donde se encuentran los archivos creados y las cabeceras y librerías de Matlab que normalmente estarán en los directorios:

...Caperta instalacion\MATLAB\R2008b\extern\lib\win32\microsoft
...Carpeta instalacion\MATLAB\R2008b\extern\include

También deberemos añadir al proyecto las librerías:

mclmcrrt.lib
libcorrelation.lib

Ahora ya podemos incluir en nuestro código la definición de nuestra librería creada en Matlab y las cabeceras de la API de Matlab:

#include "libcorrelation.h"

Y el resto del código, que debe empezar por la inicialización de la API de Matlab para lo que debemos llamar a la función mclInitializeApplication y a la función de inicialización que se ha definido en la librería que vendrá siempre dada por el nombre de la librería junto con la palabra Initialize (en nuestro caso la función libcorrelationInitialize). Por tanto el código de inicialización queda definido por:

if (!mclInitializeApplication(NULL,0)) {
        fprintf(stderr,"No se ha podido inicializar la API de Matlab!\n");
        return;
}
if (!libcorrelationInitialize()){
        fprintf(stderr,"No se ha podido inicializar la librería!\n");
        return;
}

Ahora ya podemos definir las matrices (por medio de la estructura mxArray) con los datos que le pasaremos a la función definida en la librería para que realice el cálculo del coeficiente de correlación así como la matriz en la que se almacenara la salida producida. Para ello debemos escribir:

    // Definición estructuras y datos
    mxArray *in1, *in2;
    mxArray *out = NULL;
    double data1[] = {1,2,3,4,5,6,7,8,9};
    double data2[] = {1,1,1,3,3,3,6,6,6};
    // creación matrices de entrada entrada    
    in1 = mxCreateDoubleMatrix(3,3,mxREAL);
    in2 = mxCreateDoubleMatrix(3,3,mxREAL);
    // Asignación de valores.
    memcpy(mxGetPr(in1), data1, 9*sizeof(double));
    memcpy(mxGetPr(in2), data2, 9*sizeof(double));
 
A continuación ya podemos  llamar a nuestra función que se habrá generado con el mismo nombre con el que está definida en el código en Matlab precedida del prefijo mlf siendo los primeros argumentos el numero de argumentos de salida y las estructuras donde se almacenan y el resto los definidos en la cabecera de la función del código en Matlab:

    mlfGetCorrelation(1, &out, in1, in2);
   
Aunque en este caso obtenemos una matriz de salida de 1x1, si quisiéramos saber sus dimensiones podemos escribir (dónde mwSize es en realidad un size_t):

    mwSize nRow = mxGetM(out); //Filas
    mwSize nCol = mxGetN(out); //columnas

Para recibir los datos de forma que podamos utilizarlos desde C utilizaremos:

    double *xValues = mxGetPr(out);
   
Y ya podemos imprimir la solución (o soluciones si se tratase de una matriz de mayor dimensión):

    for(size_t row = 0; row < nRow; row++) {
        for(size_t col = 0; col < nCol; col++) {
            cout << xValues[nRow * col + row];
        }
        printf("\n");
    }
 
Finalmente para liberar las estructuras generadas utilizaremos las función mxDetstroyArray:

    mxDestroyArray(in1); in1=0;
    mxDestroyArray(in2); in2=0;
    mxDestroyArray(out); out=0;
 
Y al igual que en la inicialización deberemos ejecutar las funciones de terminación en primer lugar la de la librería que vendrá definida por el nombre de la librería seguido de la palabra Terminate y a continuación la de la API de Matlab que viene dada por la función mclTerminateApplication:

    libcorrelationTerminate();
    mclTerminateApplication();


Por ultimo os dejo un par de enlaces donde podéis encontrar mas ejemplos de código C utilizando Matlab e información adicional: