정적 레이어는 시간에 따라 변화하지 않는 또는 변화가 적은 노드들을 포함하는 레이어입니다. 이 레이어는 일반적으로 환경의 고정된 구조적 요소를 나타내며, 예를 들어:
정적 레이어의 노드들은 로봇이나 센서가 환경을 탐색하면서 수집한 정보에 기반하여 생성되며, 위치나 속성이 크게 변하지 않습니다.
동적 레이어는 시간에 따라 변화하는 또는 움직이는 객체들을 나타내는 레이어입니다. 이 레이어는 동적으로 생성되고 업데이트되며, 예를 들어:
동적 레이어의 노드들은 위치, 속도, 방향 등의 속성이 시간에 따라 변하며, 이러한 변화를 실시간으로 반영하기 위해 그래프 내에서 동적으로 관리됩니다.
인터레이어 엣지는 서로 다른 레이어에 있는 노드들 사이의 관계를 나타내는 엣지입니다. 이는 정적 레이어 간 또는 정적 레이어와 동적 레이어 간의 연결을 포함합니다. 이 엣지를 통해 레이어 간의 계층적 구조나 속성 관계를 표현할 수 있습니다. 예를 들어:
인터레이어 엣지는 그래프의 계층 구조를 형성하고, 노드들 간의 부모-자식 관계나 속성 관계를 명확히 합니다.
동적 인터레이어 엣지는 동적 레이어의 노드와 다른 레이어(정적 또는 동적)의 노드 간의 관계를 나타내는 엣지입니다. 이는 시간에 따라 생성되거나 제거될 수 있으며, 동적인 상황 변화를 반영합니다. 예를 들어:
동적 인터레이어 엣지는 동적인 객체들의 상태 변화에 따라 그래프 구조가 변하도록 하여, 환경의 동적 특성을 효과적으로 모델링합니다.
이러한 개념들을 종합하면, Dynamic Scene Graph(DSG)는 환경을 계층적이고 동적으로 표현하기 위한 구조로서:
이를 통해 DSG는 복잡한 환경을 효과적으로 표현하고 분석할 수 있게 합니다.
mergeGraph
함수 상세 분석mergeGraph
함수는 현재의 DynamicSceneGraph 객체에 다른 DynamicSceneGraph 객체(other
)를 병합하는 역할을 합니다.GraphMergeConfig
객체인 config
를 사용하여 병합 과정에서의 세부 동작을 제어합니다. mergeGraph
함수는 다른 DynamicSceneGraph
객체를 현재 그래프에 병합하는 기능을 제공합니다.GraphMergeConfig
객체를 통해 병합 동작을 세부적으로 제어할 수 있습니다.mergeGraph
함수는 DynamicSceneGraph의 핵심 기능 중 하나로, 그래프 데이터를 통합하고 업데이트하는 데 사용됩니다. 이 함수를 완전히 이해하려면 그래프 구조, 레이어 개념, 노드 및 엣지의 관리 방식에 대한 깊은 이해가 필요합니다. 향후 이 코드를 검토하거나 수정할 때 이 설명이 도움이 되기를 바랍니다.
other
그래프의 동적 레이어를 현재 그래프에 병합합니다.other
의 모든 동적 레이어를 순회합니다.for (auto&& [l_id, other_layers] : other.dynamicLayers()) {
for (auto&& [prefix, other_layer] : other_layers) {
if (!hasLayer(l_id, prefix)) {
createDynamicLayer(l_id, prefix);
}
dynamic_layers_[l_id][prefix]->mergeLayer(*other_layer, config, &node_lookup_);
}
}
other.dynamicLayers()
를 통해 other
그래프의 모든 동적 레이어를 가져옵니다.l_id
: 레이어 IDprefix
: 레이어의 접두사(Prefix)other_layer
: 병합할 동적 레이어작업 과정:
레이어 존재 여부 확인:
hasLayer(l_id, prefix)
를 호출하여 현재 그래프에 해당 동적 레이어가 있는지 확인합니다.createDynamicLayer(l_id, prefix)
를 통해 새로운 동적 레이어를 생성합니다.레이어 병합:
dynamic_layers_[l_id][prefix]->mergeLayer(*other_layer, config, &node_lookup_);
를 호출하여 other_layer
를 현재 그래프의 동적 레이어에 병합합니다.mergeLayer
함수는 노드, 엣지 등을 병합하고, node_lookup_
을 업데이트합니다.other
그래프의 정적 레이어를 현재 그래프에 병합합니다.other
의 모든 정적 레이어를 순회합니다.for (auto&& [l_id, other_layer] : other.layers()) {
if (!hasLayer(l_id)) {
continue;
}
// 제거된 노드 처리
std::vector<NodeId> removed_nodes;
other_layer->getRemovedNodes(removed_nodes, config.clear_removed);
for (const auto& removed_id : removed_nodes) {
removeNode(removed_id);
}
// 제거된 엣지 처리
std::vector<EdgeKey> removed_edges;
other_layer->edges_.getRemoved(removed_edges, config.clear_removed);
for (const auto& removed_edge : removed_edges) {
layers_[l_id]->removeEdge(removed_edge.k1, removed_edge.k2);
}
// 레이어 병합
layers_[l_id]->mergeLayer(*other_layer, config, &node_lookup_);
}
작업 과정:
레이어 존재 여부 확인:
hasLayer(l_id)
를 호출하여 현재 그래프에 해당 정적 레이어가 있는지 확인합니다.continue
로 다음 레이어로 넘어갑니다.제거된 노드 처리:
other_layer->getRemovedNodes(removed_nodes, config.clear_removed);
를 호출하여 제거된 노드 목록을 가져옵니다.config.clear_removed
플래그에 따라 제거된 노드를 가져올지 결정합니다.removeNode(removed_id);
를 통해 삭제합니다.제거된 엣지 처리:
other_layer->edges_.getRemoved(removed_edges, config.clear_removed);
를 호출하여 제거된 엣지 목록을 가져옵니다.layers_[l_id]->removeEdge(removed_edge.k1, removed_edge.k2);
를 통해 삭제합니다.레이어 병합:
layers_[l_id]->mergeLayer(*other_layer, config, &node_lookup_);
를 호출하여 other_layer
를 현재 그래프의 해당 레이어에 병합합니다.mergeLayer
함수는 노드, 엣지 등을 병합하고, node_lookup_
을 업데이트합니다.other
그래프의 인터레이어 엣지를 현재 그래프에 병합합니다.other
의 모든 인터레이어 엣지를 순회합니다.for (const auto& id_edge_pair : other.interlayer_edges()) {
const auto& edge = id_edge_pair.second;
NodeId new_source = config.getMergedId(edge.source);
NodeId new_target = config.getMergedId(edge.target);
if (new_source == new_target) {
continue;
}
if (config.enforce_parent_constraints) {
insertParentEdge(new_source, new_target, edge.info->clone());
} else {
insertEdge(new_source, new_target, edge.info->clone());
}
}
작업 과정:
인터레이어 엣지 순회:
other.interlayer_edges()
를 통해 other
그래프의 모든 인터레이어 엣지를 가져옵니다.노드 ID 업데이트:
config.getMergedId(edge.source);
와 config.getMergedId(edge.target);
를 호출하여 병합 후의 소스와 타겟 노드 ID를 가져옵니다.동일 노드 여부 확인:
new_source
와 new_target
이 같으면 자기 자신에 대한 엣지이므로 continue
로 넘어갑니다.엣지 삽입:
config.enforce_parent_constraints
플래그에 따라:true
인 경우: insertParentEdge(new_source, new_target, edge.info->clone());
를 호출하여 부모-자식 관계를 강제하는 엣지를 삽입합니다.false
인 경우: insertEdge(new_source, new_target, edge.info->clone());
를 호출하여 일반적인 엣지를 삽입합니다.edge.info->clone()
을 통해 엣지의 속성 정보를 복제하여 사용합니다.other
그래프의 동적 인터레이어 엣지를 현재 그래프에 병합합니다.for (const auto& id_edge_pair : other.dynamic_interlayer_edges()) {
const auto& edge = id_edge_pair.second;
NodeId new_source = config.getMergedId(edge.source);
NodeId new_target = config.getMergedId(edge.target);
if (new_source == new_target) {
continue;
}
if (config.enforce_parent_constraints) {
insertParentEdge(new_source, new_target, edge.info->clone());
} else {
insertEdge(new_source, new_target, edge.info->clone());
}
}
// TODO(Yun) check the other mesh info (faces, vertices etc. )
return true;
true
를 반환합니다.