이 게시글은 장형기님의 SLAM 기술면접 질문 100선에 대한 제 나름대로의 답을 정리한 것입니다.
Octree는 3차원 공간을 효율적으로 관리하기 위해 사용하는 트리 기반 자료구조입니다.
한 노드가 최대 8개의 자식 노드를 가질 수 있는 구조를 가지고 있고 2차원 공간에서의 Quadtree를
3차원으로 확장한 형태라고 볼 수 있습니다. Octree는 3차원 공간을 작은 구역으로 분할하여,
필요한 연산을 수행할 때 연산량을 대폭 줄이는데 활용됩니다.
Root Node
Children node
Root node를 8개의 동일한 크기의 서브 큐브로 분할하여 각각을 자식 노드로 둡니다.
각 자식 노드도 필요에 따라 다시 8개의 하위 구역으로 분할될 수 있습니다.
Leaf Node
더 이상 하위 노드로 나누지 않거나, 나눌 필요가 없는 노드입니다.
일반적으로 리프 노드에는 해당 구역에 담긴 객체의 목록이나 참고 정보가 저장됩니다.
Division
노드에 들어 있는 데이터가 특정 기준을 초과하면 노드를 8개의 자식으로 분할합니다.
분할된 각 자식 노드는 자신의 공간 내에 어떤 데이터가 있는지를 다시 확인하고, 같은 방식으로 더 나눌지 결정합니다.
Insertion
객체나 점을 삽입할 때, 우선 루트 노드에서 시작합니다.
해당 객체가 포함될 수 있는 공간을 찾아가면서, 기준 이상으로 밀도가 높아지면 분할하여 재배치합니다.
Query
장점
단점
필요 이상으로 너무 많은 노드를 생성할 경우, 자료구조 관리가 오히려 복잡해지고 메모리 사용량이 커짐
데이터가 특정 구역에 몰려 있거나 한쪽에만 치우쳐 있으면, 분할이 한쪽으로 치중되어 트리 깊이가 과도하게 깊어질 수 있습니다.
저는 보통 KD-Tree를 사용하는데 Octree도 NeRF나 Gaussian Splatting에서 많이 사용되는 것 같습니다.
공간 크기를 결정하고 시작해서 SLAM에는 쓸 수 있을까 생각이 들긴 하는데 한 번 고민을 해봐야 할 지점인 것 같습니다.