2. 环境搭建:Ubuntu系统配置、ROS Noetic安装、PCL库编译与验证

说实话,做SLAM这几年,我见过太多人在环境搭建这一步就卡住了。明明算法原理都懂,代码也写好了,结果编译报错一整天,心态直接崩掉。我自己刚入行那会儿,也曾在PCL版本冲突上浪费过整整一个周末。

所以这一章,咱们把环境搭得稳稳当当的。你跟着我的步骤走,保证一次过。

2.1 Ubuntu系统配置——选对版本,少走弯路

我个人习惯用Ubuntu 20.04 LTS。为什么?因为ROS Noetic官方支持的就是20.04。你想想看,如果选了18.04装Noetic,那得自己折腾多少依赖?没必要。

系统装好后,第一件事是换源。国内用户直接用清华源或者阿里源,速度能快十倍。

# 备份原源
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
我的小习惯: 换源之后,顺手装个 vim、git、cmake、build-essential。这些是后面编译的基石,缺一个都可能报错。

2.2 ROS Noetic安装——全量还是精简?

ROS的安装方式有两种:desktop-full 和 desktop。我建议你直接装 desktop-full,因为它包含了Gazebo、Rviz、各种导航库。做激光SLAM,Rviz几乎是天天用的,Gazebo也能用来仿真测试。

# 设置ROS源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

# 添加密钥
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

# 安装
sudo apt update
sudo apt install ros-noetic-desktop-full -y

装完之后,别忘了初始化 rosdep。这一步很多人会漏掉,结果后面编译功能包时各种依赖找不到。

sudo rosdep init
rosdep update

然后配置环境变量:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意: 如果你用的是zsh,记得把 .bashrc 改成 .zshrc。我曾经帮一个同事排查了半天,最后发现他用的zsh但配置写在了bashrc里……

验证安装:

roscore

如果看到类似 started core service [/rosout] 的输出,说明ROS已经跑起来了。

2.3 PCL库编译与验证——从源码到实战

PCL(Point Cloud Library)是点云处理的核心。Ubuntu的apt源里其实有预编译版本,但我强烈建议你从源码编译。为什么?因为预编译版本往往比较老,而且缺少一些模块(比如 pcl_visualization 的某些功能)。

我当年做多线激光雷达融合时,就遇到过apt装的PCL不支持某些滤波算法,最后只能重新编译。

2.3.1 安装依赖

sudo apt install libeigen3-dev libflann-dev libboost-all-dev \
                 libvtk7-dev libvtk7-qt-dev libqhull-dev \
                 libopenni2-dev libpcap-dev -y

嗯,这里要注意:VTK版本一定要对。Ubuntu 20.04对应的是VTK 7,如果你装了VTK 9,后面编译PCL时可能会报链接错误。

2.3.2 下载并编译PCL

# 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build

# CMake配置
cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_visualization=ON \
      -DBUILD_surface_on_nurbs=ON \
      -DBUILD_tools=ON \
      ..

# 编译(-j4根据你的CPU核心数调整)
make -j4

# 安装
sudo make install
sudo ldconfig
关键参数说明:
  • BUILD_visualization=ON:编译可视化模块,方便调试点云
  • BUILD_surface_on_nurbs=ON:曲面重建模块,做地图优化时有用
  • BUILD_tools=ON:编译pcl_viewer等命令行工具

2.3.3 验证PCL安装

写一个简单的测试程序,看看PCL能不能正常工作:

// test_pcl.cpp
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.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);
    }

    // 保存为PCD文件
    pcl::io::savePCDFileASCII("test_pcd.pcd", *cloud);
    std::cout << "Saved " << cloud->points.size() << " data points to test_pcd.pcd." << std::endl;

    // 可视化
    pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
    viewer.showCloud(cloud);
    while (!viewer.wasStopped()) {
        // 等待用户关闭窗口
    }

    return 0;
}

编译运行:

g++ test_pcl.cpp -o test_pcl -lpcl_io -lpcl_visualization -lpcl_common
./test_pcl

如果弹出一个窗口,显示随机生成的点云,那就说明PCL安装成功了。

避坑指南: 编译时如果报 undefined reference to ...,多半是链接库的顺序不对。把 -lpcl_io 放在最前面,依赖库放在后面。这是GCC链接器的特性,说白了就是后面的库依赖前面的库。

2.4 本章知识体系总览

下面这张图,是我梳理的本章核心逻辑。你可以把它当作一张地图,随时回来对照:

环境搭建核心流程 Ubuntu 20.04 LTS ROS Noetic PCL 1.12+ 换源 → 更新 → 基础工具 desktop-full → rosdep → 环境变量 依赖 → 源码编译 → 验证 可运行的SLAM开发环境 三个模块环环相扣,缺一不可 系统层 通信层 算法层

你看,整个环境搭建其实就三层:系统层(Ubuntu)、通信层(ROS)、算法层(PCL)。每一层都踩实了,后面的开发才能顺风顺水。

好了,环境搭好了,咱们就可以开始玩点云了。下一章,我会带你用PCL读取第一帧激光雷达数据,看看那些密密麻麻的点到底长什么样。


可可精品资料库