三维激光雷达定位 SC-LeGO-LOAM (上)

本节小编将在 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 显示点云地图)

小编推荐大家去下面的这个链接中去下载,其他方式小编帮大家踩过坑了不推荐。

重新配置 VMware 共享文件夹并挂载
  1. 关闭虚拟机,重新设置共享

    • 打开 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 窗口中检查以下内容,确认建图成功:

  1. 左侧 Displays 面板
    • 确认LaserMapLaserOdometryPointsRaw这几个选项已勾选;
    • Fixed Frame设置为map(或odometry),Target Frame无需修改。
  2. 右侧视图区
    • 能看到彩色的激光点云(原始点云);
    • 能看到蓝色 / 红色的轨迹线(算法输出的里程计);
    • 能看到逐渐拼接的地图点云(LaserMap)。

常见问题快速解决

如果 RViz 空白 / 无显示,按以下顺序排查:

  1. 话题不匹配 :在终端执行rostopic list,确认有/points_raw/lasermap等话题(SC-LeGO-LOAM 会将/velodyne_points重映射为/points_raw);

  2. 坐标系问题 :在 RViz 的Fixed Frame下拉框选择velodynebase_link

  3. bag 包播放速度 :去掉-r 0.5,直接执行rosbag play --clock 2011_09_30_0027.bag

  4. 算法节点崩溃 :回到终端 1,查看是否有segmentation fault报错,若有重新编译 SC-LeGO-LOAM:

    复制代码
    cd ~/sc_lego_loam_ws
    catkin_make clean && catkin_make -DCMAKE_BUILD_TYPE=Release

关键验证点:RViz 能看到激光点云 + 轨迹

总结

本节内容是小编自己的一个下载过程,重点在于对下载过程中报错情况的处理,希望能够对读者接下来的学习产生一定的帮助。

相关推荐
鲁邦通物联网10 小时前
架构拆解:如何构建支持室外内外网络切换的机器人梯控中间件?
机器人·机器人梯控·agv梯控·机器人乘梯·机器人自主乘梯·agv机器人梯控
不做无法实现的梦~10 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
【赫兹威客】浩哥10 小时前
无人机视角军事目标细分类检测数据集及多YOLO版本训练验证
yolo·分类·无人机
大江东去浪淘尽千古风流人物12 小时前
【SLAM】Hydra-Foundations 层次化空间感知:机器人如何像人类一样理解3D环境
深度学习·算法·3d·机器人·概率论·slam
深蓝学院19 小时前
无人机操控新方式!Glove2UAV实现手势直控+触觉反馈,还能盲感知风险
无人机
大江东去浪淘尽千古风流人物19 小时前
【VLN】VLN Paradigm Alg:Reinforcement learning 强化学习及其细节(4)
机器人·大模型·概率论·端侧部署·巨身智能
才兄说20 小时前
机器人租售出场分几次?分段专人触发
机器人
麦德泽特20 小时前
基于 ESP32S3芯片的机器人设计与实现
机器人
元让_vincent20 小时前
DaliyCoding C++ ROS | C++ 避坑指南:ROS 回调函数中的对象生命周期陷阱 (Use-After-Free)
开发语言·c++·机器人·ros·ros2
clt12332120 小时前
阿里千问聊天机器人
机器人