void FrontendModule::updatePlaces(const ReconstructionOutput& input) {
if (!freespace_places_) {
return;
}
NodeIdSet active_nodes;
freespace_places_->detect(input);
{
std::unique_lock<std::mutex> graph_lock(dsg_->mutex);
freespace_places_->updateGraph(input.timestamp_ns, *dsg_->graph);
active_nodes = freespace_places_->getActiveNodes();
for (const auto& prev : previous_active_places_) {
if (active_nodes.count(prev)) {
continue;
}
const auto has_prev_node = dsg_->graph->findNode(prev);
if (!has_prev_node) {
continue;
}
const auto& prev_node = *has_prev_node;
prev_node.attributes().is_active = false;
if (lcd_input_) {
lcd_input_->archived_places.insert(prev);
}
if (frontier_places_) {
frontier_places_->archived_places_.push_back(prev);
}
}
previous_active_places_ = active_nodes;
const auto& places = dsg_->graph->getLayer(DsgLayers::PLACES);
places_nn_finder_.reset(new NearestNodeFinder(places, active_nodes));
addPlaceAgentEdges(input.timestamp_ns);
addPlaceObjectEdges(input.timestamp_ns);
state_->latest_places = active_nodes;
}
}
0. 이것만 보면돼!
- reconstruction 모듈이 전달한 TSDF를 기반으로 GVD 알고리즘을 돌려 place nodes를 도출(graph 형태로 도출)
- 도출한 graph(
place nodes
)를 원래 그래프에 반영
Place(3) - Agent(2) 엣지
를 새로 조정하고, Place(3)-object(2) 엣지
를 새로 조정합니다.
1. updatePlaces 개요
- 2D 및 3D 공간 내에서 유효한 장소(places)를 업데이트하고 관리
1. 목적
- 활성 장소(active places)를 감지하고, 현재 활성 상태가 아닌 이전 장소들을 아카이빙(비활성화)
- 이 작업은 DSG에 기반한 그래프의 갱신과 관련
- 장소 간의 관계를 유지하며 에이전트(agent)와 물체(object)와의 연결(edge)을 업데이트
- 이를 통해 에이전트와 물체가 실제 공간에서 어떻게 상호작용하는지를 추적하며, 루프 클로저 감지와 같은 고급 기능의 토대를 제공
2. 주요 알고리즘과 로직 분석
1) 장소 감지 및 갱신 시작 (freespace_places_
)
freespace_places_
가 유효한지 검사하고, 이를 통해 새로운 장소를 감지(detect()
)
- 감지된 결과를 바탕으로 해당 장소 정보가 그래프에 반영됩니다(
updateGraph()
).
2) 장소의 활성 상태와 아카이빙 처리
- 현재 활성화된 장소를 추적하기 위해
active_nodes
라는 집합에 현재 감지된 장소를 저장
- 이전 활성 장소(
previous_active_places_
)와 비교해 현재 활성화된 장소에 포함되지 않는 노드를 비활성화합니다:
- 비활성화된 장소의 is_active 플래그를 false로 설정합니다.
- LCD(Loop Closure Detection)가 활성화된 경우, 비활성화된 장소를 archived_places에 추가합니다.
- Frontier 탐색이 활성화된 경우, 비활성화된 장소를 frontierplaces에 보관합니다.
4) 에이전트-장소 및 물체-장소 간의 엣지 연결
addPlaceAgentEdges()
및 addPlaceObjectEdges()
함수를 호출하여 감지된 장소와 에이전트 및 물체 간의 관계를 업데이트
- 에이전트-장소: 에이전트와 가까운 장소를 연결합니다.
- 물체-장소: 물체와 관련된 장소를 연결합니다.
5) 상태 갱신
- 마지막으로, 현재 활성화된 장소의 상태를
state_->latest_places
에 저장합니다.
4. addPlaceAgentEdges()
와 addPlaceObjectEdges()
- 이 두 함수의 목적은 장소 노드와 객체/에이전트 노드 간의 연결을 그래프에 추가하는 것
- 가장 가까운 place를 찾아 연결함.