제6장

포인트 클라우드 처리와 프로토콜

포인트 클라우드 개요

포인트 클라우드는 물체나 환경의 표면 형상을 나타내는 3D 점들의 집합이다. 각 점은 일반적으로 정의된 좌표계에서의 X, Y, Z 좌표를 포함하며, 색상(RGB), 강도(intensity), 법선 벡터, 의미 레이블과 같은 추가 속성을 가질 수 있다. 포인트 클라우드는 3D 센서의 기본 출력이며 3D 컴퓨터 비전 응용의 토대가 된다.

포인트 클라우드 데이터 형식

PCD (Point Cloud Data)

PCL(Point Cloud Library) 프로젝트가 개발한 PCD 형식은 로봇 공학과 연구 분야에서 가장 널리 쓰이는 형식이다. ASCII 인코딩과 바이너리 인코딩을 모두 지원하고, 임의의 점 속성을 저장할 수 있으며, 포인트 클라우드의 특성을 기술하는 메타데이터를 포함한다.

# .PCD v0.7 - 포인트 클라우드 데이터 파일 형식
VERSION 0.7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F U
COUNT 1 1 1 1
WIDTH 640
HEIGHT 480
VIEWPOINT 0 0 0 1 0 0 0
POINTS 307200
DATA binary
[바이너리 데이터...]

PLY (Polygon File Format)

PLY는 포인트 클라우드와 폴리곤 메시를 모두 표현할 수 있는 유연한 형식이다. 원래 스탠퍼드 대학이 Stanford 3D Scanning Repository를 위해 개발했으며, 이후 3D 데이터의 교환 형식으로 자리 잡았다. 사용자 정의 속성을 지원하고 ASCII 인코딩과 바이너리 인코딩을 모두 지원한다.

ply
format binary_little_endian 1.0
element vertex 307200
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
[바이너리 데이터...]

LAS/LAZ (LiDAR 데이터)

LAS는 ASPRS(미국 사진측량·원격탐사학회)가 관리하는 형식으로, 특히 지리공간 응용 분야에서 LiDAR 데이터 교환에 널리 쓰인다. LAZ는 LASzip으로 LAS를 무손실 압축한 형식이며, 파일 크기를 원본의 수분의 일로 줄인다. 이 형식들은 취득 파라미터, 좌표 참조계, 점 분류(지면, 식생, 건물 등)에 관한 방대한 메타데이터를 포함한다.

XYZ (ASCII 포인트 클라우드)

가장 단순한 형식으로, 한 줄에 점 하나를 기록하는 일반 텍스트이다. 대용량 데이터셋에는 비효율적이지만, 사람이 읽을 수 있고 파싱하기 쉽다. 확장 형식에는 강도, RGB, 법선 등을 위한 열이 추가될 수 있다.

1.234 2.456 0.789
1.235 2.457 0.788
1.236 2.458 0.787
...

포인트 클라우드 처리 파이프라인

취득 및 전처리

  1. 깊이 프레임 캡처: 3D 센서가 각 픽셀에 거리를 담은 깊이 이미지를 생성한다.
  2. 신뢰도 필터링: 신호 강도, 에지 근접도, 깊이 불연속성을 기준으로 신뢰도가 낮은 점을 제거한다.
  3. 깊이에서 3D로의 변환: 카메라 내부 파라미터(intrinsics)를 사용하여 깊이 픽셀을 3D 공간으로 투영한다:
    X = (u - cx) × depth / fx
    Y = (v - cy) × depth / fy
    Z = depth
    WIA-SEMI-013 Phase 1은 카메라 좌표계를 광학 중심 원점, X축 오른쪽, Y축 아래쪽, Z축 전방으로 정의하고, 깊이를 광학 중심에서의 유클리드 거리가 아니라 Z축 방향 거리로 측정하도록 규정한다. 위 식은 이 규약을 전제로 한다.
  4. 색상 매핑: 컬러 카메라가 있는 경우, 보정된 변환을 사용하여 컬러 카메라의 RGB 값을 3D 점에 매핑한다.

필터링 및 정제

원시 포인트 클라우드에는 반드시 제거해야 하는 노이즈, 이상점(outlier), 아티팩트가 포함되어 있다:

변환 및 정합

서로 다른 센서나 시점에서 얻은 포인트 클라우드는 공통 좌표계로 변환해야 한다:

표면 재구성

이산적인 포인트 클라우드를 연속적인 표면 표현으로 변환하는 과정이다:

포인트 클라우드 라이브러리와 도구

PCL (Point Cloud Library)

PCL은 포인트 클라우드 처리를 위한 가장 포괄적인 오픈 소스 라이브러리이다. C++로 작성되었고 Python 바인딩을 제공하며, 필터링, 특징 추출, 정합, 분할, 표면 재구성, 시각화를 위한 수백 가지 알고리즘을 포함한다. PCL은 로봇 공학과 학술 연구 분야의 사실상 표준이다.

// 예제: 포인트 클라우드 불러오기, 다운샘플링, 저장
#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("input.pcd", *cloud);

pcl::VoxelGrid<pcl::PointXYZ> voxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.01f, 0.01f, 0.01f); // 1cm 복셀
voxel_filter.filter(*cloud);

pcl::io::savePCDFile("output.pcd", *cloud);

Open3D

PCL의 현대적 대안인 Open3D는 깔끔한 Python API와 성능을 위한 C++ 백엔드를 제공한다. 시각화에 특히 뛰어나고, 컬러 ICP(colored ICP)와 전역 정합(global registration) 같은 최신 알고리즘을 포함하며, PyTorch와 TensorFlow 같은 머신러닝 프레임워크와도 잘 통합된다.

ROS (Robot Operating System)

ROS는 포인트 클라우드 데이터를 위한 표준화된 메시지(sensor_msgs/PointCloud2)와 로봇 시스템에서 포인트 클라우드를 처리하기 위한 도구를 제공한다. sensor_msgs/PointCloud2 메시지 형식은 임의의 점 속성을 허용하며, 대부분의 3D 센서와 시각화 도구에서 지원된다.

포인트 클라우드 처리 라이브러리 비교

라이브러리 언어 주요 특징 성능 최적 사용 사례
PCL (Point Cloud Library) C++/Python 포괄적인 알고리즘, 필터 높음 (최적화된 C++) 연구, 로봇 공학
Open3D Python/C++ 현대적 API, ML 통합 매우 높음 (GPU 지원) 딥러닝, 시각화
PDAL C++/Python LiDAR 처리, 파이프라인 높음 (스트리밍) 지리공간, 대용량 데이터셋
CloudCompare C++ (GUI) 대화형 시각화, 편집 높음 수동 검사, 편집
Cilantro C++ 경량, 정합 중심 매우 높음 임베디드 시스템, SLAM

실시간 처리 고려 사항

포인트 클라우드를 실시간(30Hz 이상)으로 처리하려면 세심한 최적화가 필요하다:

성능 최적화 전략:

WIA-SEMI-013의 포인트 클라우드 관련 규정

WIA-SEMI-013은 포인트 클라우드를 저장·전송·처리하는 방식을 여러 단계에 나누어 규정한다. 포인트 클라우드와 직접 관련된 항목은 다음과 같다. 전체 단계 구성은 제8장에서 다룬다.

규정 단계 주요 내용
WIA 포인트 클라우드 형식 Phase 1 §3 PCD v0.7을 확장해 x, y, z(float32, 미터), rgb(uint32), intensity(uint16), confidence(uint8, 0-255), timestamp(uint64, 프레임 시작 기준 마이크로초) 필드를 둔다. 소규모 데이터에는 JSON 형식도 쓸 수 있다.
처리 API Phase 2 §5 POST /api/v1/processing/depth-to-pointcloud(무효점 제거, 복셀 다운샘플링, PCD 출력)와 POST /api/v1/processing/filter-pointcloud(통계적 이상점 제거, 복셀 다운샘플링)를 정의한다.
WIA-PC-Stream Phase 3 §1 UDP(선택적 신뢰성 계층), Protocol Buffers v3 직렬화, LZ4 또는 Zstandard 압축, 선택적 AES-256-GCM 암호화, 지연 모드별 QoS를 쓰는 실시간 스트리밍 프로토콜이다.
WIA-Depth-Stream Phase 3 §2 키프레임과 델타 프레임을 이용한 차분 인코딩, 관심 영역(ROI) 전송으로 깊이 맵 대역폭을 줄인다.

