news 2026/10/3 1:14:03

LIO-SAM在Ubuntu 20.04与ROS Noetic下的编译指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LIO-SAM在Ubuntu 20.04与ROS Noetic下的编译指南

作为一个常年跟激光SLAM算法打交道的人,我深知LIO-SAM这套代码的含金量。它是Tixiao Shan在LEGO-LOAM基础上迭代出来的作品,核心思路是把激光雷达、IMU和GPS(可选)通过因子图做紧耦合,在实时性和精度之间取得了很好的平衡,而且代码量不大,非常适合拿来学习多传感器融合的工程实现。不过很多人在Ubuntu 20.04 + ROS Noetic环境下编译LIO-SAM时,会踩到不少坑,尤其是GTSAM版本、PCL/OpenCV版本冲突这类问题,网上资料虽然多,但真正能一次性跑通的教程却不多。这篇文章我就把LIO-SAM在Noetic下从零编译到跑通demo数据集的完整过程梳理一遍,把我踩过的坑和验证过的方案都写清楚,给需要的人省点时间。

先说结论:LIO-SAM在Ubuntu 20.04 + Noetic下是完全可以编译通过的,核心难点不在代码本身,而在依赖库版本的选择上。只要把GTSAM、PCL、OpenCV这几个关键依赖的版本和编译顺序处理好,整个编译过程其实很顺。

1. 编译前的全局思路与方案选型

1.1 为什么推荐用Ubuntu 20.04 + Noetic来跑LIO-SAM

虽然LIO-SAM的作者最初是在Ubuntu 18.04 + Melodic环境下开发测试的,但如今Ubuntu 20.04 + Noetic已经成为ROS生态的主流组合,特别是Noetic是最后一个完全基于Python 2官方支持的ROS版本?说反了,恰恰Noetic是第一个默认使用Python 3的ROS发行版,这意味着大量新工具链和新算法库都在这个版本上做了适配,生态更健康,后续做扩展开发也方便。

但问题也随之而来:Noetic自带的PCL 1.10、OpenCV 4.2以及Eigen 3.3.7等库,和LIO-SAM在18.04环境下依赖的旧版本库有细微差异。这会导致编译过程中出现各种类型不匹配、函数签名改变、头文件路径缺失等报错。所以编译前搞清楚各依赖库的版本对应关系,比盲目改代码重要得多。

我整理了一张常见的环境组合对比表,可以直观看到差异:

依赖项Ubuntu 18.04 + Melodic 默认Ubuntu 20.04 + Noetic 默认说明
PCL1.8.11.10.0头文件路径有变化,部分API弃用
OpenCV3.2.04.2.0部分旧API需要兼容处理
Eigen3.3.43.3.7差异不大,基本兼容
gtsam需要自行编译需要自行编译LIO-SAM核心后端优化库
ROS底层MelodicNoetic消息接口基本一致

实际编译时,PCL和OpenCV的API变化是主要的坑点,后面我会专门讲。

1.2 编译策略的确定:先攻依赖,再战源码

LIO-SAM编译失败的案例里,绝大多数不是因为LIO-SAM源码本身有问题,而是GTSAM没有编译好,或者GTSAM与PCL的冲突没有处理好。GTSAM是Georgia Tech开发的因子图优化库,LIO-SAM用它来实现位姿图优化,是后端的关键依赖。因此,整个编译路线应当按照"系统依赖 → ROS基础包 → 算法依赖库 → LIO-SAM功能包"的顺序分层推进。

这个顺序是有讲究的:先确保系统的包管理器装好基础库,再用源码方式编译GTSAM,最后才编译LIO-SAM本体。如果反过来,先编译LIO-SAM再处理GTSAM,你会陷入"报错→改代码→又报错→重新编译"的循环里,非常浪费时间。

2. 依赖环境搭建与核心库编译实操

2.1 系统与ROS基础环境的准备

首先,你需要一台装了Ubuntu 20.04的机器。如果是双系统或者虚拟机,需要注意分配足够的磁盘和内存,我建议至少分配4核CPU和8GB内存,否则编译C++工程时会比较吃力,特别是在编译GTSAM这种模板库时,内存不够很容易被系统OOM杀死。

