# LIO-SAM **Repository Path**: john_robert/LIO-SAM ## Basic Information - **Project Name**: LIO-SAM - **Description**: No description available - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-30 - **Last Updated**: 2026-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LIO-SAM **实时激光雷达-惯性里程计软件包。强烈建议用户仔细阅读本文档,并先使用提供的数据集进行测试。方法演示视频见 [YouTube](https://www.youtube.com/watch?v=A0H8CoORZJU)。** [English](./README.md) | 中文

drawing

drawing drawing drawing drawing

## 目录 - [**系统架构**](#系统架构) - [**ROS2 分支说明**](#ros2-分支说明) - [**依赖项**](#依赖项) - [**安装**](#安装) - [**使用 Docker**](#使用-docker) - [**准备激光雷达数据**](#准备激光雷达数据)(必读) - [**准备 IMU 数据**](#准备-imu-数据)(必读) - [**示例数据集**](#示例数据集) - [**运行软件包**](#运行软件包) - [**其他说明**](#其他说明) - [**常见问题**](#常见问题) - [**论文**](#论文) - [**待办事项**](#待办事项) - [**相关软件包**](#相关软件包) - [**致谢**](#致谢) ## 系统架构

drawing

我们设计了一套维护两张因子图的系统,运行速度最高可达实时的 10 倍。 - `mapOptimization.cpp` 中的因子图用于优化激光雷达里程计因子和 GPS 因子。该因子图在整个测试过程中持续维护。 - `imuPreintegration.cpp` 中的因子图用于优化 IMU 与激光雷达里程计因子,并估计 IMU 偏差。该因子图会周期性重置,以保证以 IMU 频率进行实时里程计估计。 ## ROS2 分支说明 原版 ROS1 版本中的部分功能目前在本 ROS2 版本中尚不可用,包括: - 使用 Velodyne、Livox 激光雷达以及 Microstrain IMU 的测试 - navsat 模块 / GPS 因子的 launch 文件 - rviz2 配置缺少许多元素 本分支已使用 Ouster 激光雷达、Xsens IMU 以及 SBG-Systems IMU,配合以下 ROS2 驱动进行测试: - [ros2_ouster_drivers](https://github.com/ros-drivers/ros2_ouster_drivers) - [bluespace_ai_xsens_ros_mti_driver](https://github.com/bluespace-ai/bluespace_ai_xsens_ros_mti_driver) - [sbg_ros2_driver](https://github.com/SBG-Systems/sbg_ros2_driver) 在这些测试中,IMU 安装在激光雷达底部,使二者的 x 轴指向同一方向。`params.yaml` 中的参数 `extrinsicRot` 和 `extrinsicRPY` 对应这种安装配置。 ## 依赖项 已在 Ubuntu 20.04 的 ROS2 foxy、galactic,以及 Ubuntu 22.04 的 humble 上测试通过。 - [ROS2](https://docs.ros.org/en/humble/Installation.html) ``` sudo apt install ros--perception-pcl \ ros--pcl-msgs \ ros--vision-opencv \ ros--xacro ``` - [gtsam](https://gtsam.org/get_started)(Georgia Tech Smoothing and Mapping 库) ``` # 添加 GTSAM-PPA sudo add-apt-repository ppa:borglab/gtsam-release-4.1 sudo apt install libgtsam-dev libgtsam-unstable-dev ``` ## 安装 使用以下命令下载并编译本软件包。 ``` cd ~/ros2_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd LIO-SAM git checkout ros2 cd .. colcon build ``` ## 使用 Docker 构建镜像(基于 ROS2 Humble): ``` docker build -t liosam-humble-jammy . ``` 镜像构建完成后,可通过以下任一方式启动容器: 1. `docker run` ``` docker run --init -it -d \ --name liosam-humble-jammy-container \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=$DISPLAY \ --runtime=nvidia --gpus all \ liosam-humble-jammy \ bash ``` 2. `docker compose` 启动 docker compose 容器: ``` docker compose up -d ``` 停止 docker compose 容器: ``` docker compose down ``` 进入正在运行的容器: ``` docker exec -it liosam-humble-jammy-container bash ``` ## 准备激光雷达数据 用户需要按正确格式准备点云数据,以便进行点云去畸变(主要在 `imageProjection.cpp` 中完成)。有两项要求: - **提供点的时间戳**。LIO-SAM 使用 IMU 数据对点云进行去畸变,因此需要知道一帧扫描中各点的相对时间。最新的 Velodyne ROS 驱动应能直接输出该信息。此处假设点时间通道名为 `time`。点类型定义位于 `imageProjection.cpp` 文件顶部。`deskewPoint()` 函数利用该相对时间,得到该点相对于扫描起始时刻的变换。当激光雷达以 10Hz 旋转时,点的时间戳应在 0 到 0.1 秒之间变化。若使用其他激光雷达,可能需要修改该时间通道名称,并确保其为扫描内的相对时间。 - **提供点的 ring 编号**。LIO-SAM 用该信息将点正确组织到矩阵中。ring 编号表示该点所属传感器通道。点类型定义同样位于 `imageProjection.cpp` 文件顶部。最新的 Velodyne ROS 驱动应能直接输出该信息。若使用其他激光雷达,可能需要重命名该字段。注意:目前本软件包仅支持机械式激光雷达。 ## 准备 IMU 数据 - **IMU 要求**。与原始 LOAM 实现类似,LIO-SAM 仅支持 9 轴 IMU(可提供 roll、pitch、yaw 估计)。roll 与 pitch 估计主要用于以正确姿态初始化系统;yaw 估计在使用 GPS 数据时用于以正确航向初始化系统。理论上,若采用类似 VINS-Mono 的初始化流程,LIO-SAM 也可配合 6 轴 IMU 工作。系统性能很大程度上取决于 IMU 测量质量。IMU 数据频率越高,系统精度越好。我们使用 Microstrain 3DM-GX5-25,输出频率为 500Hz。建议使用输出频率至少为 200Hz 的 IMU。注意:Ouster 激光雷达内置 IMU 为 6 轴 IMU。 - **IMU 对齐**。LIO-SAM 将 IMU 原始数据从 IMU 坐标系变换到激光雷达坐标系,后者遵循 ROS REP-105 约定(x 向前,y 向左,z 向上)。为使系统正常工作,需在 `params.yaml` 中提供正确的外参变换。**之所以有两个外参,是因为作者所用 IMU(Microstrain 3DM-GX5-25)的加速度与姿态使用了不同的坐标系。根据 IMU 厂商不同,你的两个外参可能相同,也可能不同。** - `params.yaml` 中的 `extrinsicRot` 是将 IMU 陀螺仪与加速度计测量变换到激光雷达坐标系的旋转矩阵。 - `params.yaml` 中的 `extrinsicRPY` 是将 IMU 姿态变换到激光雷达坐标系的旋转矩阵。 - **IMU 调试**。强烈建议用户取消注释 `imageProjection.cpp` 中 `imuHandler()` 内的调试代码,并检查变换后的 IMU 数据输出。可通过旋转传感器套件,检查读数是否与传感器运动一致。展示校正后 IMU 数据的 YouTube 视频见[此处](https://youtu.be/BOUK8LYQhHs)。

