从零实现LIO-SAM在KITTI 08序列的完整评测流程
刚接触激光SLAM的研究者常常面临一个困境:论文中提到的算法效果看起来很好,但自己复现时却遇到各种数据格式、环境配置的问题。本文将带你完整走通LIO-SAM在KITTI 08序列上的全流程,从原始数据获取到最终轨迹评估,每个步骤都包含可立即执行的命令和常见问题解决方案。
1. 环境准备与数据获取
1.1 基础环境配置
推荐使用Ubuntu 20.04系统,这是目前ROS社区支持最完善的版本。首先安装ROS Noetic和必要的依赖:
sudo apt-get install -y ros-noetic-navigation ros-noetic-robot-localization ros-noetic-velodyne-simulatorLIO-SAM需要较新版本的gtsam库,建议从源码编译安装:
git clone https://github.com/borglab/gtsam.git cd gtsam && mkdir build && cd build cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF .. make -j$(nproc) sudo make install注意:如果遇到Eigen3版本冲突问题,可以尝试指定Eigen3路径:
cmake -DEigen3_DIR=/usr/include/eigen3/
1.2 KITTI数据下载与解析
KITTI数据集有多个子集,我们需要同时下载odometry和raw data两部分:
- 从 KITTI Odometry 下载数据序列08的激光雷达数据(约1.4GB)
- 从 KITTI Raw 下载对应的2011_09_30_drive_0028序列(约22GB)
关键数据对应关系如下表:
| 数据类型 | 文件路径 | 用途 |
|---|---|---|
| LiDAR点云 | odometry/data/velodyne/08/*.bin | 主要输入数据 |
| IMU数据 | raw/2011_09_30_drive_0028_extract/oxts/data/*.txt | 惯性测量单元数据 |
| 真值轨迹 | odometry/poses/08.txt | 轨迹评估基准 |
2. 数据预处理与格式转换
2.1 时间戳对齐问题
KITTI数据集存在两个常见问题需要处理:
- odometry数据与raw data时间基准不同
- 不同传感器数据采样频率不一致
使用以下Python脚本提取并同步时间戳:
import numpy as np # 从oxts数据提取IMU时间戳 imu_timestamps = np.loadtxt('oxts/timestamps.txt', dtype=str) imu_unixtime = [float(time.mktime(datetime.strptime(ts, "%Y-%m-%d %H:%M:%S").timetuple())) for ts in imu_timestamps] # 从velodyne数据提取LiDAR时间戳 lidar_timestamps = np.loadtxt('velodyne_points/timestamps.txt', dtype=str) lidar_unixtime = [...] # 类似处理2.2 生成ROS bag文件
推荐使用kitti2bag工具将原始数据转换为ROS bag格式:
pip install kitti2bag kitti2bag -t 2011_09_30 -r 0028 raw_synced常见问题处理:
- 如果遇到
ImportError: No module named 'pykitti',需要先安装pykitti:pip install pykitti - 时间戳异常可以添加
--skip 30参数跳过前30帧
3. LIO-SAM配置与优化
3.1 安装与编译
从GitHub克隆最新版LIO-SAM并编译:
cd ~/catkin_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd .. && catkin_make -DCMAKE_BUILD_TYPE=Release3.2 关键参数调整
修改params.yaml中以下关键参数以适应KITTI数据:
# LiDAR参数 sensor: velodyne N_SCAN: 64 Horizon_SCAN: 1800 downsampleRate: 1 # IMU参数 imuTopic: "/imu_raw" imuAccNoise: 1e-2 imuGyrNoise: 1e-4重要提示:KITTI的IMU数据频率为10Hz,需要将
imuFrequency参数相应调整
3.3 运行与实时监控
启动LIO-SAM节点:
roslaunch lio_sam run.launch使用rviz实时监控建图效果:
rviz -d $(rospack find lio_sam)/launch/include/module.rviz常见性能优化技巧:
- 在
laserMapping.cpp中调整mapFrameNum参数控制关键帧数量 - 使用
ndt_omp替代默认的ICP匹配算法可能提升速度
4. 轨迹评估与结果分析
4.1 轨迹格式转换
LIO-SAM默认输出为TUM格式,而KITTI真值是12列的KITTI格式。使用evo工具进行转换:
# 将KITTI真值转换为TUM格式 evo_traj kitti ground_truth.txt --save_as_tum # 将LIO-SAM输出转换为相同时间基准 python align_timestamps.py lio_sam_result.txt ground_truth.tum4.2 定量评估指标
使用evo计算绝对位姿误差(APE)和相对位姿误差(RPE):
evo_ape tum ground_truth.tum lio_sam_result.tum -r trans_part --align evo_rpe tum ground_truth.tum lio_sam_result.tum -r trans_part --delta 10 --delta_unit m典型评估结果指标解读:
| 指标 | 优秀值 | 可接受值 | 说明 |
|---|---|---|---|
| APE (m) | <0.5 | <1.5 | 绝对位置误差 |
| RPE (%) | <1 | <3 | 相对运动误差 |
| 轨迹长度 (m) | - | - | 验证完整性 |
4.3 可视化对比
生成轨迹对比图:
evo_traj tum lio_sam_result.tum --ref=ground_truth.tum -p --plot_mode=xz保存结果为PDF:
evo_ape tum ground_truth.tum lio_sam_result.tum -r trans_part --align --save_plot results.pdf5. 进阶技巧与问题排查
5.1 提升精度的实用技巧
IMU标定补偿:使用
imu_utils工具标定IMU噪声参数roslaunch imu_utils kitti_imu.launch点云去畸变:在
imageProjection.cpp中启用deskewFlagpcl::PointCloud<PointXYZIRT>::Ptr deskewedCloud(new pcl::PointCloud<PointXYZIRT>());回环检测优化:调整
loopClosureFrequency参数平衡精度与速度
5.2 常见错误排查
问题1:点云显示异常,出现条纹状 artifacts
- 解决方案:检查
N_SCAN参数是否与激光雷达线数匹配
问题2:轨迹严重漂移
- 检查步骤:
- 确认IMU数据是否正确接入
- 检查
imuTopic参数是否与bag文件中的topic一致 - 验证时间戳同步是否准确
问题3:建图出现重影
- 可能原因:回环检测失败
- 调试方法:
rostopic echo /lio_sam/mapping/loop_closure_constraint
实际项目中,我发现最影响精度的往往是时间戳同步这种基础问题。建议在数据处理阶段多花些时间验证时间对齐效果,可以节省后期大量调试时间。