然后是ROS Noetic的安装,这里我默认你已经完成了ROS Noetic的安装和rosdep的初始化。如果没有安装,请参考ROS官方Wiki的安装步骤,先安装Desktop-Full版本,因为Desktop-Full自带RVIZ、TF树可视化工具和常用消息包,后面跑demo数据包时都会用到。需要注意的一点是:Noetic推荐使用Python 3环境,如果之前切换过Python版本,要注意保证ROS工具链能正常运行,可以用roscore快速验证一下。

rosdep初始化记得要做好,因为后续编译过程中,catkin会通过rosdep检查功能包的依赖是否齐全。如果rosdep没有update成功,编译时会出现"Unable to resolve dependencies"的提示。

2.2 核心依赖库的安装与版本匹配

在开始编译LIO-SAM前,要把这些系统依赖库装齐:

sudo apt-get install -y \ ros-noetic-pcl-ros \ ros-noetic-velodyne-msgs \ ros-noetic-rviz \ ros-noetic-tf2-geometry-msgs \ ros-noetic-cv-bridge \ libeigen3-dev \ libopencv-dev \ libpcl-dev \ libyaml-cpp-dev \ libgflags-dev \ libgoogle-glog-dev \ libtbb-dev

这里重点说说PCL和OpenCV。Noetic自带的libpcl-dev版本是1.10。LIO-SAM源码里,imageProjection.cpp和featureExtraction.cpp等文件大量使用了PCL的点云类型和滤波功能,这些在1.10版本下基本都能编译通过,但有一个需要注意的地方:pcl_conversions的头文件路径和消息转换接口在ROS版本间有调整,必须保证编译时能找到pcl_conversions/header.h,否则会出现找不到头文件的错误。

OpenCV则需要注意cv_bridge的版本匹配问题。Noetic自带的cv_bridge默认针对OpenCV 4.x编译,LIO-SAM中visual_feature.cpp(如果启用视觉特征)可能会使用OpenCV的特征提取接口,这些接口在OpenCV 4.2中统一到了opencv2/features2d.hpp中,不再推荐使用旧的opencv2/xfeatures2d/nonfree.hpp。所以只安装libopencv-dev即可,不需要额外安装OpenCV 3的兼容包。

安装完基础依赖后,用下面命令验证关键版本的匹配情况:

pcl-config --version pkg-config --modversion opencv4 pkg-config --modversion eigen3

正常输出的版本号应该分别是1.10.0、4.2.0和3.3.7。

2.3 GTSAM源码编译:整个流程中最关键的环节

GTSAM的编译是LIO-SAM编译成功与否的分水岭。LIO-SAM官方推荐的GTSAM版本是4.0.2。这个版本经过了LIO-SAM作者的验证,稳定性最好。网上有人说4.0.3也能用,确实能编译通过,但有个坑是4.0.3在部分Ubuntu 20.04版本的Boost库下会出现模板实例化的问题,虽然概率不高,但一旦遇到,排查起来非常痛苦。我的建议是:不要冒这个险,直接从GitHub拉取4.0.2的tag。

具体编译步骤如下:

cd ~ git clone --branch 4.0.2 https://github.com/borglab/gtsam.git cd gtsam mkdir build && cd build cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON -DGTSAM_BUILD_TESTS=OFF -DGTSAM_BUILD_UNSTABLE=ON .. make -j$(nproc) sudo make install

这里有几个关键参数我要特别说明:

  • GTSAM_BUILD_WITH_MARCH_NATIVE=OFF:这个参数非常关键。如果设置为ON,GTSAM在编译时会根据当前CPU的指令集做针对性优化,这意味着编译生成的二进制文件只能在你当前这台机器上运行。如果你后续要把编译好的代码拷贝到其他机器,或者与其他库混用,就会出现非法指令(illegal instruction)的错误。在编译LIO-SAM所依赖的算法库时,我统一建议关掉这个选项,提升可移植性。

  • GTSAM_USE_SYSTEM_EIGEN=ON:让GTSAM使用系统已安装的Eigen,而不是自己捆绑的Eigen版本。这一步能有效避免“Eigen对齐冲突”这类经典的编译错误。Eigen是一个模板库,它内部使用了大量固定大小的向量化内存对齐,如果同一个程序里使用了不同版本的Eigen头文件,会直接导致各种奇怪的段错误或编译报错。统一使用系统Eigen是消除这类问题的根本手段。

  • GTSAM_BUILD_UNSTABLE=ON:LIO-SAM的IMU预积分因子部分实际上依赖了GTSAM的Unstable模块,所以这个选项必须打开,否则编译LIO-SAM时会出现找不到ImuFactor相关头文件的错误。

