LIO-SAM-DetailedNote实机部署指南Velodyne与Ouster激光雷达外参标定清单【免费下载链接】LIO-SAM-DetailedNoteLIO-SAM源码详细注释3D SLAM融合激光、IMU、GPS项目地址: https://gitcode.com/gh_mirrors/li/LIO-SAM-DetailedNoteLIO-SAM-DetailedNote 是 LIO-SAM 的源码详细注释版一套融合激光雷达、IMU、GPS 的 3D SLAM 系统核心代码仅 4 个 cpp 文件非常适合拿来实机部署与阅读。本文面向刚接触 LIO-SAM 的工程师给出一份从零启动到外参标定验证的完整部署清单如何配置 Velodyne / Ouster 激光雷达参数、如何填写 lidar→IMU 外参、如何检查 IMU 噪声参数以及如何快速定位地图漂移这类典型外参错误。系统组成速览4 个节点构成完整 SLAM 链路理解外参从哪里生效之前先看清数据流。LIO-SAM 由 4 个节点组成启动脚本在 launch/include/module_loam.launch节点源码职责imageProjectionsrc/imageProjection.cpp激光运动畸变校正外参在这里第一次生效featureExtractionsrc/featureExtraction.cpp曲率计算提取角点 / 平面特征imuPreintegrationsrc/imuPreintegration.cppIMU 预积分因子图优化位姿mapOptmizationsrc/mapOptmization.cppscan-to-map 匹配 因子图优化 闭环入口文件 launch/run.launch 会加载 config/params.yaml并挂载 navsatGPS→笛卡尔坐标转换与 rviz 模块Velodyne vs Ouster传感器参数差异表激光雷达型号直接决定两个关键参数全部写在 config/params.yaml 的Sensor Settings段# Sensor Settings sensor: velodyne # 只能填 velodyne 或 ouster N_SCAN: 16 # 扫描线数16 / 32 / 64 / 128 Horizon_SCAN: 1800 # 水平一圈的点数VelodyneHorizon_SCAN固定为18000.2° 一点如 VLP-16 填N_SCAN: 16VLP-32 填 32。OusterHorizon_SCAN按型号填512 / 1024 / 2048如 OS1-128 常用 128 线 × 1024 列。⚠️最容易踩的坑sensor与N_SCAN、Horizon_SCAN三者必须自洽。源码 include/utility.h 中参数加载会校验 sensor 字符串填错会直接报错退出而点数不匹配会导致畸变校正时 rangeMat 索引越界、点云花屏。Ouster 用户在源码里还有一个特殊处理src/imageProjection.cpp 的cachePointCloud()会把 Ouster 点云逐点转成 Velodyne 格式其中点内时间戳time src.t * 1e-9f纳秒→秒。Ouster 驱动输出的点内时间戳单位必须是纳秒否则整帧时差会被算错运动畸变校正直接失效。外参标定清单lidar → IMU 三步核对LIO-SAM 只要求一组外参从激光雷达到 IMU 的旋转 平移即extrinsicRot、extrinsicRPY、extrinsicTrans注意方向是 lidar→IMU不要填反。# Extrinsics (lidar - IMU) extrinsicTrans: [0.0, 0.0, 0.0] extrinsicRot: [1, 0, 0, 0, 1, 0, 0, 0, 1] extrinsicRPY: [1, 0, 0, 0, 1, 0, 0, 0, 1]标定操作清单按顺序勾选坐标系方向LIO-SAM 期望 IMU / base_link 遵循 REP-105 惯例x 前、y 左、z 上。如果你的传感器芯片坐标系不一致旋转矩阵要补上对应转换。项目自带了一个真实案例——config/params_park.yaml 中某实车的外参就是[-1,0,0; 0,1,0; 0,0,-1]IMU 的 z 轴与 lidar 反向了 180°而 config/params.yaml 默认是单位阵两传感器严格同轴安装时才正确。平移量安装间距小于几十厘米时填0,0,0对里程计精度几乎无影响间距较大如 IMU 装在底盘另一端才需要量测 xyz 并填入extrinsicTrans。旋转与 RPY 一致性extrinsicRot与extrinsicRPY两个参数都会读取请保证它们表达同一变换避免一处改了另一处没改。外参的实际作用点在 include/utility.h 的imuConverter()IMU 的加速度、角速度左乘extRot姿态四元数右乘extQRPY把 IMU 原始测量转到 lidar 坐标系后再参与畸变校正与预积分。外参错了IMU 姿态初始化就是歪的表现为地图整体倾斜、z 轴漂移。顺带提醒若 IMU 没有 9 轴姿态四元数模长小于 0.1imuConverter()会直接报Invalid quaternion, please use a 9-axis IMU!并退出——6 轴 IMU 需要先用 AHRS 算法解算出姿态。IMU 噪声参数别直接抄默认值config/params.yaml 中的 IMU 段建议按你所用 IMU 的数据手册重新标定可用 Kalibr、RobotCalibration 等工具imuAccNoise: 3.9939570888238808e-03 # 加速度白噪声密度 imuGyrNoise: 1.5636343949698187e-03 # 陀螺白噪声密度 imuAccBiasN: 6.4356659353532566e-05 # 加速度随机游走 imuGyrBiasN: 3.5640318696367613e-05 # 陀螺随机游走 imuGravity: 9.80511 # 当地重力加速度噪声参数偏小 → 因子图过度信任 IMU闭环/位姿修正被压制偏大 → 轨迹出现锯齿。imuGravity建议查仪器所在城市的重力值约 9.78~9.83而非一律 9.81。话题名按实机硬件改pointCloudTopic点云、imuTopic如imu_raw、gpsTopic。参考 config/params_park.yaml 中imu_raw与odometry/gps的命名。一键启动与话题验证编译安装后catkin 工程依赖见 CMakeLists.txtroslaunch lio_sam run.launch启动后立即做三项检查rostopic hz /points_raw与/imu_correct频率是否达到硬件标称值两路时间戳是否同源建议共用同一 clockrosrun tf tf_echo base_link map静止时 TF 应稳定运动时更新平滑rviz 中laser_map与轨迹回环后轨迹是否闭合。外参错误排查速查表症状最可能原因检查项地图整体倾斜 / z 轴持续漂移外参旋转错误重核extrinsicRot/extrinsicRPY与坐标系方向IMU 与激光轨迹打架、抖动时间戳不同源检查两传感器时钟同步点云花屏、特征点乱N_SCAN / Horizon_SCAN 与硬件不符对照雷达型号修改Sensor Settings高速运动拖影Ouster 点内时间戳单位错误确认驱动输出为纳秒启动即报 9-axis 错误IMU 无姿态输出加 AHRS 解算或换 9 轴 IMU掌握这份清单后从 Velodyne 或 Ouster 实车到可运行的 LIO-SAM 里程计通常只需半天调试。想深入理解外参参与优化的每一步可通读 README.md 中梳理的整体流程配合 4 个 cpp 文件的逐行注释这套轻量代码是学习 3D SLAM 工程实现的上佳范本。【免费下载链接】LIO-SAM-DetailedNoteLIO-SAM源码详细注释3D SLAM融合激光、IMU、GPS项目地址: https://gitcode.com/gh_mirrors/li/LIO-SAM-DetailedNote创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考