[Reconstruction] hydra code - src/reconstruction/mesh_integrator.cpp

About_work·2024년 10월 15일
0

lifelong scene graph

목록 보기
11/56
  • 생성자와 generateMesh 메서드가 중요

1. 코드 레벨 설명

  • 이 클래스는 TSDF (Truncated Signed Distance Field) 데이터를 기반으로 3D 메쉬를 생성하는 데 사용
  • 이 과정은 Marching Cubes 알고리즘을 사용하여 voxel 데이터로부터 표면을 추출하는 방식으로 이루어집니다.
    • 이 메쉬는 로봇이 탐색하는 환경의 3D 표현을 제공하는 중요한 데이터입니다.

주요 역할

  • TSDF 데이터를 메쉬로 변환: MeshIntegratorTSDF와 기타 레이어 데이터를 기반으로 메쉬를 생성하는 클래스입니다.
  • 내부 및 외부 처리:
    • processInterior()processExterior() 메서드를 통해 TSDF 데이터의 내부와 외부 영역을 처리하여 메쉬를 생성
  • Marching Cubes 알고리즘: 8개의 voxel을 사용하여 Marching Cubes 알고리즘을 통해 메쉬를 생성합니다.

코드의 로직 설명

  1. 메쉬 생성의 전체 흐름

    • TSDF 레이어로부터 Marching Cubes 알고리즘을 사용해 메쉬를 생성
    • generateMesh()에서 먼저 메쉬가 생성될 블록을 할당하고, 해당 블록의 내부(voxel 내부)외부(voxel 경계) 영역을 처리합니다.
    • 내부 영역은 주로 블록 내의 voxel을 처리하고, 외부 영역은 블록의 경계와 이웃 블록을 처리하여 메쉬가 끊기지 않도록 합니다.
    • 메쉬가 생성되면, 업데이트된 블록은 Occupancy 레이어에서 추적되어 메쉬 표면에 위치하는 voxel이 기록됩니다.
  2. Marching Cubes 기반 메쉬 생성

    • 각 voxel의 TSDF 값을 기준으로 Marching Cubes 알고리즘을 적용하여 메쉬를 생성합니다.
    • TSDF 값은 voxel이 물체 표면에 얼마나 가까운지를 나타내며, 이를 기반으로 표면이 추출됩니다.
    • 이 과정에서 8개의 voxel을 사용하여 한 개의 큐브 단위로 메쉬가 생성됨
  3. Occupancy 레이어 처리

    • Occupancy 레이어는 각 voxel이 메쉬 표면에 속하는지 여부를 추적하는 데 사용됩니다.
    • 메쉬 생성 중, 표면에 속하는 voxelOccupancyVoxel에 기록되어 이후 참조할 수 있습니다.

1. 생성자 (MeshIntegrator::MeshIntegrator(const MeshIntegratorConfig& config))

역할:

  • 이 생성자는 MeshIntegrator 객체를 초기화하는 데 사용되며, 주로 메쉬 통합에 필요한 설정(config)을 전달받아 해당 인스턴스를 설정
  • 핵심 요소:
    • config: 메쉬 통합 작업에서 사용될 다양한 설정 값을 담고 있습니다. 이는 MeshIntegratorConfig 구조체를 통해 정의되며, 최소 가중치, 사용 스레드 수, 메쉬를 업데이트할 조건 등 다양한 설정을 포함합니다.

2. generateMesh() 메서드

역할:

  • 이 메서드는 TSDF 데이터를 기반으로 3D 메쉬를 생성하는 핵심 함수
  • TSDF 레이어의 데이터에 따라 내부 블록(voxel)외부 블록(voxel 경계)를 처리하여, Marching Cubes 알고리즘을 사용해 메쉬를 생성
  • 메쉬 통합 과정을 제어하는 주요 함수이며, 멀티스레드를 이용해 병렬 처리로 성능을 최적화합니다.

