Booil Jung

Point Cloud Library (PCL)에 대한 고찰

Point Cloud Library(PCL)는 2D/3D 이미지 및 포인트 클라우드 처리를 위한 대규모의 독립형 오픈소스 C++ 라이브러리 프로젝트다.1 이 라이브러리는 3차원 컴퓨터 비전 분야에서 발생하는 다양한 문제를 해결하기 위해 설계되었으며, 필터링(filtering), 특징 추출(feature estimation), 표면 재구성(surface reconstruction), 정합(registration), 모델 피팅(model fitting), 분할(segmentation) 등 수많은 최첨단 알고리즘을 포괄적으로 제공한다.1

PCL의 가장 중요한 특징 중 하나는 라이선스 정책이다. PCL은 BSD 라이선스 하에 배포되므로, 상업적 및 연구용 애플리케이션에서 아무런 제약 없이 자유롭게 사용할 수 있다.2 이러한 개방적인 라이선스 정책은 PCL이 학계와 산업계 양쪽에서 광범위하게 채택되고, 거대한 사용자 및 개발자 커뮤니티를 형성하는 데 결정적인 역할을 했다.

PCL의 개발은 2010년 3월, 로봇 공학 연구의 선구자였던 Willow Garage에서 시작되었다.4 이 배경은 PCL의 설계 철학과 기능 구성에 깊은 영향을 미쳤다. PCL은 처음부터 로봇 운영체제(Robot Operating System, ROS)와 함께 성장했으며, 로봇이 주변 환경을 3D로 인식하고 상호작용하는 데 필요한 핵심 기술을 제공하는 것을 목표로 했다.5

이러한 기원으로 인해 PCL은 ROS와 완벽하게 통합되어 있다. pcl_ros 패키지를 통해 ROS의 메시지 타입(sensor_msgs/PointCloud2)과 PCL의 네이티브 데이터 구조(pcl::PointCloud<T>) 간의 변환이 용이하며, PCL 알고리즘을 ROS 노드(node) 또는 노드렛(nodelet) 형태로 쉽게 실행할 수 있다.4 이는 로봇 인식 파이프라인을 구축하는 데 있어 PCL을 사실상의 표준으로 만들었다.

또한, PCL은 뛰어난 이식성을 자랑한다. Linux, Windows, macOS, Android 등 대부분의 주요 운영체제에서 원활하게 동작하는 크로스플랫폼을 지원한다.4 이는 PCL이 특정 플랫폼에 종속되지 않고, 데스크톱 연구 환경부터 모바일 기기, 임베디드 시스템에 이르기까지 다양한 환경에서 활용될 수 있는 기반을 제공한다.

PCL의 아키텍처는 두 가지 핵심 철학, 즉 모듈성과 병렬 처리에 기반을 두고 있다.

첫째, PCL은 거대한 단일 라이브러리가 아니라, 기능별로 잘게 나뉜 여러 개의 작은 모듈식 라이브러리의 집합으로 구성되어 있다.2 예를 들어, 필터링 알고리즘은 libpcl_filters에, 특징 추출 알고리즘은 libpcl_features에, 시각화 관련 기능은 libpcl_visualization에 포함되는 식이다.4 이러한 모듈식 구조는 개발자에게 높은 유연성을 제공한다. 사용자는 자신의 프로젝트에 필요한 특정 모듈만 선택적으로 빌드하고 링크함으로써, 의존성을 최소화하고 최종 실행 파일의 크기를 최적화할 수 있다.

둘째, PCL은 대용량 3D 데이터의 고속 처리를 위해 설계 초기부터 병렬 처리를 염두에 두었다. 멀티코어 CPU의 성능을 최대한 활용하기 위해 OpenMP와 Intel Threading Building Blocks(TBB)를 기본적으로 지원한다.4

