3、开发环境搭建:Ubuntu + ROS2 + PCL + Open3D + Python环境配置,Docker镜像推荐

说实话,做激光雷达感知这件事,最让人头疼的往往不是算法本身,而是环境配置。我见过太多同学在群里问「为什么我编译不过」「为什么我点云显示不出来」——十有八九是环境没搭好。

这一章,我就带你把这套环境彻底搞定。咱们的目标是:一次配好,到处能用

3.1 为什么选这套组合?

先说说我为什么推荐这套技术栈。你想想看,做激光雷达感知,核心工作流无非是:

  • 读数据(ROS2 bag / 离线文件)
  • 处理点云(滤波、分割、聚类)
  • 可视化调试(看看效果对不对)
  • 算法验证(跑通流程)

Ubuntu + ROS2 是自动驾驶行业的标配,PCL 是点云处理的工业级库,Open3D 在 Python 生态里做可视化特别方便。这套组合,说白了就是「工程落地 + 快速验证」两手抓。

核心思路:ROS2 负责数据流,PCL 负责底层算法,Open3D 负责可视化调试,Python 负责快速原型。各司其职,互不打架。

3.2 系统与基础依赖

我个人习惯用 Ubuntu 22.04 LTS。为什么?因为 ROS2 Humble 官方支持的就是 22.04,省心。

装好系统后,先把基础依赖拉满:

sudo apt update
sudo apt install -y \
    build-essential \
    cmake \
    git \
    wget \
    python3-pip \
    python3-venv \
    libeigen3-dev \
    libflann-dev \
    libboost-all-dev \
    libvtk9-dev \
    libvtk9-qt-dev

嗯,这里要注意:VTK 版本一定要对。我遇到过有人装了 VTK8 和 VTK9 混在一起,编译 PCL 时各种符号冲突,排查了一下午。

3.3 ROS2 Humble 安装

ROS2 的安装其实很简单,但有几个坑。我直接给你最稳的步骤:

# 1. 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 2. 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装 ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop

# 4. 配置环境
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

小技巧:如果你网络不好,可以用清华镜像源替换官方源。我曾经在客户现场用 4G 网络装 ROS2,等了两个小时……后来学乖了,提前把 deb 包下载好。

3.4 PCL 编译安装

PCL 我建议源码编译。为什么?因为 apt 安装的版本通常比较老,而且缺少一些关键模块(比如 GPU 加速)。

# 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl && git checkout pcl-1.14.0

# 编译安装
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_GPU=ON \
      -DBUILD_apps=ON \
      -DBUILD_examples=ON ..
make -j$(nproc)
sudo make install

编译时间大概 20-30 分钟,取决于你的机器。这时候可以去泡杯咖啡。

避坑指南:我曾经在编译 PCL 时忘了装 VTK,结果可视化模块全部缺失。检查一下 cmake 输出,确保看到 VTK: YES

3.5 Open3D 与 Python 环境

Open3D 用 pip 装就行,但要注意 Python 版本。我推荐用 Python 3.10:

# 创建虚拟环境
python3 -m venv lidar_env
source lidar_env/bin/activate

# 安装 Open3D
pip install open3d==0.18.0

# 安装其他常用库
pip install numpy matplotlib scipy scikit-learn

验证一下:

python3 -c "import open3d as o3d; print(o3d.__version__)"

如果输出版本号,说明装好了。

3.6 验证整个链路

环境搭好了,咱们跑个简单的例子验证一下。写一个 Python 脚本,用 Open3D 生成点云,再用 ROS2 发布:

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import PointCloud2
import numpy as np
import open3d as o3d

class PointCloudPublisher(Node):
    def __init__(self):
        super().__init__('pcd_publisher')
        self.publisher = self.create_publisher(PointCloud2, '/lidar_points', 10)
        self.timer = self.create_timer(1.0, self.publish_cloud)

    def publish_cloud(self):
        # 生成随机点云
        points = np.random.rand(1000, 3).astype(np.float32)
        pcd = o3d.geometry.PointCloud()
        pcd.points = o3d.utility.Vector3dVector(points)
        
        # 转换为 ROS2 消息
        # ... (转换代码略)
        self.publisher.publish(msg)
        self.get_logger().info('Published point cloud')

def main(args=None):
    rclpy.init(args=args)
    node = PointCloudPublisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

跑起来之后,用 rviz2 订阅 /lidar_points 话题,你应该能看到随机点云在跳动。

3.7 Docker 镜像推荐

说实话,每次换机器都要重配环境,真的很烦。我的建议是:用 Docker 一劳永逸

这里推荐几个我常用的镜像:

镜像名称 内容 适用场景
osrf/ros:humble-desktop ROS2 Humble 基础 纯 ROS2 开发
pointcloudlibrary/pcl:latest PCL 1.14 + 依赖 点云算法开发
nvidia/cuda:12.2-devel-ubuntu22.04 CUDA + Ubuntu 22.04 GPU 加速点云处理

我自己维护了一个整合镜像,包含 ROS2 + PCL + Open3D + CUDA,Dockerfile 如下:

FROM nvidia/cuda:12.2-devel-ubuntu22.04

# 安装 ROS2
RUN apt update && apt install -y curl gnupg lsb-release
RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null
RUN apt update && apt install -y ros-humble-desktop python3-pip

# 安装 PCL
RUN apt install -y libpcl-dev

# 安装 Open3D
RUN pip3 install open3d numpy matplotlib

CMD ["bash"]

使用建议:构建镜像时加上 --network=host,避免 DNS 解析问题。我一般在项目根目录放一个 docker-compose.yml,把数据目录挂载进去,这样代码和容器分离,方便管理。

3.8 知识体系总览

下面这张图,帮你把整个环境搭建的逻辑串起来:

激光雷达点云处理环境搭建 - 知识体系 Ubuntu 22.04 LTS ROS2 Humble (数据流管理) PCL (点云算法库) Open3D (可视化) Python (快速原型) 滤波 / 分割 / 聚类 点云显示 / 标注 算法验证 / 调参 Docker 容器化部署

从底层操作系统到上层应用,再到容器化部署,这条链路清晰明了。你只要按这个顺序一步步来,基本不会出问题。

3.9 写在最后

环境搭建这件事,说白了就是「耐心 + 细心」。我刚开始做的时候也踩过不少坑,比如 ROS2 和 ROS1 的冲突、PCL 和 VTK 版本不匹配、Open3D 在虚拟环境里找不到 CUDA……但只要你按照上面的步骤来,应该能一次搞定。

如果遇到问题,先检查版本号,再看编译日志。90% 的问题都是版本不匹配导致的。

好了,环境搭好了,下一章咱们就开始真正处理点云数据了。


专注资料整理