unmerged_graph_
, shared_dsg
, private_dsg_
의 개념적 정의 및 상호작용shared_dsg
(공유된 DSG)shared_dsg
는 시스템 내 여러 모듈(예: 프론트엔드, 루프 클로저 모듈 등)이 공유하는 동적 장면 그래프(Dynamic Scene Graph, DSG)입니다.state_->backend_graph
로 접근하며, updatePrivateDsg
함수에서 참조됩니다.private_dsg_
(프라이빗 DSG)private_dsg_
는 백엔드 모듈이 독립적으로 관리하는 DSG로, 다른 모듈과의 간섭 없이 백엔드 작업을 수행하기 위해 사용됩니다.private_dsg_
로 참조되며, 백엔드 모듈의 주요 작업에 활용됩니다.unmerged_graph_
(미병합 그래프)unmerged_graph_
는 공유된 DSG로부터 가져온 변경 사항을 임시로 저장하는 그래프입니다.private_dsg_
에 적용하기 전에, unmerged_graph_
에 임시로 저장하여 안전하게 병합 과정을 관리합니다.updatePrivateDsg
함수 내에서 unmerged_graph_->mergeGraph(*shared_dsg.graph);
를 통해 공유된 DSG의 변경 사항을 받아옵니다.공유 여부:
shared_dsg
: 시스템 전체에서 여러 모듈이 공유하는 그래프입니다.private_dsg_
: 백엔드 모듈에서만 사용하는 개인용 그래프입니다.unmerged_graph_
: 변경 사항을 임시로 저장하는 그래프입니다.사용 목적:
shared_dsg
: 모듈 간의 데이터 공유와 동기화를 위해 사용됩니다.private_dsg_
: 백엔드 모듈의 내부 처리와 데이터 일관성을 유지하기 위해 사용됩니다.unmerged_graph_
: 공유된 DSG로부터 변경 사항을 받아와 private_dsg_
에 안전하게 병합하기 위해 사용됩니다.동시성 관리:
shared_dsg
: 여러 모듈이 접근하므로 동기화 메커니즘이 필요합니다.private_dsg_
: 백엔드 모듈 내부에서만 사용되므로 상대적으로 동시성 문제가 적습니다.unmerged_graph_
: 병합 과정에서만 사용되며, 필요한 경우 동기화를 고려합니다.변경 사항 수신 및 임시 저장:
updatePrivateDsg
함수에서 공유된 DSG(shared_dsg
)로부터 변경 사항을 가져와 unmerged_graph_
에 병합합니다.shared_dsg
와 unmerged_graph_
모두 동시성 문제를 방지하기 위해 뮤텍스를 사용하여 동기화됩니다.프라이빗 DSG 업데이트:
unmerged_graph_
에 저장된 변경 사항을 private_dsg_
에 병합하여 백엔드 모듈의 DSG를 최신 상태로 업데이트합니다.백엔드 처리 작업 수행:
private_dsg_
를 사용하여 메쉬 변형, 그래프 최적화 등의 작업을 수행합니다.결과 반영 및 통신:
private_dsg_
의 정보를 다른 모듈이나 시스템과 공유하기 위해 ZMQ(ZeroMQ)를 통해 전송하거나 Sink 함수를 호출합니다.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_
에 병합하여 백엔드 모듈의 그래프를 최신 상태로 유지합니다.shared_dsg
, private_dsg_
, unmerged_graph_
는 백엔드 모듈이 DSG를 효과적으로 관리하고, 시스템 전체의 데이터 일관성을 유지하며, 동시성 문제를 방지하기 위한 핵심 개념입니다.shared_dsg
는 여러 모듈 간의 데이터 공유를 담당하며, private_dsg_
는 백엔드 모듈의 독립적인 처리를 지원합니다. unmerged_graph_
는 이 둘 사이에서 변경 사항을 안전하게 중계하는 역할을 합니다.