DWG复现环境
基于 CUDA 的点云重建与法线估计工具。
🔗项目链接:https://dwgtech.github.io/
使用git clone
进行,而非zip
形式
1. 🚀环境准备
-
创建 Conda 环境
mamba create -n dwg_env -c conda-forge \ cmake=3.27 gcc_linux-64=9 gxx_linux-64=9 \ boost=1.84 pcl=1.14 cgal=5.2 -y
-
激活环境
conda activate dwg_env
-
设置环境变量
export CUDA_HOME=/usr/local/cuda export PATH=
$CUDA_HOME/bin:$
CONDA_PREFIX/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$
CONDA_PREFIX/lib:$LD_LIBRARY_PATH
(未使用 activate.d
方式;每次手动执行 export)
2. 📋编译项目
-
创建并进入 build 目录
mkdir -p build && cd build
-
生成 Makefile
cmake .. -DCMAKE_BUILD_TYPE=Release
-
并行编译
make -j$(nproc)
3. 🏃♂️运行示例
./bin/DWG_CUDA \
--in_path /绝对/点云/路径 \
--in_name 文件名.xyz \
--out_path /绝对/输出/路径
例如:
./bin/DWG_CUDA --in_path ./../data --in_name camel_normals.xyz --out_path ./../output/ --com_As 1 --in_normal 1 --lambda 10 --kw 7 --grid_reso 200 --use_radii 1
4. ⚙️参数说明
参数 | 含义 | 默认/选项 |
---|---|---|
--in_path |
输入点云文件所在目录绝对路径 | — |
--in_name |
输入点云文件名(仅支持 .xyz ) |
— |
--out_path |
输出结果保存目录绝对路径 | — |
--output_mode |
输出模式:1 Mesh(.stl) 2 带法线点云(.xyz) 3 两者均输出 |
1 |
--in_normal |
法线初始化模式:0 随机 1 输入法线 3 高斯图(Gauss map) |
3 |
--lambda |
屏蔽系数,细窄增大 | — |
--max_depth |
八叉树最大深度 | — |
--use_radii |
是否开启屏蔽模式:0 关 1 开 |
— |
--kw |
迭代时最近邻数 | 10 |
--final_kw |
最终输出时最近邻数 | 10 |
--grid_reso |
迭代时 Marching Cubes 分辨率 | — |
--final_reso |
最终输出时 Marching Cubes 分辨率 | — |
--total_iter |
最大迭代次数 | — |
--test_iter |
中间结果输出频率(关闭则填 0) | 0 |
--com_As |
是否计算面积权重:0 关 1 开 |
— |
--use_leaves_generate |
噪声较高时开启:0 关 1 开 |
— |
⚠️注意:
运行时需要带参数,很多参数没有默认值,请见上面的【运行示例】
5. 🔧常见问题
-
找不到 PCL 库
- 错误示例:
error while loading shared libraries: libpcl_features.so.1.14 ...
- 解决:检查并执行
export LD_LIBRARY_PATH=...
,重新激活环境。
- 错误示例:
-
Boost 版本冲突
- 错误示例:
Could not find boost_filesystem 1.71.0
- 解决:使用 Conda 安装
boost=1.84
,并在 CMake 中禁用系统 Boost。
- 错误示例:
-
找不到 PCLConfig.cmake
- 错误示例:
Could not find a package configuration file provided by "PCL"
- 解决:确保
CMAKE_PREFIX_PATH
包含$CONDA_PREFIX
,并通过 Conda 安装 PCL。
- 错误示例:
-
CGAL 头文件缺失
- 错误示例:
fatal error: CGAL/Exact_predicates_exact_constructions_kernel.h: No such file
- 解决:安装
cgal>=5.2
。
- 错误示例:
-
CUDA 编译器未找到
- 错误示例:
Couldn't find CUDA library root
- 解决:执行
export CUDA_HOME=/usr/local/cuda
,并更新PATH
、LD_LIBRARY_PATH
。
- 错误示例:
-
nvcc 不可用
- 错误示例:
Command 'nvcc' not found
- 解决:
export PATH=
$CUDA_HOME/bin:$PATH
。
- 错误示例:
-
链接错误
- 错误示例:
undefined reference to std::condition_variable ...
- 解决:使用 Conda 安装
gcc_linux-64=9 gxx_linux-64=9
,并优先使用 Conda 编译器。
- 错误示例:
下次使用:
conda activate dwg_env
cd /项目/路径/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
CMakeLists.txt
cmake_minimum_required(VERSION 3.18 FATAL_ERROR) # 要求 CMake 最低版本 3.18,否则终止配置
# Suppress policy warnings
if(POLICY CMP0167) # 如果启用了 CMP0167 策略
cmake_policy(SET CMP0167 NEW) # 则将其设置为新的行为
endif() # 结束判断
if(POLICY CMP0104) # 如果启用了 CMP0104 策略
cmake_policy(SET CMP0104 NEW) # 则将其设置为新的行为
endif() # 结束判断
# Find CUDA compiler before project declaration
if(NOT DEFINED CMAKE_CUDA_COMPILER OR CMAKE_CUDA_COMPILER STREQUAL "") # 如果未指定 CUDA 编译器
find_program(CMAKE_CUDA_COMPILER nvcc # 在常见路径中查找 nvcc
HINTS /usr/local/cuda/bin /usr/bin $ENV{PATH}
)
message(STATUS "Using CUDA compiler: ${CMAKE_CUDA_COMPILER}") # 打印所使用的 nvcc 路径
endif()
# ---- Force CMake to prefer packages inside current conda env --------------
if(DEFINED ENV{CONDA_PREFIX}) # 如果存在 CONDA_PREFIX 环境变量
list(PREPEND CMAKE_PREFIX_PATH $ENV{CONDA_PREFIX}) # 将 Conda 环境路径添加到 CMAKE_PREFIX_PATH
endif()
# Tell FindBoost NOT to use any BoostConfig.cmake on the system
set(Boost_NO_SYSTEM_PATHS ON) # 禁止系统路径中的 BoostConfig.cmake
set(Boost_NO_BOOST_CMAKE ON) # <- this forces "module mode" only # 强制使用模块模式查找 Boost
# ---------------------------------------------------------------------------
project(DWG_CUDA LANGUAGES CXX CUDA) # 定义项目名及使用的语言:C++ 和 CUDA
# --- BEGIN conda-libstdc++ rpath hack --------------------------------------
if(DEFINED ENV{CONDA_PREFIX}) # 如果在 Conda 环境中
list(APPEND CMAKE_PREFIX_PATH $ENV{CONDA_PREFIX}) # 再次确保 Conda 路径在前缀路径中
set(CMAKE_LIBRARY_PATH "$ENV{CONDA_PREFIX}/lib" ${CMAKE_LIBRARY_PATH}) # 添加 Conda 库路径
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -L$ENV{CONDA_PREFIX}/lib" # 将 Conda 库路径加入链接器搜索路径
)
set(CMAKE_SKIP_BUILD_RPATH FALSE) # 不跳过构建时的 rpath
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # 构建使用安装时的 rpath
set(CMAKE_BUILD_RPATH "$ENV{CONDA_PREFIX}/lib") # 设置构建时的 rpath
set(CMAKE_INSTALL_RPATH "$ENV{CONDA_PREFIX}/lib") # 设置安装时的 rpath
endif() # 结束 Conda rpath hack
# --- END conda-libstdc++ rpath hack ----------------------------------------
# Prevent in-source builds
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) # 如果源目录等于二进制目录
message(FATAL_ERROR "Please build in a separate build directory.") # 提示在单独目录构建
endif() # 结束判断
# If using Conda, hint CMake to search under CONDA_PREFIX
if(DEFINED ENV{CONDA_PREFIX}) # 再次检查 Conda 环境
list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}") # 添加 Conda 前缀到 CMAKE_PREFIX_PATH
set(CMAKE_LIBRARY_PATH "$ENV{CONDA_PREFIX}/lib" ${CMAKE_LIBRARY_PATH}) # 添加库搜索路径
set(CMAKE_INCLUDE_PATH "$ENV{CONDA_PREFIX}/include" ${CMAKE_INCLUDE_PATH}) # 添加头文件搜索路径
endif() # 结束判断
# Turn off verbose makefiles unless explicitly requested
set(CMAKE_VERBOSE_MAKEFILE OFF) # 关闭冗长的 Makefile 输出
# Language standards
set(CMAKE_CXX_STANDARD 17) # 设置 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求 C++17
set(CMAKE_CUDA_STANDARD 14) # 设置 CUDA 标准为 CUDA14
set(CMAKE_CUDA_STANDARD_REQUIRED ON) # 强制要求 CUDA14
# CUDA architectures (semicolon-separated list)
option(CUDA_ARCH "CUDA architectures (e.g. \"75;80\")" "") # 可选手动指定 CUDA 架构
if(CUDA_ARCH) # 如果用户指定了架构
set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH} CACHE STRING "" FORCE) # 应用指定架构
else() # 否则
set(CMAKE_CUDA_ARCHITECTURES OFF CACHE STRING "" FORCE) # 禁用自动架构
endif() # 结束判断
# Output directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") # 静态库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") # 动态库输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") # 可执行文件输出目录
# Export compile commands
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 导出编译命令到 compile_commands.json
# Compiler warnings and flags for C++
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") # 如果使用 GCC 或 Clang
add_compile_options( # 添加通用警告选项
-Wall -Wextra -g3
-Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations
-Wno-sign-compare -Wno-comment -Wno-maybe-uninitialized
)
set(CMAKE_CXX_FLAGS_RELEASE "-march=native -O3 -DNDEBUG") # Release 模式优化选项
endif()
# Dependencies
find_package(OpenMP REQUIRED) # 查找 OpenMP
find_package(Boost REQUIRED COMPONENTS filesystem iostreams system) # 查找 Boost 文件系统、IOStreams、System
find_package(PCL REQUIRED COMPONENTS common io kdtree search features) # 查找 PCL 模块
find_package(CGAL QUIET COMPONENTS Core) # 查找 CGAL Core,可选
find_package(CUDAToolkit REQUIRED) # 查找 CUDA 工具包
# Sources
file(GLOB_RECURSE DWG_SOURCES # 搜集所有源文件
"${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/src/*.cu"
)
# Executable target
add_executable(${PROJECT_NAME} ${DWG_SOURCES}) # 定义可执行目标及其源文件
# Include directories
# - own project includes as non-system
target_include_directories(${PROJECT_NAME} PUBLIC # 添加项目自身头文件目录
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
)
# - third-party includes as SYSTEM to suppress their warnings
# (for C++ host code)
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC # 添加第三方库头文件目录
${Boost_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
$<TARGET_PROPERTY:CUDA::cudart,INTERFACE_INCLUDE_DIRECTORIES>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/cudaKDTree>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/geometrycentral>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/deps/libigl/include>
)
# CUDA-specific compile options (nvcc flags)
target_compile_options(${PROJECT_NAME} PRIVATE # 添加 CUDA 编译选项
$<$<COMPILE_LANGUAGE:CUDA>:-O3>
$<$<COMPILE_LANGUAGE:CUDA>:--use_fast_math>
# pass host warnings flags through nvcc
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wall>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wextra>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-parameter>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-variable>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-function>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-deprecated-declarations>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-sign-compare>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-comment>
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-maybe-uninitialized>
)
# Link libraries
target_link_libraries(${PROJECT_NAME} PUBLIC # 链接所需库
OpenMP::OpenMP_CXX
${PCL_LIBRARIES}
Boost::filesystem
Boost::iostreams
Boost::system
CUDA::cudart
$<$<TARGET_EXISTS:CGAL::CGAL>:CGAL::CGAL>
)
# Enable CUDA separable compilation
set_target_properties(${PROJECT_NAME} PROPERTIES # 启用 CUDA 可分离编译与安装时 rpath
CUDA_SEPARABLE_COMPILATION ON
BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "$ORIGIN/../lib"
)
message(STATUS "CMake configuration complete.") # 打印配置完成信息