포인트 클라우드 라이브러리

**포인트 클라우드 라이브러리**(Point Cloud Library, **PCL**)는 점구름 처리 작업과 3차원 컴퓨터 비전에서 사용되는 3D 기하 처리를 위한 오픈 소스 라이브러리이다. 이 라이브러리에는 필터링, 특징 추정, 표면 재구성, 3D 정합, 모델 피팅, 객체 인식, 분할을 위한 알고리즘이 포함되어 있다. 각 모듈은 개별적으로 컴파일할 수 있는 작은 라이브러리(예: libpcl_filters, libpcl_features, libpcl_surface, ...)로 구현된다. PCL은 점구름 저장을 위한 자체 데이터 형식인 **PCD**(Point Cloud Data)를 가지고 있지만, 다른 여러 형식으로 데이터 세트를 로드하고 저장할 수도 있다. C++로 작성되었으며 BSD 라이선스로 배포된다.

이 알고리즘들은 예를 들어, 로봇공학에서 지각을 위해 잡음이 있는 데이터에서 이상치를 필터링하고, 3D 점구름을 함께 꿰매고, 장면의 관련 부분을 분할하며, 키포인트를 추출하고 기하학적 모양을 기반으로 세계의 객체를 인식하기 위한 디스크립터를 계산하며, 점구름에서 표면을 생성하고 시각화하는 데 사용되었다.

PCL이 작동하려면 여러 타사 라이브러리를 설치해야 한다. 대부분의 수학적 연산은 Eigen 라이브러리를 사용하여 구현된다. 3D 점구름을 위한 시각화 모듈은 VTK를 기반으로 한다. Boost는 공유 포인터에 사용되며 FLANN 라이브러리는 빠른 k-최근접 이웃 검색에 사용된다. Qhull, OpenNI, Qt와 같은 추가 라이브러리는 선택 사항이며 PCL에 추가 기능을 확장한다.

PCL은 가장 일반적으로 사용되는 운영체제인 리눅스, 마이크로소프트 윈도우, macOS 및 안드로이드에서 실행되는 크로스 플랫폼 소프트웨어이다. 이 라이브러리는 로봇 운영체제 (ROS)와 완전히 통합되어 있으며, 멀티코어 병렬 컴퓨팅을 위한 OpenMP 및 인텔 스레딩 빌딩 블록 (TBB) 라이브러리를 지원한다.

이 라이브러리는 지속적으로 업데이트되고 확장되며, 다양한 산업 분야에서 그 활용이 끊임없이 증가하고 있다. 예를 들어, PCL은 세 가지 프로젝트로 구글 서머 오브 코드 2020 이니셔티브에 참여했다. 그 중 하나는 Pybind11을 사용하여 파이썬과 함께 PCL을 확장하는 것이었다.

PCL 웹사이트에는 C++ 소스 파일 또는 개별 단계에 대한 자세한 설명과 해설이 있는 튜토리얼 형태로 많은 예제와 튜토리얼이 제공된다.

## 응용 프로그램
포인트 클라우드 라이브러리는 다양한 분야에서 널리 사용된다. 몇 가지 예시는 다음과 같다.

* 3D 점구름을 함께 꿰매기
* 기하학적 모양으로 3D 객체 인식
* 잡음이 있는 데이터 필터링 및 평활화
* 점구름에서 표면 생성
* 이전에 캡처된 객체 모델을 새로 캡처된 데이터에 정렬
* 클러스터 인식 및 6DoF 자세 추정
* 실시간 시각화와 함께 모바일 장치로 점구름 스트리밍