编译GTSAM的时间取决于CPU性能,一般10分钟到半小时不等。编译完成后执行sudo make install,GTSAM的库文件会被安装到/usr/local/lib,头文件到/usr/local/include/gtsam,这些路径后续编译LIO-SAM时需要cmake能找到。

安装完成后,建议验证一下GTSAM的版本信息:

ls /usr/local/include/gtsam/base/Vector.h

能列出这个文件就说明GTSAM的基本头文件已经就位。

2.4 一个需要提前确认的依赖:Ceres Solver

LIO-SAM本身不强制依赖Ceres,但很多基于LIO-SAM改造的项目(比如LIO-SAM-Map优化、激光-视觉联合标定流程)会用到Ceres做BA优化。如果你只是跑LIO-SAM原生代码,Ceres可以不装。但如果你是做SLAM方向的研究,后续大概率会用到,我建议顺手把Ceres也装好,避免之后用到时再回头补环境。

Ceres的源码编译在Ubuntu 20.04下比较顺畅:

sudo apt-get install -y libceres-dev

也可以选择源码编译最新版本,但系统源里的Ceres版本对LIO-SAM相关项目来说完全够用,源码编译反而可能因为依赖冲突浪费时间。实测下来,Ubuntu 20.04自带的Ceres 1.14版本在后续标定项目中表现稳定。

3. LIO-SAM源码编译与demo数据包运行实录

3.1 工作空间的创建与源码拉取

依赖库就位后,就可以创建ROS catkin工作空间了。我习惯把所有算法的代码统一放在~/catkin_ws/src下,这样方便维护,也方便和后续其他功能包交叉引用。

mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd ~/catkin_ws catkin_make

这里的catkin_make会报错吗?第一次直接运行catkin_make一般会失败,因为工作空间里只有LIO-SAM一个功能包,而且它会去查找GTSAM等依赖。报错信息通常会在CMake阶段就中止,提示找不到GTSAM。这是因为GTSAM安装到/usr/local后,LIO-SAM的CMakeLists.txt中find_package(GTSAM COMPONENTS ...)需要能搜索到/usr/local/lib/cmake/GTSAM路径。

如果遇到找不到GTSAM的情况,可以手动设置环境变量:

export GTSAM_ROOT=/usr/local

或者干脆在~/.bashrc中加上:

export GTSAM_ROOT=/usr/local export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

然后source一下使得环境变量生效。

3.2 编译过程与关键参数调整

重新打开一个终端,进入工作空间执行以下命令:

cd ~/catkin_ws catkin_make -j4

-j4是并行编译的线程数,我这里故意保守一点用4线程,因为LIO-SAM的源码里包含了几个比较大的模板类,比如mapOptimization.cpp、imageProjection.cpp,这些文件单文件编译内存开销比较大,如果机器内存不足,并行线程数开太高容易被系统杀掉。如果是16GB内存以上的机器,用-j8也问题不大。

整个编译过程通常会遇到一个警告,就是using namespace Eigen;和某些第三方库的命名空间冲突,但一般只是warning不会报错,可以忽略。

编译成功的标志是在~/catkin_ws/devel/lib/lio_sam/目录下生成四个可执行文件:

  • lio_sam_imageProjection
  • lio_sam_featureExtraction
  • lio_sam_mapOptimization
  • lio_sam_imuPreintegration

看到这四个节点文件就说明编译已经通过了,接下来可以进行demo数据测试。

3.3 demo数据集的运行与launch文件修改

跑demo数据前,需要先下载官方提供的rosbag数据集。LIO-SAM官方在GitHub的README里提供了一组Google Drive链接,内容覆盖了各种场景,我们选其中最常见的walking dataset为例来演示。

下载好rosbag后,需要修改LIO-SAM的launch文件中的参数配置。打开终端,编辑~/catkin_ws/src/LIO-SAM/config/params.yaml:

gedit ~/catkin_ws/src/LIO-SAM/config/params.yaml

重点修改以下内容:

  • useImuLoopClosure: true这里可以保持默认,它控制是否启用IMU+雷达的里程计回环检测。
  • savePCD: false如果要保存地图点云,改为true并设置savePCDDirectory为你的目标路径。注意,这个路径必须是已存在的绝对路径,否则程序运行时会直接崩溃,不会给出任何友好提示。

