LiDAR 종류

구동 방식에 따른 LiDAR 종류는 크게 다음과 같은 종류를 가진다.

  1. Spinning LiDAR
    내부에 물리적인 회전을 동반하여 360도 방향으로 데이터를 수집.
    데이터의 정확도가 좋고 넓은 수평 시야각을 가진다.
    하지만 해상도가 낮다.
  2. Scanning (solid state LiDAR)
    한 방향을 스캔하여 데이터를 수집.
    높은 해상도를 가진다.
    하지만 데이터의 정확도가 부족하고 수평 시야각이 좁다.

1. LiDAR 데이터 표현

voxel은 3차원 공간을 쪼개서 나타낸다.
우리가 지금 존재하는 공간을 여러 개의 사각형 박스로 나눈다고 생각해 보자.

센서가 물체를 감지할 때 박스는 채워진다.

이렇게 되면 주변의 빈 공간이 생긴다.

빈 공간은 불필요한 연산을 야기한다.

 

따라서 조금 더 컴팩트한 point cloud를 사용한다.

3차원 형상을 여러 점 군으로 표현한 방식이다.

표현이 상대적으로 간결하고 이를 처리하는 속도도 나쁘지 않다.

 

1.1 point cloud

point cloud에는 다양한 정보를 넣을 수 있다.

좌표, 법선 벡터(normal vector), 포인트의 색상, 반사 강도(intensity) 등등.

 

point cloud의 특성

raw데이터의 순서가 무작위다.

여러 정보를 하나의 point에 할당 가능하다.

센서로부터 물체의 거리가 멀면 sparse, 가까우면 dense 한 점군이 형성된다.

 

point cloud 쓰임

localization

obejct detection

semantic segmentation

registration

classification

등등

 

2. point cloud 시각화

point cloud는 raw데이터를 직접 보는 게 굉장히 어렵다.

LiDAR를 연결하고 topic echo를 해보면 터미널창이 무서운 속도로 스킵된다.

 

[4] YdLidar G4 라이다센서 데이터 받아오기

라이다센서 라이다센서는 Ydlidar의 G4모델을 사용하였다. 중국 회사의 제품이지만 가격대비 나쁘지 않은 성능을 보여준다. 그리고 아래 작성한 튜토리얼은 YdLidar가 아니더라도 대부분의 라이다

merobot.tistory.com

위 글에서는 ROS의 시각화 담당 rviz를 이용해서 LiDAR의 실시간 데이터를 받아왔다.

그렇다면 라이다 데이터를 받아서 만든 point cloud 를 다루는 방법은?

정말 감사하게도 다양한 라이브러리가 존재한다.

  • open3D
  • PCL
  • cilantro

2.1 open3D

 

Open3D – A Modern Library for 3D Data Processing

Introduction Open3D is an open-source library that supports rapid development of software that deals with 3D data. The Open3D frontend exposes a set of carefully selected data structures and algorithms in both C++ and Python. The backend is highly optimize

www.open3d.org

open3D는 3D데이터 프로세싱을 위한 라이브러리다.

비교적 최신 라이브러리다.

C++과 Python을 지원하기 때문에 python으로 시작이 가능하다.

 

python으로 설명을 해본다.

python은 3.8에서 3.11까지 지원한다.
꼭 버전을 확인해 보자.

 

그리고 OS는 ubuntu 18.04, 윈도우 10,  mac os 10.15 이상이면 된다.

pip 설치를 해준다.

pip install -U pip>=20.3
pip3 install open3d

 

2.1.1 point cloud 데이터 시각화

본인이 사용하는 IDE에서 python 파일 하나를 만들어준다.

 

그냥 o3d_test.py로 만들었다.

 

point cloud 데이터는 open3d에서 제공하는 built-in 데이터를 다운로드하면 된다.

import open3d as o3d

ply_point_cloud = o3d.data.EaglePointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)