## 타사 라이브러리
PCL을 설치하려면 아래에 나열된 여러 타사 라이브러리가 필요하다. 일부 라이브러리는 선택 사항이며 PCL에 추가 기능을 확장한다. PCL 라이브러리는 최소 3.5.0 버전의 CMake 빌드 시스템(http://www.cmake.org/)으로 빌드된다.

필수 라이브러리:

* **[[Boost (C++ 라이브러리)|Boost]]** (http://www.boost.org/) 최소 1.46.1 버전. 이 C++ 라이브러리 세트는 스레딩 및 주로 공유 포인터에 사용되므로 시스템에 이미 있는 데이터를 다시 복사할 필요가 없다.
* **[[Eigen (C++ 라이브러리)|Eigen]]** (http://eigen.tuxfamily.org/) 최소 3.0.0 버전이 필요하다. 선형대수(행렬, 벡터)를 위한 오픈 소스 템플릿 라이브러리이다. PCL의 대부분의 수학적 연산(SSE 최적화)은 Eigen으로 구현된다.
* **FLANN** (http://www.cs.ubc.ca/research/flann/) 1.6.8 이상 버전. 고차원 공간에서 빠른 근사 최근접 이웃 검색을 수행하는 라이브러리이다. PCL에서는 빠른 k-최근접 이웃 검색 연산을 위해 kdtree 모듈에서 특히 중요하다.
* **[[VTK|VTK - Visualization ToolKit]]** (http://www.vtk.org/) 최소 5.6.1 버전. 3D 점구름 렌더링, 모델링, 이미지 처리, 볼륨 렌더링을 위한 다중 플랫폼 소프트웨어 시스템. 점구름 렌더링 및 시각화를 위한 시각화 모듈에 사용된다.

일부 추가 기능을 활성화하는 선택적 라이브러리:

* **QHULL** 버전 >= 2011.1 (http://www.qhull.org/)은 볼록 껍질, 델로네 삼각 분할, 보로노이 다이어그램 등의 계산을 구현한다. PCL에서는 표면의 볼록/오목 껍질 분해에 사용된다.
* **[[OpenNI]]** 버전 >= 1.1.0.25 (http://www.openni.org/)는 깊이 센서에 대한 단일 통합 인터페이스를 제공한다. 장치에서 점구름을 검색하는 데 사용된다.
* **[[Qt (소프트웨어)|Qt]]** 버전 >= 4.6 (https://www.qt.io/)은 그래픽 사용자 인터페이스(GUI)를 갖춘 애플리케이션 개발에 사용되는 크로스 플랫폼 C++ 프레임워크이다.
* **[[구글 테스트|Googletest]]** 버전 >= 1.6.0 (http://code.google.com/p/googletest/)은 C++ 테스트 프레임워크이다. PCL에서는 테스트 단위를 빌드하는 데 사용된다.

## PCD 파일 형식
**PCD** (**Point Cloud Data**)는 3D 점구름 데이터를 저장하기 위한 파일 형식이다. 기존 형식으로는 PCL 라이브러리가 제공하는 일부 기능을 지원할 수 없었기 때문에 만들어졌다. PCD는 PCL의 기본 데이터 형식으로, 라이브러리는 다른 형식(예: PLY, IFS, VTK, STL, OBJ, X3D)으로 데이터를 저장하고 로드하는 기능도 제공한다. 그러나 이러한 다른 형식은 PCD 파일의 유연성과 속도를 가지고 있지 않다. PCD의 장점 중 하나는 정렬된 점구름 데이터 세트를 저장하고 처리할 수 있다는 것이다. 또 다른 장점은 이진 형태로 저장된 점들을 매우 빠르게 저장하고 로드할 수 있다는 것이다.

### 버전
PCD 버전은 각 파일 헤더에 0.x(예: 0.5, 0.6 등) 숫자로 지정된다. 2020년 공식 버전은 PCD **0.7** (**PCD_V7**)이다. 0.6 버전과 비교하여 주요 차이점은 새로운 헤더인 VIEWPOINT가 추가되었다는 것이다. 이는 데이터 세트와 관련된 센서의 방향에 대한 정보를 지정한다.

### 파일 구조
PCD 파일은 **헤더**와 **데이터**의 두 부분으로 나뉜다. 헤더는 정확하게 정의된 형식을 가지며 그 안에 저장된 점구름 데이터에 대한 필요한 정보를 포함한다. 헤더는 ASCII로 인코딩되어야 하지만, 데이터는 ASCII 또는 이진 형식으로 저장될 수 있다. ASCII 형식은 사람이 읽기 쉽다는 장점 덕분에 표준 소프트웨어 도구에서 열어 쉽게 편집할 수 있다.

버전 0.7에서는 PCD 파일 버전이 헤더의 시작 부분에 있으며, 그 다음에는 저장된 데이터의 각 차원의 이름, 크기 및 유형이 온다. 또한 전체 클라우드의 점 수(높이*너비)와 점구름 데이터 세트가 조직화되었는지 비조직화되었는지에 대한 정보도 표시된다. 데이터 유형은 점구름 데이터가 어떤 형식(ASCII 또는 이진)으로 저장되는지 지정한다. 헤더 다음에는 점 집합이 온다. 각 점은 별도의 줄에 저장되거나(비조직화된 점구름) 이미지와 같은 조직화된 구조로 저장된다(조직화된 점구름). 헤더 항목에 대한 자세한 정보는 문서에서 찾을 수 있다. 아래는 PCD 파일의 예시이며 헤더 항목의 순서가 중요하다.
 # .PCD v.7 - Point Cloud Data file format
 VERSION .7
 FIELDS x y z rgb
 SIZE 4 4 4 4
 TYPE F F F F
 COUNT 1 1 1 1
 WIDTH 213
 HEIGHT 1
 VIEWPOINT 0 0 0 1 0 0 0
 POINTS 213
 DATA 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
 ...
 ...

## 역사
포인트 클라우드 라이브러리 개발은 2010년 3월 윌로 개러지(Willow Garage)에서 시작되었다. 이 프로젝트는 처음에는 윌로 개러지의 서브 도메인에 있었지만 2011년 3월에 새로운 웹사이트인 www.pointclouds.org로 이전했다. PCL의 첫 공식 릴리스(버전 1.0)는 두 달 후인 2011년 5월에 출시되었다.

## 모듈
PCL은 여러 개의 작은 코드 라이브러리로 나뉘며 개별적으로 컴파일할 수 있다. 가장 중요한 모듈과 그 기능 중 일부는 아래에 설명되어 있다.

### 필터
3D 점구름을 스캔할 때 오류와 다양한 편차가 발생하여 데이터에 노이즈가 발생할 수 있다. 이로 인해 표면 법선과 같은 일부 로컬 점구름 특성 추정이 복잡해진다. 이러한 부정확성은 추가 처리에서 심각한 오류로 이어질 수 있으므로 적절한 필터로 제거하는 것이 좋다. **pcl_filters** 라이브러리는 이상치와 노이즈를 제거하고 데이터를 다운샘플링하기 위한 여러 유용한 필터를 제공한다. 일부는 간단한 기준을 사용하여 점을 잘라내고, 다른 일부는 통계 분석을 사용한다.

* **PassThrough** 필터 - 선택된 하나의 차원에서 점을 필터링하는 데 사용된다. 이는 사용자가 지정한 범위 내에 없는 점을 잘라낼 수 있음을 의미한다.
* **VoxelGrid** 필터 - 점구름에 복셀 그리드를 생성한다. 각 복셀 내의 점은 해당 중심점으로 근사화된다. 이는 점구름 데이터의 다운샘플링(점 수 감소)으로 이어진다.
* **StatisticalOutlierRemoval** 필터 - 각 점의 이웃에 적용된 통계 분석 기술을 사용하여 점구름 데이터 세트에서 노이즈를 제거하고 평균 거리가 정의된 간격 밖에 있는 모든 점을 잘라낸다.
* **RadiusOutlierRemoval** 필터 - 정의된 이웃에서 선택된 수보다 적은 이웃을 가진 점들을 제거한다.

### 특징
**pcl_features** 라이브러리에는 3D 특징 추정을 위한 알고리즘과 데이터 구조가 포함되어 있다. 가장 많이 사용되는 로컬 기하학적 특징은 점 법선과 기본 표면의 추정된 곡률이다. 특징은 선택된 k-이웃(점 주위에 선택된 데이터 공간)을 기반으로 특정 점의 기하학적 패턴을 설명한다. 이웃은 가장 가까운 영역에서 고정된 수의 점을 결정하거나 점 주위에 구의 반경을 정의하여 선택할 수 있다.

표면 법선을 추정하는 가장 쉽게 구현된 방법 중 하나는 점의 이웃에서 생성된 공분산 행렬의 고유 벡터 및 고유값을 분석하는 것이다. 점 특징 히스토그램(또는 더 빠른 FPFH) 디스크립터는 고급 특징 표현이며 각 점의 법선 추정에 따라 달라진다. 이는 값의 다차원 히스토그램을 사용하여 점 주위의 평균 곡률을 일반화한다. 라이브러리의 다른 디스크립터로는 Viewpoint Feature Histogram (VFH) 디스크립터, NARF 디스크립터, 관성 모멘트 및 이심률 기반 디스크립터, Globally Aligned Spatial Distribution (GASD) 디스크립터 등이 있다.

### 분할
**pcl_segmentation** 라이브러리에는 점구름을 여러 클러스터로 분할하기 위한 알고리즘이 포함되어 있다. 클러스터링은 종종 클라우드를 개별 부분으로 나누는 데 사용되며, 이는 추가로 처리될 수 있다. 다양한 분할 방법을 지원하는 여러 클래스가 구현되어 있다.

* **평면 모델** 분할 - 점구름에서 평면 모델을 지원하는 모든 점을 찾는 간단한 알고리즘
* **유클리드** 클러스터링 - 유클리드 거리를 기반으로 점 클러스터를 생성한다
* **조건부 유클리드** 클러스터링 - 유클리드 거리와 사용자 정의 조건을 기반으로 점을 클러스터링한다
* **영역 성장** 분할 - 부드러움 제약 조건 측면에서 충분히 가까운 점들을 병합한다
* **색상 기반 영역 성장** 분할 - 영역 성장과 동일한 개념이지만 법선 대신 색상을 사용한다
* **Min-Cut** 기반 이진 분할 - 클라우드를 전경과 배경 점 집합으로 나눈다
* **법선 차이** 기반 분할 - 스케일 기반 분할로, 주어진 스케일 파라미터 내에 속하는 점을 찾는다
* **슈퍼 복셀** 클러스터링 - 3D 점구름 데이터의 볼륨 과분할을 생성한다

### 시각화
**pcl_visualization** 라이브러리는 3D 점구름 데이터를 빠르고 쉽게 시각화하는 데 사용된다. 이 패키지는 VTK 라이브러리를 사용하여 클라우드 및 범위 이미지의 3D 렌더링을 수행한다. 이 라이브러리는 다음을 제공한다.

* **CloudViewer** 클래스는 간단한 점구름 시각화를 위한 것이다.
* **RangeImageVisualizer**는 범위 이미지를 3D 점구름으로 또는 색상이 범위 값에 해당하는 그림으로 시각화하는 데 사용할 수 있다.
* **PCLVisualizer**는 여러 응용 프로그램을 가진 시각화 클래스이다. 간단한 점구름과 색상 데이터를 포함하는 점구름을 모두 표시할 수 있다. CloudViewer와 달리 법선, 주 곡률 및 기하학과 같은 흥미로운 점구름 정보를 그릴 수도 있다. 여러 점구름을 나란히 표시하여 쉽게 비교하거나, 점 집합 또는 매개변수 방정식에서 다양한 기본 도형(예: 원통, 구, 선, 다각형 등)을 그릴 수 있다.
* **PCLPlotter** 클래스는 다항식 함수에서 히스토그램에 이르기까지 그래프를 쉽게 플로팅하는 데 사용된다. 다양한 유형의 플롯 입력(좌표, 함수)을 처리하고 자동 색상 지정을 수행한다.
* **PCLHistogramVisualizer**는 2D 플롯을 위한 히스토그램 시각화 모듈이다.

### 정합
정합은 다른 시점에서 획득한 다양한 점구름 데이터 세트를 단일 점구름 모델로 정렬하는 문제이다. **pcl_registration** 라이브러리는 조직화된 데이터 세트와 비조직화된 데이터 세트 모두에 대한 여러 점구름 정합 알고리즘을 구현한다. 이 작업은 데이터 세트 간의 해당 점을 식별하고 거리를 최소화하는 변환을 찾는 것이다.

반복 최근접 점 알고리즘은 두 점구름의 점들 사이의 거리를 최소화한다. 한 점구름이 다른 점구름의 강체 변환인지 여부를 결정하는 데 사용할 수 있다. 정규 분포 변환 (NDT)은 100,000개 이상의 점을 가진 두 점구름 사이의 강체 변환을 결정하는 데 사용할 수 있는 정합 알고리즘이다.

### 샘플 합의
**sample_consensus** 라이브러리에는 RANSAC과 같은 SAC(SAmple Consensus) 방법과 점구름에서 특정 객체를 감지하기 위한 모델이 포함되어 있다. 이 라이브러리에 구현된 모델 중 일부는 벽과 바닥과 같은 내부 표면을 감지하는 데 자주 사용되는 평면 모델이다. 다음 모델은 선, 평면의 2D 및 3D 원, 구, 원통, 원뿔, 주어진 축과 평행한 선을 결정하기 위한 모델, 사용자 지정 축에 수직인 평면을 결정하기 위한 모델, 사용자 지정 축에 평행한 평면 등이 있다. 이러한 모델은 공통 기하학적 구조를 가진 객체(예: 머그컵에 원통 모델 피팅)를 감지하는 데 사용될 수 있다.

라이브러리에서 사용할 수 있는 강력한 샘플 합의 추정기:

* SAC_RANSAC - RANdom SAmple Consensus
* SAC_LMEDS - 최소 중앙 제곱
* SAC_MSAC - M-추정기 샘플 합의
* SAC_RRANSAC - 무작위 RANSAC
* SAC_RMSAC - 무작위 MSAC
* SAC_MLESAC - 최대 우도 추정 샘플 합의
* SAC_PROSAC - PROgressive 샘플 합의

### 표면
3D 점구름의 표면 재구성을 위한 여러 알고리즘이 **pcl_surface** 라이브러리에 구현되어 있다. 표면을 재구성하는 방법은 여러 가지가 있다. 가장 일반적으로 사용되는 방법 중 하나는 메싱이며, PCL 라이브러리에는 두 가지 알고리즘이 있다. 원본 점의 매우 빠른 삼각 분할과 더 느린 네트워킹(평활화 및 구멍 채우기도 수행)이다. 클라우드에 노이즈가 있는 경우 구현된 알고리즘 중 하나를 사용하여 표면 평활화를 사용하는 것이 좋다.

이동 최소 제곱 (MLS) 표면 재구성 방법은 표면의 누락된 부분을 재구성할 수 있는 리샘플링 알고리즘이다. 주변 데이터 점 간의 고차 다항식 보간 덕분에 MLS는 스캐닝으로 인한 작은 오류를 수정하고 평활화할 수 있다.

탐욕 투영 삼각 분할은 법선이 있는 비정렬된 PointCloud에서 빠른 표면 삼각 분할을 위한 알고리즘을 구현한다. 결과는 점의 법선을 따라 점의 로컬 이웃을 투영하여 생성된 삼각형 메시이다. 표면이 국부적으로 매끄럽고 점 밀도가 다른 영역 간에 부드러운 전환이 있을 때 가장 잘 작동한다. 점을 연결할 때 고려되는 많은 매개변수(검색할 이웃 수, 점에 대한 최대 거리, 삼각형의 최소 및 최대 각도)를 설정할 수 있다.

이 라이브러리는 또한 평면 모델에 대한 오목 또는 볼록 폐포 다각형을 생성하는 기능, 그리드 투영 표면 재구성 알고리즘, 마칭 큐브, 이어 클리핑 삼각 분할 알고리즘, 푸아송 표면 재구성 알고리즘 등을 구현한다.

### I/O
**io_library**를 사용하면 점구름을 파일로 로드하고 저장할 수 있을 뿐만 아니라 다양한 장치에서 클라우드를 캡처할 수 있다. 이 라이브러리에는 동일한 유형 및 필드 수를 가진 두 개의 다른 점구름의 점을 연결하는 기능이 포함되어 있다. 또한 이 라이브러리는 동일한 수의 점을 가진 두 개의 다른 점구름의 필드(예: 차원)를 연결할 수 있다.

**PCL 1.0**부터 이 라이브러리는 다양한 장치 및 파일 형식에 쉽게 액세스할 수 있는 새로운 일반 그래버 인터페이스를 제공한다. 데이터 수집에 지원되는 첫 번째 장치는 OpenNI 호환 카메라(Primesense Reference Design, Microsoft Kinect 및 Asus Xtion Pro 카메라로 테스트됨)였다. **PCL 1.7** 현재, 벨로다인 고해상도 라이다 (HDL) 시스템에서도 점구름 데이터를 얻을 수 있으며, 이는 360도 점구름을 생성한다. PCL은 원래 HDL-64e 및 HDL-32e를 모두 지원한다. Dinast 카메라(IPA-1110, Cyclopes II 및 IPA-1002 ng T-Less NG로 테스트됨)를 위한 새로운 드라이버도 있다. **PCL 1.8**은 IDS-Imaging Ensenso 카메라, DepthSense 카메라(예: Creative Senz3D, DepthSense DS325) 및 davidSDK 스캐너를 지원한다.

### KdTree
**pcl_kdtree** 라이브러리는 k차원 공간에 점 집합을 구성하기 위한 kd-트리 데이터 구조를 제공한다. 특정 점 또는 위치의 K 최근접 이웃을 찾는 데 사용된다(FLANN 사용).

### Octree
**pcl_octree** 라이브러리는 점구름 데이터를 위한 팔진트리 계층적 트리 데이터 구조를 구현한다. 이 라이브러리는 "복셀 내 이웃 검색", "K 최근접 이웃 검색" 및 "반경 내 이웃 검색"과 같은 최근접 이웃 검색 알고리즘을 제공한다. 또한 리프 노드의 속성에 따라 달라지는 여러 옥트리 유형이 있다. 각 리프 노드는 단일 점 또는 점 인덱스 목록을 보유할 수 있으며, 또는 점 정보를 저장하지 않을 수도 있다. 이 라이브러리는 또한 옥트리 구조의 재귀적 비교를 통해 여러 비정렬된 점구름 간의 공간 변화를 감지하는 데 사용될 수 있다.

### 검색
**pcl_search** 라이브러리는 KdTree, Octree와 같은 다른 모듈에서 찾을 수 있는 다양한 데이터 구조를 사용하거나 조직화된 데이터 세트에 특화된 검색을 사용하여 최근접 이웃을 검색하는 방법을 구현한다.

### 범위 이미지
**range_image** 라이브러리에는 픽셀 값이 센서로부터의 거리를 나타내는 범위 이미지를 표현하고 작업하기 위한 두 가지 클래스가 포함되어 있다. 센서 위치가 지정되면 범위 이미지를 점구름으로 변환하거나 경계를 추출할 수 있다.

### 키포인트
**pcl_keypoints** 라이브러리에는 점구름 키포인트 감지 알고리즘(AGAST 코너 점 감지기, 해리스 감지기, BRISK 감지기 등)의 구현이 포함되어 있다.

### 공통
**pcl_common** 라이브러리에는 점구름의 핵심 데이터 구조, 점 표현, 표면 법선, RGB 색상 값 등의 유형이 포함되어 있다. 또한 거리, 평균값 및 공분산, 기하학적 변환 등을 계산하는 데 유용한 메서드도 구현되어 있다. 공통 라이브러리는 주로 다른 PCL 모듈에서 사용된다.

## 각주

## 외부 링크
* 포인트 클라우드 라이브러리
* 포인트 클라우드 라이브러리 (PCL) 사용자
* 깃허브 저장소
* 튜토리얼

분류:3차원 그래픽 소프트웨어
분류:C++로 작성된 자유 소프트웨어
분류:BSD 라이선스 소프트웨어