surface_places_->detect(input, *last_mesh_update_, *dsg_->graph);
장소를 감지
하고, 특정 기준에 따라 장소를 분할
하며, 최종적으로 유효한 장소들을 그래프에 반영
하는 구조detect
함수는 활성화된 메시 인덱스를 기반으로 2D 장소를 감지하고, 이를 라벨별로 필터링
하여 최종 장소를 생성하는 과정getActivePlaceIndices
함수는 findPlaces
함수는 decomposePlaces
함수는 Place2dSegmenter::detect
MeshDelta
와 DynamicSceneGraph
를 바탕으로, 활성화된 장소들을 감지하는 핵심 함수활성화된 인덱스 가져오기:
getActivePlaceIndices
함수를 통해 처리const auto active_indices = getActivePlaceIndices(mesh_delta.getActiveIndices(),
active_places_,
mesh_delta,
graph,
num_archived_vertices_,
nodes_to_remove_);
라벨 인덱스 필터링:
LabelIndices label_indices = getLabelIndices(mesh.labels, *active_indices);
라벨별 클러스터링 및 분할:
findPlaces
함수와 decomposePlaces
함수가 사용됩니다.const auto initial_places = findPlaces(mesh.points,
mesh_delta,
label_indices.at(label),
config.connection_ellipse_scale_factor);
std::vector<Place2d> final_places =
decomposePlaces(mesh.points,
initial_places,
config.pure_final_place_size,
config.min_final_place_points,
config.connection_ellipse_scale_factor);
최종 감지된 장소 저장:
detected_label_places_
에 저장하여 이후 그래프 업데이트에 사용될 수 있도록 합니다.getActivePlaceIndices
const auto active_indices = getActivePlaceIndices(mesh_delta.getActiveIndices(),
active_places_,
mesh_delta,
graph,
num_archived_vertices_,
nodes_to_remove_);
이 함수는 활성화된 장소의 인덱스들을 필터링하여 유효한 장소의 인덱스들을 반환하는 역할
active_indices
에 추가됩니다.LabelIndices label_indices = getLabelIndices(mesh.labels, *active_indices);
findPlaces
const auto initial_places = findPlaces(mesh.points,
mesh_delta,
label_indices.at(label),
config.connection_ellipse_scale_factor);
findPlaces
함수 개요cloud_indices
)를 받아서, findPlaces
함수는 메시 데이터에서 특정 라벨에 해당하는 포인트들을 클러스터링하여 "장소"로 정의하는 과정decomposePlaces
std::vector<Place2d> final_places =
decomposePlaces(mesh.points,
initial_places,
config.pure_final_place_size,
config.min_final_place_points,
config.connection_ellipse_scale_factor);
decomposePlaces
알고리즘 개요decomposePlaces
함수는 하나의 장소(Place)를 더 작은 서브 장소들로 재귀적으로 분해하는 과정을 수행min_size
)와 최소 포인트 수(min_points
)를 조정하여, 원하는 수준의 분할을 수행할 수 있습니다.decomposePlaces
알고리즘은 장소를 재귀적으로 분할하고, 각 장소의 경계와 중심을 계산하여 최적의 공간 분할을 수행합니다.
재귀적 분해: 큰 장소를 더 작은 서브 장소로 분할
컨벡스 헐 계산: 장소의 경계와 중심을 정확하게 파악
decomposePlaces
는 최소 크기(min_size)와 최소 포인트 수(min_points)를 기준으로, 장소를 재귀적으로 분할합니다. 이 함수는 다음과 같은 주요 단계를 따릅니다.입력된 각 장소에 대해 분할 수행:
splitPlace
함수로 두 개의 서브 장소(자식 노드)로 나눕니다.분할된 장소가 충분히 작은지 확인:
min_size
)와 최소 포인트 수(min_points
)를 만족하는지 확인합니다.모든 분해가 완료된 후, 장소에 경계 정보 추가:
surface_places_->detect(input, *last_mesh_update_, *dsg_->graph);
{ // start graph critical section
std::unique_lock<std::mutex> graph_lock(dsg_->mutex);
surface_places_->updateGraph(input.timestamp_ns, input, *dsg_->graph);
// TODO(nathan) unify places so that active places get populated correctly
// depending on run configuration
} // end graph update critical section
archivePlaces2d(active_nodes);
updateGraph
알고리즘은 2D 장소의 상태를 실시간으로 관리하여 updateGraph
알고리즘 개요Place2dSegmenter::updateGraph
는 2D 장소를 동적으로 갱신active_places_
와 detected_label_places_
를 기반으로 활성 노드 집합을 새롭게 계산합니다.
1. 위치 정보가 없을 때: 이전에 활성화된 모든 노드가 새롭게 활성화됩니다.
2. 위치 정보가 있을 때:
active_places_to_check
와 new_active_places
로 분류하여 갱신할 필요가 있는 노드만 처리합니다.active_places_
와 detected_label_places_
active_places_
의 의미detected_label_places_
의 의미노드 간 연결을 시도:
frontendAddPlaceConnection
을 호출합니다. 이웃 노드 상태 검사:
Overlap Distance
(중첩 거리) 측정ellipsoid overlap distance
는 두 장소 간 타원의 중심을 따라 얼마나 겹치는지를 나타내는 지표입니다. Centroid Height Offset
) 측정Edge Weight
의 계산 및 부여각 노드는 상태에 따라 활성(active), 준활성(semiactive), 비활성(inactive)으로 나뉩니다.
활성 노드:
준활성 노드:
비활성 노드:
이 정보를 바탕으로 노드를 active_places_
와 semiactive_places_
로 분류합니다.