然后是launch文件中的参数调整,打开~/catkin_ws/src/LIO-SAM/launch/run.launch,检查以下两项:

  • 点云话题名称:数据集中的点云话题一般是/points_raw,和launch文件里默认的/velodyne_points不同。需要把<param name="pointCloudTopic" value="/points_raw" />改对。
  • IMU话题名称:数据集中的IMU话题一般是/imu_raw,同样要检查是否匹配。

改完之后,启动三个终端:

终端1启动roscore:

roscore

终端2启动LIO-SAM:

cd ~/catkin_ws source devel/setup.bash roslaunch lio_sam run.launch

终端3播放数据集:

rosbag play your_downloaded_dataset.bag

播放之后,RVIZ窗口会实时显示点云地图的构建过程。这里有个小技巧:如果RVIZ里看不到地图,先检查点云话题时间戳是否和系统时间同步。如果是下载的公开数据集,时间戳是历史时间,需要加上--clock参数,让ROS使用bag中记录的时间:

rosbag play --clock your_downloaded_dataset.bag

同时,在run.launch中确认use_sim_time设置为true。这样TF树和各传感器的时间戳才能对齐。

3.4 运行效果评估与地图输出

运行结束后,LIO-SAM会在控制台输出位姿轨迹信息和回环检测结果。如果一切正常,你会看到回环检测报出多条“loop found”信息,地图构建也非常平滑。此时,如果设置了savePCD: true,运行结束后在设定的目录下会生成map.pcd文件,可以手动保存地图。

我个人实操时,用walking数据集在普通笔记本上(i7-9750H + 16GB内存 + GTX1660Ti)能保持30Hz左右的实时建图,CPU占用率在80%左右,说明LIO-SAM的轻量化特性确实名不虚传。

4. 编译与运行中的高发报错与排查方案

4.1 GTSAM相关的编译报错

编译LIO-SAM时最常见的报错是:

/usr/local/include/gtsam/...: error: 'gtsam::PinholeCamera' has not been declared

这类错误,九成原因是GTSAM版本不对,或者GTSAM没有被正确找到。尤其是如果你系统里碰巧装了多个GTSAM版本,比如通过apt装过ros-noetic-gtsam,然后你又手动编译安装了4.0.2,两者就会冲突。

排查方法:先查看/opt/ros/noetic/lib下是否有gtsam相关库文件。如果执行dpkg -l | grep gtsam能查到系统自带gtsam,建议先卸载它:

sudo apt-get remove ros-noetic-gtsam

然后再重新手动编译安装4.0.2版本。这个坑我踩过,当时编译LIO-SAM时一直提示某些头部函数声明找不到,后来源头是apt版GTSAM版本过旧,和LIO-SAM期望的API版本不一致。

4.2 PCL版本相关的编译报错

在Ubuntu 20.04 + Noetic环境下,PCL 1.10相比PCL 1.8有一些接口弃用和改名。LIO-SAM源码中,容易触发问题的是以下两个位置:

  • imageProjection.cpp中使用了pcl::PointCloud<PointType>::Ptr和pcl::transformPointCloud。这些在PCL 1.10下完全没有问题,但如果出现“找不到PCLPointCloud2转换函数”这类错误,说明pcl_ros的消息类型没有正确链接。解决方法是检查是否安装了ros-noetic-pcl-ros,并在CMakeLists.txt中确认find_package(PCL REQUIRED)被正确声明。

  • mapOptimization.cpp中调用了pcl::voxel_grid滤波和pcl::StatisticalOutlierRemoval滤波,1.10版本中这些类的头文件路径变为pcl/filters/voxel_grid.h和pcl/filters/statistical_outlier_removal.h,一般不会冲突。

另外,GTSAM和PCL同时使用时,可能会出现Eigen::aligned_allocator相关的报错。这本质上是Eigen内存对齐引起的编译冲突,解决方案已经在前面说过了:保证GTSAM使用系统Eigen(GTSAM_USE_SYSTEM_EIGEN=ON),同时不要往任何加了EIGEN_MAKE_ALIGNED_OPERATOR_NEW的类里塞STL容器元素,这属于Eigen的老话题了。

4.3 OpenCV版本相关的运行时异常

LIO-SAM默认不依赖视觉特征,但如果你的项目中额外启用了visualFeature相关模块,可能会遇到OpenCV 4.2下的API差异。最典型的问题是cv::solvePnP函数在多解时的行为变化,以及在OpenCV 4下findEssentialMat默认使用RANSAC时抛出的异常。

