[backend] unmerged_graph_, shared_dsg, private_dsg_

About_work·2024년 10월 24일
0

lifelong scene graph

목록 보기
52/56

unmerged_graph_, shared_dsg, private_dsg_의 개념적 정의 및 상호작용

1. 개념적 정의

1.1. shared_dsg (공유된 DSG)

  • 정의: shared_dsg는 시스템 내 여러 모듈(예: 프론트엔드, 루프 클로저 모듈 등)이 공유하는 동적 장면 그래프(Dynamic Scene Graph, DSG)입니다.
  • 역할:
    • 데이터 공유 및 동기화: 여러 모듈 간 환경 정보의 공유와 최신 상태 유지를 위해 사용됩니다.
    • 동시성 관리 필요: 여러 스레드나 모듈이 동시에 접근하므로, 뮤텍스(mutex)와 같은 동기화 메커니즘을 통해 데이터의 일관성을 유지해야 합니다.
  • 사용 위치: 코드에서 state_->backend_graph로 접근하며, updatePrivateDsg 함수에서 참조됩니다.

1.2. private_dsg_ (프라이빗 DSG)

  • 정의: private_dsg_백엔드 모듈이 독립적으로 관리하는 DSG로, 다른 모듈과의 간섭 없이 백엔드 작업을 수행하기 위해 사용됩니다.
  • 역할:
    • 백엔드 전용 그래프: 메쉬 변형, 그래프 최적화 등 백엔드 모듈의 내부 처리에 사용됩니다.
    • 데이터 일관성 유지: 백엔드 모듈이 안정적으로 작업할 수 있도록, 공유된 DSG의 변경 사항을 필요 시 반영하지만 독립적으로 유지됩니다.
  • 사용 위치: 코드 전반에서 private_dsg_로 참조되며, 백엔드 모듈의 주요 작업에 활용됩니다.

1.3. unmerged_graph_ (미병합 그래프)

  • 정의: unmerged_graph_공유된 DSG로부터 가져온 변경 사항을 임시로 저장하는 그래프입니다.
  • 역할:
    • 병합 전 임시 저장소: 공유된 DSG의 변경 사항을 직접 private_dsg_에 적용하기 전에, unmerged_graph_에 임시로 저장하여 안전하게 병합 과정을 관리합니다.
    • 변경 사항 처리: 병합 과정에서 발생할 수 있는 데이터 충돌이나 일관성 문제를 방지하고, 필요한 추가 처리를 수행합니다.
  • 사용 위치: updatePrivateDsg 함수 내에서 unmerged_graph_->mergeGraph(*shared_dsg.graph);를 통해 공유된 DSG의 변경 사항을 받아옵니다.

2. 세 개념의 차이점

  • 공유 여부:

    • shared_dsg: 시스템 전체에서 여러 모듈이 공유하는 그래프입니다.
    • private_dsg_: 백엔드 모듈에서만 사용하는 개인용 그래프입니다.
    • unmerged_graph_: 변경 사항을 임시로 저장하는 그래프입니다.
  • 사용 목적:

    • shared_dsg: 모듈 간의 데이터 공유와 동기화를 위해 사용됩니다.
    • private_dsg_: 백엔드 모듈의 내부 처리와 데이터 일관성을 유지하기 위해 사용됩니다.
    • unmerged_graph_: 공유된 DSG로부터 변경 사항을 받아와 private_dsg_에 안전하게 병합하기 위해 사용됩니다.
  • 동시성 관리:

    • shared_dsg: 여러 모듈이 접근하므로 동기화 메커니즘이 필요합니다.
    • private_dsg_: 백엔드 모듈 내부에서만 사용되므로 상대적으로 동시성 문제가 적습니다.
    • unmerged_graph_: 병합 과정에서만 사용되며, 필요한 경우 동기화를 고려합니다.

