利用kitti2bag和RVIZ高效处理KITTI数据集的完整指南
1. 从零开始玩转KITTI数据集第一次接触KITTI数据集时我被它丰富的传感器数据震撼到了——64线激光雷达、高精度GPS/IMU、立体相机简直就是自动驾驶研究的宝藏。但很快我就遇到了难题这些数据格式和ROS不兼容没法直接用RVIZ可视化。经过反复尝试我发现kitti2bag这个神器它能将KITTI的raw_data完美转换成ROS的bag文件。这里有个真实案例去年帮学弟处理KITTI的2011_09_26_drive_0005数据时原始数据有20GB包含30分钟的城市道路场景。用传统方法处理需要自己写解析脚本而kitti2bag只用一行命令就搞定了格式转换省去了至少三天的工作量。2. 环境准备与工具安装2.1 搭建ROS开发环境我强烈推荐使用Ubuntu 18.04 ROS Melodic组合这是最稳定的配置。安装完基础ROS后千万别忘了这两个关键包sudo apt-get install ros-melodic-rviz ros-melodic-velodyne-pointcloud曾经有次我在Ubuntu 20.04上折腾了一整天就是因为少了velodyne-pointcloud这个包导致激光雷达数据在RVIZ中显示异常。血的教训告诉我们环境配置要一步到位。2.2 安装kitti2bag的三种方式官方推荐用pip安装但我实测发现用源码安装更可靠git clone https://github.com/tomas789/kitti2bag.git cd kitti2bag pip install -e .如果遇到权限问题可以试试加--user参数。安装完成后建议运行kitti2bag --version验证下我遇到过因为Python路径问题导致命令找不到的情况。3. 数据转换全流程详解3.1 数据集预处理技巧下载的KITTI数据集通常长这样2011_09_26_drive_0005_sync ├── image_00 ├── image_01 ├── velodyne_points └── ...关键一步是把校准文件放到正确位置。我习惯这样做unzip 2011_09_26_calib.zip cp 2011_09_26_calib/* 2011_09_26_drive_0005_sync/曾经因为漏了这一步转换出来的bag文件没有校准信息在RVIZ里点云和图像完全对不上浪费了半天时间排查。3.2 转换命令的隐藏参数基础命令大家都会kitti2bag -t 2011_09_26 -r 0005 raw_synced但有几个实用参数很少人知道--velodyne指定是否转换激光雷达数据--grayscale处理灰度图像--threads 4加速转换过程比如处理城市数据集时可以这样用kitti2bag -t 2011_09_26 -r 0005 --velodyne true --grayscale false raw_synced4. RVIZ高级可视化技巧4.1 激光雷达点云优化配置在RVIZ中添加PointCloud2显示时按我说的配置保证效果惊艳Topic选择/kitti/velo/pointcloudStyle选PointsSize调为0.05Color Transformer选Intensity最近处理2011_09_30_drive_0034数据时这样配置后连远处的行人轮廓都清晰可见比默认配置强太多了。4.2 多传感器同步显示要实现下图这样的多窗口联动效果[相机图像] [激光雷达] [鸟瞰图]需要在RVIZ中添加3个ImageView分别订阅对应的图像topic在Global Options里勾选Fixed Frame为velo_link记住一定要先启动rosbag play再打开RVIZ不然坐标系会显示异常。这个坑我踩过至少五次。5. 实战问题解决方案5.1 播放速度控制秘籍直接rosbag play会以原速播放对于调试来说太慢了。我常用的几种调速方案方案一基础倍速播放rosbag play -r 2 kitti.bag # 2倍速方案二分段变速适合长数据rosbag play -r 1 -u 60 kitti.bag # 前60秒1倍速 rosbag play -r 2 -s 60 -u 120 kitti.bag # 60-120秒2倍速方案三关键帧跳转rosbag play -r 1 --skip-empty0.1 kitti.bag # 跳过空数据5.2 话题重映射进阶技巧当需要对接现有系统时话题重映射就派上用场了。这是我的万能模板rosbag play kitti.bag \ /kitti/camera_gray_left/image_raw:/camera/left \ /kitti/camera_gray_right/image_raw:/camera/right \ /kitti/velo/pointcloud:/lidar/points更复杂的场景可以配合launch文件使用比如同时播放多个bag文件时。6. 性能优化与扩展应用6.1 大文件处理技巧遇到50GB以上的大bag文件时可以这样优化使用--chunksize1024参数分割文件播放时添加--pause参数防止卡顿在SSD上操作速度会快3-5倍上周处理2011_09_30_drive_0033数据约80GB时这些技巧让处理时间从6小时缩短到1.5小时。6.2 与SLAM算法联调将KITTI数据接入LOAM或LeGO-LOAM时要注意修改launch文件中的topic名称调整时间同步参数使用tf_static发布坐标系变换具体可以这样启动roslaunch lego_loam run.launch rosbag play kitti.bag /kitti/velo/pointcloud:/velodyne_points7. 自动化脚本大全7.1 一键转换脚本这是我常用的convert_all.sh#!/bin/bash for drive in {0001..0011} do kitti2bag -t 2011_09_26 -r $drive raw_synced done7.2 自动播放脚本play_all.py更智能import os import rosbag for bag in os.listdir(.): if bag.endswith(.bag): os.system(frosbag play {bag} -r 2) input(Press Enter to continue...)这个脚本会按顺序播放所有bag文件每个播完后暂停等待确认。