1.
- 이 코드는 TSDF를 기반으로 GVD(Generalized Voronoi Diagram)를 생성하고 업데이트하는 핵심적인 로직을 구현
- 이 로직은 장애물과 자유 공간 사이의 경계를 명확히 정의하고, 로봇이 탐색할 수 있는 경로를 관리하는 데 사용돼.
2. 로직의 주요 단계
2.1 TSDF 데이터 처리
-
TSDF 블록 선택과 필터링:
- TSDF에서 갱신된 블록을 추출해. 이는 계산 효율을 높이고 불필요한 데이터 처리를 피하는 최적화 작업이야.
- 필요에 따라 TSDF를 다운샘플링해서 블록 단위의 처리 속도를 높여.
-
GVD 초기화와 통합 준비:
- TSDF가 처리되면, GVD가 초기화돼. GvdLayer는 공간을 voxels(복셀)로 나누어 관리하며, GvdIntegrator가 TSDF와 GVD 간의 데이터를 동기화해.
2.2 GVD 업데이트 및 경계선 생성
-
TSDF 데이터에서 표면 복셀 탐지:
- 각 복셀의 거리 값을 검사해 장애물의 표면에 가까운 복셀을 탐지해. 표면 복셀은 다른 경로 탐색에 중요한 기준이야.
-
TSDF로부터 GVD 갱신:
- GvdIntegrator는 표면 복셀을 바탕으로 GVD를 확장해. 이때 장애물의 변화나 새로운 장애물의 추가가 반영돼.
- 이 과정에서 부모-자식 관계가 설정된 복셀 맵(parent map)이 생성돼, 각 복셀의 위치와 부모 복셀 간의 관계가 관리돼.
2.3 GVD의 부모-자식 관계 및 거리 갱신
-
부모 복셀 설정:
- GVD 통합 과정에서 각 복셀은 가장 가까운 부모 복셀과 연결돼.
- 이 부모-자식 관계는 장애물 경계 계산과 탐색 경로 생성에 필수적이야.
-
거리 값 갱신:
- 각 복셀의 거리 값은 주변 이웃 복셀의 거리와 비교하며 업데이트돼.
- 새로운 거리 값이 기존 거리보다 작으면 갱신되고, 복셀이 고정 상태라면 이 값은 더 이상 변하지 않아.
-
부모-자식 관계 추적 및 갱신:
- 복셀이 경계에 있거나 부모 복셀이 사라질 경우, 새로운 부모를 할당해.
- 이 과정은 GVD가 동적으로 변하는 환경에 적응하도록 보장해.
updateFromTsdf & updateGvd
1. updateFromTsdf: TSDF 데이터 통합과 표면 탐지
이 함수는 TSDF 블록을 활용해 GVD의 경계와 장애물 표면을 갱신해.
- 이를 통해 새로운 장애물이 감지되거나 공간 정보가 변경되면, 해당 정보가 반영돼 GVD가 최신 상태로 유지돼.
주요 단계
-
TSDF 블록의 표면 전파:
- 각 TSDF 블록에서 표면 복셀을 탐지해 GVD에 반영해. 이는 장애물 경계와 자유 공간을 나누는 기준이 돼.
-
TSDF 블록 내 복셀 처리:
- processTsdfBlock을 통해 각 복셀의 거리와 상태를 업데이트해.
- 새롭게 감지된 장애물 정보나 기존 장애물 변화가 이 과정에서 반영돼.
-
ESDF 업데이트 플래그 초기화:
- 필요한 경우, 해당 블록이 더 이상 업데이트되지 않았음을 나타내는 esdf_updated 플래그를 해제해, 불필요한 중복 처리를 방지해.
2. updateGvd: GVD 업데이트와 그래프 추출
- 이 함수는 TSDF에서 가져온 정보를 GVD에 통합하고, 최적 경계선과 그래프 구조를 생성해. 이렇게 생성된 그래프는 로봇의 경로 계획에 사용돼.
주요 단계
-
오픈 큐 처리:
- GVD 내부에서는 오픈 큐(Open Queue)를 사용해 경계선 탐색을 수행해.
- 큐에 있는 복셀은 새로운 거리 값이나 부모 정보가 있는지 확인하고, 필요 시 이웃 복셀까지 전파돼. 이는 복셀 간의 부모-자식 관계를 관리하고, 경계선의 일관성을 유지해.
-
부모 복셀 매핑 업데이트:
- parenttracker가 각 복셀의 부모 정보를 추적해. 복셀의 위치와 부모-자식 관계가 최신 상태로 유지되도록 관리하며, 이는 후속 경계 탐색에 필수적이야.
-
그래프 추출:
- graphextractor가 GVD 데이터를 사용해 동적 그래프(DSG)를 추출해.
- 이 그래프는 장소와 경계를 정교하게 정의하며, 로봇이 실시간 경로 계획에 사용할 수 있는 정보로 변환해.
-
부모 정보 채우기:
- 추출된 그래프에 복셀의 부모 정보가 포함돼, 복셀 간의 위상 관계와 부모-자식 연결 정보가 완성돼.
getActiveNodes
NodeIdSet GvdPlaceExtractor::getActiveNodes() const { return active_nodes_; }