copyMeshDelta
메서드는 프론트엔드로부터 받은 메쉬 업데이트를 기반으로 백엔드의 메쉬 표현과 동적 장면 그래프(DSG)를 갱신copyMeshDelta
함수 이해하기메쉬 업데이트 수신
mesh_update
를 포함하는 BackendInput
을 수신mesh_update
에는 메쉬에 적용해야 할 모든 변경 사항이 포함메쉬 업데이트 적용
copyMeshDelta
는 mesh_update
의 updateMesh
를 호출하여 DSG의 메쉬 정점과 면을 업데이트
아카이브된 정점 추적
num_archived_vertices_
는 아카이브된 정점을 반영하도록 업데이트됩니다.장소 노드 업데이트
updatePlaces2d
는 활성 메쉬 인덱스를 가진 모든 2D 장소 노드를 순회합니다.updatePlace2dMesh
와 updatePlace2dBoundary
를 사용하여 업데이트합니다.copyMeshDelta
함수copyMeshDelta
의 주요 목적은 프론트엔드로부터 받은 메쉬 업데이트를 -> 백엔드의 내부 데이터 구조에 적용하는 것입니다. 여기에는 다음이 포함됩니다:
메쉬 업데이트 적용
MeshDelta
의 updateMesh
메서드를 호출하여 메쉬의 정점과 면을 업데이트합니다.
input.mesh_update->updateMesh(*private_dsg_->graph->mesh());
private_dsg_
: 백엔드에서 사용되는 DSG에 대한 포인터.graph->mesh()
: DSG의 메쉬 구성 요소에 접근.원본 정점 및 타임스탬프 업데이트
원본 정점과 타임스탬프를 보유하는 StampedCloud
객체를 생성한 후, updateVertices
메서드를 호출하여 이들을 업데이트합니다.
kimera_pgmo::StampedCloud<pcl::PointXYZ> cloud_out{*original_vertices_, vertex_stamps_};
input.mesh_update->updateVertices(cloud_out);
original_vertices_
: 메쉬 정점의 원래 위치를 저장.vertex_stamps_
: 각 정점에 연관된 타임스탬프.아카이브된 정점 수 업데이트
getTotalArchivedVertices
를 사용하여 아카이브된 정점의 수를 업데이트합니다.
num_archived_vertices_ = input.mesh_update->getTotalArchivedVertices();
DSG의 장소 노드 업데이트
updatePlaces2d
유틸리티 함수를 호출하여 메쉬 업데이트를 기반으로 DSG의 2D 장소 노드를 업데이트합니다.
utils::updatePlaces2d(private_dsg_, *input.mesh_update, num_archived_vertices_);
MeshDelta
클래스MeshDelta
클래스는 적용해야 할 메쉬의 변경 사항을 캡슐화합니다. updateMesh
메쉬의 정점, 타임스탬프, 면, 선택적으로 의미 정보를 업데이트합니다.
void updateMesh(pcl::PointCloud<pcl::PointXYZRGBA>& vertices,
std::vector<Timestamp>& stamps,
std::vector<pcl::Vertices>& faces,
std::vector<uint32_t>* semantics) const;
updateVertices
와 updateFaces
를 호출합니다.updateVertices
다양한 경우를 처리하기 위해 오버로드되어 있으며, 정점 위치, 타임스탬프 및 의미 정보를 업데이트합니다.
void updateVertices(pcl::PointCloud<pcl::PointXYZRGBA>& vertices,
std::vector<Timestamp>* stamps,
std::vector<uint32_t>* semantics) const;
getTotalArchivedVertices
아카이브된 정점의 총 수를 반환합니다.
size_t getTotalArchivedVertices() const;
vertex_start + num_archived_vertices_
로 계산됩니다.vertex_updates
stamp_updates
num_archived_vertices_
deleted_indices
prev_to_curr
updatePlaces2d
updatePlaces2d
함수는 메쉬에 가해진 변경 사항을 반영하도록 DSG의 장소 노드를 업데이트합니다.
장소 노드 순회
MESH_PLACES
레이어의 각 노드를 순회합니다.
for (auto& id_node_pair : dsg->graph->getLayer(DsgLayers::MESH_PLACES).nodes()) {
auto& attrs = id_node_pair.second->attributes<spark_dsg::Place2dNodeAttributes>();
if (!attrs.has_active_mesh_indices) {
continue;
}
updatePlace2dMesh(attrs, mesh_update, num_archived_vertices);
updatePlace2dBoundary(attrs, mesh_update);
}
Place2dNodeAttributes
를 가져옵니다.updatePlace2dMesh
함수는 메쉬 업데이트에 따라 장소 노드의 메쉬 연결을 갱신합니다.
활성 상태 판단
장소 노드에 여전히 활성 메쉬 연결이 있는지 확인합니다.
if (attrs.pcl_max_index < num_archived_vertices) {
attrs.has_active_mesh_indices = false;
}
updatePlace2dBoundary
함수는 메쉬 업데이트에 따라 장소 노드의 경계 정보를 갱신합니다.