DEEP.I - Lab

오프라인 공간의 지능화를 꿈꾸는 딥아이 연구실입니다.

Matlab

[Matlab] 극좌표계를 이용한 LIDAR 라이다 PCD 데이터 Segmentation #2

Jongwon Kim 2021. 1. 4. 21:22
반응형

Concept

지난 포스팅에 이은 라이다 데이터 전처리 기법 #2, PCD Segmentation 알고리즘입니다.

 

일반적인 라이다는 360도 전 구간에서 데이터를 수집합니다. 모든 데이터가 필요하기도 하지만, 측면이나 후면에 부착된 도로 주행 분석 시스템에서는 불필요 데이터를 제거해야 합니다. 이를 위해 방사되는 각도에 따른 분할 알고리즘을 구현해보도록 하겠습니다.

 

그림 1. PCD 데이터 시각화

POST

1.라이다 데이터 전처리 [KITTI DATASET 활용하기]

2. 각도에 따라 라이다 데이터 분할하기 [Segmentation]

3. 변환 행렬을 이용하여 라이다 데이터 축 변환하기 [Transformation]
4. 복셀화를 이용한 LIDAR 라이다 PCD 데이터 압축 [Voxcelization]

 

 

Algorithm (Polar Coordinates)

분할을 위해 극좌표계 (polar coordinate system)의 개념이 도입됩니다. 극좌표계는 평면 위의 위치를 각도와 거리를 써서 나타내는 좌표계입니다. X, Y로 표현되는 직교 좌표계에서는 삼각함수로 복잡하게 나타나는 관계가 간단하게 표현되기에 PCD 데이터 전처리에도 유용하게 사용됩니다. 

 

PCD는 3차원 데이터지만 라이다 PCD가 센서(원점)로부터 방사되는 형태이기 때문에 반지름 성분과 각 성분으로 결정할 수 있습니다. 반지름은 원점으로부터 거리를 나타내며 각 성분은 X축 또는 Y축을 기반으로 반시계 방향으로 잰 각의 크기를 나타냅니다.

 

  • 반지름 $ r = \sqrt{x^2 + y^2)} $

 

  • 각도 $ \theta = tan^{-1} (y  /  x) $

 

위 수식을 통해 극좌표계로 쉽게 변환되며,  그림 2와 같이 Z 축은 고정하고 변환을 해주면 됩니다.

 

그림 2. PCD 데이터 좌표계 변환

 

SourceCode

1. SorceCode 및 데이터 다운로드

github.com/DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

 

DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

Pre-processing Technique of LIDAR PCD Data Using KITTI-Dataset - DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

github.com

git clone github.com/DEEPI-LAB/LiDAR-Point-Cloud-Preprocessing-matlab

 

2. X, Y, Z 축을 기준으로 임계값 제거

그림 1과 같이 라이다 센서는 이론적으로 100m 이상 센싱할 수 있습니다. 하지만 방사되는 빛의 특성으로 무의미한 값들이 많이 분포하게 됩니다. 데이터를 정규화하고 기준값을 지정하기 위해 우선, 좌표값을 기준으로 데이터를 추출합니다.

 

하단의 코드는 PCD 정규화를 위해 추출되는 영역을 지정하는 함수입니다. 

 

function xyzi = ROIextraction(xyzi,x,y,z,flag)

if (flag == 'height')
    
    xyzi = xyzi(xyzi(:,1) > x(1) & xyzi(:,1) < x(2) & xyzi(:,2) > y(1) & xyzi(:,2) < y(2),:);
    xyzi = xyzi(xyzi(:,3) > z(1) & xyzi(:,3) < z(2),:);
    
elseif (flag == 'intensity')
    
    xyzi = xyzi(xyzi(:,1) > x(1) & xyzi(:,1) < x(2) & xyzi(:,2) > y(1) & xyzi(:,2) < y(2),:);
    xyzi = xyzi(xyzi(:,4) > z(1) & xyzi(:,4) < z(2),:);

else
    error('No matching values found');
end

 

X축 기준 -30 ~ 30, Y축 기준 -30 ~ 30, Z축 기준 -2 ~ 5m로 PCD를 추출합니다. KITTI 데이터는 차량에서 수집되어 원점이 지상에서 2m가량 높기 때문에 -2 이하 데이터를 제거했습니다. 정규화 이후, 이전 포스팅에서 구현한 시각화 함수를 적용하면 그림 3과 같이 지정된 영역 내 데이터로 추출된 PCD를 확인할 수 있습니다. 

 

% 2nd preprocessing
xyzi = ROIextraction(xyzi,[-30,30],[-30,30],[-2,5],'height'); 

%2D scatter
visualization2D(xyzi)

그림 3. 임계값을 기준으로 추출된 PCD

3. 극좌표계 변환

section 값은 분할된 각도 영역의 크기를 나타냅니다. 예를 들어 30으로 지정하면, 360 / 30 = 12개의 영역으로 분할 됩니다.  atan2 함수를 통해 극좌표계의 각도 값을 추출한 뒤, 이를 PCD의 인덱스 idx로 할당합니다.

 

반환되는 값은 PCD 모든 점 데이터에 대응하는 각도값 인덱스가 되며 gscatter 함수로 시각화하면 그림 4와 같습니다.

function idx = segmentation(xyzi,section)

alpha = section; 
num = 180/alpha;
num = -num : 1 : num ;
idx = zeros(size(xyzi,1),1);
seg= rad2deg(atan2(xyzi(:,1),xyzi(:,2))) / alpha;

for i = 1 : 360/alpha
    
    temp_1 = num(i);
    temp_2 = num(i+1);
    idx(find(seg >= temp_1 & seg < temp_2)) = i;
    
end
end

그림 4. 각도에 따라 분할된 PCD 영역

 

추출을 원하는 인덱스를 기준으로 PCD를 정리하면 그림 5와 같이 관심 영역을 설정할 수 있습니다.

 

roi = xyzi(aidx == 2,:);
gt = xyzi(aidx ~= 2,:);
scatter(roi (:,1),roi (:,2),'.r');
hold on
scatter(gt (:,1),gt  (:,2),'.k');

그림 5. 최종 Segmentation 결과 시각화

Reference

  • Fast segmentation of 3D point clouds for ground vehicles (2010, June)
  • On the Segmentation of 3D Lidar Point Clouds

 

 

Your Best AI Partner DEEP.I
AI 바우처 공급 기업
객체 추적 및 행동 분석 솔루션 | 제조 생산품 품질 검사 솔루션 | AI 엣지 컴퓨팅 시스템 개발

인공지능 프로젝트 개발 외주 및 상담
E-mail: contact@deep-i.ai
Site: www.deep-i.ai
 

딥아이 DEEP.I | AI 기반 지능형 기업 솔루션

딥아이는 AI 기술의 정상화라는 목표를 갖고, 최첨단 딥러닝 기술 기반의 기업 솔루션을 제공하고 있으며, 이를 통해 고도의 AI 기반 객체 탐지, 분석, 추적 기능을 통합하여 다양한 산업 분야에

deep-i.ai

 

반응형