[Backend] hydra code - src/backend/backend_module.cpp - copyMeshDelta

About_work·2024년 10월 23일
0

lifelong scene graph

목록 보기
44/56

핵심 요약! 이거만 보면 돼!

  • copyMeshDelta 메서드는 프론트엔드로부터 받은 메쉬 업데이트를 기반으로 백엔드의 메쉬 표현과 동적 장면 그래프(DSG)를 갱신
  1. 메쉬 업데이트 수신: 프론트엔드에서 전달된 메쉬 변경 사항을 받아옵니다.
  2. 메쉬 업데이트 적용: 이 변경 사항을 백엔드의 DSG 메쉬에 적용하여 정점과 면을 업데이트합니다.
  3. 원본 정점 및 타임스탬프 동기화: 메쉬의 원본 정점 위치와 각 정점의 타임스탬프를 업데이트하여 메쉬 데이터의 일관성을 유지합니다.
  4. 아카이브된 정점 수 추적: 비활성화된(아카이브된) 정점의 수를 업데이트하여, 활성 정점에만 변형이 적용되도록 관리합니다.
  5. 2D 장소 노드 업데이트: DSG 내의 모든 2D 장소 노드의 메쉬 연결과 경계 정보를 메쉬 업데이트에 따라 갱신합니다.
  6. 공간적 관계 유지: 메쉬와 장소 노드의 업데이트를 통해 DSG 내의 모든 공간적 관계가 정확하고 유효하게 유지되도록 합니다.

Hydra Backend의 copyMeshDelta 함수 이해하기

  • copyMeshDelta 함수는 들어오는 frontend 모듈의 출력값(특히 메쉬 업데이트)를 기반으로 메쉬 데이터 구조를 갱신하는 중요한 역할
  • copyMeshDelta 함수는 백엔드의 메쉬 표현과 DSG의 2d 장소 노드의 일관성과 정확성을 유지하는 데 필수적

7. 전체적인 통합

  1. 메쉬 업데이트 수신

    • 백엔드는 mesh_update를 포함하는 BackendInput을 수신
    • mesh_update에는 메쉬에 적용해야 할 모든 변경 사항이 포함
  2. 메쉬 업데이트 적용

    • copyMeshDeltamesh_updateupdateMesh를 호출하여 DSG의 메쉬 정점과 면을 업데이트
    • 원본 정점과 타임스탬프도 동기화를 유지하기 위해 업데이트됩니다.
  3. 아카이브된 정점 추적

    • num_archived_vertices_는 아카이브된 정점을 반영하도록 업데이트됩니다.
      • 이는 2d 장소 노드를 올바르게 업데이트하고 비활성 정점에 변형을 적용하는 것을 방지하는 데 중요합니다.
  4. 장소 노드 업데이트

    • updatePlaces2d는 활성 메쉬 인덱스를 가진 모든 2D 장소 노드를 순회합니다.
    • 각 장소 노드의 메쉬 연결과 경계를 updatePlace2dMeshupdatePlace2dBoundary를 사용하여 업데이트합니다.

2. copyMeshDelta 함수

함수의 목적

copyMeshDelta의 주요 목적은 프론트엔드로부터 받은 메쉬 업데이트를 -> 백엔드의 내부 데이터 구조에 적용하는 것입니다. 여기에는 다음이 포함됩니다:

  • 메쉬의 정점과 면을 업데이트.
  • 아카이브된(비활성화된) 정점을 추적.
  • 메쉬의 변경 사항을 반영하도록 DSG의 장소 노드를 업데이트.

