[open3d / reconstruction system (Tensor)] 1. Voxel Block Grid

About_work·2024년 9월 14일
0

SLAM

목록 보기
4/12

  • 복셀 블록 그리드는 3D 장면을 나타내기 위한 전역적으로 희소하고, 지역적으로 밀집된 데이터 구조입니다.
  • 3D 공간에서 2D 객체의 표면은 일반적으로 작은 부분만 차지하기 때문에
    • 전역적으로 희소하지만,
    • 연속적인 표면을 나타내기 위해 지역적으로는 밀집되어 있습니다.
  • 이러한 구조를 표현하기 위해 먼저 3D 공간을 대략적으로 블록 그리드로 나눕니다.
  • 표면이 포함된 블록은 해시 맵에 3D 좌표로 정리되어 저장되며(전역적으로 희소함),
  • 각 블록은 밀집된 복셀로 더 세분화되어 배열 인덱스를 통해 접근할 수 있습니다(지역적으로 밀집됨).
    • 복셀 해시 맵을 유지하지 않는 이유는
      • 인접한 데이터를 메모리에 고르게 흩어놓는 대신, 데이터의 지역성을 유지할 수 있기 때문
  • 먼저 해시 맵(https://www.open3d.org/docs/0.14.1/tutorial/core/hashmap.html), 특히 다중 값 해시 맵(Multi-valued Hash Map, https://www.open3d.org/docs/0.14.1/tutorial/core/hashmap.html#Multi-valued-hash-map) 섹션을 확인하여
    • 기본 데이터 구조에 대한 기본 이해를 갖추시기 바랍니다.
    • 자세한 내용은 [Dong2021]을 참조하세요.

구성(Construction)

  • 복셀 블록 그리드는 다음과 같이 구성할 수 있습니다:
# examples/python/t_reconstruction_system/integrate.py
    if config.integrate_color:
        vbg = o3d.t.geometry.VoxelBlockGrid(
            attr_names=('tsdf', 'weight', 'color'),
            attr_dtypes=(o3c.float32, o3c.float32, o3c.float32),
            attr_channels=((1), (1), (3)),
            voxel_size=3.0 / 512,
            block_resolution=16,
            block_count=50000,
            device=device)
    else:
        vbg = o3d.t.geometry.VoxelBlockGrid(attr_names=('tsdf', 'weight'),
                                            attr_dtypes=(o3c.float32,
                                                         o3c.float32),
                                            attr_channels=((1), (1)),
                                            voxel_size=3.0 / 512,
                                            block_resolution=16,
                                            block_count=50000,
                                            device=device)

GPT 설명

  • 공통 속성:
    • voxel_size=3.0 / 512: 각 복셀의 크기를 설정합니다. 여기서는 3m 공간을 512개의 복셀로 나누어 복셀 하나의 크기를 약 0.00586m로 설정합니다.
    • block_resolution=16: 각 복셀 블록이 몇 개의 복셀을 가로, 세로, 깊이로 가지는지를 결정합니다. 여기서는 (16 \times 16 \times 16) 크기의 복셀 블록을 생성합니다.
    • block_count=50000: 해시 맵에 포함될 최대 블록 수를 설정합니다.
      • 여기서는 최대 50,000개의 블록을 관리합니다.
      • TODO: 이걸 바꿔야할수도
    • device=device: CPU 또는 GPU를 지정합니다.
2.3 복셀 블록 그리드의 속성
  • attr_names: 복셀 블록이 저장할 속성의 이름입니다.
    • 'tsdf':
      • 잘린 부호 거리 함수(Truncated Signed Distance Function, TSDF)를 저장
      • TSDF는 3D 공간에서 표면을 표현하는 데 사용되는 값
    • 'weight': TSDF 값의 신뢰도를 나타내는 가중치
    • 'color': (선택 사항) 컬러 이미지를 저장하기 위한 속성
  • attr_dtypes: 각 속성의 데이터 타입을 설정합니다. 여기서는 모두 float32로 설정되어 있습니다.
  • attr_channels: 각 속성의 채널 수를 설정합니다.
    • (1): 단일 채널, TSDF와 가중치는 하나의 값을 가집니다.
    • (3): RGB 컬러는 3개의 채널을 가집니다.
3. 해시 맵과 배열 구조
  • 해시 맵:
    • 복셀 블록을 관리하기 위해 사용되며, 전역적으로 공간을 효율적으로 표현
    • 해시 맵의 키는 (3,) 형태의 3D 좌표(정수형)
    • 이 좌표는 각 복셀 블록이 공간에서 어디에 위치하는지를 나타냄
  • 배열의 구조(SoA):
    • 해시 맵의 값은 각 블록에 있는 복셀의 정보를 구조화된 배열(Structure of Array, SoA) 형태로 저장
    • 각 블록은 크기 (16, 16, 16)의 복셀로 구성되며, 각 복셀에 TSDF, 가중치, 그리고 (선택적으로) RGB 컬러 정보가 포함됩니다.
4. 해시 맵의 값 구성 요소
  • TSDF: 잘린 부호 거리 함수로, 블록 내의 각 복셀에 대해 (16, 16, 16, 1) 형태로 저장됩니다. 이 값은 각 복셀의 표면까지의 거리를 나타내며, 3D 공간의 물체 모양을 표현하는 데 사용됩니다.
  • 가중치: TSDF의 신뢰도를 나타내며, 역시 (16, 16, 16, 1) 형태로 저장됩니다.
  • RGB 색상 (선택 사항): 컬러 데이터가 포함될 경우, 각 복셀에 대해 (16, 16, 16, 3) 형태로 RGB 값을 저장합니다.

글 설명

  • 이 예제에서 다중 값 해시 맵은 (3,)의 키 모양과 int32의 데이터 타입을 가지고 있습니다.
  • 해시 맵의 값은 배열의 구조(SoA)로 정리되어 있습니다.
    • 해시 맵의 값에는 다음이 포함됩니다: 기본적으로 다음 항목을 포함합니다:
      • Truncated Signed Distance Function, TSDF: (16, 16, 16, 1)
      • 가중치: (16, 16, 16, 1)
      • (선택적으로) RGB 색상: (16, 16, 16, 3)
  • 경험적으로, 거실 규모의 장면에 대해 빈번한 재해시(rehashing)를 방지하기 위해 50000개의 블록을 예약합니다.
  • 사용자 지정 속성도 추가할 수 있습니다.
    • 예를 들어, float32 타입의 요소 모양 (16, 16, 16, 1)을 가지는 강도(intensity)나
    • int32 타입의 요소 모양 (16, 16, 16, 1)을 가지는 레이블 등을 정의할 수 있습니다.
  • 데이터를 처리하는 방법에 대해서는 "Customized Integration(사용자 정의 통합)"을 참조하세요.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN