当前位置: 首页 > news >正文

LIO-SAM 完整安装教程(Ubuntu 20.04 + ROS Noetic + GTSAM 4.0)

前言

LIO-SAM (LiDAR-Inertial Odometry via Smoothing And Mapping) 是 Tixiao Shan 等人于 2020 年提出的紧耦合激光-惯性- GPS里程计与建图系统。它在 LeGO-LOAM 的基础上加入了 IMU 预积分因子、GPS 因子和回环检测因子,使用 GTSAM 的 iSAM2 增量优化器进行联合优化,实现了全局一致的高精度3D地图构建

GitHub: https://github.com/TixiaoShan/LIO-SAM
论文:LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping, Shan et al., IROS 2020


1. 系统环境要求

项目要求说明
操作系统Ubuntu 18.04 / 20.04 LTS本文以 20.04 + ROS Noetic 为例
ROSMelodic / Noetic必须
编译器GCC 7.5+C++14
CMake3.3+
内存8GB+
GPU无要求纯CPU计算
依赖GTSAM 4.0+, PCL, Eigen3, OpenCVGTSAM 是最容易出错的依赖

2. 依赖库全景图

LIO-SAM ├── ROS Noetic(通信 + 可视化) │ ├── roscpp, sensor_msgs, nav_msgs │ ├── pcl_ros / pcl_conversions │ ├── tf / tf2 / tf2_ros │ ├── robot_localization(可选:GPS融合) │ └── rviz ├── GTSAM 4.0+ —— 因子图优化引擎(核心!) │ ├── iSAM2 增量优化器 │ ├── IMU 预积分因子 │ └── 各种因子类型 ├── PCL 1.10+ —— 点云处理 ├── Eigen3 —— 线性代数 ├── OpenCV 4.x —— 仅用于可视化 └── Ceres Solver —— 间接依赖(GTSAM可能用到)

⚠️最重要的坑:GTSAM 版本必须是4.0 或更高。Ubuntu 20.04 apt 源的 GTSAM 版本可能太旧,推荐从源码编译 GTSAM 4.0.2 或 4.1.0。


3. 第一步:安装 ROS Noetic

# 添加 ROS 源sudosh-c'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'sudoaptinstallcurlcurl-shttps://raw.githubusercontent.com/ros/rosdistro/master/ros.asc|sudoapt-keyadd-# 安装sudoaptupdatesudoaptinstall-yros-noetic-desktop-full# 初始化sudorosdep init rosdep update# 环境变量echo"source /opt/ros/noetic/setup.bash">>~/.bashrcsource~/.bashrc

4. 第二步:安装基础依赖

# PCL 点云库sudoaptinstall-ylibpcl-dev pcl-tools# ROS PCL 桥接包sudoaptinstall-yros-noetic-pcl-ros ros-noetic-pcl-conversions\ros-noetic-pcl-msgs# Eigen3sudoaptinstall-ylibeigen3-dev# OpenCVsudoaptinstall-ylibopencv-dev# robot_localization(GPS 融合需要)sudoaptinstall-yros-noetic-robot-localization\ros-noetic-geographic-msgs# 可视化sudoaptinstall-yros-noetic-rviz ros-noetic-rqt# 基础工具sudoaptinstall-ybuild-essential cmakegitlibboost-all-dev

5. 第三步:编译安装 GTSAM 4.0.2

这是最容易出错的步骤。GTSAM 是 LIO-SAM 的核心优化引擎。

# 下载 GTSAM 4.0.2gitclone https://github.com/borglab/gtsam.gitcdgtsamgitcheckout4.0.2# 安装编译依赖sudoaptinstall-ylibboost-all-dev libtbb-dev# 编译(关键:必须加以下 CMake 参数!)mkdirbuild&&cdbuild cmake..\-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF\-DGTSAM_USE_SYSTEM_EIGEN=ON\-DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF\-DGTSAM_BUILD_TESTS=OFF\-DCMAKE_BUILD_TYPE=Releasemake-j$(nproc)sudomakeinstall# 更新库路径sudoldconfig# 验证安装ls/usr/local/lib/libgtsam.sols/usr/local/include/gtsam/

GTSAM 编译参数说明

参数含义为什么需要
GTSAM_BUILD_WITH_MARCH_NATIVE=OFF不针对本机CPU优化否则可能在不同机器上无法运行
GTSAM_USE_SYSTEM_EIGEN=ON使用系统 Eigen避免版本冲突
GTSAM_BUILD_TESTS=OFF不编译测试大幅减少编译时间
GTSAM_BUILD_EXAMPLES_ALWAYS=OFF不编译示例同上

GTSAM 版本不匹配的典型报错

error: 'class gtsam::PreintegratedImuMeasurements' has no member named '...' error: no matching function for call to 'gtsam::ISAM2::update(...)'

如果遇到这些错误,说明 GTSAM 版本不对。卸载重装:

sudomakeuninstall# 在 GTSAM build 目录下sudorm-rf/usr/local/include/gtsamsudorm-f/usr/local/lib/libgtsam*

6. 第四步:创建工作空间并编译 LIO-SAM

# 创建工作空间mkdir-p~/catkin_ws/srccd~/catkin_ws/src# 克隆 LIO-SAMgitclone https://github.com/TixiaoShan/LIO-SAM.git# 安装 ROS 依赖cd~/catkin_ws rosdepinstall--from-paths src --ignore-src-r-y# 编译catkin_make -j$(nproc)# 设置环境变量echo"source ~/catkin_ws/devel/setup.bash">>~/.bashrcsource~/.bashrc

7. 第五步:下载测试数据集

官方示例(Walking Dataset)

# LIO-SAM 作者提供的示例数据wgethttps://drive.google.com/uc?id=1A8HNL3BHYo8oQrDzFXrkYxHx46GSJStR\-Ocasual_walk.bag

KITTI 数据集

LIO-SAM 也支持 KITTI 数据集(需自行转换为 ROS bag 格式)。

自定义数据集要求

自己的 bag 文件需要包含以下话题:

  • /velodyne_points/ouster/points:LiDAR 点云
  • /imu/data:IMU 数据(加速度计 + 陀螺仪)
  • /gps/fix(可选):GPS 数据(sensor_msgs/NavSatFix)

8. 第六步:运行测试

# 终端1:启动 LIO-SAMroslaunch lio_sam run.launch# 终端2:播放数据包rosbag play YOUR_BAG.bag--clock-r1

运行成功后,RViz 中会显示:

  • 白色点云:当前帧的角点
  • 彩色点云:全局地图
  • 红色线条:里程计轨迹(lio_sam/path)
  • 坐标轴:当前位姿
  • 绿色线条:GPS 轨迹(如果有GPS数据)

9. 配置文件参数说明

# config/params.yaml 核心参数# ─── 传感器配置 ───lio_sam/imu_topic:"/imu/data"# IMU 话题lio_sam/lidar_topic:"/velodyne_points"# LiDAR 话题# ─── LiDAR 参数 ───lio_sam/N_SCAN:16# 扫描线数(VLP-16=16, HDL-64=64, Ouster OS1=128)lio_sam/Horizon_SCAN:1800# 每条线的水平点数lio_sam/edgeThreshold:1.0# 角点曲率阈值lio_sam/surfThreshold:0.1# 面点曲率阈值lio_sam/lidarMinRange:1.0# 最小有效距离(m)lio_sam/lidarMaxRange:100.0# 最大有效距离(m)# ─── IMU 参数 ───lio_sam/imuAccNoise:3.993957088e-03# 加速度计噪声密度lio_sam/imuGyrNoise:1.563634394e-03# 陀螺仪噪声密度lio_sam/imuAccBiasN:6.435665935e-05# 加速度计随机游走lio_sam/imuGyrBiasN:3.564031869e-05# 陀螺仪随机游走lio_sam/imuGravity:9.80511# 重力加速度(m/s²)# ─── 外参 ───lio_sam/extrinsicRot:[-1,0,0,0,1,0,0,0,-1]# LiDAR→IMU 旋转lio_sam/extrinsicRPY:[0,1,0,1,0,0,0,0,1]# LiDAR→IMU RPY# ─── 回环检测 ───lio_sam/loopClosureEnableFlag:true# 启用回环检测lio_sam/loopClosureFrequency:1.0# 回环检测频率(Hz)lio_sam/historyKeyframeSearchRadius:15.0# 回环搜索半径(m)lio_sam/historyKeyframeSearchNum:25# 回环搜索关键帧数# ─── GPS ───lio_sam/gpsUseFlag:false# 是否使用GPS

10. 常见问题排查

问题1:GTSAM 编译失败

error: 'tbb/tbb.h' file not found

解决

sudoaptinstall-ylibtbb-dev

问题2:LIO-SAM 找不到 GTSAM

Could not find a package configuration file provided by "GTSAM"

解决

# 确保 GTSAM 安装正确ls/usr/local/lib/cmake/GTSAM/# 如果目录不存在或内容为空,重新编译安装 GTSAM# 如果存在但 CMake 仍找不到exportGTSAM_DIR=/usr/local/lib/cmake/GTSAM

问题3:运行时崩溃 “bad_alloc”

terminate called after throwing an instance of 'std::bad_alloc'