drawing

drawing

## 示例数据集 出于隐私原因,目前无法提供适用于 ROS2 的数据集。 master 分支的 README.md 中包含一些 ROS1 rosbag 的链接。可通过 [ros1_bridge](https://github.com/ros2/ros1_bridge) 使用这些 rosbag,但请先验证时间行为(ROS2 中的消息频率)。同时请注意 [DDS 调优](https://docs.ros.org/en/humble/How-To-Guides/DDS-tuning.html)。 ## 运行软件包 1. 运行 launch 文件: ``` ros2 launch lio_sam run.launch.py ``` 2. 播放已有 bag 文件: ``` ros2 bag play your-bag.bag ``` ## 保存地图 ``` ros2 service call /lio_sam/save_map lio_sam/srv/SaveMap ``` ``` ros2 service call /lio_sam/save_map lio_sam/srv/SaveMap "{resolution: 0.2, destination: /Downloads/service_LOAM}" ``` ## 其他说明 - **回环检测:** 此处的回环功能为概念验证示例,直接改编自 LeGO-LOAM 的回环检测。更先进的回环检测实现请参考 [ScanContext](https://github.com/irapkaist/SC-LeGO-LOAM)。在 `params.yaml` 中将 `loopClosureEnableFlag` 设为 `true` 即可测试回环功能。在 Rviz 中取消勾选 "Map (cloud)",勾选 "Map (global)"。因为可视化的 "Map (cloud)" 只是 Rviz 中点云的简单堆叠,位姿校正后其位置不会更新。此处回环功能改编自 LeGO-LOAM,是一种基于 ICP 的方法。由于 ICP 运行较慢,建议将回放速度设为 `-r 1`。可使用 Garden 数据集进行测试。

drawing drawing

