本节小编将在 Ubuntu 18.04 系统中安装 SC-LeGO-LOAM 这个激光 SLAM 算法,并将在下一节以它为代表讲述三维的激光雷达定位基础知识。
其中关于对特殊情况 的处理可能会 对读者安装有一定的帮助 ,(小编的踩坑经历),这些地方在小编问AI时并没有给出满意的回答,甚至陷入了死循环,但小编所列出的痛点 可以帮助读者"有的放矢 ",下载 SC-LeGO-LOAM 源码时,从GitHub上面下载的源码在编译时会出状况 ,不要 按照AI给出的建议修改xml文件 和CMakeLists文件,详细解决方案见下文。
创建并初始化工作空间
bash
# 创建工作空间目录(按你的要求命名)
mkdir -p ~/sc_lego_loam_ws/src
cd ~/sc_lego_loam_ws/src
# 初始化工作空间(生成CMakeLists.txt)
cd ~/sc_lego_loam_ws
catkin_make
# 设置工作空间环境变量(永久生效)
echo "source ~/sc_lego_loam_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
手动编译安装 GTSAM
bash
# 创建GTSAM编译目录
mkdir -p ~/gtsam_build && cd ~/gtsam_build
# 克隆GTSAM 4.2.0(适配Ubuntu18.04的稳定版本)
git clone --depth 1 --branch 4.2.0 https://github.com/borglab/gtsam.git
cd gtsam && mkdir build && cd build
# 配置编译参数(关闭示例/测试,加快编译)
cmake -DGTSAM_BUILD_EXAMPLES=OFF -DGTSAM_BUILD_TESTS=OFF -DGTSAM_WITH_CUDA=OFF ..
# 编译(自动匹配CPU核心数,速度最快)
make -j$(nproc)
# 安装到系统目录
sudo make install
# 验证GTSAM安装(输出4.2.0则成功)
pkg-config --modversion gtsam
如果之后输入以下指令能够正常反馈,那么安装就没有出现问题。
bash
# 检查GTSAM核心头文件(应有.h文件)
ls /usr/local/include/gtsam/ | head -5
# 检查GTSAM库文件(应有.so动态库)
ls /usr/local/lib/libgtsam.so*
# 检查cmake配置文件(编译SC-LeGO-LOAM会用到)
ls /usr/local/lib/cmake/GTSAM/GTSAMConfig.cmake

安装特殊情况的处理
原因:部分 GTSAM 版本(尤其是非稳定版)可能不会自动生成gtsam.pc文件。
1.# 验证GTSAM安装(输出4.2.0则成功)
pkg-config --modversion gtsam,这一步可能会存在pkg-config 配置的问题,显示没有生成gtsam.pc文件,我们可以强制生成gtsam.pc文件。(手动创建一个)
bash
# 先创建 pkgconfig 目录(如果不存在)
sudo mkdir -p /usr/local/lib/pkgconfig
# 创建并编辑 gtsam.pc 文件
sudo nano /usr/local/lib/pkgconfig/gtsam.pc
将以下内容完整粘贴进去(适配你已安装的 GTSAM 路径):
bash
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: GTSAM
Description: Georgia Tech Smoothing and Mapping Library (Unstable)
Version: 4.2.0 # 若知道具体版本可修改,比如 4.1.1/4.3.0
URL: https://github.com/borglab/gtsam
Libs: -L${libdir} -lgtsam -lgtsam_unstable
Libs.private: -lboost_serialization -lboost_system -lpthread
Cflags: -I${includedir} -I${includedir}/gtsam_unstable
保存退出(Ctrl+O 回车,Ctrl+X)。
验证 gtsam.pc 是否生效
bash
# 刷新 pkg-config 缓存并检查
pkg-config --list-all | grep gtsam
# 输出 "gtsam - Georgia Tech Smoothing and Mapping Library (Unstable)" 即成功
# 验证版本和链接信息
pkg-config --modversion gtsam
pkg-config --libs --cflags gtsam