상세한 분석

  1. 메쉬 업데이트 적용

    MeshDeltaupdateMesh 메서드를 호출하여 메쉬의 정점과 면을 업데이트합니다.

    input.mesh_update->updateMesh(*private_dsg_->graph->mesh());
    • private_dsg_: 백엔드에서 사용되는 DSG에 대한 포인터.
    • graph->mesh(): DSG의 메쉬 구성 요소에 접근.
  • 여기서 input.mesh_update는 프론트엔드에서 전달된 메쉬 변경 사항을 담고 있습니다.
    • updateMesh 함수는 이 변경 사항을 백엔드의 DSG 메쉬(*privatedsg->graph->mesh())에 적용합니다.
    • 즉, 프론트엔드의 출력인 mesh_update를 백엔드의 DSG 메쉬에 추가하는 것입니다.
  1. 원본 정점 및 타임스탬프 업데이트

    원본 정점과 타임스탬프를 보유하는 StampedCloud 객체를 생성한 후, updateVertices 메서드를 호출하여 이들을 업데이트합니다.

    kimera_pgmo::StampedCloud<pcl::PointXYZ> cloud_out{*original_vertices_, vertex_stamps_};
    input.mesh_update->updateVertices(cloud_out);
    • original_vertices_: 메쉬 정점의 원래 위치를 저장.
    • vertex_stamps_: 각 정점에 연관된 타임스탬프.
    • 목적: 원본 정점 데이터가 메쉬 업데이트와 동기화되도록 보장합니다.
  • 이 역시 mesh_update에 저장된 변경 사항을 cloud_out에 적용하는 것입니다.
  • 즉, 프론트엔드에서 전달된 메쉬 업데이트를 -> 백엔드의 원본 정점 데이터(originalvertices와 vertexstamps)에 적용하여 동기화하는 과정입니다.
  1. 아카이브된 정점 수 업데이트

    getTotalArchivedVertices를 사용하여 아카이브된 정점의 수를 업데이트합니다.

    num_archived_vertices_ = input.mesh_update->getTotalArchivedVertices();
    • 목적: 더 이상 활성화되지 않은 정점을 추적하여 변형 작업이 활성 정점에만 적용되도록 합니다.
  2. DSG의 장소 노드 업데이트

    updatePlaces2d 유틸리티 함수를 호출하여 메쉬 업데이트를 기반으로 DSG의 2D 장소 노드를 업데이트합니다.

    utils::updatePlaces2d(private_dsg_, *input.mesh_update, num_archived_vertices_);
    • 목적: 장소 노드와 메쉬 정점 간의 연관성을 최신 상태로 유지합니다.

3. MeshDelta 클래스

  • MeshDelta 클래스는 적용해야 할 메쉬의 변경 사항을 캡슐화합니다.
    • 여기에는 정점 추가, 삭제, 업데이트 및 면 업데이트가 포함

주요 메서드

  1. updateMesh

    메쉬의 정점, 타임스탬프, 면, 선택적으로 의미 정보를 업데이트합니다.

    void updateMesh(pcl::PointCloud<pcl::PointXYZRGBA>& vertices,
                    std::vector<Timestamp>& stamps,
                    std::vector<pcl::Vertices>& faces,
                    std::vector<uint32_t>* semantics) const;
    • 내부적으로 updateVerticesupdateFaces를 호출합니다.
    • 목적: 한 번의 함수 호출로 모든 메쉬 업데이트를 적용합니다.
  2. updateVertices

    다양한 경우를 처리하기 위해 오버로드되어 있으며, 정점 위치, 타임스탬프 및 의미 정보를 업데이트합니다.

    void updateVertices(pcl::PointCloud<pcl::PointXYZRGBA>& vertices,
                        std::vector<Timestamp>* stamps,
                        std::vector<uint32_t>* semantics) const;
    • 사용 가능한 데이터에 따라 매개변수의 다양한 조합을 처리합니다.
    • 목적: 의미 정보와 타임스탬프의 변경 가능성을 고려하여 정점 데이터가 올바르게 업데이트되도록 합니다.
  3. getTotalArchivedVertices

    아카이브된 정점의 총 수를 반환합니다.

    size_t getTotalArchivedVertices() const;
    • vertex_start + num_archived_vertices_로 계산됩니다.
    • 목적: 다른 함수에서 사용할 수 있도록 비활성 정점의 수를 제공합니다.