3. 세 개념의 상호작용 관계

  1. 변경 사항 수신 및 임시 저장:

    • 백엔드 모듈은 updatePrivateDsg 함수에서 공유된 DSG(shared_dsg)로부터 변경 사항을 가져와 unmerged_graph_에 병합합니다.
    • 이때, shared_dsgunmerged_graph_ 모두 동시성 문제를 방지하기 위해 뮤텍스를 사용하여 동기화됩니다.
  2. 프라이빗 DSG 업데이트:

    • unmerged_graph_에 저장된 변경 사항을 private_dsg_에 병합하여 백엔드 모듈의 DSG를 최신 상태로 업데이트합니다.
    • 이 과정에서 백엔드 모듈은 다른 모듈의 간섭 없이 안정적으로 그래프를 업데이트할 수 있습니다.
  3. 백엔드 처리 작업 수행:

    • 백엔드 모듈은 업데이트된 private_dsg_를 사용하여 메쉬 변형, 그래프 최적화 등의 작업을 수행합니다.
    • 이러한 작업은 백엔드 모듈의 내부 로직에 따라 이루어지며, 다른 모듈과의 독립성을 유지합니다.
  4. 결과 반영 및 통신:

    • 필요에 따라, 백엔드 모듈은 업데이트된 private_dsg_의 정보를 다른 모듈이나 시스템과 공유하기 위해 ZMQ(ZeroMQ)를 통해 전송하거나 Sink 함수를 호출합니다.
    • 이를 통해 시스템 전체의 데이터 일관성을 유지하고, 다른 모듈과의 협업을 지원합니다.

4. 코드 상의 예시를 통한 이해

bool BackendModule::updatePrivateDsg(size_t timestamp_ns, bool force_update) {
  std::unique_lock<std::mutex> graph_lock(private_dsg_->mutex); // private_dsg_ 잠금
  {
    ScopedTimer timer("backend/read_graph", timestamp_ns);

    const auto& shared_dsg = *state_->backend_graph; // shared_dsg 참조
    std::unique_lock<std::mutex> shared_graph_lock(shared_dsg.mutex); // shared_dsg 잠금
    if (!force_update && shared_dsg.last_update_time != timestamp_ns) {
      return false; // 업데이트 필요 없음
    }

    unmerged_graph_->mergeGraph(*shared_dsg.graph); // shared_dsg의 변경 사항을 unmerged_graph_에 병합
  } // 뮤텍스 잠금 해제

  // unmerged_graph_의 변경 사항을 private_dsg_에 병합
  private_dsg_->graph->mergeGraph(*unmerged_graph_, config);

  return true; // 업데이트 성공
}
  • 설명:
    • updatePrivateDsg 함수에서 공유된 DSG로부터 변경 사항을 받아와 unmerged_graph_에 병합합니다.
    • 이후, unmerged_graph_의 내용을 private_dsg_에 병합하여 백엔드 모듈의 그래프를 최신 상태로 유지합니다.
    • 이 과정에서 동기화 메커니즘을 통해 데이터의 일관성과 스레드 안전성을 보장합니다.

5. 결론

  • shared_dsg, private_dsg_, unmerged_graph_는 백엔드 모듈이 DSG를 효과적으로 관리하고, 시스템 전체의 데이터 일관성을 유지하며, 동시성 문제를 방지하기 위한 핵심 개념입니다.
  • shared_dsg는 여러 모듈 간의 데이터 공유를 담당하며, private_dsg_는 백엔드 모듈의 독립적인 처리를 지원합니다. unmerged_graph_는 이 둘 사이에서 변경 사항을 안전하게 중계하는 역할을 합니다.
  • 이러한 구조를 통해 백엔드 모듈은 최신의 그래프 정보를 활용하면서도, 다른 모듈과의 간섭 없이 안정적으로 작업을 수행할 수 있습니다.
  • 결과적으로, 시스템은 복잡한 환경에서도 효율적으로 데이터를 관리하고 업데이트하여 로봇의 환경 이해와 상호작용을 지원합니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글