解决

  • 减小historyKeyframeSearchNum(从 25 降到 10)
  • 增加surroundingKeyframeSearchRadius(减少局部地图大小)
  • 确保系统有 8GB+ 内存

问题4:IMU 话题无数据

  • 检查params.yamlimu_topic是否正确
  • 使用rostopic list查看所有话题
  • IMU 话题中的frame_id需要与 launch 文件中的一致

问题5:回环检测不触发

  • 确保运动中有实际的重访场景
  • 检查loopClosureEnableFlag: true
  • 减小historyKeyframeSearchRadius以放宽搜索范围

11. LIO-SAM 与 A-LOAM / Fast-LIO 安装对比

对比项LIO-SAMA-LOAMFast-LIO
传感器LiDAR + IMU + GPS(可选)LiDARLiDAR + IMU
核心优化库GTSAM 4.0+Ceres 1.14Eigen(手写IESKF)
GTSAM 编译需要手动编译(~20min)不需要不需要
ROS 依赖多(robot_localization等)少(基础)中(Livox SDK)
安装难度★★★★★★★★
编译时间~20分钟~5分钟~5分钟
代码量~15000行~2000行~5000行

总结

步骤操作时间
安装 ROS Noeticapt install10-20分钟
安装基础依赖apt install5分钟
编译 GTSAM 4.0.2git clone + cmake20-40分钟
编译 LIO-SAMcatkin_make5-15分钟
下载测试数据取决于网速10-30分钟

整个流程约50分钟至2小时。核心坑点只有一个——GTSAM 版本和编译参数。掌握 CMake 参数-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON,安装基本不会出问题。

http://www.zskr.cn/news/1425459.html

相关文章:

  • Switch Transformers Base-32源码解析:理解路由机制与专家选择
  • UE5 Niagara实战:如何用‘事件’和‘蓝图通信’让粒子跟游戏世界互动(附项目文件)
  • 6美元引爆Messenger订阅:低成本Chatbot增长策略全解析
  • 第五波计算与物联网:从环境智能到产业变革的核心逻辑与应用
  • 如何3分钟搞定iPhone网络共享驱动:Windows用户的终极解决方案
  • 大模型技术全景:从架构到应用,小白也能轻松入门收藏!
  • 医疗数字化转型:患者参与解决方案的架构设计与落地实践
  • 2026年口碑好的南京弹性体双螺杆造粒机/电缆料双螺杆造粒机公司对比推荐 - 品牌宣传支持者
  • 蓝桥杯嵌入式备赛:用HAL库搞定UART串口收发(附省赛真题解析)
  • 如何永久珍藏你的数字记忆:WeChatMsg聊天记录保存终极指南
  • 告别死等:用STM32 HAL库的DMA+中断高效驱动I2C EEPROM
  • 星际治理:基于区块链与DAO的跨行星社会架构设计
  • 15分钟掌握跨平台网络资源下载神器:轻松保存视频号、抖音、小红书内容
  • AI创业避坑指南:如何避免“高速盲跑”,构建持久技术护城河
  • UE5 Lumen全局光照实战:如何用动态光照让你的场景告别“烘焙等待”,实现实时昼夜交替
  • Claude体验地图绘制方法论(企业级SOP首次解密)
  • 数据主义:从技术理念到价值信仰的演变与反思
  • 谷歌AI搜索变革:EEAT与SGE如何重塑SEO与内容策略
  • 别再让开发乱加字段了!DBA必看的Oracle大表DDL避坑指南(含压缩表限制)
  • 终极指南:OmniParser-v2.0快速上手,5分钟搭建你的AI屏幕解析系统
  • EuroLLM-1.7B API接口开发:构建多语言聊天应用实战
  • 给嵌入式新手的保姆级指南:手把手教你用设备树配置i.MX6ULL的引脚(pinctrl实战)
  • 理性看待AI文本生成:技术原理、风险边界与协同实践
  • bloom-3b-conversational配置详解:从config.json到generation_config的完整设置指南
  • HVV期间,红队最爱打的漏洞Top 10:从告警日志看实战攻击手法(附CVE编号)
  • 如何优化Qwen2.5-14B-Instruct-GPTQ-Int8内存占用:3种部署策略对比
  • 5个实用技巧:如何高效使用猫抓浏览器资源嗅探扩展
  • 如何用MAA明日方舟助手实现游戏日常全自动化?新手配置与效率革命指南
  • Qwen2.5-7B-Instruct代码生成能力测试:从简单函数到复杂项目的完整评估
  • 从一道CTF题复盘:如何用PHP的GC回收机制(fast-destruct)绕过__wakeup魔术方法