第二章:环境搭建——Ubuntu系统配置、ROS安装、PCL库编译与安装
说实话,做激光雷达点云处理,最让人头疼的往往不是算法本身,而是环境搭建。我见过太多新手,花了两周配环境,最后心态崩了直接放弃。嗯,今天咱们就把这事一次性说清楚。
我个人习惯用Ubuntu 20.04 LTS,搭配ROS Noetic。这套组合我用了三年,踩过的坑比走过的路还多。你想想看,如果环境都配不好,后面那些炫酷的点云分割、配准算法,根本跑不起来。
2.1 Ubuntu系统配置——选对版本,少走弯路
先说说系统选择。我个人强烈推荐Ubuntu 20.04 LTS。为什么?因为ROS Noetic官方支持的就是20.04。你非要用22.04装ROS Noetic,也不是不行,但你会发现自己成了「孤勇者」——网上90%的教程都不适用。
核心建议:Ubuntu 20.04 LTS + ROS Noetic,这是目前最稳的组合。
安装方式有两种:双系统或者虚拟机。我建议有条件的直接上双系统。虚拟机跑点云处理?嗯,我试过,那个卡顿感会让你怀疑人生。尤其是后面你要跑PCL的ICP配准,虚拟机直接给你卡成PPT。
装好系统后,第一件事换源。别用官方源,慢得你想砸电脑。换成清华或者中科大的源:
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 编辑源列表
sudo gedit /etc/apt/sources.list
# 替换为清华源(Ubuntu 20.04)
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 更新
sudo apt update && sudo apt upgrade -y
小技巧:换源后记得装一些基础依赖,比如build-essential、cmake、git。我每次装新系统,第一件事就是跑这条命令:sudo apt install build-essential cmake git vim -y
如果你用的是NVIDIA显卡,记得装驱动。点云可视化需要GPU加速,不然那个点云旋转起来一卡一卡的。我曾经在一个项目里没装驱动,结果可视化帧率只有5帧,调试了三天才发现是驱动问题。
2.2 ROS安装——别被rosdep劝退
ROS安装本身不复杂,但rosdep这一步能劝退80%的人。我当年第一次装ROS,卡在rosdep init上整整两天。后来发现,其实就是网络问题。
先上安装命令:
# 1. 添加ROS源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 2. 添加密钥
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
# 3. 更新
sudo apt update
# 4. 安装完整版ROS(推荐)
sudo apt install ros-noetic-desktop-full -y
装完之后,配置环境变量:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:rosdep init如果报错,多半是网络问题。解决方案:手动下载rosdep的配置文件,或者使用代理。我个人的做法是直接跳过rosdep,手动安装依赖。虽然麻烦点,但比卡在那强。
接下来初始化rosdep:
sudo rosdep init
rosdep update
如果这一步卡住了,试试这个:
# 手动创建rosdep配置
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo touch /etc/ros/rosdep/sources.list.d/20-default.list
# 手动写入内容
echo "yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx" | sudo tee /etc/ros/rosdep/sources.list.d/20-default.list
echo "yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml" | sudo tee -a /etc/ros/rosdep/sources.list.d/20-default.list
echo "yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml" | sudo tee -a /etc/ros/rosdep/sources.list.d/20-default.list
echo "yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml" | sudo tee -a /etc/ros/rosdep/sources.list.d/20-default.list
echo "gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte" | sudo tee -a /etc/ros/rosdep/sources.list.d/20-default.list
最后创建你的工作空间:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
2.3 PCL库编译与安装——两种方式,各有利弊
PCL(Point Cloud Library)是点云处理的核心库。安装方式有两种:apt直接安装,或者源码编译。
| 方式 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| apt安装 | 简单快速,一行命令搞定 | 版本较旧,缺少部分模块 | 初学者、快速验证 |
| 源码编译 | 版本最新,功能完整 | 编译耗时,依赖多 | 正式项目、需要最新特性 |
方式一:apt安装(推荐新手)
sudo apt install libpcl-dev pcl-tools -y
装完就能用。简单吧?但要注意,apt安装的PCL版本可能比较老。比如Ubuntu 20.04默认装的是PCL 1.10,而最新版已经是1.14了。
方式二:源码编译(推荐进阶用户)
我个人习惯用源码编译。虽然慢,但你能拿到完整的模块,包括那些apt没有的。而且出了问题,你能直接看源码调试。
# 1. 安装依赖
sudo apt install libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev libvtk7-qt-dev -y
# 2. 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build
# 3. CMake配置
cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_visualization=ON \
-DBUILD_surface_on_nurbs=ON \
-DBUILD_tools=ON \
..
# 4. 编译(-j4表示用4核编译,根据你的CPU调整)
make -j4
# 5. 安装
sudo make install
关键点:编译PCL时,VTK依赖一定要装对。如果你要可视化点云,-DBUILD_visualization=ON必须打开。我曾经忘了开这个选项,结果编译完发现没有可视化模块,又重编了一次,白白浪费两小时。
编译时间取决于你的机器。我当年用一台i5笔记本,编译了将近40分钟。嗯,趁这个时间泡杯咖啡,或者看看文档,别干等着。
2.4 验证环境——跑个例子试试
环境搭好了,怎么知道对不对?跑个简单的PCL例子验证一下。
# 创建一个测试文件
mkdir ~/pcl_test && cd ~/pcl_test
touch test_pcl.cpp
写入以下代码:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
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::io::savePCDFileASCII("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl;
return (0);
}
编译运行:
# 创建CMakeLists.txt
cat > CMakeLists.txt << EOF
cmake_minimum_required(VERSION 3.5)
project(pcl_test)
find_package(PCL REQUIRED)
include_directories(\${PCL_INCLUDE_DIRS})
link_directories(\${PCL_LIBRARY_DIRS})
add_definitions(\${PCL_DEFINITIONS})
add_executable(pcl_test test_pcl.cpp)
target_link_libraries(pcl_test \${PCL_LIBRARIES})
EOF
# 编译
mkdir build && cd build
cmake ..
make
./pcl_test
如果看到输出"Saved 5 data points to test_pcd.pcd",恭喜你,环境搭建成功了!
避坑指南:如果编译时报找不到PCL,检查一下find_package(PCL REQUIRED)这行。我曾经因为路径问题,折腾了半天才发现是CMake没找到PCL的Config文件。解决方案:export PCL_DIR=/usr/local/share/pcl-1.10,手动指定路径。
好了,环境搭好了,后面就可以开始真正的点云处理了。记住,环境搭建是基础,基础不牢,地动山摇。我见过太多人因为环境问题放弃了这个方向,其实只要按步骤来,没那么难。
可可精品资料库