Articulo de referencia

Biblioteca de nubes de puntos

{{cite web|last=B. Rusu|first=Radu|title=PointClouds.org: A new home for Point Cloud Library (PCL)|url=http://www.willowgarage.com/blog/2011/03/27/point-cloud-library-pcl-moved-...

La biblioteca Point Cloud Library ( PCL ) es una biblioteca de código abierto de algoritmos para tareas de procesamiento de nubes de puntos y procesamiento de geometría 3D, como las que se producen en la visión artificial tridimensional . La biblioteca contiene algoritmos para filtrado, estimación de características, reconstrucción de superficies, registro 3D , [ 5 ] ajuste de modelos , reconocimiento de objetos y segmentación . Cada módulo se implementa como una biblioteca más pequeña que se puede compilar por separado (por ejemplo, libpcl_filters, libpcl_features, libpcl_surface, ...). PCL tiene su propio formato de datos para almacenar nubes de puntos: PCD (Point Cloud Data), pero también permite cargar y guardar conjuntos de datos en muchos otros formatos. Está escrita en C++ y se publica bajo la licencia BSD .

Estos algoritmos se han utilizado, por ejemplo, para la percepción en robótica para filtrar valores atípicos de datos ruidosos, unir nubes de puntos 3D , segmentar partes relevantes de una escena, extraer puntos clave y calcular descriptores para reconocer objetos en el mundo en función de su apariencia geométrica, y crear superficies a partir de nubes de puntos y visualizarlas. [ 6 ]

PCL requiere varias bibliotecas de terceros para funcionar, las cuales deben instalarse. La mayoría de las operaciones matemáticas se implementan mediante la biblioteca Eigen . El módulo de visualización para nubes de puntos 3D se basa en VTK . Boost se utiliza para punteros compartidos y la biblioteca FLANN para la búsqueda rápida de k vecinos más cercanos. Otras bibliotecas, como Qhull, OpenNI o Qt, son opcionales y amplían PCL con funcionalidades adicionales.

PCL es un software multiplataforma que se ejecuta en los sistemas operativos más utilizados : Linux , Windows , macOS y Android . La biblioteca está totalmente integrada con el Robot Operating System (ROS) y proporciona soporte para las bibliotecas OpenMP e Intel Threading Building Blocks (TBB) para paralelismo multinúcleo . [ 7 ] [ 8 ]

La biblioteca se actualiza y amplía constantemente, y su uso en diversas industrias crece continuamente. Por ejemplo, PCL participó en la iniciativa Google Summer of Code 2020 con tres proyectos. Uno de ellos fue la extensión de PCL para su uso con Python mediante Pybind11. [ 9 ]

En el sitio web de PCL se encuentran disponibles numerosos ejemplos y tutoriales, ya sea como archivos fuente de C++ o como tutoriales con una descripción y explicación detallada de cada paso.

Aplicaciones

La biblioteca de nubes de puntos se utiliza ampliamente en muchos campos diferentes; aquí hay algunos ejemplos:

  • unir nubes de puntos 3D
  • reconocer objetos 3D por su apariencia geométrica
  • Filtrado y suavizado de datos ruidosos
  • crear superficies a partir de nubes de puntos
  • alinear un modelo de objeto capturado previamente con algunos datos capturados recientemente
  • Reconocimiento de clústeres y estimación de pose en 6 grados de libertad.
  • Transmisión de nube de puntos a dispositivos móviles con visualización en tiempo real.

Bibliotecas de terceros

PCL requiere para su instalación varias bibliotecas de terceros, que se enumeran a continuación. Algunas bibliotecas son opcionales y extienden PCL con características adicionales. La biblioteca PCL se compila con el sistema de compilación CMake ( http://www.cmake.org/ ) al menos en la versión 3.5.0. [ 10 ] [ 8 ]

Bibliotecas obligatorias:

  • Boost ( http://www.boost.org/ ) al menos la versión 1.46.1. Este conjunto de bibliotecas de C++ se utiliza para la programación multihilo y principalmente para punteros compartidos, por lo que no es necesario volver a copiar los datos que ya están en el sistema.
  • Eigen ( http://eigen.tuxfamily.org/ ) es necesario al menos en la versión 3.0.0. Es una biblioteca de plantillas de código abierto para álgebra lineal (matrices, vectores). La mayoría de las operaciones matemáticas ( optimizadas mediante SSE ) en PCL se implementan con Eigen.
  • FLANN ( http://www.cs.ubc.ca/research/flann/ ) en la versión 1.6.8 o superior. Es una biblioteca que realiza una búsqueda rápida y aproximada del vecino más cercano en espacios de alta dimensión. En PCL, es especialmente importante en el módulo kdtree para operaciones rápidas de búsqueda del k-vecino más cercano.
  • VTK - Visualization ToolKit ( http://www.vtk.org/ ), versión 5.6.1 como mínimo. Sistema de software multiplataforma para renderizado de nubes de puntos 3D, modelado, procesamiento de imágenes y renderizado volumétrico. Se utiliza en el módulo de visualización para el renderizado y la visualización de nubes de puntos.

Bibliotecas opcionales que permiten algunas funciones adicionales:

  • QHULL en su versión >= 2011.1 ( http://www.qhull.org/ ) implementa el cálculo de la envolvente convexa, la triangulación de Delaunay, el diagrama de Voronoi, etc. En PCL se utiliza para la descomposición de la envolvente convexa/cóncava en la superficie.
  • OpenNI en su versión >= 1.1.0.25 ( http://www.openni.org/ ) proporciona una interfaz unificada para sensores de profundidad. Se utiliza para recuperar nubes de puntos de los dispositivos.
  • Qt versión >= 4.6 ( https://www.qt.io/ ) es un framework C++ multiplataforma utilizado para desarrollar aplicaciones con una interfaz gráfica de usuario (GUI).
  • Googletest en versión >= 1.6.0 ( http://code.google.com/p/googletest/ ) es un framework de pruebas en C++. En PCL, se utiliza para crear unidades de prueba.

Formato de archivo PCD

El formato PCD ( Point Cloud Data ) es un formato de archivo para almacenar datos de nubes de puntos 3D. Se creó debido a que los formatos existentes no admitían algunas de las características que ofrece la biblioteca PCL. PCD es el formato de datos principal en PCL, pero la biblioteca también permite guardar y cargar datos en otros formatos (como PLY, IFS, VTK, STL, OBJ, X3D). Sin embargo, estos otros formatos no ofrecen la flexibilidad ni la velocidad de los archivos PCD. Una de las ventajas de PCD es la capacidad de almacenar y procesar conjuntos de datos de nubes de puntos organizados. Otra ventaja es la gran velocidad de guardado y carga de puntos almacenados en formato binario. [ 11 ] [ 12 ]

Versiones

La versión de PCD se especifica con los números 0.x (por ejemplo, 0.5, 0.6, etc.) en el encabezado de cada archivo. La versión oficial en 2020 es PCD 0.7 ( PCD_V7 ). La principal diferencia con respecto a la versión 0.6 es que se ha añadido un nuevo encabezado: VIEWPOINT. Este especifica la información sobre la orientación del sensor en relación con el conjunto de datos. [ 13 ]

Estructura de archivos

El archivo PCD se divide en dos partes: encabezado y datos . El encabezado tiene un formato definido con precisión y contiene la información necesaria sobre los datos de la nube de puntos almacenados en él. El encabezado debe estar codificado en ASCII; sin embargo, los datos pueden almacenarse en formato ASCII o binario. Gracias a que el formato ASCII es más legible, se puede abrir con herramientas de software estándar y editar fácilmente.

En la versión 0.7, la versión del archivo PCD se encuentra al principio del encabezado, seguida del nombre , el tamaño y el tipo de cada dimensión de los datos almacenados. También muestra el número de puntos ( alto * ancho ) en toda la nube e información sobre si el conjunto de datos de la nube de puntos está organizado o no. El tipo de datos especifica en qué formato se almacenan los datos de la nube de puntos (ASCII o binario). El encabezado va seguido de un conjunto de puntos. Cada punto puede almacenarse en una línea separada (nube de puntos no organizada) o en una estructura organizada similar a una imagen (nube de puntos organizada). [ 11 ] Puede encontrar información más detallada sobre las entradas del encabezado en la documentación . A continuación se muestra un ejemplo de un archivo PCD. ¡El orden de las entradas del encabezado es importante!

# .PCD v.7 - Formato de archivo de datos de nube de puntos VERSIÓN .7 CAMPOS xyz rgb TALLA 4 4 4 4 TIPO FFFF CONTEO 1 1 1 1 ANCHO 213 ALTURA 1 PUNTO DE VISTA 0 0 0 1 0 0 0 PUNTOS 213 DATOS ascii 0,93773 0,33763 0 4,2108e+06 0,90805 0,35641 0 4,2108e+06 0,81915 0,32 0 4,2108e+06 0,97192 0,278 0 4,2108e+06 ... ...

Historia

El desarrollo de la Biblioteca de Nubes de Puntos comenzó en marzo de 2010 en Willow Garage . El proyecto residía inicialmente en un subdominio de Willow Garage y luego se trasladó a un nuevo sitio web www.pointclouds.org en marzo de 2011. [ 1 ] La primera versión oficial de PCL (Versión 1.0) se publicó dos meses después, en mayo de 2011. [ 2 ]

Módulos

PCL se divide en varias bibliotecas de código más pequeñas que se pueden compilar por separado. Algunos de los módulos más importantes y sus funciones se describen a continuación. [ 14 ] [ 15 ]

Filtros

Al escanear una nube de puntos 3D, pueden producirse errores y diversas desviaciones que generan ruido en los datos. Esto dificulta la estimación de algunas características locales de la nube de puntos, como las normales de la superficie. Estas imprecisiones pueden provocar errores significativos en el procesamiento posterior, por lo que es recomendable eliminarlas con un filtro adecuado. La biblioteca pcl_filters proporciona varios filtros útiles para eliminar valores atípicos y ruido, así como para reducir el tamaño de los datos. Algunos utilizan criterios sencillos para recortar puntos, mientras que otros emplean análisis estadísticos.

  • Filtro PassThrough : se utiliza para filtrar puntos en una dimensión seleccionada. Esto significa que puede excluir los puntos que no se encuentran dentro del rango especificado por el usuario.
  • Filtro VoxelGrid : crea una cuadrícula de vóxeles en una nube de puntos. Los puntos dentro de cada vóxel se aproximan mediante su centroide. Esto conlleva un submuestreo (reducción del número de puntos) en los datos de la nube de puntos.
  • Filtro StatisticalOutlierRemoval : elimina el ruido de un conjunto de datos de nube de puntos mediante técnicas de análisis estadístico aplicadas al vecindario de cada punto y recorta todos los puntos cuyas distancias medias están fuera de un intervalo definido.
  • Filtro RadiusOutlierRemoval : elimina aquellos puntos que tienen menos del número de vecinos seleccionado en el vecindario definido.

Características

La biblioteca pcl_features contiene algoritmos y estructuras de datos para la estimación de características 3D . Las características geométricas locales más utilizadas son la normal del punto y la curvatura estimada de la superficie subyacente. Estas características describen patrones geométricos en un punto determinado, basándose en un vecindario k seleccionado (espacio de datos seleccionado alrededor del punto). El vecindario se puede seleccionar determinando un número fijo de puntos en el área más cercana o definiendo el radio de una esfera alrededor del punto.

Uno de los métodos más sencillos para estimar la normal de la superficie consiste en analizar los autovectores y autovalores de una matriz de covarianza creada a partir del entorno del punto. Los descriptores de histogramas de características de puntos (o FPFH, más rápido) constituyen una representación avanzada de características y dependen de estimaciones de la normal en cada punto. Generalizan la curvatura media alrededor del punto mediante un histograma multidimensional de valores. Otros descriptores de la biblioteca son el descriptor de histograma de características de punto de vista (VFH), los descriptores NARF, los descriptores basados ​​en el momento de inercia y la excentricidad, los descriptores de distribución espacial alineada globalmente (GASD), entre otros.

Segmentación

La biblioteca pcl_segmentation contiene algoritmos para segmentar una nube de puntos en diferentes clústeres. La agrupación se utiliza a menudo para dividir la nube en partes individuales que pueden procesarse posteriormente. Se han implementado varias clases que admiten diversos métodos de segmentación:

  • Segmentación de modelos planos : algoritmo simple que encuentra todos los puntos que soportan un modelo plano en la nube de puntos.
  • Agrupamiento euclidiano : crea grupos de puntos basados ​​en la distancia euclidiana.
  • Agrupamiento euclidiano condicional : agrupamiento de puntos basado en la distancia euclidiana y una condición definida por el usuario.
  • Segmentación por crecimiento de región : fusiona los puntos que están lo suficientemente cerca en términos de la restricción de suavidad.
  • Segmentación por crecimiento de región basada en color : mismo concepto que el crecimiento de región, pero utiliza color en lugar de normales.
  • Segmentación binaria basada en Min-Cut : divide la nube en conjuntos de puntos de primer plano y de fondo.
  • Segmentación basada en la diferencia de normales : segmentación basada en la escala, que encuentra puntos que pertenecen a los parámetros de escala dados.
  • Agrupamiento de supervóxeles : genera sobresegmentaciones volumétricas de datos de nube de puntos 3D.

Visualización

La biblioteca pcl_visualization se utiliza para visualizar de forma rápida y sencilla datos de nubes de puntos 3D. El paquete utiliza la biblioteca VTK para la representación 3D de nubes e imágenes de rango. La biblioteca ofrece:

  • La clase CloudViewer sirve para una visualización sencilla de nubes de puntos.
  • RangeImageVisualizer se puede utilizar para visualizar una imagen de rango como una nube de puntos 3D o como una imagen donde los colores corresponden a los valores del rango.
  • PCLVisualizer es una clase de visualización con diversas aplicaciones. Permite visualizar tanto nubes de puntos simples como nubes de puntos con datos de color. A diferencia de CloudViewer, también puede dibujar información relevante de la nube de puntos, como normales, curvaturas principales y geometrías. Puede mostrar varias nubes de puntos una al lado de la otra para compararlas fácilmente, o dibujar diversas formas primitivas (por ejemplo, cilindros, esferas, líneas, polígonos, etc.) a partir de conjuntos de puntos o de ecuaciones paramétricas.
  • La clase PCLPlotter se utiliza para crear gráficos fácilmente, desde funciones polinómicas hasta histogramas. Puede procesar diferentes tipos de datos de entrada (coordenadas, funciones) y realiza el coloreado automático.
  • PCLHistogramVisualizer es un módulo de visualización de histogramas para gráficos 2D.

Registro

El registro consiste en alinear diversos conjuntos de datos de nubes de puntos, obtenidos desde diferentes perspectivas, en un único modelo de nube de puntos. La biblioteca pcl_registration implementa varios algoritmos de registro de nubes de puntos para conjuntos de datos organizados y no organizados. La tarea consiste en identificar los puntos correspondientes entre los conjuntos de datos y encontrar una transformación que minimice su distancia.

El algoritmo iterativo de punto más cercano minimiza las distancias entre los puntos de dos nubes de puntos. Se puede utilizar para determinar si una nube de puntos es simplemente una transformación rígida de otra. La Transformación de Distribuciones Normales (NDT) es un algoritmo de registro que se puede utilizar para determinar una transformación rígida entre dos nubes de puntos que tienen más de 100 000 puntos.

Consenso de la muestra

La biblioteca sample_consensus contiene métodos de consenso de muestra (SAC), como RANSAC, y modelos para detectar objetos específicos en nubes de puntos. Algunos de los modelos implementados en esta biblioteca incluyen modelos de planos, que se utilizan a menudo para detectar superficies interiores como paredes y suelos. Otros modelos son líneas, círculos 2D y 3D en un plano, esfera, cilindro, cono, un modelo para determinar una línea paralela a un eje dado, un modelo para determinar un plano perpendicular a un eje especificado por el usuario, un plano paralelo a un eje especificado por el usuario, etc. Estos se pueden utilizar para detectar objetos con estructuras geométricas comunes (por ejemplo, ajustar un modelo de cilindro a una taza).

Estimadores de consenso de muestra robustos disponibles en la biblioteca:

  • SAC_RANSAC - Consenso de muestra aleatoria
  • SAC_LMEDS - Mínima mediana de cuadrados
  • SAC_MSAC - Consenso de muestra del estimador M
  • SAC_RRANSAC - RANSAC aleatorio
  • SAC_RMSAC - MSAC aleatorio
  • SAC_MLESAC - Consenso de muestra de estimación de máxima verosimilitud
  • SAC_PROSAC - Consenso de muestra progresivo

Superficie

La biblioteca pcl_surface implementa varios algoritmos para la reconstrucción de superficies a partir de nubes de puntos 3D . Existen diversas maneras de reconstruir la superficie. Una de las más utilizadas es el mallado, y la biblioteca PCL ofrece dos algoritmos: la triangulación ultrarrápida de los puntos originales y el mallado más lento, que además suaviza y rellena los huecos. Si la nube de puntos presenta ruido, se recomienda aplicar un suavizado de superficie mediante alguno de los algoritmos implementados.

El método de reconstrucción de superficies por mínimos cuadrados móviles (MLS, por sus siglas en inglés) es un algoritmo de remuestreo que permite reconstruir las partes faltantes de una superficie. Gracias a las interpolaciones polinómicas de orden superior entre los puntos de datos circundantes, MLS puede corregir y suavizar pequeños errores causados ​​por el escaneo.

La triangulación por proyección voraz implementa un algoritmo para la triangulación rápida de superficies en una nube de puntos no ordenada con normales. El resultado es una malla triangular que se crea proyectando el entorno local de un punto a lo largo de su normal. Funciona mejor si la superficie es localmente suave y existen transiciones suaves entre áreas con diferentes densidades de puntos. Se pueden configurar muchos parámetros que se tienen en cuenta al conectar los puntos (cuántos vecinos se buscan, la distancia máxima para un punto, el ángulo mínimo y máximo de un triángulo).

La biblioteca también implementa funciones para crear un polígono de envoltura cóncava o convexa para un modelo plano, algoritmo de reconstrucción de superficie por proyección de cuadrícula, cubos marchantes , algoritmo de triangulación de recorte de orejas , algoritmo de reconstrucción de superficie de Poisson , etc.

E/S

La biblioteca io_library permite cargar y guardar nubes de puntos en archivos, así como capturar nubes desde diversos dispositivos. Incluye funciones para concatenar los puntos de dos nubes de puntos diferentes con el mismo tipo y número de campos. La biblioteca también puede concatenar campos (por ejemplo, dimensiones) de dos nubes de puntos diferentes con el mismo número de puntos.

A partir de PCL 1.0, la biblioteca ofrece una nueva interfaz genérica de captura que facilita el acceso a diferentes dispositivos y formatos de archivo. Los primeros dispositivos compatibles para la recopilación de datos fueron cámaras compatibles con OpenNI (probadas con Primesense Reference Design , Microsoft Kinect y cámaras Asus Xtion Pro ). A partir de PCL 1.7 , también se pueden obtener datos de nube de puntos del sistema Velodyne High Definition LiDAR (HDL), que produce nubes de puntos de 360 ​​grados. PCL es compatible con los formatos originales HDL-64e y HDL-32e . También hay un nuevo controlador para cámaras Dinast (probado con IPA-1110 , Cyclopes II e IPA-1002 ng T-Less NG ). PCL 1.8 incorpora compatibilidad con cámaras IDS-Imaging Ensenso , cámaras DepthSense (por ejemplo, Creative Senz3D , DepthSense DS325 ) y escáneres davidSDK .

Árbol Kd

La biblioteca pcl_kdtree proporciona la estructura de datos kd-tree para organizar un conjunto de puntos en un espacio de k dimensiones. Se utiliza para encontrar los K vecinos más cercanos (mediante FLANN) de un punto o ubicación específicos.

Octree

La biblioteca pcl_octree implementa la estructura de datos jerárquica de árbol octree para datos de nubes de puntos. Proporciona algoritmos de búsqueda de vecinos más cercanos, como "Búsqueda de vecinos dentro de vóxel", "Búsqueda de K vecinos más cercanos" y "Búsqueda de vecinos dentro de radio". Existen varios tipos de octree que se diferencian por las propiedades de sus nodos hoja. Cada nodo hoja puede contener un único punto, una lista de índices de puntos o no almacenar información de puntos. La biblioteca también se puede utilizar para detectar cambios espaciales entre múltiples nubes de puntos no organizadas mediante la comparación recursiva de estructuras de árbol de octetos.

La biblioteca pcl_search implementa métodos para buscar vecinos más cercanos utilizando diferentes estructuras de datos, que se pueden encontrar en otros módulos, como KdTree, Octree o búsquedas especializadas para conjuntos de datos organizados.

Imagen de rango

La biblioteca range_image contiene dos clases para representar y trabajar con imágenes de rango cuyos valores de píxeles representan una distancia desde el sensor. La imagen de rango se puede convertir en una nube de puntos si se especifica la posición del sensor o si se pueden extraer sus bordes.

Puntos clave

La biblioteca pcl_keypoints contiene implementaciones de algoritmos de detección de puntos clave en nubes de puntos (detector de puntos de esquina AGAST, detector Harris , detector BRISK, etc.).

Común

La biblioteca pcl_common contiene las estructuras de datos principales para nubes de puntos, tipos para la representación de puntos, normales de superficie, valores de color RGB, etc. También incluye métodos útiles para calcular distancias, valores medios y covarianza, transformaciones geométricas y más. Esta biblioteca común es utilizada principalmente por otros módulos PCL.

Referencias

  1. 1 2 B. Rusu, Radu (28 de marzo de 2011). "PointClouds.org: Un nuevo hogar para Point Cloud Library (PCL)" . Willow Garage. Archivado del original el 20 de mayo de 2013. Recuperado el 26 de noviembre de 2012 .
  2. 1 2 "¡PCL 1.0!" . PCL. 12 de mayo de 2011. Archivado del original el 6 de enero de 2020. Recuperado el 24 de mayo de 2013 .
  3. "Versión 1.15.1" . Consultado el 27 de agosto de 2025 .
  4. "Versiones · PointCloudLibrary/PCL" . GitHub .
  5. Holz, Dirk; Ichim, Alexandru E.; Tombari, Federico; Rusu, Radu B.; Behnke, Sven (2015). "Registro con la biblioteca de nube de puntos: un marco modular para la alineación en 3-D" . IEEE Robotics & Automation Magazine . 22 (4): 110– 124. Bibcode : 2015IRAM...22d.110H . doi : 10.1109/MRA.2015.2432331 . S2CID 2621807 . 
  6. Sistema Operativo para Robots: http://www.ros.org/wiki Archivado el 23/11/2017 en Wayback Machine
  7. Hsieh, C. (2012). "Un desarrollo eficiente del registro de superficies 3D mediante la biblioteca de nubes de puntos (PCL)". Simposio Internacional de 2012 sobre Procesamiento Inteligente de Señales y Sistemas de Comunicación . págs. 729–734 . doi : 10.1109/ISPACS.2012.6473587 . ISBN  978-1-4673-5082-2. S2CID 5449026 . 
  8. 1 2 Rusu, RB; Cousins, S. (2011). "El 3D ya está aquí: Biblioteca de Nubes de Puntos (PCL)". 2011 IEEE International Conference on Robotics and Automation . pp. 1–4 . doi : 10.1109/ICRA.2011.5980567 . ISBN  978-1-61284-386-5. S2CID 206849822 . 
  9. "Google Summer of Code 2020" . Point Cloud Library . Consultado el 09/11/2020 .
  10. "Compilación de las dependencias de PCL desde el código fuente en Windows — Documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Archivado del original el 7 de mayo de 2021. Consultado el 2 de noviembre de 2020 .
  11. 1 2 "El formato de archivo PCD (Datos de Nube de Puntos) — Documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Consultado el 2 de noviembre de 2020 .
  12. "Formato de archivo PCD (Datos de Nube de Puntos) — Documentación de la Biblioteca de Nube de Puntos 0.0" .
  13. "Biblioteca de nubes de puntos (PCL): Referencia de la clase pcl::PCDReader" . pointclouds.org . Archivado del original el 7 de mayo de 2021. Consultado el 2 de noviembre de 2020 .
  14. "PCL Walkthrough — Documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Archivado del original el 22/03/2021 . Consultado el 03/11/2020 .
  15. "Introducción — Documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Archivado del original el 22/03/2021 . Consultado el 04/11/2020 .
  • Biblioteca de nubes de puntos
  • Usuarios de la Biblioteca de Nubes de Puntos (PCL)
  • Repositorio de GitHub
  • Tutoriales