Octree
K-D Tree may be good for high-dimensional space; however, for 3D point clouds, Octree may provide better performance in some cases. In the following, we report some benchmark results on LiDAR point clouds.
Experiment 1: Ouster LiDAR cloud
Target cloud size = 65536, source cloud size = 3000.
For each point in the source cloud, find its neighbor point in the target cloud.
The scale is roughly 10-50 meters, in a structured environment.
13-gen Intel evo i7 CPU (dell xps laptop), single threading.
Both data structures are implemented in PCL.
Build Tree
7 ms
8 ms
12 ms
Approximate NN Search (k=1)
(not support)
94 ms
96 ms
K-NN Search (k=1)
124 ms
390 ms
408 ms
K-NN Search (k=10)
124 ms
395 ms
452 ms
K-NN Search (k=100)
134 ms
573 ms
698 ms
Radius Search (r=0.01 m)
1789 ms
126 ms
126 ms
Radius Search (r=0.1 m)
1799 ms
129 ms
130 ms
Radius Search (r=1 m)
2011 ms
415 ms
861 ms
Other observations from ablation study:
Time consumption of tree building is linear in target cloud size.
Time consumption of each search method is also almost linear in source/query cloud size. (i.e. size = 30000 can roughly take 10x more time than size = 3000).
The location and shape of source query cloud does not affect much on running time.
PCL Point Type (PointXYZ vs. PointXYZRGBNormal) does not affect much on running time.
Other notes:
This result can be accelerated by multi-threading, e.g., OpenMP.
The
approxNearestSearch
method in Octree can only find the nearest point (k=1 case), and uses tree nodes as the approximate result similar to the radius search to speed up.
Experiment 2: Velodyne LiDAR Cloud (VLP-16)
Target cloud size = 28209 (NaN points removed), source cloud size = 3000.
For each point in the source cloud, find its neighbor point in the target cloud.
The scale is roughly 10-50 meters, in a structured environment.
13-gen Intel evo i7 CPU (dell xps laptop), single threading.
Both data structures are implemented in PCL.
Build Tree
4 ms
6 ms
9 ms
Approximate NN Search (k=1)
(not support)
1.5 ms
1.5 ms
K-NN Search (k=1)
3 ms
23 ms
23 ms
K-NN Search (k=10)
5 ms
41 ms
57 ms
K-NN Search (k=100)
21 ms
407 ms
539 ms
Radius Search (r=0.01 m)
1 ms
2 ms
2 ms
Radius Search (r=0.1 m)
2 ms
4 ms
5 ms
Radius Search (r=1 m)
34 ms
59 ms
138 ms
Notes (based on new observations):
If using method K-NN Search (k=1), Octree and K-D Tree can get almost the same neighbor points as the output result.
If using method Approximate NN Search (k=1) from Octree, the result will be approximated and most likely different from the K-NN Search (k=1) result. This method is OK to be used in finding the neighbor points (to constitute a submap) from a global map, but it should not be used internally in an ICP algorithm in each iteration, as it can make the algorithm not to converge.
Benchmark Code
Last updated
Was this helpful?