资讯动态

LIO-SAM实战:KITTI数据集从零跑通激光雷达SLAM建图与定位

发布时间:2026/9/2 23:04:21 来源:尧图企业网站定制
简介面向SLAM初学者与自动驾驶感知开发者下载包整合了LIO-SAMLiDAR-Inertial Odometry via Smoothing and Mapping在KITTI数据集上的完整工程实现定位为可直接参考的ROS工作空间源码包。包内含42个文件以launch启动脚本、C源码、conf配置、rviz可视化配置为主同时附带markdown说明文档、Python辅助脚本、msg/srv自定义消息与PDF解析整体约64.12MB。已有4255人学习说明其在SLAM学习与自动驾驶算法复现场景中具备一定参考价值。通过源码结构、节点配置与参数文件可清晰掌握LIO-SAM如何融合LiDAR点云与IMU惯性数据并借助KITTI数据完成特征提取、滑窗优化与建图评估gif与png预览图还能直观展示算法在真实道路场景中的运行效果适合用来复现实验、二次开发或作为毕业设计/课题研究的起点。 很多朋友第一次接触 LIO-SAM 是奔着 KITTI 数据集去的代码 clone 下来依赖装好编译通过结果卡在数据这关——KITTI 给的是 bin 点云文件不是 ROS bag而 LIO-SAM 要的是持续发布的点云、IMU、GPS 话题。我在这个环节也折腾过一整个晚上后来顺着 KITTI raw data 的目录结构和 lio_sam 的 kittiHelper 源码理了一遍才把整条链路跑通。这篇文章就是一份实操笔记内容覆盖 LIO-SAM 的原理定位、环境编译、KITTI 数据准备、运行调参、轨迹评估以及顺手接上 mmdetection3d 做 3D 目标检测CenterPoint、PointPillars 这类配置和权重下载怎么找。适合正在做 SLAM 入门、自动驾驶点云处理或者想在 KITTI 上同时搞定定位建图和感知的同学参考。1. LIO-SAM 和 KITTI 为什么总是被放在一起讨论1.1 LIO-SAM 解决的是什么问题LIO-SAM 是 Tixiao Shan 在 IROS 2020 上发表的紧耦合激光惯性里程计算法全称是 Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping。它把激光雷达、IMU、GPS 三类信息放进一个因子图框架里用 GTSAM 的 iSAM2 做增量平滑优化。与传统 LOAM 系算法相比LIO-SAM 最大的变化在于IMU 预积分因子负责约束相邻帧之间的运动激光里程计因子负责把当前帧特征匹配到局部地图GPS 因子在长距离场景下抑制累计漂移回环检测因子则修正历史轨迹。四个因子共同维护全局一致的地图。这套设计非常适合自动驾驶场景因为车上的传感器组合基本就是激光雷达 IMU GPS。LIO-SAM 对这些传感器没有很苛刻的要求只要话题能对上、外参标定合理就能跑得比较稳。1.2 KITTI 的传感器配置几乎是为 LIO-SAM 量身定做的KITTI 是当前自动驾驶领域最常用的开源数据集之一由德国卡尔斯鲁厄理工学院联合丰田美国研究院发布。它用 Velodyne HDL-64E 激光雷达做 10Hz 扫描用 OXTS RT3003 做 100Hz 的 IMU/GPS 组合导航同时提供前视相机图像和 odometry 真值轨迹。对 LIO-SAM 来说KITTI 提供了所有需要的输入点云、IMU、GPS、真值。而且 KITTI odometry benchmark 的 00 系列00-10 共 11 个序列包含城市、高速、住宅区等不同场景回环丰富非常适合验证建图和回环模块的效果。很多人在搜索里把 lio-sam、kitti 放在一起说明大家都在做同一件事用这个经典数据集验证 LIO-SAM 的效果。这是很自然的选择因为数据好拿、真值齐全、社区资料多。1.3 但 KITTI 原始数据并不能直接喂给 ROS 节点KITTI 官方发布的数据是离线格式点云是.bin二进制文件每帧四列x, y, z, intensity一帧大约 12 万个点IMU/GPS 是.txt文本标定参数分散在多个文件里。而 ROS 节点之间通过话题通信LIO-SAM 启动后要订阅的/points_raw、/imu/data、/gps/fix是持续流动的消息流。从 bin 文件到 ROS 话题中间必须有个搬运工节点把离线数据一帧一帧读出来、转成 sensor_msgs/PointCloud2、sensor_msgs/Imu、sensor_msgs/NavSatFix 发布出去。LIO-SAM 仓库里的 kittiHelper 节点就是干这个的。所有跑 KITTI 时遇到的数据问题本质都是这个转换环节出了问题。2. 环境准备ROS 与 GTSAM 的版本陷阱2.1 ROS 发行版选择LIO-SAM 官方推荐 Ubuntu 18.04 ROS Melodic 或 Ubuntu 20.04 ROS Noetic。我测试过这两个组合都能正常编译运行。如果机器配置允许我个人推荐 Noetic因为 PCL、Eigen、OpenCV 的版本整体更新后续如果要对接 mmdetection3d 的 Python 生态也更顺。需要注意ROS 自带的依赖通常已经够 LIO-SAM 使用比如pcl_ros、cv_bridge、tf2等。默认安装了ros-$(ROS_DISTRO)-desktop-full的话这些基本都齐了。2.2 GTSAM 版本必须锁定 4.0.2GTSAM 是 LIO-SAM 最核心的第三方依赖也是编译过程中最容易踩坑的地方。LIO-SAM 官方在 README 里明确要求 GTSAM 4.0.2不是最新版 4.1.x。原因很简单从 4.1 开始 GTSAM 内部 API 有调整LIO-SAM 用到的BetweenFactor、NonlinearFactorGraph等类在 4.1 下会编译报错或者运行异常。正确做法是从 GitHub 上 GTSAM 仓库的 Release 页面下载 4.0.2 源码然后源码编译安装wget https://github.com/borglab/gtsam/archive/refs/tags/4.0.2.tar.gz tar -xzf 4.0.2.tar.gz cd gtsam-4.0.2 mkdir build cd build cmake .. make -j8 sudo make install编译时间长一点十几分钟到半小时取决于机器性能。安装完成后默认头文件装到/usr/local/include/gtsam库文件装到/usr/local/libLIO-SAM 编译时能自动找到。2.3 LIO-SAM 编译与常见报错速查编译 LIO-SAM 本身不复杂创建工作空间后 clone 源码然后catkin_makemkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd ~/catkin_ws catkin_make我在不同机器上反复编译过下面是几个高频报错和处理方案报错现象原因解决方案Could not find a package configuration file provided by gtsamGTSAM 未正确安装确认 4.0.2 编译安装完成检查/usr/local/lib/cmake/GTSAM是否存在GTSAM 相关头文件报大量编译错误装了 4.1 或更高版本卸载后重装 4.0.2undefined reference to boost::filesystemBoost 库不完整sudo apt install libboost-all-devc: internal compiler error或内存不足编译并行任务过多用catkin_make -j2降低并行度RVIZ 无法显示点云不是编译问题检查话题名称和坐标系后面第 4 节细说编译完成后不要急着运行先确认数据集和参数否则 kittiHelper 一启动就会因为路径错误而崩溃。3. KITTI 数据集预处理从 bin 文件到可播放的 ROS 话题3.1 先分清 raw data 和 odometry 两种格式KITTI 官网提供很多下载类型跑 LIO-SAM 只需要区分两种raw data原始数据按采集日期组织比如2011_10_03_drive_0027_sync里面包含velodyne_points/data/*.bin、oxts/data/*.txtIMU/GPS、相机图像、标定文件。LIO-SAM 的 kittiHelper 默认就是按这个目录结构设计的。odometry里程计基准数据按sequences/00到sequences/10组织每个序列下只有velodyne/*.bin、times.txt、calib.txt、poses.txt训练序列有真值没有 IMU 和 GPS。如果你的目标是完整复现 LIO-SAM 的激光 惯性 GPS效果请下载 raw data。如果要快速跑通流程odometry 数据也能凑合但需要伪造 IMU 话题效果会差不少。3.2 官方推荐路径raw data 配真实 IMU/GPSLIO-SAM 的config/params.yaml中有一个Dataset参数把它指向 raw data 的 sync 目录即可Dataset: /media/username/data/kitti/2011_10_03_drive_0027_synckittiHelper 启动后会做三件事读取velodyne_points下的 bin 文件并发布成/points_raw解析oxts下的数据把加速度和角速度打包成/imu/data把 GPS 经纬度转为/gps/fix。这三条消息的频率是 10Hz、100Hz、10Hz和 LIO-SAM 期望的一致。这里有个容易被忽略的细节raw data 的标定文件在相邻的2011_10_03_calib目录里包含calib_imu_to_velo.txt、calib_velo_to_cam.txt等。kittiHelper 需要用到激光雷达到 IMU 的外参V2MVelodyne to IMU如果目录结构或文件名对不上会直接报错。建议保持下载后原始目录不改动并确认Dataset路径的上一级目录里有对应的 calib 目录。3.3 快速验证路径odometry 序列也能跑但要注意外参近似有时候你只想快速验证 LIO-SAM 代码是否编译正确不想下载几十 GB 的 raw data。那可以用 odometry 序列比如sequences/00但 kittiHelper 默认按 raw data 目录解析odometry 下没有oxts所以需要一点变通。我的做法是写一个轻量 Python 节点把 odometry 的 bin 文件发成/points_raw同时用一个默认的 IMU 消息发/imu/dataIMU 数据不是真实测量值只是让 LIO-SAM 的 imuPreintegration 节点不报错。核心逻辑如下#!/usr/bin/env python3 import rospy import numpy as np from sensor_msgs.msg import PointCloud2, Imu from std_msgs.msg import Header import sensor_msgs.point_cloud2 as pc2 def read_bin(bin_path): points np.fromfile(bin_path, dtypenp.float32).reshape(-1, 4) return points def make_pc2(header, points): fields [pc2.PointField(namen, offseti*4, datatypepc2.PointField.FLOAT32, count1) for i, n in enumerate([x, y, z, intensity])] return pc2.create_cloud(header, fields, points) rospy.init_node(kitti_odom_publisher) pub_pc rospy.Publisher(/points_raw, PointCloud2, queue_size10) pub_imu rospy.Publisher(/imu/data, Imu, queue_size10) rate rospy.Rate(10) # 遍历 velodyne/*.bin 并逐帧发布需要特别说明odometry 的calib.txt里的Tr是激光雷达到相机 0 的变换不是激光雷达到 IMU 的变换。LIO-SAM 如果用这个近似外参初始化阶段误差会偏大但配合后面的点云匹配通常还能收敛。这个方法只适合冒烟测试正式实验请用 raw data。这是很多只拿 odometry 跑的朋友精度不理想的最主要原因。3.4 params.yaml 里和 KITTI 强相关的字段LIO-SAM 的config/params.yaml参数很多但针对 KITTI 必须确认的核心就几个参数KITTI 推荐值说明pointCloudTopic/points_rawkittiHelper 默认发布的话题不要随意改imuTopic/imu/data同上RAW data 方案自动对接gpsTopic/gps/fix如果不想用 GPS可设为空字符串sensorStopDeg0HDL-64E 是 360° 扫描无停歇角度如果是 VLP-16 要改成 18 左右N_SCAN64HDL-64E 是 64 线Horizon_SCAN2048水平分辨率对应值KITTI 常用 2048downsampleRate1或2每 N 个点取 1 个CPU 吃紧时用 2lidarMinRange/lidarMaxRange1.0/1000.0过滤近距离车身点和无效点savePCDtrue结束后保存地图点云到savePCDDirectoryN_SCAN和Horizon_SCAN一旦写错range image 投影会乱特征提取阶段一片狼藉建图会糊成一团。KITTI 的 HDL-64E 水平角分辨率约 0.17°360° 除以 0.17° 约为 2118取 2048 是常用近似值LIO-SAM 作者在 KITTI 上的配置就是 2048。4. 运行调参与轨迹评估把 KITTI 真值拉出来对一对4.1 启动流程其实就两条命令数据准备好、参数改好之后启动非常简单roslaunch lio_sam run.launchrun.launch会把 imageProjection、featureExtraction、imuPreintegration、mapOptimization、transformFusion 五个节点全部拉起来同时打开 RVIZ 加载默认显示配置。再开一个终端roslaunch lio_sam kitti.launchkitti.launch的内容其实就是启动 kittiHelper 节点让它按params.yaml里的Dataset路径读取数据并发布话题。两条 launch 都跑起来后RVIZ 里应该很快出现点云地图和车辆运动轨迹。4.2 RVIZ 里看什么RVIZ 启动后重点观察几个东西/lio_sam/mapping/cloud_registered当前帧配准后的点云正常情况应该和 local map 贴合。/lio_sam/mapping/odometry优化后的里程计轨迹绿色路径。/lio_sam/mapping/map_global全局地图回环检测成功时地图上的重叠区域会明显对齐。因子图的可视化LIO-SAM 会把当前因子图发布出来回环约束以紫色线段显示看到紫色线段就说明回环因子在起作用。我第一次跑通时最大的感受是 KITTI 00 序列建出来的地图非常干净路口、建筑轮廓都很清晰。如果地图出现重影、错位优先怀疑参数配置或数据时间戳问题。4.3 用 evo 评估轨迹注意坐标系对齐跑完算法后光看 RVIZ 里的轨迹不够量化最好用 evo 和 KITTI 真值对比。先录制 LIO-SAM 输出的轨迹话题rosbag record /lio_sam/mapping/odometry然后转换成 TUM 格式并用 evo 评估evo_traj ros odometry.bag /lio_sam/mapping/odometry --save_as_tum evo_ape kitti od p a hrefhttps://download.csdn.net/download/qq_39607707/85372836 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价