KITTI数据集改造实战:用rosbag_filter_gui和merge_bags.py打造你的专属100Hz IMU融合数据集
KITTI数据集深度定制:构建100Hz IMU融合数据集的完整实战指南
在自动驾驶和机器人定位领域,KITTI数据集一直是算法验证的黄金标准。但当我们试图评估基于滤波的多传感器融合算法时,标准数据集中的10Hz IMU数据往往成为性能瓶颈。本文将带你从零开始,通过rosbag_filter_gui和merge_bags.py等工具,打造一个包含100Hz IMU、去畸变图像和激光点云的增强版数据集。
1. 理解KITTI数据集的局限与改造需求
标准KITTI数据集提供两种数据格式:sync(同步去畸变数据)和extract(原始高频数据)。sync数据集虽然提供了经过校准和时间对齐的多传感器数据,但IMU频率仅有10Hz,这对于需要高频惯性测量的滤波算法(如EKF、UKF)来说远远不够。
关键差异对比:
| 特性 | sync数据集 | extract数据集 |
|---|---|---|
| IMU频率 | 10Hz | 100Hz |
| 图像处理 | 去畸变 | 原始数据 |
| 时间对齐 | 已同步 | 未同步 |
| 数据完整性 | 精选片段 | 完整记录 |
提示:extract数据集中的IMU数据虽然频率高,但缺少相机去畸变处理,直接使用会影响视觉算法的精度。
2. 环境准备与工具链配置
2.1 基础环境搭建
首先确保系统已安装ROS(推荐Melodic或Noetic版本)和Python 2.7环境(KITTI官方工具依赖):
sudo apt-get install python-pip python-qt4 ros-<distro>-rosbag ros-<distro>-tf2-msgs pip install pykitti numpy pandas2.2 必备工具获取
需要准备三个核心工具:
- rosbag_filter_gui:可视化过滤工具
- merge_bags.py:智能合并脚本
- kitti2bag:数据集转换工具
# 创建工作空间 mkdir -p ~/kitti_ws/src && cd ~/kitti_ws/src # 获取工具 git clone https://github.com/AtsushiSakai/rosbag_filter_gui.git git clone https://github.com/geyuyuan/kitti2bag.git wget https://raw.githubusercontent.com/geyuyuan/kitti_utils/master/merge_bags.py3. 数据获取与预处理
3.1 下载原始数据集
从KITTI官网获取两个关键数据集:
2011_10_03_drive_0027_sync(去畸变数据)2011_10_03_drive_0027_extract(高频IMU数据)
# 示例下载命令(实际需替换为官网链接) wget http://kitti.is.tue.mpg.de/kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip wget http://kitti.is.tue.mpg.de/kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_extract.zip3.2 数据重组策略
执行以下关键操作:
- 将extract中的
oxts文件夹重命名为oxts_extract - 复制到sync目录下
- 将原sync中的
oxts重命名为oxts_sync
2011_10_03_drive_0027_sync/ ├── image_00 ├── oxts_sync/ # 原sync数据 └── oxts_extract/ # 新增extract数据注意:此步骤确保两种数据源共存于同一目录结构,为后续处理奠定基础。
4. 时间戳修复与数据转换
4.1 运行时间戳修复脚本
GEYAO提供的scripts.py能自动处理时间戳异常:
# 示例脚本核心逻辑 def fix_timestamps(base_dir, drive): # 读取sync和extract的时间戳 sync_times = load_timestamps(os.path.join(base_dir, 'oxts_sync')) extract_times = load_timestamps(os.path.join(base_dir, 'oxts_extract')) # 线性插值对齐时间戳 aligned_times = interpolate_timestamps(sync_times, extract_times) # 生成新的oxts文件夹 save_aligned_data(aligned_times, os.path.join(base_dir, 'oxts'))运行命令:
python2 scripts.py -i 2011_10_03_drive_0027_sync4.2 生成ROS bag文件
使用改造后的kitti2bag.py转换数据:
python2 kitti2bag.py -t 2011_10_03 -r 0027 raw_synced关键参数说明:
-t:日期标签-r:行驶编号raw_synced:使用我们改造后的数据格式
5. 精细化数据过滤与合并
5.1 使用rosbag_filter_gui进行智能过滤
启动GUI工具:
python2 rosbag_filter_gui.py过滤策略建议:
对sync.bag:
- 保留所有图像和点云topic
- 删除
/tf和/tf_static(避免与extract数据冲突)
对extract.bag:
- 仅保留IMU和GPS相关topic
- 特别保留高频
/kitti/oxts/imu数据
5.2 Topic重命名技巧
为避免合并时的命名冲突,需要重命名extract的topic:
rosrun rosbag topic_renamer.py /kitti/oxts/imu extracted_filtered.bag /kitti/oxts/imu/extract extracted_filtered2.bag rosrun rosbag topic_renamer.py /kitti/oxts/gps/fix extracted_filtered2.bag /kitti/oxts/gps/fix/extract extracted_filtered3.bag5.3 智能合并数据流
使用merge_bags.py进行最终合并:
python2 merge_bags.py 2011_10_03_filtered.bag synced_filtered.bag extracted_filtered4.bag合并效果验证:
rostopic hz /kitti/oxts/imu/extract # 应显示100Hz rostopic hz /kitti/camera_color_left/image_raw # 应保持10Hz6. 高级技巧与问题排查
6.1 数据同步质量检查
建议使用rqt工具可视化检查时间对齐情况:
rqt_bag 2011_10_03_filtered.bag常见问题处理:
- 时间戳跳跃:检查scripts.py是否正确处理了原始时间戳
- 话题丢失:确认过滤时没有误删关键topic
- 频率异常:验证extract数据是否完整下载
6.2 性能优化建议
对于大型bag文件,可以考虑:
- 使用
--chunksize参数控制内存使用 - 先分割处理再合并
- 采用SSD存储加速读写
# 示例分割处理 rosbag filter large.bag small.bag "t.secs >= 1317617734 and t.secs <= 1317618000"7. 实际应用与算法验证
改造后的数据集特别适合以下场景:
- 紧耦合的VIO算法:100Hz IMU+10Hz图像
- 多传感器标定:提供精确的时间对齐数据
- SLAM系统评估:通过evo工具计算轨迹误差
典型评估命令:
evo_ape kitti ground_truth.txt estimated.txt -va --plot在完成数据集改造后,我发现最耗时的环节往往是数据下载和初步验证。建议在开始前确保:
- 网络连接稳定(数据集总大小约25GB)
- 预留足够的磁盘空间(建议50GB以上)
- 建立完整的数据处理日志,方便问题追踪