표준 PCD에 WIA 필드를 더하는 방식이므로, PCL이나 Open3D 같은 기존 도구로도 기본 좌표 필드는 그대로 읽을 수 있다. Phase 1은 포인트 클라우드 파일 확장자를 .pcd로 정하고, 파서가 알 수 없는 필드를 무시하도록 요구한다.

포인트 클라우드 처리의 응용

SLAM (Simultaneous Localization and Mapping, 동시적 위치 추정 및 지도 작성)

포인트 클라우드를 이용하면 로봇과 자율주행 차량이 자신의 위치를 추적하면서 3D 지도를 작성할 수 있다. 정합 알고리즘은 연속된 포인트 클라우드를 정렬하여 카메라의 움직임을 추정한다. 루프 폐합(loop closure) 검출은 이전에 방문한 위치를 식별하여 전역적으로 일관된 지도를 만들 수 있게 한다.

물체 검출 및 인식

포인트 클라우드에서의 3D 물체 검출은 시점 변화에 불변인 기하학적 특징을 사용한다. 응용 분야로는 창고 자동화(빈 피킹), 자율주행(보행자/차량 검출), 품질 검사(결함 검출) 등이 있다.

장면 이해

의미론적 분할(semantic segmentation)은 각 점에 클래스(지면, 식생, 건물, 차량 등) 레이블을 부여한다. 인스턴스 분할(instance segmentation)은 개별 물체를 서로 분리한다. 이를 통해 로봇 공학과 AR을 위한 고수준의 장면 이해가 가능해진다.

변화 검출

서로 다른 시점에 취득한 포인트 클라우드를 비교하면 환경의 변화를 파악할 수 있다. 응용 분야로는 건설 모니터링, 변형 분석, 감시 등이 있다.

포인트 클라우드 처리는 원시 센서 데이터를 자율 시스템, 3D 모델링, 공간 컴퓨팅에 활용할 수 있는 실질적인 정보로 변환한다. 다음 장에서는 이러한 기법이 완전한 응용 시스템에 어떻게 통합되는지 살펴본다.

요약

핵심 내용:

복습 질문

  1. PCD와 PLY 파일 형식을 비교하라. 각각의 장점은 무엇인가? 어떤 경우에 한쪽을 다른 쪽보다 선택하겠는가?
  2. 깊이에서 포인트 클라우드로의 변환 과정을 설명하라. 카메라 내부 파라미터(fx=525, fy=525, cx=319.5, cy=239.5)와 깊이 2000mm인 픽셀 (320, 240)이 주어졌을 때 3D 좌표를 계산하라.
  3. 통계적 이상점 제거란 무엇이며 어떻게 동작하는가? 표면 재구성과 같은 후속 처리 전에 이상점을 제거하는 것이 왜 중요한가?
  4. ICP(Iterative Closest Point) 알고리즘을 설명하라. 그 한계는 무엇이며, 점 대 평면 ICP와 같은 변형은 이를 어떻게 해결하는가?
  5. 임베디드 시스템에서 실시간 SLAM을 위해 640×480 깊이 스트림을 30 FPS로 처리해야 한다. 현재 CPU 구현은 10 FPS에 불과하다. 어떤 최적화 전략을 적용하겠는가?
  6. 복셀 그리드 다운샘플링을 설명하라. 장면이 2m × 2m × 2m 부피일 때, 300,000점의 포인트 클라우드를 5mm 복셀로 다운샘플링하면 결과 점의 수가 얼마가 될지 추정하라.
  7. 포인트 클라우드의 의미론적 분할과 인스턴스 분할의 차이는 무엇인가? 각각의 응용 예를 하나씩 제시하라.
  8. WIA-SEMI-013의 WIA-PC-Stream 프로토콜과 WIA 포인트 클라우드 파일 형식(확장 PCD)을 비교하라. 실시간 전송과 보관 사이의 핵심 트레이드오프는 무엇인가?