FPFHEstimationOMP 11나 GreedyProjectionTriangulation의 OpenMP 버전 13처럼, 계산 집약적인 여러 알고리즘에 대해 병렬화된 구현이 제공된다. 사용자는 클래스 이름만 변경하는 것만으로 간단하게 싱글 스레드 버전에서 멀티 스레드 버전으로 전환하여 성능을 극대화할 수 있다. 더 나아가, Intel oneAPI Base Toolkit을 활용한 PCL 최적화 버전은 SYCL 표준을 통해 CPU뿐만 아니라 Intel 내장 및 외장 GPU를 활용한 이기종 컴퓨팅까지 지원하여, 현대 컴퓨팅 하드웨어의 발전에 발맞춰 진화하고 있다.14

PCL의 강력하고 다양한 기능은 여러 고품질 서드파티 라이브러리 위에 구축되어 있다. 이러한 의존성을 이해하는 것은 PCL을 효과적으로 사용하고 빌드하는 데 필수적이다.

PCL에서 모든 작업의 기본이 되는 데이터 구조는 pcl::PointCloud<PointT> 템플릿 클래스다.6 이는 포인트 클라우드를 저장하고 관리하기 위한 핵심 컨테이너 역할을 한다.

PointT 템플릿 매개변수에는 저장할 포인트의 종류(예: pcl::PointXYZ, pcl::PointXYZRGB)가 지정된다.

이 클래스는 다음과 같은 주요 멤버 변수를 포함한다 28:

PCL 프로그래밍에서는 메모리 관리를 용이하게 하기 위해 PointCloud 객체를 직접 다루기보다는 스마트 포인터(주로 boost::shared_ptr 또는 현대 C++의 std::shared_ptr)를 사용하는 것이 일반적인 관례다. 이를 위해 PointCloud<PointT>::Ptr과 같은 타입 별칭(type alias)이 널리 사용된다.6

PCL은 포인트 클라우드를 정규(organized)와 비정규(unorganized) 두 가지 유형으로 구분하며, 이 구분은 단순한 데이터의 형태를 넘어 알고리즘의 선택과 성능에 지대한 영향을 미친다.

따라서 개발자는 센서 데이터가 정규 구조를 가지고 있다면, 처리 파이프라인 전반에 걸쳐 가능한 한 이 구조를 유지하도록 노력해야 한다. 많은 필터링이나 변환 작업이 이 구조를 깨뜨릴 수 있으므로, 알고리즘 선택에 신중을 기하는 것이 전체 시스템의 성능을 좌우하는 핵심 요소가 된다.

PointTPointCloud에 저장될 개별 포인트의 데이터 구조를 정의한다. PCL은 다양한 시나리오에 맞춰 미리 정의된 여러 PointT 타입을 제공하며, 사용자는 데이터의 특성에 따라 가장 적합한 타입을 선택해야 한다.33 필요하다면 사용자가 직접 새로운 PointT 타입을 정의하여 확장하는 것도 가능하다.34

다음 표는 가장 일반적으로 사용되는 PointT 타입들을 정리한 것이다.

Point Type (pcl::...) 구성 필드 (Component Fields) 주요 사용처 (Primary Use Case)
PointXYZ float x, y, z 가장 기본적인 3차원 좌표 정보만 필요할 때 사용.34
PointXYZI float x, y, z, intensity LiDAR 스캔 데이터와 같이 각 점의 강도(intensity) 정보가 포함될 때 사용.6
PointXYZRGB float x, y, z, rgb RGB-D 카메라 데이터와 같이 각 점의 색상(RGB) 정보가 포함될 때 사용.6
PointXYZRGBA float x, y, z, uint32_t rgba 색상 정보에 투명도(alpha) 채널까지 포함될 때 사용.34
Normal float normal_x, normal_y, normal_z, curvature 점의 위치 정보 없이 표면 법선 벡터와 곡률 정보만 저장할 때 사용.34
PointNormal float x, y, z, float normal, curvature 3차원 좌표와 해당 지점의 법선 및 곡률 정보를 함께 저장할 때 사용.34
FPFHSignature33 float histogram FPFH 특징 디스크립터를 저장하기 위한 타입.12
VFHSignature308 float histogram VFH 특징 디스크립터를 저장하기 위한 타입.36

필터링은 포인트 클라우드 처리 파이프라인의 가장 첫 단계에서 수행되는 핵심적인 전처리 과정이다. 센서로부터 취득된 원본 데이터에는 노이즈, 이상점(outlier), 불필요한 영역 등이 포함되어 있을 수 있으며, 이를 제거하거나 데이터를 간소화하여 후속 처리의 정확성과 효율성을 높이는 것이 필터링의 주된 목적이다.4

PCL의 거의 모든 고수준 알고리즘은 내부적으로 특정 포인트의 이웃을 찾는 ‘탐색’ 작업에 의존한다. pcl_search 모듈과 이를 기반으로 하는 pcl_kdtree, pcl_octree 모듈은 이러한 탐색 작업을 효율적으로 수행하기 위한 핵심 자료구조와 인터페이스를 제공한다. 이 탐색 기능의 성능이 전체 PCL 파이프라인의 성능을 좌우한다고 해도 과언이 아니다. 법선 추정, 특징 기술, 군집화, 정합 등 거의 모든 과정이 이웃 포인트들의 정보를 필요로 하기 때문이다.32 PCL은 이러한 의존성을 pcl::search::Search라는 추상 базовый 클래스(base class)를 통해 관리하며, 사용자는 실제 구현체(Kd-tree 또는 Octree)를 선택하여 주입하는 ‘플러그인’ 방식으로 탐색 방법을 교체할 수 있다.

특징점 기술(Feature Description)은 포인트 클라우드의 각 점이나 특정 영역이 가진 고유한 기하학적 특성을 정량적인 수치 벡터, 즉 ‘디스크립터(descriptor)’로 표현하는 과정이다. 잘 설계된 디스크립터는 시점이나 조명 변화, 노이즈 등에 강인해야 하며, 이를 통해 서로 다른 포인트 클라우드 간의 대응점을 찾거나(정합), 특정 객체를 식별하는(인식) 등의 고수준 작업을 수행할 수 있다.4

키포인트(또는 관심점, interest points) 검출은 전체 포인트 클라우드에서 후속 처리(예: 특징 매칭, 정합)의 기준점이 될 소수의 중요하고 안정적인 점들을 추출하는 과정이다.32 전체 포인트에 대해 특징 디스크립터를 계산하는 대신, 키포인트에 대해서만 계산함으로써 전체 처리 속도를 크게 향상시킬 수 있다.

정합은 서로 다른 좌표계에서 측정된 두 개 이상의 포인트 클라우드를 하나의 공통 좌표계로 정렬하는 과정이다. 이는 3D 모델링, 지도 작성(mapping), 로봇 위치 추정(localization) 등 다양한 분야의 핵심 기술이다.32

분할은 전체 포인트 클라우드를 특정 기준에 따라 의미 있는 여러 부분 집합(클러스터 또는 세그먼트)으로 나누는 과정이다. 예를 들어, 실내 환경 스캔에서 바닥, 벽, 테이블, 의자 등을 각각의 객체로 분리하는 작업이 이에 해당한다.6

표면 재구성은 흩어져 있는 이산적인 3D 포인트들로부터 원래 객체의 연속적인 표면을 복원하는 과정이며, 결과물은 보통 삼각형 메시(triangle mesh) 형태로 표현된다.86 PCL은 이 문제를 해결하기 위해 근본적으로 다른 두 가지 철학에 기반한 알고리즘들을 제공한다: 명시적(explicit) 방법과 암시적(implicit) 방법이다.

다음 표는 PCL의 주요 표면 재구성 기법들의 특징을 비교한 것이다.

기법 (Technique) 기본 원리 (Principle) 장점 (Pros) 단점 (Cons) 주요 파라미터 (Key Parameters)
GreedyProjectionTriangulation 명시적, 지역적 투영 기반 삼각화 빠름, 원본 데이터 정점 보존 노이즈/홀에 취약, 법선 필요 setSearchRadius, setMu 95
Poisson 암시적, 푸아송 방정식 기반 전역 최적화 노이즈에 강함, 홀 채움, 부드러운 결과 법선 필수, 계산 비용 높음 setDepth 96
MovingLeastSquares 평활화, 국소적 다항식 피팅 노이즈 제거, 고품질 법선 생성 표면 재구성이 아닌 전처리 setPolynomialOrder, setSearchRadius 93
OrganizedFastMesh 명시적, 정규 클라우드 이웃 관계 활용 매우 빠름 정규(organized) 클라우드에서만 사용 가능 파라미터 거의 없음 86

알고리즘의 결과를 확인하고 디버깅하기 위해 3D 데이터를 시각화하는 것은 필수적이다. pcl_visualization 라이브러리는 VTK(Visualization Toolkit)를 백엔드로 사용하여 강력하고 유연한 시각화 기능을 제공한다.24

PCL은 크로스플랫폼 빌드 시스템인 CMake를 표준으로 채택하고 있다.4 따라서 PCL을 사용하는 모든 프로젝트는 CMakeLists.txt 파일을 통해 빌드 설정을 관리해야 한다. PCL의 모듈식 구조는 CMake와 긴밀하게 연동되어, ‘파이프라인을 코드로 정의(Pipeline as Code)’하는 개념을 가능하게 한다. 즉, 프로젝트의 CMakeLists.txt 파일은 단순한 빌드 스크립트를 넘어, 해당 프로젝트가 어떤 처리 단계를 포함하는지를 명시하는 선언적인 문서 역할을 한다.

사용자 프로젝트의 CMakeLists.txt에서 PCL을 연동하는 표준적인 방법은 다음과 같다 108:

  1. find_package(PCL <version> REQUIRED): 시스템에 설치된 PCL 라이브러리를 찾는다. REQUIRED 키워드는 PCL을 찾지 못하면 빌드 과정을 중단시킨다. COMPONENTS 키워드 뒤에 io, filters, segmentation과 같이 필요한 모듈의 이름을 명시하면, 해당 모듈과 그 의존성만 프로젝트에 연결된다. 이는 불필요한 라이브러리 링크를 방지하고 빌드 시간을 단축시킨다. 이 COMPONENTS 목록 자체가 프로젝트가 수행하는 작업의 종류(입출력, 필터링, 분할 등)를 고수준에서 설명해준다.
  2. target_link_libraries(your_executable ${PCL_LIBRARIES}): find_package를 통해 찾아낸 PCL 라이브러리들(PCL_LIBRARIES 변수에 저장됨)을 실제 실행 파일에 링크한다. 최신 PCL 버전에서는 이 한 줄만으로 헤더 경로(PCL_INCLUDE_DIRS)와 컴파일러 정의(PCL_DEFINITIONS)까지 자동으로 처리된다.108

find_package 명령이 성공적으로 실행되면, PCL_VERSION, PCL_INCLUDE_DIRS, PCL_LIBRARIES 등 PCL 관련 정보가 담긴 여러 CMake 변수들이 설정되어 프로젝트에서 사용할 수 있게 된다.108

PCL을 성공적으로 설치하고 사용하는 것은 그 의존성들을 올바르게 관리하는 것에서 시작된다. 설치 방법은 크게 패키지 매니저를 이용하는 방법과 소스 코드를 직접 컴파일하는 방법으로 나뉜다.9

PCL은 3D 포인트 클라우드 처리를 위한 사실상의 산업 표준 라이브러리로서, 지난 10여 년간 학계와 산업계의 수많은 요구사항을 반영하며 방대하고 성숙한 기능 집합을 구축했다. Willow Garage와 ROS 생태계에서 태동한 배경 덕분에 로봇 공학의 실제 문제 해결에 매우 실용적인 도구들을 제공하며, BSD 라이선스 정책은 그 확산을 가속화했다.