내부 데이터 구조

  • vertex_updates

    • 업데이트된 정점 데이터를 저장합니다.
    • 목적: 메쉬에 적용해야 할 신규 또는 수정된 정점을 보유합니다.
  • stamp_updates

    • 정점의 타임스탬프 업데이트를 저장합니다.
    • 목적: 각 정점이 언제 업데이트되었는지 추적합니다.
  • num_archived_vertices_

    • 아카이브된 정점의 수를 계산합니다.
    • 목적: 활성 정점에만 업데이트를 적용하도록 관리합니다.
  • deleted_indices

    • 삭제된 정점의 인덱스를 포함하는 집합.
    • 목적: 다른 데이터 구조에서 삭제된 정점에 대한 참조를 제거하는 데 사용됩니다.
  • prev_to_curr

    • 이전 정점 인덱스에서 업데이트된 인덱스로의 매핑.
    • 목적: 정점 인덱스가 업데이트로 인해 변경될 때 일관성을 유지합니다.

4. 장소 노드 업데이트: updatePlaces2d

updatePlaces2d 함수는 메쉬에 가해진 변경 사항을 반영하도록 DSG의 장소 노드를 업데이트합니다.

함수의 목적

  • DSG에서 활성 메쉬 인덱스를 가진 모든 2D 장소 노드를 순회합니다.
  • 각 장소 노드의 메쉬 연결 및 경계 정보를 메쉬 업데이트에 따라 갱신합니다.
  • 장소 노드가 업데이트된 메쉬에서 연관된 영역을 정확하게 나타내도록 합니다.

상세한 분석

  1. 장소 노드 순회

    MESH_PLACES 레이어의 각 노드를 순회합니다.

    for (auto& id_node_pair : dsg->graph->getLayer(DsgLayers::MESH_PLACES).nodes()) {
      auto& attrs = id_node_pair.second->attributes<spark_dsg::Place2dNodeAttributes>();
      if (!attrs.has_active_mesh_indices) {
        continue;
      }
    
      updatePlace2dMesh(attrs, mesh_update, num_archived_vertices);
      updatePlace2dBoundary(attrs, mesh_update);
    }
    • 속성 추출: 각 노드의 Place2dNodeAttributes를 가져옵니다.
    • 활성 메쉬 인덱스 확인: 활성 메쉬 연결이 없는 노드는 건너뜁니다.
    • 메쉬 연결 및 경계 업데이트: 각 노드의 데이터를 업데이트하는 도우미 함수를 호출합니다.

5. 장소 노드의 메쉬 연결 업데이트

함수의 목적

updatePlace2dMesh 함수는 메쉬 업데이트에 따라 장소 노드의 메쉬 연결을 갱신합니다.

  • 삭제된 정점에 대한 참조를 제거합니다.
  • 변경된 정점 인덱스를 업데이트합니다.
  • 장소 노드에 연결된 최소 및 최대 메쉬 정점 인덱스를 재계산합니다.
  • 장소 노드에 여전히 활성 메쉬 연결이 있는지 판단합니다.
  1. 활성 상태 판단

    장소 노드에 여전히 활성 메쉬 연결이 있는지 확인합니다.

    if (attrs.pcl_max_index < num_archived_vertices) {
      attrs.has_active_mesh_indices = false;
    }
    • 목적: 연결된 모든 정점이 아카이브된 경우 노드를 비활성화로 표시합니다.

6. 장소 노드의 경계 업데이트

함수의 목적

updatePlace2dBoundary 함수는 메쉬 업데이트에 따라 장소 노드의 경계 정보를 갱신합니다.

  • 삭제된 정점과 연결된 경계 점을 제거합니다.
  • 경계 연결의 정점 인덱스를 업데이트합니다.
  • 업데이트된 메쉬에서 장소 노드의 영역을 정확하게 나타내도록 경계를 보장합니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글