2、开发环境武装:Ubuntu系统配置、PCL库源码编译、Open3D Python绑定安装、VS Code调试配置
说实话,做激光雷达SLAM这几年,我踩过最多的坑反而不是算法本身,而是环境配置。你想想看,好不容易搞懂了ICP原理,结果编译PCL时报了一堆莫名其妙的错,一查是Eigen版本不对——这种挫败感,我太熟悉了。
所以这一章,咱们就把开发环境一次性搞定。我把自己这些年积累的配置经验,浓缩成一套「稳、准、快」的方案。跟着走,基本不会出幺蛾子。
2.1 Ubuntu系统配置——选对版本,少走弯路
我个人习惯用Ubuntu 20.04 LTS。为什么?因为ROS Noetic、PCL 1.12、Open3D 0.15这些主流版本,在20.04上都有官方支持。18.04太老,22.04有些库还没完全适配。
装完系统后,第一件事不是装软件,而是换源。我推荐用清华源或者中科大源,速度稳定。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 20.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update
sudo apt upgrade -y
2.2 PCL库源码编译——从源码开始,掌控一切
虽然apt也能装PCL,但我强烈建议你从源码编译。为什么?因为apt装的版本往往比较旧,而且缺少一些关键模块(比如GPU加速)。源码编译虽然慢一点,但你能完全控制编译选项。
先装依赖:
sudo apt install -y libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev
sudo apt install -y libqhull-dev libgtest-dev libusb-1.0-0-dev
然后下载PCL源码:
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
git checkout pcl-1.12.1 # 我用的是这个版本,稳定
编译配置:
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_visualization=ON \
-DBUILD_surface_on_nurbs=ON \
-DBUILD_global_tests=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)
sudo make install
编译完成后,验证一下:
pcl_viewer /usr/share/pcl-1.12/test/bunny.pcd
如果能看到一只兔子点云,恭喜你,PCL装好了。
2.3 Open3D Python绑定安装——点云可视化的利器
Open3D是我做点云可视化时的首选。它比PCL的visualization模块好用太多,尤其是Python绑定,写几行代码就能看到点云效果。
安装方式很简单:
pip install open3d
但这里有个坑——如果你用系统自带的Python3,可能会遇到权限问题。我建议用虚拟环境:
python3 -m venv lidar_env
source lidar_env/bin/activate
pip install open3d numpy matplotlib
测试一下:
import open3d as o3d
import numpy as np
# 生成随机点云
points = np.random.rand(1000, 3)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([pcd])
如果弹出一个窗口显示随机点云,说明Open3D安装成功。
sudo apt install libgl1-mesa-glx。另外,如果你用远程服务器,记得加上export DISPLAY=:0。
2.4 VS Code调试配置——让调试像呼吸一样自然
写C++代码,没有调试器就像开车没有方向盘。VS Code配合GDB,是我目前用过最顺手的组合。
首先安装VS Code扩展:
- C/C++(微软官方)
- CMake Tools
- Python
- Code Runner(可选)
然后配置launch.json。我个人习惯这样写:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug PCL",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/your_executable",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
再配一个tasks.json,用于编译:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "cd build && cmake .. && make -j$(nproc)",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
set(CMAKE_BUILD_TYPE Debug),否则断点可能不生效。我刚开始做项目时,就因为忘了这步,调试了半天发现断点根本不停。
配置完成后,按F5就能一键编译+调试。你可以在代码里打断点,查看变量值,甚至实时修改点云数据——嗯,这种感觉,真的很爽。
2.5 环境验证——跑一个完整的点云处理流程
最后,咱们写一个简单的程序,验证整个环境是否打通:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
int main() {
// 创建一个点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = 100;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size(); ++i) {
cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
// 可视化
pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer");
viewer.addPointCloud(cloud, "cloud");
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
return 0;
}
编译运行:
mkdir build && cd build
cmake ..
make
./pcl_test
如果一切顺利,你会看到一个窗口,里面飘着一堆随机点云。虽然没什么实际意义,但至少证明你的开发环境已经武装到位了。
好了,环境准备好了。下一章,咱们开始真正接触点云数据——从读取、滤波到特征提取,一步步来。