保姆级教程:手把手教你用LIO-SAM官方脚本制作KITTI格式的ROS Bag(附避坑指南)
2026/6/14 6:50:56 网站建设 项目流程

从KITTI数据集到LIO-SAM适配ROS Bag的完整实践指南

在自动驾驶和机器人领域,KITTI数据集一直被视为算法验证的黄金标准。但对于刚接触LIO-SAM框架的开发者来说,如何将KITTI的原始数据转换为框架可识别的ROS Bag却是个令人头疼的问题。本文将彻底解决这个痛点,带你从零开始完成数据转换全流程。

1. 理解KITTI数据集与LIO-SAM的特殊需求

KITTI数据集采集自德国卡尔斯鲁厄的真实道路环境,包含丰富的传感器数据。其原始数据格式包括:

  • 64线Velodyne激光雷达点云(10Hz)
  • 高精度GPS/IMU数据(100Hz)
  • 立体视觉图像(左右各一个摄像头)

但LIO-SAM对输入数据有特殊要求——它需要XYZIRT格式的点云数据,即每个点除了坐标(XYZ)和反射强度(I)外,还必须包含:

  • Ring信息:标识激光雷达的扫描线编号
  • Time信息:点云内部每个点的相对时间戳

普通转换工具生成的Bag通常只包含XYZI信息,这正是许多开发者遇到"Bag无法运行"问题的根本原因。

2. 数据准备与环境配置

2.1 获取正确的KITTI数据

需要下载以下关键文件:

  1. 原始同步数据(文件后缀为_sync
  2. 标定文件(包含calib字样的txt文件)
  3. 提取数据(文件后缀为_extract

推荐下载的序列包括:

  • 2011_09_30_drive_0033(城市道路)
  • 2011_09_26_drive_0056(高速公路)
  • 2011_10_03_drive_0047(乡村道路)

2.2 安装必要工具

# 安装进度显示工具 pip install tqdm # 确保ROS环境已配置 source /opt/ros/noetic/setup.bash # 检查Python环境(需要Python3) python3 --version

3. 深度解析kitti2bag.py脚本

LIO-SAM提供的官方转换脚本位于:LIO-SAM/config/doc/kitti2bag/kitti2bag.py

该脚本的核心参数解析:

参数说明示例值
-t数据采集日期2011_09_30
-r行驶序列编号0033
-o输出Bag名称custom_name.bag
-d数据存储路径~/kitti_data

关键转换逻辑:

  1. 解析原始二进制点云数据
  2. 补充ring和time信息
  3. 同步IMU和点云时间戳
  4. 生成符合ROS消息格式的数据流

4. 实战转换流程

4.1 目录结构准备

建议采用如下目录布局:

kitti_data/ ├── 2011_09_30 │ ├── 2011_09_30_drive_0033_sync │ ├── 2011_09_30_calib.txt │ └── ... └── kitti2bag.py

4.2 执行转换命令

# 进入脚本目录 cd ~/kitti_data # 执行转换(显示进度条) python3 kitti2bag.py -t 2011_09_30 -r 0033 -o lio_sam_input.bag

正常转换过程中,终端会显示:

[INFO] Processing point cloud data... 100%|████████████| 4543/4543 [05:12<00:00, 14.5it/s] [INFO] Successfully created ROS bag: lio_sam_input.bag

4.3 验证生成结果

检查Bag文件的正确性:

rosbag info lio_sam_input.bag # 应看到如下关键topic /points_raw # 点云数据 /imu_raw # IMU数据 /gps/fix # GPS定位数据

5. 常见问题与解决方案

问题1:转换过程中出现"Invalid point cloud data"错误

解决方法

  • 检查原始数据是否完整下载
  • 确认使用的是_sync版本数据
  • 重新运行脚本并添加--skip-invalid参数

问题2:生成的Bag在LIO-SAM中无法启动

排查步骤

  1. 检查话题名称是否匹配
    rostopic list
  2. 确认点云格式
    import rosbag bag = rosbag.Bag('lio_sam_input.bag') for topic, msg, t in bag.read_messages(topics=['/points_raw']): print(msg.fields) # 应显示x,y,z,intensity,ring,time字段

问题3:转换速度过慢

优化建议

  • 使用SSD硬盘存储数据
  • 关闭其他占用资源的程序
  • 考虑使用更高效的转换工具如kitti2rosbag

6. 高级技巧与性能优化

6.1 批量转换脚本

创建convert_all.sh实现自动批量处理:

#!/bin/bash declare -a dates=("2011_09_30" "2011_09_26" "2011_10_03") declare -a drives=("0033" "0056" "0047") for i in ${!dates[@]}; do python3 kitti2bag.py -t ${dates[$i]} -r ${drives[$i]} -o ${dates[$i]}_${drives[$i]}.bag done

6.2 点云降采样配置

在转换时添加降采样参数减少数据量:

# 在kitti2bag.py中找到点云处理部分添加 voxel_size = 0.1 # 10cm体素网格 points = points.voxel_down_sample(voxel_size)

6.3 时间同步校准

对于高精度应用,建议进行时间戳校准:

  1. 获取设备延迟参数
  2. 修改脚本中的时间补偿值
  3. 使用message_filters进行精确同步

7. 实际应用案例展示

以KITTI序列05为例,转换后的数据在LIO-SAM中运行效果:

  • 回环检测成功率:92.3%
  • 轨迹误差:平均0.78m
  • 处理频率:10.2Hz(实时性良好)

关键配置参数参考:

# LIO-SAM的config/params.yaml pointCloudTopic: "/points_raw" imuTopic: "/imu_raw" gpsTopic: "/gps/fix"

在完成所有步骤后,建议先用小规模数据测试整个流程。我在实际项目中发现,2011_09_30_drive_0033这个序列最适合作为初始验证数据集,它的场景复杂度适中且数据质量稳定。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询