下载 SC-LeGO-LOAM 源码
bash
# 回到工作空间src目录
cd ~/sc_lego_loam_ws/src
# 克隆SC-LeGO-LOAM源码
git clone https://github.com/gisbi-kim/SC-LeGO-LOAM.git
# 安装ROS依赖(自动补全缺失的包)
cd ~/sc_lego_loam_ws
rosdep install --from-paths src --ignore-src -r -y
安装ROS依赖时会有如下报错,执行 rosdep install 时提示找不到 gtsam 的 rosdep 定义,这是正常现象 ------ 因为 GTSAM 不是 ROS 官方维护的包,rosdep 数据库里没有它的配置,所以这个报错可以直接忽略,不影响后续编译。现在,除了 gtsam 之外,其他所有 ROS 依赖都已经安装成功了。我们直接编译 SC-LeGO-LOAM(绕开 rosdep 对 gtsam 的检查),可以消除这个报错。

bash
# 进入工作空间根目录
cd ~/sc_lego_loam_ws
# 清理之前的编译缓存(避免残留问题)
catkin_make clean
#先备份原有的 CMakeLists.txt
cd ~/sc_lego_loam_ws/src/SC-LeGO-LOAM/
cp CMakeLists.txt CMakeLists.txt.bak
执行以下命令,直接覆盖原有文件(内容已完整适配手动安装的 GTSAM):
bash
cat > CMakeLists.txt << EOF
cmake_minimum_required(VERSION 2.8.3)
project(sc_lego_loam)
## Compile as C++11, supported in ROS Kinetic and newer
set(CMAKE_CXX_FLAGS "-std=c++11")
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
sensor_msgs
nav_msgs
geometry_msgs
tf
pcl_ros
cv_bridge
image_transport
)
## 手动强制查找GTSAM(核心修复部分)
# 指定GTSAM头文件路径
set(GTSAM_INCLUDE_DIR /usr/local/include)
# 指定GTSAM库文件路径
set(GTSAM_LIBRARY /usr/local/lib/libgtsam.so)
# 确保GTSAM路径有效
if(NOT EXISTS \${GTSAM_INCLUDE_DIR} OR NOT EXISTS \${GTSAM_LIBRARY})
message(FATAL_ERROR "GTSAM not found! Check path: \${GTSAM_INCLUDE_DIR} and \${GTSAM_LIBRARY}")
endif()
## System dependencies are found with CMake's conventions
find_package(Boost REQUIRED COMPONENTS system)
find_package(PCL 1.7 REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# std_msgs# sensor_msgs# nav_msgs# geometry_msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
INCLUDE_DIRS include
# LIBRARIES sc_lego_loam
CATKIN_DEPENDS roscpp rospy std_msgs sensor_msgs nav_msgs geometry_msgs tf pcl_ros cv_bridge image_transport
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
\${catkin_INCLUDE_DIRS}
\${PCL_INCLUDE_DIRS}
\${EIGEN3_INCLUDE_DIR}
\${OpenCV_INCLUDE_DIRS}
\${GTSAM_INCLUDE_DIR} # 手动添加GTSAM头文件路径
)
## Declare a C++ library
# add_library(\${PROJECT_NAME}
# src/\${PROJECT_NAME}/sc_lego_loam.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(\${PROJECT_NAME} \${\${PROJECT_NAME}_EXPORTED_TARGETS} \${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(imageProjection src/imageProjection.cpp)
add_executable(featureAssociation src/featureAssociation.cpp)
add_executable(mapOptmization src/mapOptmization.cpp)
add_executable(transformFusion src/transformFusion.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(\${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(\${PROJECT_NAME}_node \${\${PROJECT_NAME}_EXPORTED_TARGETS} \${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(imageProjection
\${catkin_LIBRARIES}
\${PCL_LIBRARIES}
\${OpenCV_LIBS}
\${GTSAM_LIBRARY} # 手动链接GTSAM库
)
target_link_libraries(featureAssociation
\${catkin_LIBRARIES}
\${PCL_LIBRARIES}
\${OpenCV_LIBS}
\${GTSAM_LIBRARY} # 手动链接GTSAM库
)
target_link_libraries(mapOptmization
\${catkin_LIBRARIES}
\${PCL_LIBRARIES}
\${OpenCV_LIBS}
\${GTSAM_LIBRARY} # 手动链接GTSAM库
)
target_link_libraries(transformFusion
\${catkin_LIBRARIES}
\${PCL_LIBRARIES}
\${OpenCV_LIBS}
\${GTSAM_LIBRARY} # 手动链接GTSAM库
)
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION \${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS \${PROJECT_NAME}_node
# RUNTIME DESTINATION \${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS \${PROJECT_NAME}
# ARCHIVE DESTINATION \${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION \${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION \${CATKIN_GLOBAL_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/\${PROJECT_NAME}/
# DESTINATION \${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION \${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(\${PROJECT_NAME}-test test/test_sc_lego_loam.cpp)
# if(TARGET \${PROJECT_NAME}-test)
# target_link_libraries(\${PROJECT_NAME}-test \${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
EOF
bash
# 回到工作空间根目录
cd ~/sc_lego_loam_ws
# 清理所有编译缓存(关键)
catkin_make clean
# 重新编译(无需额外指定路径,CMakeLists.txt已内置)
catkin_make -DCMAKE_BUILD_TYPE=Release
验证编译结果的正确操作
bash
ls ~/sc_lego_loam_ws/devel/lib/lego_loam/

编译成功后,可通过以下命令启动 SC-LeGO-LOAM(需先确保 ROS 环境已加载):
bash
source ~/sc_lego_loam_ws/devel/setup.bash
roslaunch lego_loam run.launch
运行结果如图:


特殊情况处理:
如果显示找不到cloud_info.h,
单独编译真正的 cloud_msgs 包(生成 cloud_info.h)
WHY:因为源代码中cloud_msgs与LeGO_LOAM是分开存放的。小编对特殊情况的处理是尝试完AI给出的所有解决方案中,针对该开源下载文件的处理方法,操作过程因人而异,但是解决的核心问题就是小编排查下的这个问题。
如图是这个开源代码空间结构的对应部分

bash
cd ~/catkin_ws
# 彻底删除旧的cloud_msgs编译产物
rm -rf build/cloud_msgs devel/include/cloud_msgs devel/lib/cloud_msgs
# 只编译cloud_msgs包(强制生成cloud_info.h)
catkin_make --pkg cloud_msgs
验证文件是否真的生成
bash
ls /home/abot/catkin_ws/devel/include/cloud_msgs/cloud_info.h
如果输出:/home/abot/catkin_ws/devel/include/cloud_msgs/cloud_info.h → 生成成功
bash
# 清理LeGO-LOAM的编译缓存
rm -rf build/lego_loam devel/lib/lego_loam
# 编译整个工作空间
catkin_make -DCMAKE_BUILD_TYPE=Release
(拓展)KITTI数据集的下载
下载 KITTI 数据集的 bag 包,是因为SC-LeGO-LOAM 是一个激光 SLAM 算法,需要实际的传感器数据来验证其建图功能,而 KITTI 数据集是激光 SLAM 领域的常用公开数据集,主要作用包括:
1. 测试算法功能
SC-LeGO-LOAM 编译完成后,需要输入激光雷达(+IMU)数据 才能运行 ------KITTI 的 bag 包是已经转换成 ROS 格式的数据集,直接通过rosbag play播放,就能在 rviz 中看到算法的实时建图效果,验证安装是否真正可用。
2. 验证算法性能
KITTI 数据集自带真实的轨迹和地图标注,可以将 SC-LeGO-LOAM 输出的建图结果与真实数据对比,评估算法的定位精度、建图完整性等性能指标。
3. 学习 SLAM 流程
通过实际数据测试,能熟悉 SLAM 系统的完整工作链:
- 数据输入(bag 包播放)
- 算法处理(激光特征提取、配准、优化)
- 结果可视化(rviz 显示点云地图)
小编推荐大家去下面的这个链接中去下载,其他方式小编帮大家踩过坑了不推荐。
- 这个百度网盘链接里的 bag 包适配相关 SLAM 方案,可直接用于测试。链接:https://pan.baidu.com/s/13MlLlzqUJME8ungRNJbaSQ,提取码:hl71 。
重新配置 VMware 共享文件夹并挂载
-
关闭虚拟机,重新设置共享:
- 打开 VMware→虚拟机设置→选项→共享文件夹→选择 "总是启用";
- 点击 "添加",选择物理机中 bag 包所在的文件夹,设置共享名称(如
kitti_bag)。
2. 启动虚拟机,手动挂载共享目录
bash
# 创建挂载目录
sudo mkdir -p /mnt/hgfs/kitti_bag
# 挂载共享文件夹(替换kitti_bag为你的共享名称)
sudo vmhgfs-fuse .host:/kitti_bag /mnt/hgfs/kitti_bag -o allow_other
#若能看到物理机中的 bag 包,说明挂载成功
ls /mnt/hgfs/kitti_bag
# 进入共享目录
cd /mnt/hgfs/kitti_bag
# 复制bag包到dataset目录
cp kitti_2011_09_30_drive_0027_synced_SELF.bag ~/sc_lego_loam_ws/dataset/


启动 SC-LeGO-LOAM
终端1:启动算法
bash
# 启动算法(自动打开RViz可视化界面) 终端1
roslaunch lego_loam run.launch
终端 2:播放 KITTI bag 包(给算法输入数据)
bash
# 加载环境
source ~/sc_lego_loam_ws/devel/setup.bash
# 进入dataset目录
cd ~/sc_lego_loam_ws/dataset
# 播放bag包(--clock同步时间,-r 0.5降速播放更清晰)
rosbag play --clock ~/catkin_ws/dataset/kitti_2011_09_30_drive_0027_synced_SELF.bag -r 0.5
- 播放后终端会显示
Playing bag: 2011_09_30_0027.bag,并滚动显示话题发布信息; - 此时 RViz 窗口会逐渐出现激光点云、轨迹和地图。
终端 3:查看节点运行状态(排查问题用)
bash
# 查看SC-LeGO-LOAM的节点是否都在运行
rosnode list
正常会看到/featureAssociation、/imageProjection、/mapOptmization、/transformFusion这 4 个节点。
在 RViz 窗口中检查以下内容,确认建图成功:
- 左侧 Displays 面板 :
- 确认
LaserMap、LaserOdometry、PointsRaw这几个选项已勾选; Fixed Frame设置为map(或odometry),Target Frame无需修改。
- 确认
- 右侧视图区 :
- 能看到彩色的激光点云(原始点云);
- 能看到蓝色 / 红色的轨迹线(算法输出的里程计);
- 能看到逐渐拼接的地图点云(LaserMap)。
常见问题快速解决
如果 RViz 空白 / 无显示,按以下顺序排查:
-
话题不匹配 :在终端执行
rostopic list,确认有/points_raw、/lasermap等话题(SC-LeGO-LOAM 会将/velodyne_points重映射为/points_raw); -
坐标系问题 :在 RViz 的
Fixed Frame下拉框选择velodyne或base_link; -
bag 包播放速度 :去掉
-r 0.5,直接执行rosbag play --clock 2011_09_30_0027.bag; -
算法节点崩溃 :回到终端 1,查看是否有
segmentation fault报错,若有重新编译 SC-LeGO-LOAM:cd ~/sc_lego_loam_ws catkin_make clean && catkin_make -DCMAKE_BUILD_TYPE=Release
关键验证点:RViz 能看到激光点云 + 轨迹
总结
本节内容是小编自己的一个下载过程,重点在于对下载过程中报错情况的处理,希望能够对读者接下来的学习产生一定的帮助。