如果遇到这类运行时崩溃,首先确认是否安装了libopencv-dev和ros-noetic-cv-bridge,其次检查cv_bridge和OpenCV版本是否一致。Noetic默认的cv_bridge针对OpenCV 4编译,如果你另外用源码编译了OpenCV 3,那必然会产生链接冲突。这种情况下的解决方法只有一个:保持系统标准版本,不要动OpenCV。

4.4 编译卡死或内存不足现象

LIO-SAM的mapOptimization.cpp在编译时是出了名的吃内存。如果你使用的是虚拟机,或者物理内存只有8GB,那么catkin_make -j$(nproc)经常会导致编译进程被系统杀死,表现为终端显示Killed字样。

处理办法有两个方向:

  1. 降低并行编译线程数,例如用catkin_make -j2,让每个编译任务拥有更多内存。
  2. 临时增加swap空间,在/etc/fstab中配置一个swap文件,或者直接用fallocate和mkswap创建一块临时swap来缓解物理内存不足。

我个人实际测试,8GB内存的机器用-j2编译LIO-SAM是完全能通过的,只是时间会稍长一些,大概多等10分钟而已。不要盲目追求编译速度,稳定通过才是第一目标。

4.5 运行时不建图或地图闪退问题排查

运行LIO-SAM时,最让人头疼的问题就是RVIZ中看不到点云,或者地图稍微转两下就崩溃。这类问题通常不是编译造成的,而是数据时间同步和TF坐标系设置的问题。

用rqt_tf_tree命令检查TF树是否完整。LIO-SAM的正常TF树结构应当是:

map -> odom odom -> base_link base_link -> sensor_link (通常是 velodyne 或 camera_init)

如果map到odom的TF一直没有发布,说明回环检测或者后端优化节点没有正常工作,检查mapOptimization节点的输出日志。如果odom到base_link抖动剧烈,则说明IMU数据处理有误,检查imuTopic话题中的数据频率是否正常,LIO-SAM要求IMU频率不低于100Hz,如果只有50Hz,需要调整参数或使用IMU内插数据。

另外,数据集的点云话题如果是/points_raw,但你的launch文件里用的是/velodyne_points,那么RVIZ中当然不会有任何点云,因为节点根本就没有订阅到数据。用rostopic list查看当前话题列表,用rostopic hz /points_raw查看话题发布频率,这都是排查数据链路问题的基本功。

4.6 常见问题排查速查表

我把上边提到的坑整理成一个速查表,方便以后排障时直接查阅:

问题现象可能原因解决方案
CMake找不到GTSAMGTSAM未安装或未加入环境变量检查/usr/local/lib/cmake/GTSAM是否存在;添加GTSAM_ROOT=/usr/local环境变量
编译时报Eigen对齐错误GTSAM使用了自带Eigen而非系统Eigen重编GTSAM,加上-DGTSAM_USE_SYSTEM_EIGEN=ON
undefined reference togtsam::...GTSAM版本不对或与系统自带版本冲突卸载apt版GTSAM,源码安装4.0.2
运行时找不到/points_raw话题点云话题名称不匹配修改launch文件中的pointCloudTopic参数
RVIZ无地图且无TF时间戳不同步播放bag时加--clock参数,launch中设置use_sim_time: true
编译时内存不足被Killed并行线程数过多或物理内存不足降低-j线程数或增加swap空间
运行时崩溃:Segmentation fault保存pcd的路径不存在确保savePCDDirectory路径存在且可写
运行时报Invalid argumentIMU话题频率过低检查IMU话题数据频率,重新录包或增加IMU数据率

5. 编译成功后的功能扩展与二次开发方向

5.1 从LIO-SAM到LIO-SAM-Map与语义SLAM

一旦LIO-SAM在Noetic下成功编译和运行,你就拥有了一个非常稳定的多传感器融合SLAM底座。最常见的扩展方向是LIO-SAM-Map这种引入大量历史帧进行大规模建图的变种。它和LIO-SAM的主要差异在后端优化策略:后者保留更大的局部地图进行扫描匹配,对内存和算力的需求更高,但建图精度也会提升。实现方式通常是修改mapOptimization.cpp中的关键帧插入策略,并增加一个SC-PGO(Scan Context全局回环检测)模块。SC-PGO和LIO-SAM的结合是当前比较热门的增强方向,它能显著改善大场景下的累计漂移问题。

