상세 컨텐츠

본문 제목

[Open3D Tutorial] point cloud distance

AI/Open3D

by 쑤야. 2024. 8. 13. 16:33

본문

point cloud distance


이번 섹션은 포인트 클라우드 간의 거리를 계산하는 것이다.

 

아직 자율주행 관련 프로젝트 경험이 없다보니 포인트 클라우드의 거리 계산이 왜 필요한지, 언제 어떻게 활용되는지 궁금해서 찾아본 것을 먼저 정리해보겠다. 

 

포인트 클라우드 간의 거리 계산의 활용 및 필요성:

  1. 3D 모델 정렬 및 registration
    • 필요성
      : 2 개의 포인트 클라우드를 정렬하는 것은 3D 데이터 처리에서 매우 중요한 작업인데, 이때 각 포인트 클라우드 간의 거리를 최소화하는 방식으로 정렬이 이뤄진다
    • 활용
      : Iterative Closest Point (ICP) 알고리즘은 두 포인트 클라우드를 정렬하기 위해 반복적으로 포인트 간의 거리를 계산하고, 이를 기반으로 변환 행렬을 업데이트한다. 정렬이 완료되면 두 포인트 클라우드 간의 평균 거리 또는 최대 거리가 최소화되며, 이를 통해 정렬의 품질을 평가할 수 있다
  2. 3D 모델 품질 검증 및 에러 분석
    • 필요성
      : 3D 모델을 생성하는 과정에서 실제 데이터(포인트 클라우드)와 모델(메쉬 또는 다른 포인트 클라우드) 간의 차이를 분석하는 것이 중요하다. 예를 들어, 3D 스캐너로 스캔한 데이터를 기반으로 CAD 모델을 제작한 후, 이 CAD 모델이 실제 스캔 데이터와 얼마나 일치하는지를 확인해야 한다
    • 활용
      : 포인트 클라우드와 생성된 모델 간의 거리를 계산하여 차이를 분석할 수 있다. 이 차이가 클수록 모델의 품질이 낮음을 의미하는데, 이를 통해 제작된 모델의 정밀도를 평가하거나 제조 공정에서 발생할 수 있는 오류를 미리 감지할 수 있다
  3. 물체 인식 및 위치 추적
    • 필요성
      : 로봇 공학이나 자율 주행차와 같은 시스템에서 특정 물체의 위치를 정확히 인식하고 추적하는 것이 필요한데, 물체의 포인트 클라우드를 미리 알고 있다면 실시간으로 수집된 포인트 클라우드와 비교하여 물체의 위치를 추정할 수 있다
    • 활용
      : 이 경우, 실시간으로 수집된 포인트 클라우드와 미리 저장된 물체의 포인트 클라우드 간의 거리를 계산한다. 최적의 정렬(즉, 가장 작은 거리를 제공하는 위치)을 찾음으로써 물체의 정확한 위치를 추적할 수 있는데, 이는 로봇의 정확한 움직임을 제어하거나 자율 주행 차량이 장애물을 회피하도록 하는 데 사용된다
  4. 충돌 감지 및 회피
    • 필요성
      : 3D 환경에서 로봇이 움직이거나 물체가 이동할 때, 다른 물체와의 충돌을 피하는 것이 중요한데, 이를 위해 실시간으로 포인트 클라우드를 이용해 주변 환경을 스캔하고, 이동 경로상의 장애물을 감지할 수 있다
    • 활용
      : 이동 경로상의 장애물과 로봇의 포인트 클라우드 간의 거리를 실시간으로 계산하여, 특정 임계값 이내로 거리가 좁혀지면 충돌 경고를 발생시키거나 회피 경로를 계산할 수 있으며 이는 안전한 로봇 작동을 보장하는 데 필수적
  5. 3D 데이터 기반 변화 탐지
    • 필요성 
      : 같은 장소나 물체를 다른 시점에 스캔한 포인트 클라우드를 비교하여, 시간에 따른 변화(예: 건물의 균열, 침식, 구조물의 변형 등)를 탐지할 수 있다
    • 활용
      : 두 시점에서의 포인트 클라우드 간의 거리를 계산하여, 특정 부분에서 큰 변화가 있는지를 분석할 수 있다. 이는 건설 현장 모니터링, 유지보수, 재난 대응 등 다양한 분야에서 중요한 역할을 한다. 

import open3d as o3d
import numpy as np

# Load data
demo_crop_data = o3d.data.DemoCropPointCloud()
pcd = o3d.io.read_point_cloud(demo_crop_data.point_cloud_path)
vol = o3d.visualization.read_selection_polygon_volume(demo_crop_data.cropped_json_path)
chair = vol.crop_point_cloud(pcd)

dists = pcd.compute_point_cloud_distance(chair)
dists = np.asarray(dists)
ind = np.where(dists > 0.01)[0]
pcd_without_chair = pcd.select_by_index(ind)

o3d.visualization.draw_geometries(
    [pcd_without_chair],
    zoom=0.3412,
    front=[0.4257, -0.2125, -0.8795],
    lookat=[2.6172, 2.0475, 1.532],
    up=[-0.0694, -0.9768, 0.2024]
)

'AI > Open3D' 카테고리의 다른 글

[Open3D Tutorial] convex hull  (0) 2024.08.14
[Open3D Tutorial] bounding volumes  (0) 2024.08.13
[Open3D Tutorial] vertex normal estimation  (0) 2024.08.12
[Open3D Tutorial] voxel downsampling  (0) 2024.08.12
[Open3D Tutorial] visualize point cloud  (0) 2024.08.12

관련글 더보기