PCL의 핵심적인 특징은 모듈성, 병렬 처리 지원, 그리고 강력한 서드파티 라이브러리와의 통합으로 요약할 수 있다. 기능별로 분리된 모듈식 아키텍처와 CMake 기반의 유연한 빌드 시스템은 개발자가 필요한 기능만을 선택적으로 사용하여 효율적이고 유지보수하기 쉬운 애플리케이션을 만들 수 있게 한다. OpenMP와 oneAPI를 통한 병렬 및 이기종 컴퓨팅 지원은 대용량 데이터를 실시간으로 처리해야 하는 현대적 요구에 부응한다. 또한 Eigen, FLANN, VTK와 같은 검증된 라이브러리들을 기반으로 하여, 수학적 연산, 근접 이웃 탐색, 시각화 등 핵심 기능의 성능과 안정성을 보장한다.

PCL은 필터링, 특징 추출, 정합, 분할, 표면 재구성 등 포인트 클라우드 처리의 전 과정을 아우르는 포괄적인 알고리즘 파이프라인을 제공한다. PointCloud<PointT>라는 핵심 데이터 구조를 중심으로, 각 처리 단계에 맞는 다양한 알고리즘들이 유기적으로 연결되어 동작한다. 특히 KdTreeOctree를 기반으로 하는 효율적인 탐색 메커니즘은 PCL의 거의 모든 기능의 근간을 이루는 중요한 요소다.

