sábado, 14 de diciembre de 2013

Como usar PCL en su proyecto

Explicaremos los pasos que debemos hacer para emplear la biblioteca de Point Cloud Library.

Antes de empezar debemos estar seguros de haber descargado e instalado la biblioteca PCL.

Ajustes del proyecto

Una vez tengamos el código preparado para ser compilado, lo guardaremos en una carpeta en la cual crearemos un archivo nuevo llamado CMakeLists.txt, si nuestro código se llama codigo.cpp debemos copiar en el nuevo archivo de la siguiente manera:
 __________________________________________________
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(codigo)

find_package(PCL 1.6 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (codigo codigo.cpp)
target_link_libraries (codigo ${PCL_LIBRARIES}) 
____________________________________________________
 

Explicación

Explicamos a continuación lo que hemos hecho en cada una de las líneas.





cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
                          

En esta linea indicamos la versión de cmake que necesitamos, aunque nosotros hayamos solicitado una versión 2.8 si el proyecto es muy básico sera suficiente con una versión 2.6. aun así es necesario especificar la versión que requerimos para compilar.


project(codigo)
 
Aquí indicamos el nombre del proyecto, y también nos da la posibilidad de indicar a cmake el directorio de origen (MY_GRAND_PROJECT_SOURCE_DIR) y el directorio desde el que se invoca cmake (MY_GRAND_PROJECT_BINARY_DIR).



find_package(PCL 1.6 REQUIRED)
  
 Luego solicitamos los paquetes de PCL que necesitamos, si no indicamos ninguno por defecto los tomara todos, pero podríamos solicitar uno solo añadiendo al final los paquetes que deseamos utilizar, si además añadimos REQUIRED debemos  tener en cuenta que si no esta la versión de PCL que indicamos fallará la compilación.


include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

Cuando estamos en los paquetes de PCL, teneos las siguientes variables:

  • PCL_FOUND: activado a 1si hemos encontrado PCL, de lo contrario desactivado.
  • PCL_INCLUDE_DIRS: ajuste  de las rutas de acceso a las cabeceras y encabezados de dependencia de PCL.
  • PCL_LIBRARIES: establecemos los  archivos de cabecera y encabezados instalados en la biblioteca  de PCL.
  • PCL_LIBRARY_DIRS: establecemos las rutas de acceso de la biblioteca PCL y otras dependencias.
  • PCL_VERSION: la versión de PCL que hemos encontrado.
  •  PCL_COMPONENTS: lista  de todos los componentes disponibles.
  • PCL_DEFINITIONS: enumera las definiciones de preprocesador necesarios y opciones del compilador.
 Para que cmake reconozca  los encabezados externos que incluimos en nuestro proyecto, es necesario utilizar include_directories (macro). En nuestros caso PCL_INCLUDE_DIRS , contiene exactamente lo que necesitamos, por lo tanto le pedimos cmake  buscar los caminos que contiene un encabezado potencialmente incluido.


add_executable (codigo codigo.cpp)

Aquí tratamos de que cmake, a partir del código inicial que es el archivo codigo.cpp en nuestro caso, cree un archivo ejecutable que el propio cmake se encargará de crear la extensión que necesaria  según en el sistema operativo, para window .exe y para UNIX vacío.

target_link_libraries (codigo ${PCL_LIBRARIES}) 

El ejecutable que estamos construyendo hace llamada a funciones de PCL. Hasta ahora, sólo hemos incluido los encabezados PCL por lo que el compilador tiene los métodos que estamos llamando. También tenemos que hacer que el enlazador conozca las bibliotecas que se están incluyendo. Como se dijo antes ,se encontró las referencias a la biblioteca PCL usando las variables  PCL_LIBRARIES, todo lo que queda es para activar la operación de enlace haciendo la llamada target_link_libraries (macro). PCLConfig.cmake utiliza una característica especial CMake llamado "EXPORT", que permite el uso de proyectos de objetivos de otros como si ellos mismos lo construyeran. Cuando se utiliza este tipo de objetivos que se llaman metas y actúa igual que toda otra meta importada.

Compilación del proyecto.

Si utilizamos la consola de Linux, lo normal es utilizar Ubuntu, tendremos que proceder  de la siguiente manera:

  • Entramos en el archivo donde tenemos el proyecto (codigo.cpp) y el archivo CMakeLists.txt mediante el comando $cd ruta/carpeta
  • Creamos una carpeta nueva cualquier nombre sirve en nuestro caso construcion con el comando $cd mkdir contrucion
  • Luego entramos en la carpeta que hemos creado con el siguiente comando      $cd construcion
  • Luego preparamos la carpeta con los archivos necesarios para la compilación del proyecto mediante el comando $cmake ..
Por tanto en consola tendremos que proceder de la siguiente manera:

$cd ruta/carpeta
$cd mkdir contrucion
$cd construcion
$cmake ..

Si tenemos todo bien nos deberá de aparecer por consola lo siguiente:
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- checking for module 'eigen3'
--   found eigen3, version 3.0.5
-- Found eigen: /usr/include/eigen3
-- Boost version: 1.46.1
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   iostreams
-- checking for module 'flann'
--   found flann, version 1.7.1
-- Found Flann: /opt/ros/groovy/lib/libflann_cpp_s.a
-- checking for module 'openni-dev'
--   found openni-dev, version 1.5.2.23~precise
-- Found openni: /usr/lib/libOpenNI.so
-- Found libusb-1.0: /usr/include
-- Found qhull: /usr/lib/libqhull.so
-- looking for PCL_COMMON
-- Found PCL_COMMON: /opt/ros/groovy/lib/libpcl_common.so
-- looking for PCL_KDTREE
-- Found PCL_KDTREE: /opt/ros/groovy/lib/libpcl_kdtree.so
-- looking for PCL_OCTREE
-- Found PCL_OCTREE: /opt/ros/groovy/lib/libpcl_octree.so
-- looking for PCL_SEARCH
-- Found PCL_SEARCH: /opt/ros/groovy/lib/libpcl_search.so
-- looking for PCL_SAMPLE_CONSENSUS
-- Found PCL_SAMPLE_CONSENSUS: /opt/ros/groovy/lib/libpcl_sample_consensus.so
-- looking for PCL_IO
-- Found PCL_IO: /opt/ros/groovy/lib/libpcl_io.so
-- looking for PCL_GEOMETRY
-- Found PCL_GEOMETRY: /opt/ros/groovy/include/pcl-1.6
-- looking for PCL_FEATURES
-- Found PCL_FEATURES: /opt/ros/groovy/lib/libpcl_features.so
-- looking for PCL_FILTERS

.
.
.
-- Configuring done
-- Generating done
-- Build files have been written to: /ruta/construcion


Luego para compilar el archivo debemos de ejecutar el siguiente comando en la consola:

$make

donde nos deberá aparecer los errores si los tenemos y por tanto no se producirá el ejecutable, o si toda esta correcto, nos deberá de aparecer las siguientes lineas:

Scanning dependencies of target codigo
[100%] Building CXX object CMakeFiles/cubo.dir/codigo.cpp.o
Linking CXX executable codigo
[100%] Built target codigo


Finalmente para poder utilizar el  proyecto que hemos compilado debemos ejecutar de la siguiente  manera:

$./codigo

Luego procederá según hayamos escrito el código.

Para el caso de window no procedemos por consola, por que tenemos que indicar donde y que archivos vamos a introducir, teniendo en cuenta que debemos introducir el archivo CMakeLists.txt como source code y en binary el código que tenemos en Visual Studio.




fuentes:
http://www.pointclouds.org/assets/images/contents/logos/pcl/pcl_horz_large_pos.png

No hay comentarios:

Publicar un comentario