o3d.visualization.draw_geometries(
    [pcd],
)

먼저 built-in 데이터인 EaglePointCloud를 받아오겠다고 선언한다.

이후 pcd 변수에 해당 point cloud 데이터를 읽어온다.

마지막으로 visualization 기능을 이용해 pcd를 시각화한다.

결과는 다음과 같다.

 

-- 마우스 뷰 컨트롤 --
  왼쪽 버튼 + 드래그           : 회전
  컨트롤 + 왼쪽 버튼 + 드래그   : 병진
  휠 버튼 + 드래그            : 병진
  쉬프트 + 왼쪽 버튼 + 드래그   : roll 회전
  휠                        : 줌 인/아웃

-- 키보드 뷰 컨트롤 --
  [/]          : field of view 증가/감소
  R            : 뷰 포인트 리셋
  컨트롤/Cmd + C : 현재 뷰 상태를 클립보드에 복사
  컨트롤/Cmd + V : 클립보드로부터 뷰 상태를 붙여넣기

-- 일반적인 컨트롤 --
  Q, Esc       : 창 닫기
  H            : 도움말 표시
  P, PrtScn    : 화면 캡처
  D            : depth 캡처
  O            : 현재 랜더링 설정을 캡처

visualization.draw_geometries에는 여러 인자를 넣을 수 있다.

zoom, front, lookat, up 인자가 있으며 보통 pcd를 알고 있을 때 내가 원하는 초기 위치를 지정하는데 쓴다.

2.1.2 Voxel Downsampling

복셀 다운샘플링은 LiDAR 데이터를 다룰 때 자주 사용되는 기법이다.

앞서 언급했듯이 공간을 작은 3D 상자인 voxel로 나눈다.

각 voxel 내의 포인트들을 단일 포인트로 근사해서 처리한다.

Raw 데이터의 특징을 유지하면서 데이터를 효과적으로 줄일 수 있게 도와준다.

 

작은 데이터는 체감이 안되지만 large 데이터셋을 불러오고 작업하려면 다운샘플링이 필요하다.

 

open3D에서는 함수 하나로 복셀 다운샘플링이 가능하다.

import open3d as o3d

ply_point_cloud = o3d.data.EaglePointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
downpcd = pcd.voxel_down_sample(voxel_size=0.1) # 여기 추가

o3d.visualization.draw_geometries(
    [pcd],
)

확실히 sparse 한 분포를 보인다.

2.1.3 Normal Vector 

import open3d as o3d

ply_point_cloud = o3d.data.EaglePointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
downpcd = pcd.voxel_down_sample(voxel_size=0.1)
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(max_nn=30,radius=0.01)) # 여기 추가
o3d.visualization.draw_geometries(
    [pcd],
)

Normal vector를 시각화했다.

2.2 Cloud Compare

 

CloudCompare - Downloads

CloudCompy, by Paul Rascle This project allows one to load clouds and access their internal data as numpy arrays, call some of CloudCompare's algorithms, apply your own processes, and save the result. the reference documentation can be found here the lates

cloudcompare-org.danielgm.net

sudo apt update
sudo apt install snapd
sudo snap install cloudcompare

 

위 커맨드를 터미널에 입력하여 설치한다.

아이콘

설치가 다 되었다면 아이콘이 생긴다.

클릭해서 오픈.

아까 open3D에서 다운로드한 built-in 데이터를 열어보려 한다.

리눅스 환경 기준으로 아까 다운받은 파일 명을 서칭 한다.

혹은 최근 사용 목록에 가서 찾은 후 잘 보이는 곳에 복사해 둔다.

보통은 이곳에 ply 파일이 다운로드하여진다.

 

자 이제 Cloud Compare 좌측 상단의 file의 open을 누른다.

ply 확장자의 데이터를 선택해 준다.

그냥 Apply all.

ply가 정상적으로 시각화된다. 

 

더보기

마지막 수정

2024. 05. 11