물론 C++11 이전 시대에 설계되어 Boost 라이브러리에 대한 의존성이 깊다는 점과 같은 기술적 유산도 존재하지만, 커뮤니티는 std 라이브러리를 활용하는 방향으로 꾸준히 현대화를 진행하고 있다. PCL은 3D 인식 분야에 입문하는 개발자에게는 포괄적인 학습 도구를, 숙련된 연구자에게는 강력하고 유연한 실험 플랫폼을 제공하는 대체 불가능한 프레임워크로 확고히 자리매김하고 있다.

  1. PCL Tutorial: - The Point Cloud Library By Example - Jeff Delmerico, accessed July 24, 2025, http://www.jeffdelmerico.com/wp-content/uploads/2014/03/pcl_tutorial.pdf
  2. pcl/Handbook - ROS Wiki, accessed July 24, 2025, http://wiki.ros.org/pcl/Handbook
  3. Point Cloud Library - Wikipedia, accessed July 24, 2025, https://en.wikipedia.org/wiki/Point_Cloud_Library
  4. 3D is here: Point cloud library (PCL) - ResearchGate, accessed July 24, 2025, https://www.researchgate.net/publication/221068443_3D_is_here_Point_cloud_library_PCL
  5. Navigating Common Pitfalls in Point Cloud Analysis - Mindkosh, accessed July 24, 2025, https://mindkosh.com/blog/navigating-common-pitfalls-in-point-cloud-analysis/
  6. 11x Performance Gain: Latest Connext DDS, ROS 2 Performance Benchmarks - RTI, accessed July 24, 2025, https://www.rti.com/blog/latest-connext-dds-ros-2-performance-benchmarks
  7. sensor_msgs/Reviews/2010-03-01 PointCloud2_API_Review - ROS Wiki, accessed July 24, 2025, http://wiki.ros.org/sensor_msgs/Reviews/2010-03-01%20PointCloud2_API_Review
  8. Adding your own custom PointT type - Point Cloud Library 0.0 documentation, accessed July 24, 2025, https://pcl.readthedocs.io/projects/tutorials/en/latest/adding_custom_ptype.html
  9. Case study: convert ROS message to PCL - CPP Optimizations diary, accessed July 24, 2025, https://cpp-optimizations.netlify.app/pcl_fromros/
  10. Optimized ROS->PCL conversion - Open Robotics Discourse, accessed July 24, 2025, https://discourse.ros.org/t/optimized-ros-pcl-conversion/25833
  11. pcl::PointCloud< PointT > Class Template Reference - the official ROS docs, accessed July 24, 2025, https://docs.ros.org/en/diamondback/api/pcl/html/classpcl_1_1PointCloud.html
  12. pcl::PointCloud< PointT > Class Template Reference - Point Cloud Library, accessed July 24, 2025, http://pointclouds.org/documentation/classpcl_1_1_point_cloud.html
  13. Module common - Point Cloud Library (PCL), accessed July 24, 2025, http://pointclouds.org/documentation/group__common.html
  14. [conversions] toPCLPointCloud2 or toROSMsg
  15. ros2_cookbook/rclcpp/pcl.md at main - GitHub, accessed July 24, 2025, https://github.com/mikeferguson/ros2_cookbook/blob/main/rclcpp/pcl.md
  16. sensor_msgs/msg/PointCloud2 Message - ROS Documentation, accessed July 24, 2025, https://docs.ros2.org/foxy/api/sensor_msgs/msg/PointCloud2.html
  17. PointCloud2 - sensor_msgs: Humble 4.9.0 documentation - the official ROS docs, accessed July 24, 2025, https://docs.ros.org/en/ros2_packages/humble/api/sensor_msgs/msg/PointCloud2.html
  18. Built-in Message Type Introduction to ROS2 and Robotics, accessed July 24, 2025, https://www.learnros2.com/ros/ros2-building-blocks/built-in-types/built-in-message-type
  19. PointCloud2 and PointField - pcl - Robotics Stack Exchange, accessed July 24, 2025, https://robotics.stackexchange.com/questions/73981/pointcloud2-and-pointfield
  20. Using sensor_msgs/PointCloud2 natively - Robotics Stack Exchange, accessed July 24, 2025, https://robotics.stackexchange.com/questions/70072/using-sensor-msgs-pointcloud2-natively
  21. In-Place Modification of PointCloud2 message? - ROS Answers archive, accessed July 24, 2025, https://answers.ros.org/question/324666/
  22. ROS2 pointcloud : r/ROS - Reddit, accessed July 24, 2025, https://www.reddit.com/r/ROS/comments/gkxyqk/ros2_pointcloud/
  23. GitRepJo/pcl_example: A template ROS2 C++ node to test a PCL Pointcloud2 processing, accessed July 24, 2025, https://github.com/GitRepJo/pcl_example
  24. Conversion from sensor_msgs::PointCloud2 to pcl::PointCloud
  25. home/travis/build/PointCloudLibrary/pcl/common/include/pcl/ros/conversions.h Source File, accessed July 24, 2025, https://pointclouds.org/documentation/ros_2conversions_8h_source.html
  26. ROS 2 Performance Benchmarking - ROS General - Open Robotics Discourse, accessed July 24, 2025, https://discourse.ros.org/t/ros-2-performance-benchmarking/44382
  27. NVIDIA-ISAAC-ROS/ros2_benchmark: Benchmark the performance of your ROS 2 graphs, accessed July 24, 2025, https://github.com/NVIDIA-ISAAC-ROS/ros2_benchmark
  28. ROS 2 benchmark open source release, accessed July 24, 2025, https://discourse.ros.org/t/ros-2-benchmark-open-source-release/30753
  29. irobot-ros/ros2-performance: Framework to evaluate peformance of ROS 2 - GitHub, accessed July 24, 2025, https://github.com/irobot-ros/ros2-performance
  30. PillarGen: Enhancing Radar Point Cloud Density and Quality via Pillar-based Point Generation Network - arXiv, accessed July 24, 2025, https://arxiv.org/html/2403.01663v2
  31. How Can I Estimate the LiDAR Point Density for My Flight? - Knowledge Base - Inertial Labs, accessed July 24, 2025, https://resources.inertiallabs.com/en-us/knowledge-base/how-can-i-estimate-the-point-density-for-my-flight
  32. Influence of point cloud density on the results of automated Object-Based building extraction from ALS data - ResearchGate, accessed July 24, 2025, https://www.researchgate.net/publication/262673446_Influence_of_point_cloud_density_on_the_results_of_automated_Object-Based_building_extraction_from_ALS_data
  33. Frequency of depth and pointclouds got much slower when we subscribed compressedDepth / Issue #1672 / IntelRealSense/realsense-ros - GitHub, accessed July 24, 2025, https://github.com/IntelRealSense/realsense-ros/issues/1672