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++ 标准差异。下图给出依赖安装与工作空间编译的整体关系,便于先建立全局认识。
二、方法流程:从系统到可运行节点
第一步是确认系统与 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 能看到点云与轨迹”。