- **使用 GPS:** park 数据集用于测试 LIO-SAM 与 GPS 数据的配合,由 [Yewei Huang](https://robustfieldautonomylab.github.io/people.html) 采集。启用 GPS 功能时,将 `params.yaml` 中的 `gpsTopic` 改为 `odometry/gps`。在 Rviz 中取消勾选 "Map (cloud)",勾选 "Map (global)",并勾选 "Odom GPS" 以可视化 GPS 里程计。可通过 `gpsCovThreshold` 过滤较差的 GPS 读数;`poseCovThreshold` 用于调节向图中添加 GPS 因子的频率。例如,将 `poseCovThreshold` 设为 1.0 时,会看到轨迹被 GPS 持续校正。由于 iSAM 优化较重,建议回放速度为 `-r 1`。

drawing

- **KITTI:** 由于 LIO-SAM 需要高频 IMU 才能正常工作,测试需使用 KITTI raw 数据。一个尚未解决的问题是 IMU 内参未知,这对 LIO-SAM 精度有较大影响。下载提供的示例数据后,在 `params.yaml` 中做如下修改: - extrinsicTrans: [-8.086759e-01, 3.195559e-01, -7.997231e-01] - extrinsicRot: [9.999976e-01, 7.553071e-04, -2.035826e-03, -7.854027e-04, 9.998898e-01, -1.482298e-02, 2.024406e-03, 1.482454e-02, 9.998881e-01] - extrinsicRPY: [9.999976e-01, 7.553071e-04, -2.035826e-03, -7.854027e-04, 9.998898e-01, -1.482298e-02, 2.024406e-03, 1.482454e-02, 9.998881e-01] - N_SCAN: 64 - downsampleRate: 2 或 4 - loopClosureEnableFlag: true 或 false

drawing drawing

- **Ouster 激光雷达:** 要使 LIO-SAM 配合 Ouster 激光雷达工作,需要在硬件和软件层面做一些准备。 - 硬件: - 使用外部 IMU。LIO-SAM 无法配合 Ouster 激光雷达内置的 6 轴 IMU 工作。需要在激光雷达上外接 9 轴 IMU 并采集数据。 - 配置驱动。将 Ouster launch 文件中的 `timestamp_mode` 改为 `TIME_FROM_PTP_1588`,以便点云使用 ROS 格式时间戳。 - 配置: - 将 `params.yaml` 中的 `sensor` 改为 `ouster`。 - 根据你的激光雷达修改 `params.yaml` 中的 `N_SCAN` 和 `Horizon_SCAN`,例如 N_SCAN=128,Horizon_SCAN=1024。 - 第一代与第二代 Ouster: 不同代际的点坐标定义可能不同。调试请参考 [Issue #94](https://github.com/TixiaoShan/LIO-SAM/issues/94)。

drawing drawing

## 常见问题 - **锯齿或抖动行为**:若激光雷达与 IMU 数据格式符合 LIO-SAM 要求,该问题很可能由激光雷达与 IMU 时间戳不同步引起。 - **上下跳动**:若开始测试 bag 文件后 `base_link` 立即上下跳动,很可能是 IMU 外参错误。例如,重力加速度出现负值。 - **mapOptimization 崩溃**:通常由 GTSAM 引起。请安装 README.md 中指定的 GTSAM 版本。更多类似问题见[此处](https://github.com/TixiaoShan/LIO-SAM/issues)。 - **GPS 里程计不可用**:通常是因为消息 `frame_id` 与机器人 `frame_id` 之间缺少可用变换(例如:应从 `imu_frame_id`、`gps_frame_id` 到 `base_link` 有可用变换)。请阅读 Robot Localization 文档:[此处](http://docs.ros.org/en/melodic/api/robot_localization/html/preparing_sensor_data.html)。 ## 论文 若使用本代码的任何部分,请引用 [LIO-SAM (IROS-2020)](./config/doc/paper.pdf),谢谢。 ``` @inproceedings{liosam2020shan, title={LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping}, author={Shan, Tixiao and Englot, Brendan and Meyers, Drew and Wang, Wei and Ratti, Carlo and Rus Daniela}, booktitle={IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)}, pages={5135-5142}, year={2020}, organization={IEEE} } ``` 部分代码改编自 [LeGO-LOAM](https://github.com/RobustFieldAutonomyLab/LeGO-LOAM)。 ``` @inproceedings{legoloam2018shan, title={LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain}, author={Shan, Tixiao and Englot, Brendan}, booktitle={IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)}, pages={4758-4765}, year={2018}, organization={IEEE} } ``` ## 待办事项 - [ ] [imuPreintegration 中的 Bug](https://github.com/TixiaoShan/LIO-SAM/issues/104) ## 相关软件包 - [激光雷达-IMU 标定](https://github.com/chennuo0125-HIT/lidar_imu_calib) - [带 Scan Context 的 LIO-SAM](https://github.com/gisbi-kim/SC-LIO-SAM) ## 致谢 - LIO-SAM 基于 LOAM(J. Zhang and S. Singh. LOAM: Lidar Odometry and Mapping in Real-time)。