第三章 环境搭建:Ubuntu系统下PCL库安装、Open3D库安装、VS Code与CMake配置、第一个点云可视化程序
说实话,环境搭建这件事,我见过太多同学卡在这一步了。
明明代码逻辑都懂,结果装个库装了两天,心态直接崩了。我自己刚入行那会儿,也曾在PCL的依赖地狱里挣扎过。所以这一章,我尽量把坑都给你指出来。
3.1 为什么选Ubuntu?
做点云处理,Ubuntu几乎是标配。Windows当然也能用,但很多底层库的编译、调试,在Linux下要顺畅得多。我个人习惯用Ubuntu 20.04或22.04 LTS版本,稳定,社区支持也好。
你想想看,如果装个库都要折腾半天,哪还有心思学算法?
3.2 PCL库安装(Point Cloud Library)
PCL是点云处理的老牌库。滤波、分割、配准,样样都行。安装方式有两种:apt直接装,或者源码编译。
3.2.1 方法一:apt安装(推荐新手)
最简单,但版本可能不是最新的。不过对于咱们课程来说,完全够用。
sudo apt update
sudo apt install libpcl-dev pcl-tools
装完验证一下:
pcl_viewer --help
如果能看到帮助信息,说明装好了。
3.2.2 方法二:源码编译(进阶推荐)
如果你需要最新特性,或者想定制某些模块,那就源码编译。步骤稍微多一点,但也不难。
# 安装依赖
sudo apt install cmake g++ libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev
# 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build
# 编译(-j4表示用4个核心,根据你电脑配置调整)
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
sudo make install
编译时间大概10-20分钟,去泡杯咖啡吧。
3.3 Open3D库安装
Open3D是后起之秀,API设计更现代,可视化效果也漂亮。我个人很喜欢用它做快速原型验证。
3.3.1 pip安装(最简单)
pip install open3d
装完测试一下:
python3 -c "import open3d as o3d; print(o3d.__version__)"
3.3.2 源码编译(如果需要C++接口)
如果你要用C++调用Open3D,那就得编译了。
git clone https://github.com/isl-org/Open3D.git
cd Open3D
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
sudo make install
3.4 VS Code与CMake配置
编辑器我推荐VS Code,插件生态好,调试方便。CMake是C++项目的标配,没有之一。
3.4.1 VS Code安装
sudo snap install --classic code
或者去官网下载.deb包安装。装完后必装插件:
- C/C++(微软官方)
- CMake Tools
- Python
3.4.2 CMake配置示例
创建一个项目文件夹,里面放一个CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(PointCloudDemo)
set(CMAKE_CXX_STANDARD 14)
# 找PCL
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# 找Open3D
find_package(Open3D REQUIRED)
add_executable(demo main.cpp)
target_link_libraries(demo ${PCL_LIBRARIES} Open3D::Open3D)
这个配置同时链接了PCL和Open3D,方便你后续切换使用。
3.5 第一个点云可视化程序
环境搭好了,咱们写个程序验证一下。用PCL读取一个点云文件并显示。
3.5.1 准备测试数据
PCL官方提供了示例点云文件,下载一个:
wget https://raw.githubusercontent.com/PointCloudLibrary/pcl/master/test/bunny.pcd
这是经典的斯坦福兔子点云,大概几万个点。
3.5.2 编写代码
创建main.cpp:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
int main(int argc, char** argv) {
// 创建点云对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 读取PCD文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("bunny.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file bunny.pcd\n");
return -1;
}
std::cout << "Loaded " << cloud->points.size() << " points." << std::endl;
// 可视化
pcl::visualization::PCLVisualizer viewer("PCL Bunny Viewer");
viewer.setBackgroundColor(0, 0, 0);
viewer.addPointCloud<pcl::PointXYZ>(cloud, "bunny cloud");
viewer.setPointCloudRenderingProperties(
pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "bunny cloud");
while (!viewer.wasStopped()) {
viewer.spinOnce(100);
}
return 0;
}
3.5.3 编译运行
mkdir build && cd build
cmake ..
make
./demo
如果一切顺利,你会看到一个黑色的窗口,里面有一只白色的兔子点云。可以用鼠标拖拽旋转视角。
3.6 常见问题与解决
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 找不到PCL头文件 | CMake未正确找到PCL路径 | 检查find_package(PCL REQUIRED)是否成功,手动设置PCL_DIR |
| 链接错误:undefined reference | 库版本不匹配或链接顺序不对 | 调整target_link_libraries中的库顺序,PCL的库放在前面 |
| Open3D导入失败 | Python环境问题 | 检查pip list,确认open3d已安装;尝试在虚拟环境中重装 |
| 可视化窗口卡死 | spinOnce调用频率太低 | 减小spinOnce的参数值,比如spinOnce(10) |
好了,环境搭好了,第一个程序也跑通了。接下来咱们就可以正式进入点云处理的核心内容了。下一章,我会带你手写一个点云降噪滤波器——不是调库,是从原理到实现,一步步来。