La biblioteca de nubes de puntos ( PCL ) es una biblioteca de algoritmos de código abierto para tareas de procesamiento de nubes de puntos y procesamiento de geometría 3D , como ocurre en la visión por computadora tridimensional . La biblioteca contiene algoritmos para filtrado, estimación de características, reconstrucción de superficies, registro 3D , [4] 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á escrito en C ++ y publicado bajo la licencia BSD .
![]() | |
Autor (es) original (es) | Willow Garage |
---|---|
Versión inicial | Marzo de 2010 [1] [2] |
Lanzamiento estable | 1.11.1 / 14 de agosto de 2020 [3] |
Repositorio | ![]() |
Sistema operativo | Multiplataforma |
Tipo | Biblioteca |
Licencia | Licencia BSD |
Sitio web | nubes de puntos |
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. [5] [ verificación fallida ]
PCL requiere varias bibliotecas de terceros para funcionar, que deben estar instaladas. La mayoría de las operaciones matemáticas se implementan utilizando 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 una búsqueda rápida del vecino más cercano. Las bibliotecas adicionales como QHULL , OpenNI o Qt son opcionales y amplían PCL con funciones adicionales.
PCL es un software multiplataforma que se ejecuta en los sistemas operativos más utilizados : Linux , Windows , macOS y Android . La biblioteca está completamente integrada con el sistema operativo del robot (ROS) y proporciona soporte para bibliotecas OpenMP e Intel Threading Building Blocks (TBB) para el paralelismo de múltiples núcleos . [6] [7]
La biblioteca se actualiza y amplía constantemente, y su uso en diversas industrias está en constante crecimiento. Por ejemplo, PCL participó en la iniciativa Google Summer of Code 2020 con tres proyectos. Una fue la extensión de PCL para usar con Python usando Pybind11. [8]
Hay una gran cantidad de ejemplos y tutoriales disponibles en el sitio web de PCL, ya sea como archivos fuente de C ++ o como tutoriales con una descripción detallada y una explicación de los pasos individuales.
Aplicaciones
La biblioteca de nubes de puntos se usa ampliamente en muchos campos diferentes, aquí hay algunos ejemplos:
- uniendo nubes de puntos 3D juntas
- reconocer objetos 3D en su apariencia geométrica
- filtrar y suavizar datos ruidosos
- crear superficies a partir de nubes de puntos
- alinear un modelo capturado previamente de un objeto con algunos datos recién capturados
- reconocimiento de clústeres y estimación de pose 6DOF
- 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 amplían PCL con funciones adicionales. La biblioteca PCL está construida con el sistema de compilación CMake ( http://www.cmake.org/ ) al menos en la versión 3.5.0. [9] [7]
Bibliotecas obligatorias:
- Boost ( http://www.boost.org/ ) al menos la versión 1.46.1. Este conjunto de bibliotecas de C ++ se utiliza para subprocesos y principalmente para punteros compartidos, por lo que no es necesario volver a copiar los datos que ya están en el sistema.
- Se requiere Eigen ( http://eigen.tuxfamily.org/ ) 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 ( SSE optimizadas) 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 aproximada del vecino más cercano en espacios de gran dimensión. En PCL, es especialmente importante en el módulo kdtree para operaciones rápidas de búsqueda del vecino más cercano k.
- VTK - Visualization ToolKit ( http://www.vtk.org/ ) al menos la versión 5.6.1. Sistema de software multiplataforma para renderizado de nubes de puntos 3D, modelado, procesamiento de imágenes, renderizado de volumen. Se utiliza en el módulo de visualización para la representación y visualización de nubes de puntos.
Bibliotecas opcionales que habilitan algunas características adicionales:
- QHULL en la versión> = 2011.1 ( http://www.qhull.org/ ) implementa el cálculo del casco convexo, triangulación de Delaunay, diagrama de Voronoi, etc. En PCL se utiliza para la descomposición del casco convexo / cóncavo en la superficie.
- OpenNI en la versión> = 1.1.0.25 ( http://www.openni.org/ ) proporciona una única interfaz unificada para los sensores de profundidad. Se utiliza para recuperar nubes de puntos de dispositivos.
- La versión Qt > = 4.6 ( https://www.qt.io/ ) es un marco C ++ multiplataforma que se utiliza para desarrollar aplicaciones con una interfaz gráfica de usuario (GUI).
- Googletest en la versión> = 1.6.0 ( http://code.google.com/p/googletest/ ) es un marco de prueba de C ++. En PCL, se usa para construir unidades de prueba.
Formato de archivo PCD
El PCD ( datos de nubes de puntos ) es un formato de archivo para almacenar datos de nubes de puntos en 3D. Se creó porque los formatos existentes no admitían algunas de las funciones proporcionadas por la biblioteca PCL. PCD es el formato de datos principal en PCL, pero la biblioteca también ofrece la capacidad de guardar y cargar datos en otros formatos (como PLY, IFS, VTK, STL, OBJ, X3D). Sin embargo, estos otros formatos no tienen la flexibilidad y la velocidad de los archivos PCD. Una de las ventajas de PCD es la capacidad de almacenar y procesar conjuntos de datos organizados de nubes de puntos. Otro es el almacenamiento y la carga muy rápidos de puntos que se almacenan en forma binaria. [10] [11]
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 en comparación con la versión 0.6 es que se ha agregado un nuevo encabezado: VIEWPOINT. Especifica la información sobre la orientación del sensor en relación con el conjunto de datos. [12]
Estructura de archivo
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 que se almacenan en él. El encabezado debe estar codificado en ASCII, sin embargo, los datos se pueden almacenar en formato ASCII o binario. Gracias al hecho de que el formato ASCII es más legible por humanos, puede abrirse en herramientas de software estándar y editarse fácilmente.
En la versión 0.7, la versión del archivo PCD se encuentra al principio del encabezado, seguida del nombre , tamaño y tipo de cada dimensión de los datos almacenados. También muestra una cantidad 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 desorganizado. 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 una serie de puntos. Cada punto se puede almacenar en una línea separada (nube de puntos no organizada) o se almacenan en una estructura organizada similar a una imagen (nube de puntos organizada). [10] Puede encontrar información más detallada sobre las entradas de 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 puntosVERSIÓN .7CAMPOS xyz rgbTAMAÑO 4 4 4 4TIPO FFFFCONTAR 1 1 1 1ANCHO 213ALTURA 1PUNTO DE VISTA 0 0 0 1 0 0 0PUNTOS 213DATOS ascii0,93773 0,33763 0 4,2108e + 060,90805 0,35641 0 4,2108e + 060,81915 0,32 0 4,2108e + 060,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] El primer lanzamiento 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ódigos 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. [13] [14]
Filtros
Al escanear una nube de puntos 3D, pueden producirse errores y diversas desviaciones, lo que provoca ruido en los datos. Esto complica la estimación de algunas características de las nubes de puntos locales, como las normales de superficie. Estas inexactitudes pueden dar lugar a errores importantes en el procesamiento posterior y, por lo tanto, es aconsejable eliminarlas con un filtro adecuado. La biblioteca pcl_filters proporciona varios filtros útiles para eliminar valores atípicos y ruido y también para reducir el muestreo de los datos. Algunos de ellos usan criterios simples para recortar puntos, otros usan análisis estadístico.
- Filtro PassThrough : se utiliza para filtrar puntos en una dimensión seleccionada. Esto significa que puede cortar puntos que no estén 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 luego por su centroide. Esto conduce a una disminución de la resolución (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 a la vecindad de cada punto y recorta todos los puntos cuyas distancias medias están fuera de un intervalo definido.
- Filtro RadiusOutlierRemoval : elimina los puntos que tienen menos del número seleccionado de vecinos en la vecindad definida.
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 el punto normal y la curvatura estimada de la superficie subyacente. Las características describen patrones geométricos en un punto determinado en función de la vecindad k seleccionada (espacio de datos seleccionado alrededor del punto). La vecindad 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 implementados más fáciles para estimar la superficie normal es un análisis de los autovectores y autovalores de una matriz de covarianza creada a partir de la vecindad del punto. Los descriptores de histogramas de características puntuales (o FPFH más rápido) son una representación de características avanzadas y dependen de estimaciones normales en cada punto. Generaliza la curvatura media alrededor del punto utilizando un histograma multidimensional de valores. Algunos de los otros descriptores de la biblioteca son el descriptor del histograma de características del 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) y más.
Segmentación
La biblioteca pcl_segmentation contiene algoritmos para segmentar una nube de puntos en diferentes grupos. La agrupación en clústeres se utiliza a menudo para dividir la nube en partes individuales, que pueden procesarse más. Se implementan varias clases, que admiten varios métodos de segmentación:
- Segmentación del modelo plano : algoritmo simple que encuentra todos los puntos que admiten un modelo plano en la nube de puntos.
- Agrupación euclidiana : crea grupos de puntos basados en la distancia euclidiana.
- Agrupación euclidiana condicional : agrupación de puntos según la distancia euclidiana y una condición definida por el usuario
- Segmentación creciente de la región : combine los puntos que están lo suficientemente cerca en términos de la restricción de suavidad
- Segmentación de crecimiento de región basada en color : el mismo concepto que el de crecimiento de región, pero usa 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
- Diferencia de segmentación basada en normales: segmentación basada en escala, búsqueda de puntos que pertenecen a los parámetros de escala dados
- Agrupación de supervoxel : genera sobresegmentaciones volumétricas de datos de nubes de puntos 3D
Visualización
La biblioteca pcl_visualization se utiliza para visualizar rápida y fácilmente datos de nubes de puntos 3D. El paquete hace uso de la biblioteca VTK para la representación 3D de nubes e imágenes de rango. La biblioteca ofrece:
- La clase CloudViewer es para una visualización simple de la nube 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 valores de rango.
- PCLVisualizer es una clase de visualización con varias aplicaciones. Puede mostrar tanto la nube de puntos simple como la nube de puntos que contiene datos de color. A diferencia de CloudViewer, también puede extraer información interesante de la nube de puntos, como normales, curvaturas principales y geometrías. Puede mostrar múltiples nubes de puntos una al lado de la otra para poder compararlas fácilmente o dibujar varias 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 trazar gráficos fácilmente, desde funciones polinomiales hasta histogramas. Puede procesar diferentes tipos de entrada de gráficos (coordenadas, funciones) y colorea automáticamente.
- PCLHistogramVisualizer es un módulo de visualización de histogramas para gráficos 2D.
Registro
El registro es el problema de alinear varios conjuntos de datos de nubes de puntos adquiridos de diferentes vistas en un solo 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 es identificar los puntos correspondientes entre los conjuntos de datos y encontrar una transformación que minimice su distancia.
El algoritmo iterativo del 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 solo una transformación rígida de otra. La transformación de distribución normal (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 muestra
La biblioteca sample_consensus contiene métodos SAmple Consensus (SAC) como RANSAC y modelos para detectar objetos específicos en nubes de puntos. Algunos de los modelos implementados en esta biblioteca incluyen modelos planos que se utilizan a menudo para detectar superficies interiores como paredes y suelos. Los siguientes modelos son las 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. 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 que están disponibles en la biblioteca:
- SAC_RANSAC - Consenso de muestra de RANdom
- SAC_LMEDS - Mediana mínima de cuadrados
- SAC_MSAC - Ejemplo de consenso de estimador M
- SAC_RRANSAC - RANSAC aleatorizado
- SAC_RMSAC - MSAC aleatorizado
- SAC_MLESAC - Ejemplo de consenso de estimación de likeLihood máximo
- SAC_PROSAC - Ejemplo de consenso progresivo
Superficie
En la biblioteca pcl_surface se implementan varios algoritmos para la reconstrucción de superficies de nubes de puntos 3D . Hay varias formas de reconstruir la superficie. Uno de los más utilizados es el mallado, y la biblioteca PCL tiene dos algoritmos: triangulación muy rápida de puntos originales y redes más lentas, que también suavizan y rellenan huecos. Si la nube es ruidosa, es recomendable utilizar el suavizado de superficies mediante uno de los algoritmos implementados.
El método de reconstrucción de superficies Moving Least Squares (MLS) es un algoritmo de remuestreo que puede reconstruir las partes faltantes de una superficie. Gracias a las interpolaciones polinomiales de orden superior entre los puntos de datos circundantes, MLS puede corregir y suavizar los pequeños errores causados por el escaneo.
La triangulación de proyección codiciosa implementa un algoritmo para la triangulación de superficie rápida en una nube de puntos desordenada con normales. El resultado es una malla triangular que se crea proyectando la vecindad local de un punto a lo largo de la normal del punto. Funciona mejor si la superficie es localmente lisa y hay transiciones suaves entre áreas con diferentes densidades de puntos. Se pueden configurar muchos parámetros que se tienen en cuenta al conectar puntos (cuántos vecinos se buscan, la distancia máxima para un punto, ángulo mínimo y máximo de un triángulo).
La biblioteca también implementa funciones para crear un polígono de casco cóncavo o convexo para un modelo plano, algoritmo de reconstrucción de superficie de proyección de cuadrícula, cubos de marcha , algoritmo de triangulación de recorte de orejas , algoritmo de reconstrucción de superficie de Poisson , etc.
E / S
El io_library le permite cargar y guardar archivos a nubes de puntos, así como nubes de captura de varios dispositivos. Incluye funciones que le permiten 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 de captura genérica que proporciona un fácil acceso a diferentes dispositivos y formatos de archivo. Los primeros dispositivos compatibles para la recolección de datos fueron OpenNI cámaras compatibles (probado con Diseño PrimeSense de referencia , Microsoft Kinect y Asus Xtion cámaras Pro ). A partir de PCL 1.7 , los datos de nubes de puntos también se pueden obtener del sistema Velodyne High Definition LiDAR (HDL), que produce nubes de puntos de 360 grados. PCL admite tanto el HDL-64e original como el HDL-32e . También hay un nuevo controlador para las cámaras Dinast (probado con IPA-1110 , Cyclopes II e IPA-1002 ng T-Less NG ). PCL 1.8 ofrece soporte para cámaras IDS-Imaging Ensenso , cámaras DepthSense (por ejemplo, Creative Senz3D , DepthSense DS325 ) y escáneres davidSDK .
KdTree
La biblioteca pcl_kdtree proporciona la estructura de datos kd-tree para organizar un conjunto de puntos en un espacio con k dimensiones. Se utiliza para encontrar los K vecinos más cercanos (usando FLANN) de un punto o ubicación específicos.
Octree
La biblioteca pcl_octree implementa la estructura de datos de árbol jerárquico de octárbol para los datos de la nube de puntos. La biblioteca proporciona algoritmos de búsqueda de vecinos más cercanos, como "Vecinos dentro de la búsqueda de voxel", "K Búsqueda de vecinos más cercanos" y "Vecinos dentro de la búsqueda de radio". También hay varios tipos de octárbol que se diferencian por las propiedades de su nodo hoja. Cada nodo hoja puede contener un solo punto o una lista de índices de puntos, o no almacena ninguna información de puntos. La biblioteca también se puede utilizar para la detección de cambios espaciales entre múltiples nubes de puntos no organizadas mediante la comparación recursiva de estructuras de árbol de octetos.
Buscar
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úsqueda especializada 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 se pueden extraer los bordes de ella.
Puntos clave
La biblioteca pcl_keypoints contiene implementaciones de algoritmos de detección de puntos clave de nube de puntos (detector de punto de esquina AGAST, detector de Harris , detector de BRISK, etc.).
Común
La biblioteca pcl_common contiene las estructuras de datos centrales para la nube de puntos, tipos para la representación de puntos, normales de superficie, valores de color RGB, etc. También se implementan métodos útiles para calcular distancias, valores medios y covarianza, transformaciones geométricas y más. La biblioteca común la utilizan principalmente otros módulos PCL.
Referencias
- ↑ a b B. Rusu, Radu (28 de marzo de 2011). "PointClouds.org: un nuevo hogar para Point Cloud Library (PCL)" . Willow Garage . Consultado el 26 de noviembre de 2012 .
- ^ a b "¡PCL 1.0!" . PCL. 12 de mayo de 2011 . Consultado el 24 de mayo de 2013 .Archivado el 6 de enero de 2020 en la Wayback Machine.
- ^ https://github.com/PointCloudLibrary/pcl/releases
- ^ Holz, Dirk; Ichim, Alexandru E .; Tombari, Federico; Rusu, Radu B .; Behnke, Sven (2015). "Registro con la biblioteca de nubes de puntos: un marco modular para alinear en 3-D" . Revista IEEE Robotics Automation . 22 (4): 110-124. doi : 10.1109 / MRA.2015.2432331 . S2CID 2621807 .
- ^ Sistema operativo del robot: http://www.ros.org/wiki
- ^ Hsieh, C. (2012). "Un desarrollo eficiente del registro de superficies 3D por Point Cloud Library (PCL)" . Simposio internacional de 2012 sobre procesamiento inteligente de señales y sistemas de comunicaciones : 729–734. doi : 10.1109 / ISPACS.2012.6473587 . ISBN 978-1-4673-5082-2. S2CID 5449026 .
- ^ a b Rusu, RB; Primos, S. (2011). "3D está aquí: Point Cloud Library (PCL)" . Conferencia Internacional IEEE 2011 sobre Robótica y Automatización : 1–4. doi : 10.1109 / ICRA.2011.5980567 . ISBN 978-1-61284-386-5. S2CID 206849822 .
- ^ "Verano de código de Google 2020" . Biblioteca de nubes de puntos . Consultado el 9 de noviembre de 2020 .
- ^ "Construyendo las dependencias de PCL desde la fuente en Windows - Documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Consultado el 2 de noviembre de 2020 .
- ^ a b "El formato de archivo PCD (Point Cloud Data) - documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Consultado el 2 de noviembre de 2020 .
- ^ https://pcl.readthedocs.io/projects/tutorials/en/latest/pcd_file_format.html
- ^ "Biblioteca de nube de puntos (PCL): pcl :: Referencia de clase PCDReader" . pointclouds.org . Consultado el 2 de noviembre de 2020 .
- ^ "Tutorial de PCL - documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Consultado el 3 de noviembre de 2020 .
- ^ "Introducción - documentación de Point Cloud Library 0.0" . pcl.readthedocs.io . Consultado el 4 de noviembre de 2020 .
enlaces externos
- Biblioteca de nubes de puntos
- Usuarios de la biblioteca de nubes de puntos (PCL)
- Desarrolladores de la biblioteca de nubes de puntos (PCL)
- Repositorio de GitHub
- Tutoriales