3. ROS与系统环境搭建

LIO-SAM 是一个典型的“ROS 节点 + 第三方数学库 + 点云库”的工程型项目。它并不只是把源码放进 src 目录再 catkin_make 就能跑起来,而是对系统版本、ROS 发行版、GTSAM 版本、PCL 与 Eigen 的兼容性都有明确要求。环境搭建的目标是:让编译期能找到正确的头文件与库,让运行期能加载参数、订阅话题、发布里程计与点云地图。本节从依赖关系出发,给出可复现的安装与编译流程。

一、核心原理:依赖链与版本匹配

LIO-SAM 的依赖可以分成四层:操作系统层(Ubuntu)、通信与构建层(ROS + catkin)、数学优化层(GTSAM、Eigen)、感知与数据结构层(PCL、OpenCV 可选)。其中 GTSAM 是最容易出问题的一环,因为它既提供因子图优化接口,又依赖 Boost、Eigen 等基础库;如果系统里存在多个 GTSAM 版本,编译时可能链接到旧版本,导致 undefined reference 或运行时崩溃。

推荐组合是 Ubuntu 20.04 + ROS Noetic + GTSAM 4.0.2 及以上 + PCL 1.10 + Eigen 3.3。Ubuntu 18.04 + ROS Melodic 也可用,但要注意 PCL 与 C++ 标准差异。下图给出依赖安装与工作空间编译的整体关系,便于先建立全局认识。

LIO-SAM 环境依赖链与编译流程 Ubuntu 20.04 系统基础 / apt 源 ROS Noetic roscore / catkin / rviz GTSAM 4.0.2 因子图优化 Eigen 3.3 矩阵运算 PCL 1.10 点云配准 / 滤波 OpenCV 图像/可视化辅助 catkin 工作空间 ~/catkin_ws src / build / devel → catkin_make → source devel/setup.bash 编译顺序:先装系统依赖 → 再装 ROS → 再装 GTSAM/PCL/Eigen → 最后编译 LIO-SAM 任一环节版本不匹配,都会在链接或运行阶段暴露问题

二、方法流程:从系统到可运行节点

第一步是确认系统与 ROS 版本。执行 lsb_release -a 查看 Ubuntu 版本,再按官方源安装 ROS Noetic。安装完成后,必须验证 roscore 能正常启动,否则后续所有节点都无法通信。

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 update
sudo apt install ros-noetic-desktop-full
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
roscore

第二步安装 GTSAM。LIO-SAM 对 GTSAM 的版本较敏感,建议从源码编译 4.0.2 或更高稳定版,并安装到 /usr/local。编译时开启 -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF 可减少无关目标,加快速度。

sudo apt install libboost-all-dev libtbb-dev
git clone https://github.com/borglab/gtsam.git
cd gtsam && git checkout 4.0.2
mkdir build && cd build
cmake -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF ..
make -j$(nproc)
sudo make install
sudo ldconfig

第三步安装 PCL、Eigen 与其余依赖。Ubuntu 20.04 的 apt 源中 PCL 通常为 1.10,Eigen 为 3.3,可直接安装。若需要更细粒度的点云处理,也可源码编译 PCL,但要注意与 ROS 自带 PCL 的冲突。

sudo apt install libpcl-dev libeigen3-dev libopencv-dev
sudo apt install ros-noetic-navigation ros-noetic-robot-localization
sudo apt install ros-noetic-velodyne ros-noetic-ouster-ros

三、工作空间创建与编译

创建 catkin 工作空间时,目录结构必须规范:src 放源码包,build 与 devel 由 catkin 自动生成。LIO-SAM 依赖 utility.h 中的参数读取与 imageProjection、featureExtraction、mapOptimization 等节点,因此编译前要确认 CMakeLists.txt 中 find_package 能找到 GTSAM 与 PCL。

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make -j4
source devel/setup.bash

如果编译报错 Could not find GTSAM,通常是 GTSAM_DIR 未指向安装路径;可在 CMakeLists.txt 中显式设置 set(GTSAM_DIR "/usr/local/lib/cmake/GTSAM")。若报 PCL requires C++14,则需在 add_compile_options 中加入 -std=c++14。

四、案例与场景:一次典型的环境排障

某次在 Ubuntu 18.04 + ROS Melodic 上编译 LIO-SAM,出现 undefined reference to gtsam::NonlinearFactorGraph::add。排查发现系统里同时存在 apt 安装的 GTSAM 3.2 与源码安装的 4.0.2,链接器优先找到了旧版本。解决方法是卸载旧版、重新 sudo ldconfig,并在 CMake 中指定新版本路径。这个案例说明:环境搭建不是“装完即可”,而是要保证版本唯一且路径明确。

建议:每次修改依赖后执行 ldconfig -p | grep gtsam 与 pkg-config --modversion eigen3,确认实际生效的版本,而不是只看安装日志。

五、依赖与检查清单

组件 推荐版本 验证命令 常见问题
Ubuntu 20.04 LTS lsb_release -a 18.04 需注意 C++ 标准
ROS Noetic roscore 环境变量未 source
GTSAM 4.0.2+ ldconfig -p | grep gtsam 多版本冲突
PCL 1.10 pcl_viewer 与 ROS 自带版本冲突
Eigen 3.3 pkg-config --modversion eigen3 头文件路径未包含
误区提醒:不要跳过 source devel/setup.bash 直接运行 roslaunch,否则会提示找不到 lio_sam 包;也不要在未安装 GTSAM 的情况下反复 catkin_make clean,那只会浪费时间,应先解决依赖再编译。

完成以上步骤后,可用 roslaunch lio_sam run.launch 启动节点,并通过 rostopic list 检查 /odometry、/cloud_registered 等话题是否正常发布。环境搭建的最终验收标准不是“编译通过”,而是“节点能启动、话题能通信、RViz 能看到点云与轨迹”。