如果你对语义SLAM感兴趣,LIO-SAM的轻量化结构非常适合嫁接语义分割网络。思路也简单:在LIO-SAM提取特征之后,加入一个语义分割线程,为每个点云帧增加语义标签,让里程计和回环检测只使用地面点和背景点等静态物体,而把车辆、行人等动态物体剔除。这个方向在Noetic下实现起来很方便,因为Noetic对Python 3的支持很好,很多语义分割模型都可以直接部署。

5.2 适配自有传感器:从demo到真实设备

跑通demo数据集之后,下一步大概率是要把LIO-SAM迁移到自己的传感器平台上。这一步的关键在于把传感器数据转换成ROS消息格式,并且保证时间戳同步。

LIO-SAM的输入是:

  • 一个3D激光雷达话题,消息格式为PointCloud2
  • 一个6轴或9轴IMU话题,消息格式为sensor_msgs/Imu

如果使用的激光雷达是Livox系列,需要额外注意点云数据的预处理。Livox官方提供了livox_ros_driver2,发布的消息是自定义的livox_ros_driver2/CustomMsg,LIO-SAM原版是不认这种数据格式的,需要先使用livox_point_cloud_converter把它转成标准的PointCloud2格式,再通过pointcloud_to_laserscan或直接转发到/points_raw话题。如果直接让LIO-SAM订阅CustomMsg,编译能过,但运行时不会有点云数据。

IMU的安装位置校准也容易被忽视。LIO-SAM假设IMU和激光雷达之间的外参已经标定好,如果外参不准,即使编译运行成功,建出的地图也会有明显的漂移和分层现象。建议先使用lidar-IMU联合标定工具(如LiLi-OM、lidar_imu_calib)做好外参标定,再把外参参数填入params.yaml。

5.3 性能调优实践:编译优化参数

如果你对实时性有更高要求,还可以在编译阶段做一些优化。LIO-SAM源码的CMakeLists.txt中默认使用的是-O2优化级别,你也可以尝试改为-O3,在某些CPU上能带来5%-10%的帧率提升。修改方式是在CMakeLists.txt中找到add_definitions或者set(CMAKE_CXX_FLAGS_RELEASE ...)的行,加上-O3 -march=native。但要注意,-march=native和GTSAM编译时的可移植性设定是冲突的,如果是自己本机使用,可以加上;如果后续要换机器运行,就别加。

另一个调优方向是修改params.yaml中关键帧之间的距离阈值和角度阈值,让系统插入更少的关键帧,减轻后端优化的压力。对于室外大场景,将keyFrameMeter从1.0调整到1.5或2.0,能明显降低CPU占用,而精度损失通常在一个可接受范围内。这个参数的调整没有绝对标准,需要根据传感器精度和应用场景实测折中。

6. 写在最后:一个过来人的经验小结

LIO-SAM的编译折腾下来,我的最大感受是:这套代码的质量整体是过硬的,它之所以让很多人卡住,问题几乎都集中在依赖库管理上。Ubuntu 20.04 + Noetic的组合只要把GTSAM的编译参数选对,把PCL和OpenCV的版本匹配处理好,整个编译过程比想象中顺利。

最后分享一个我自己的习惯:编译任何SLAM算法之前,先把系统的所有依赖库版本记录下来,用pkg-config --modversion逐个验证一遍,这比编译报错后再回头排查要高效得多。另外养成使用catkin build而不是catkin_make的习惯,catkin build在增量编译时更人性化,能精确告诉你每个功能包的编译状态和依赖顺序,排查问题的时候直观很多。

如果你的编译过程遇到了我在文章里没提到的问题,优先去GitHub的Issue区搜索,很多坑早就有前人留下了解答。祝大家都能顺利跑通LIO-SAM,在自己平台上建出漂亮的第一张地图。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:14:03

风电场运维管理教案:从三层维护体系到EAM闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:10:35

OpenArm机械臂零件缺陷分析与加固改进实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:09:45

Playwright测试框架实战:从零编写稳定可靠的Web端到端测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:09:45

电商App算法黑盒分析:以Shopee为例拆解推荐与搜索排序

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:09:15

变压器UL认证测试项目全解析:从耐压、温升到异常工况

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 1:09:07

从零搭建开源医学影像Web阅片系统:OHIF + Orthanc 实战部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华