로직:
1. cube_coord_offsets_ 초기화:

  • cube_index_offsets_라는 사전에 정의된 행렬을 기반으로, voxel의 좌표 오프셋을 계산합니다.
  • 각 voxel은 3D 공간에서 8개의 코너를 가지며, 이 코너의 위치를 오프셋으로 나타냅니다.
  • 이를 통해 voxel의 각 꼭짓점 좌표를 정의하고, Marching Cubes 알고리즘에서 이를 사용해 메쉬를 생성합니다.
  • cubecoord_offsetsvoxel의 크기(voxel_size)를 고려하여 좌표 오프셋을 계산합니다.
  1. 블록 할당 (allocateBlocks):

    • 메쉬를 생성할 블록들을 먼저 할당합니다.
    • TSDF 레이어에서 메쉬가 업데이트된 블록(mesh_updated 플래그가 true인 블록)만 처리할지 여부는 only_mesh_updated_blocks에 의해 결정됩니다.
    • tsdf.blockIndicesWithCondition(TsdfBlock::meshUpdated): 메쉬가 업데이트된 블록의 인덱스를 가져옵니다.
    • tsdf.allocatedBlockIndices(): 할당된 모든 블록의 인덱스를 가져옵니다.
    • 이후 allocateBlocks() 함수에서는 각 블록에 대해 메쉬 레이어와 occupancy 레이어에서 필요한 메모리를 할당하고 초기화합니다.
  2. 내부 및 외부 처리 (launchThreads):

    • 내부 처리외부 처리를 별도로 나누어 메쉬를 생성합니다. 내부 처리는 블록 내부의 voxel을, 외부 처리는 블록 경계의 voxel을 처리합니다.
    • launchThreads()를 사용하여 블록 인덱스에 따라 멀티스레드를 통해 내부와 외부 처리를 나누어 병렬 처리합니다. 각 스레드는 내부/외부 블록을 나누어 처리하고 메쉬를 생성합니다.
    • 내부와 외부를 구분하는 이유는 경계에서의 voxel 처리가 매우 중요하기 때문입니다. 외부 경계에서는 이웃한 블록의 voxel과의 연계성이 필요하므로 처리가 다소 복잡합니다.
  3. 메쉬 업데이트 플래그 처리:

    • 메쉬가 생성된 후, clear_updated_flag가 true인 경우에는 TSDF 블록mesh_updated 플래그를 false로 설정하여 해당 블록이 메쉬 생성이 완료되었음을 나타냅니다.
    • 이 플래그는 이후 메쉬가 다시 업데이트되거나 재생성될 때 유용하게 사용됩니다.

세부적으로

  • cube_index_offsets_cube_coord_offsets_:

    • cube_index_offsets_는 3D voxel에서 각 꼭짓점(corner)의 상대적인 위치를 정의하는 정수 오프셋입니다.
    • 예를 들어, 한 voxel의 코너는 (0, 0, 0)에서 (1, 1, 1)로 이어지는 8개의 포인트로 구성되며, 이러한 좌표를 정의하는 것이 cube_index_offsets_입니다.
    • cube_coord_offsets_는 이 인덱스를 voxel의 크기와 곱하여 실제 공간에서의 좌표 오프셋을 계산합니다.
  • 내부/외부 처리:

    • 내부 처리(processInterior)는 TSDF 블록의 내부 voxel을 처리합니다. 이는 일반적으로 경계에 속하지 않는 voxel이므로 처리가 비교적 단순합니다.
    • 외부 처리(processExterior)는 블록 경계를 처리하며, 이는 이웃 블록의 voxel과 연관이 있기 때문에 경계 voxel에 대한 특별한 처리가 필요합니다.
    • 내부와 외부 처리를 각각 나누어 처리하는 이유는 메쉬의 경계 처리가 매우 중요하기 때문입니다. 외부에서의 처리는 이웃 블록과의 연결성을 고려해야 하기 때문에 별도로 다루어집니다.
  • 멀티스레드 처리:

    • launchThreads() 함수는 각 블록에 대해 내부외부의 메쉬 생성을 병렬로 처리합니다. 주어진 블록 인덱스에 대해 내부 또는 외부 처리를 각각 멀티스레드로 나누어 진행합니다.
    • 각 스레드는 BlockIndexGetter를 사용하여 다음에 처리할 블록 인덱스를 가져옵니다. 이를 통해 스레드 간 충돌을 방지하고 블록을 효율적으로 분배합니다.
  • Marching Cubes 알고리즘:

    • MarchingCubes::meshCube() 함수는 8개의 voxel 데이터를 기반으로 하나의 큐브에서 메쉬를 생성합니다. 이때 각 voxel의 TSDF 값이 사용됩니다.
    • TSDF 데이터는 각 voxel이 물체의 표면에서 얼마나 떨어져 있는지를 나타내므로, 거리 정보(distance)가중치(weight)를 기반으로 표면을 추출합니다.

결론

  • 생성자에서는 메쉬 통합에 필요한 설정을 받고, TSDF 데이터를 메쉬로 변환할 준비를 합니다.
  • generateMesh()는 TSDF 데이터를 기반으로 메쉬를 생성하는 주요 함수입니다. 이를 위해 내부외부 voxel을 각각 처리하고, Marching Cubes 알고리즘을 사용해 메쉬를 생성합니다.
  • 내부와 외부 처리를 병렬로 나누어 멀티스레드로 처리하며, 성능을 최적화합니다. 경계 처리는 이웃 블록과의 연결성을 유지하기 위해 외부 처리에서 신중하게 다루어집니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글