pcl ndt,koide3/ndt_omp, autoware ndt_gpu的效率對比
1. pcl ndt
簡介:
pcl官方提供的ndt。
環境需求:
1) 需要編譯安裝pcl-1.8.1或以上版本。
使用方法:
參照官方樣常式序 Point Cloud Library (PCL)
參數設置:
普通參數配置
resolution=1.0 // ndt網格大小為1立方米
epsilon=0.01 // 精度為1釐米
maxIterations=100 // 最大迭代次數
stepSize=0.1 // 步長
測試數據:
2幀點雲,降採樣後都是1萬個點。
測試結果:
配準時間:3.98秒。
2. ndt_omp
簡介:
koide3/ndt_omp。繼承自pcl ndt,並做了多線程等優化。參考:koide3/ndt_omp
環境需求:
1) 需要編譯安裝pcl-1.8.1或以上版本。因為ndt_omp是繼承自pcl ndt的。
使用方法:
1) 將include/pclomp目錄複製到你的include目錄下,將src/pclomp目錄複製到你的src目錄下。
2) 在CMakeLists.txt中需要有支持PCL的代碼(同pcl ndt),並需增加以下代碼
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
include_directories(include)
add_library(ndt_omp src/pclomp/voxel_grid_covariance_omp.cpp src/pclomp/ndt_omp.cpp src/pclomp/gicp_omp.cpp)
add_dependencies(align ndt_omp) #這裡的align改成你的app
target_link_libraries(align ${PCL_LIBRARIES} ndt_omp) #這裡的align改成你的app
3) 在.cpp文件中需要有支持PCL ndt的頭文件包含(同pcl ndt),並需增加以下頭文件包含
#include <pclomp/ndt_omp.h>
4) 聲明ndt_omp對象,並用它來執行align(),具體可參照官方樣常式序align.cpp。
pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>::Ptr ndt_omp(new pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>());
參數設置:
普通參數配置 resolution epsilon maxIterations stepSize都和pcl ndt相同。
注意:stepSize=0.1不要變它。改成0.4會在直線行駛時加快匹配速度,但在轉彎時容易匹配錯誤。
獨特參數配置
sear_methods=pclomp::DIRECT7 // 這個最快最好(其他的參數都是有特殊場景的用途)
setNumTreads(omp_get_max_threads()) // 使用能使用到的最多的線程(線程越多越快)
測試數據:
同pcl ndt。
測試結果:
配準時間:112毫秒。
3. ndt_gpu
簡介:
CPFL/Autoware中間的一個獨立子模塊。參考:CPFL/Autoware
環境需求:
1) 需要編譯安裝cuda9.0
注意,用下列方法檢測自己安裝的是否正確:
查看GPU型號 lspci | grep -i nvidia
查看NVIDIA驅動版本 sudo dpkg --list | grep nvidia-*
產看CUDA版本號 nvcc --version 得到9.0
使用方法:
1) 先下載Autoware,並將ndt_gpu這個獨立模塊編譯通過(注意要編譯release的版本)。得到lib_ndt_gpu.so(release版本1.1MB)。
2) 將ndt_gpu/inlude目錄複製到你的include目錄下,將lib_ndt_gpu.so複製到你的lib目錄下。
3) 在CMakeLists.txt中增加以下代碼
find_package(CUDA)
if (CUDA_FOUND)
add_definitions(-DCUDA_FOUND)
include_directories(include)
link_directories(lib)
endif ()
...
if (CUDA_FOUND)
target_link_libraries(align ndt_gpu) #這裡的align改成你的app
endif ()
3) 在.cpp文件中增加以下頭文件包含
#ifdef CUDA_FOUND
#include <ndt_gpu/NormalDistributionsTransform.h>
#endif
4) 聲明gpu_ndt對象,並用它來執行align(),具體可參照樣常式序 CPFL/Autoware
參數設置:
普通參數配置 resolution epsilon maxIterations stepSize都和pcl ndt相同。
測試數據:
同pcl ndt。
測試結果:
配準時間:190毫秒。
推薦閱讀: