第3章 环境搭建与工具链
说实话,每次带新人入门点云处理,我最怕的就是环境搭建这一步。明明代码逻辑都懂,结果卡在装库上,一卡就是半天。我自己当年也踩过不少坑,所以这一章,我带你把 Ubuntu、Windows、Python 三套环境一次性捋清楚。
本章核心目标:让你能在三分钟内判断出「我的环境能不能跑点云代码」,而不是花三天去装一个用不上的库。
3.1 Ubuntu + ROS + PCL 1.x 安装
我个人习惯用 Ubuntu 20.04 搭配 ROS Noetic。为什么?因为 PCL 1.10 已经集成在 Noetic 里了,省去编译源码的麻烦。你想想看,要是从源码编译 PCL,光依赖项就得装二十多个,还不一定一次过。
直接上命令:
# 安装 ROS Noetic(桌面完整版)
sudo apt install ros-noetic-desktop-full
# 安装 PCL 相关包
sudo apt install ros-noetic-pcl-ros libpcl-dev pcl-tools
# 验证安装
pcl_viewer /path/to/your/file.pcd
嗯,这里要注意:ROS 的 apt 源一定要先配好。我见过太多人直接敲命令,结果报错说找不到包。配源的方法很简单,去 ROS 官网复制一行命令就行。
我的小技巧:装完 ROS 后,记得把 source /opt/ros/noetic/setup.bash 写进 ~/.bashrc。不然每次开终端都要手动 source,烦得很。
3.2 Windows + VS + PCL 配置
Windows 下配 PCL,说白了就是「下载 -> 解压 -> 配路径」三步走。但为什么很多人配不好?因为版本对不上。
我建议你直接用 PCL 官方提供的 All-in-One 安装包。目前稳定版是 1.12.1,配合 Visual Studio 2019 或 2022 都行。
- 去 GitHub 下载
PCL-1.12.1-AllInOne-msvc2019-win64.exe - 安装时勾选「Add PCL to the system PATH for all users」
- 在 VS 中配置附加包含目录和附加库目录
配置 VS 项目属性时,记得把 PCL_ROOT\bin 和 PCL_ROOT\lib 都加进去。我曾经因为漏了 bin 目录,编译通过但运行时疯狂报 DLL 缺失,排查了半小时才发现。
避坑指南:Windows 下 PCL 的 Debug 和 Release 库是分开的。如果你用 Debug 模式编译,链接的库名后面会带个 d,比如 pcl_common_debug.lib。混用的话,链接器会报一堆莫名其妙的错误。
3.3 Python 环境:Open3D、PyPCL、NumPy
Python 这边就简单多了。我个人最推荐 Open3D,因为它安装简单、文档清晰、可视化效果也好。PyPCL 虽然也能用,但维护不太活跃,我一般只在需要跟 ROS 的 PCL 类型互转时才用它。
# 创建虚拟环境(强烈建议)
python -m venv pcl_env
source pcl_env/bin/activate # Linux/Mac
# 或 pcl_env\Scripts\activate # Windows
# 安装核心库
pip install numpy open3d
# 如果需要 PyPCL
pip install python-pcl
你可能会问:为什么非要装 NumPy?因为 Open3D 的点云数据本质上就是个 NumPy 数组。你想想看,有了 NumPy,你就可以用矩阵运算、切片、条件筛选这些操作,处理点云数据会灵活很多。
我的经验:Open3D 的 o3d.geometry.PointCloud 对象有个 points 属性,直接就是 numpy.ndarray。所以你可以用 np.asarray(pcd.points) 拿到所有点的坐标,然后想怎么处理就怎么处理。
3.4 验证安装:读取并显示一个 PCD 文件
环境搭好了,总得跑个例子验证一下吧?我准备了一个最简单的测试脚本,分别用 C++ 和 Python 实现。
C++ 版本(PCL)
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
int main() {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file test.pcd\n");
return -1;
}
std::cout << "Loaded " << cloud->width * cloud->height << " points" << std::endl;
pcl::visualization::PCLVisualizer viewer("PCD Viewer");
viewer.addPointCloud(cloud, "cloud");
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
return 0;
}
Python 版本(Open3D)
import open3d as o3d
import numpy as np
# 读取 PCD 文件
pcd = o3d.io.read_point_cloud("test.pcd")
# 打印点云信息
print(f"点云包含 {len(pcd.points)} 个点")
print(f"点的坐标范围:\n{np.asarray(pcd.points).min(axis=0)} ~ {np.asarray(pcd.points).max(axis=0)}")
# 可视化
o3d.visualization.draw_geometries([pcd], window_name="PCD Viewer")
运行后如果能看到一个三维点云窗口,恭喜你,环境搭建成功了!
测试数据哪里来?PCL 官方 GitHub 仓库的 test/ 目录下有很多 .pcd 文件,比如 bunny.pcd、table_scene_lms400.pcd。你也可以用 pcl_generate_cloud 命令自己生成一个随机点云来测试。
3.5 本章知识体系总览
下面这张图是我自己画的,把本章涉及的环境、工具和它们之间的关系梳理了一遍。你保存下来,以后配环境时对照着看,思路会清晰很多。
这张图把三大平台的核心组件、验证方法和最终目标串在了一起。你配环境时如果卡住了,就回来看看这张图,定位一下是哪个环节出了问题。
最后提醒一句:千万别在系统 Python 里直接 pip install。用虚拟环境,这是无数前辈用血泪换来的教训。我曾经因为贪图方便,把系统 Python 搞崩了,重装系统花了整整一天。
好了,环境搭好之后,下一章我们就可以正式开始玩点云滤波了。到时候我会从最基础的下采样讲起,一步步带你深入。