Apollo2NuScenes数据转换工具概要设计
1. 概述
1.1 设计目标
本工具旨在将Apollo Record格式的传感器数据转换为NuScenes数据集格式,同时将点云检测模型生成的障碍物信息作为标注,为后续的自动驾驶感知模型训练和验证提供标准化数据。
1.2 工具功能
- 将Apollo Record中的多相机图像、激光雷达点云数据转换为NuScenes格式
- 处理相机图像的去畸变和裁剪,确保图像质量
- 基于时间戳同步多传感器数据
- 将障碍物检测结果转换为NuScenes标注格式
- 生成符合NuScenes规范的JSON元数据文件
2. 系统架构与原理
2.1 核心组件
| 组件名称 | 职责 |
|---|---|
| Config | 存储全局配置参数,如传感器映射关系、目标分辨率等 |
| Buffer | 缓存和检索时间戳相关的数据,支持数据同步 |
| Apollo2NuScenesConverter | 核心转换逻辑,处理数据读取、转换和保存 |
2.2 数据流分析
- 数据输入:Apollo Record文件,包含相机图像、激光雷达点云和障碍物检测结果
- 数据处理 :
- 消息解析与缓存
- 时间戳同步
- 图像去畸变与裁剪
- 点云数据处理
- 障碍物标注转换
- 数据输出 :符合NuScenes格式的数据集,包括:
- 图像文件(.jpg)
- 点云文件(.pcd.bin)
- 元数据文件(.json)
2.3 关键原理
-
时间同步原理:
- 使用Buffer类缓存传感器数据,基于时间戳进行最近邻匹配
- 确保同一时间戳下的多传感器数据被关联到同一个样本
-
坐标系转换原理:
- 构建传感器间的变换树,基于外参计算不同坐标系间的转换
- 将传感器数据统一转换到世界坐标系
-
图像去畸变原理:
- 使用OpenCV的fisheye模块进行鱼眼相机图像去畸变
- 基于相机内参和ROI进行图像裁剪和缩放
-
数据格式转换原理:
- 将Apollo的传感器数据格式转换为NuScenes格式
- 将Apollo的障碍物类型映射到NuScenes的类别体系
3. 详细设计
3.1 配置模块
3.1.1 Config类
- 目标分辨率设置:定义输出图像的目标宽度和高度
- 传感器映射:建立Apollo传感器话题与NuScenes传感器名称的映射关系
- 置信度阈值:设置障碍物检测结果的过滤阈值
3.2 缓存模块
3.2.1 Buffer类
- 数据添加:使用二分查找保持时间戳有序,确保高效插入
- 数据检索:基于时间戳查找最近邻数据,支持数据同步
- 缓存管理:自动清理过期数据,优化内存使用
3.3 核心转换模块
3.3.1 Apollo2NuScenesConverter类
3.3.1.1 初始化与准备
- 创建输出目录结构
- 加载预定义的JSON文件
- 初始化数据结构和缓冲区
3.3.1.2 传感器校准
- 加载传感器外参
- 构建变换树
- 计算传感器到世界坐标系的转换
- 生成校准传感器信息
3.3.1.3 消息处理
- 解析CAN总线消息,获取车辆状态
- 解析相机图像数据,进行缓存
- 解析激光雷达点云数据,进行缓存
- 解析位姿数据,构建世界坐标系转换
3.3.1.4 障碍物处理与数据同步
- 基于障碍物消息时间戳同步多传感器数据
- 过滤低置信度障碍物
- 生成障碍物标注信息
- 关联实例ID,构建实例跟踪
3.3.1.5 数据保存
- 保存处理后的图像和点云数据
- 生成符合NuScenes格式的元数据文件
- 构建场景、样本、标注等数据结构
4. 工作流程
4.1 整体流程
-
初始化阶段
- 解析命令行参数
- 初始化Cyber框架
- 创建转换器实例
- 构建传感器校准信息
-
数据处理阶段
- 读取Record文件
- 解析并缓存传感器消息
- 处理障碍物数据,同步传感器数据
- 生成样本和标注信息
-
数据保存阶段
- 保存处理后的传感器数据
- 生成NuScenes格式的元数据文件
- 关闭Cyber框架
4.2 详细流程
是
否
是
否
启动程序
解析命令行参数
初始化Cyber框架
创建转换器实例
创建传感器校准信息
读取Record文件
解析传感器消息
是否是障碍物消息?
处理障碍物数据
缓存传感器数据
同步多传感器数据
生成样本和标注
达到最大处理数量?
保存数据
关闭Cyber框架
结束
5. 数据结构
5.1 输入数据结构
- Apollo Record文件:包含多种传感器消息
- 传感器外参文件:YAML格式,定义传感器间的位置关系
- 相机内参文件:YAML格式,定义相机的内参和ROI
5.2 输出数据结构
5.2.1 目录结构
out_dir/
├── can_bus/ # 车辆状态数据
└── nuscenes/
├── samples/ # 传感器数据
│ ├── CAM_BACK/ # 后相机图像
│ ├── CAM_BACK_LEFT/ # 左后相机图像
│ ├── CAM_BACK_RIGHT/ # 右后相机图像
│ ├── CAM_FRONT/ # 前相机图像
│ ├── CAM_FRONT_LEFT/ # 左前相机图像
│ ├── CAM_FRONT_RIGHT/ # 右前相机图像
│ └── LIDAR_TOP/ # 激光雷达点云
├── sweeps/ # 预留目录
└── v1.0-mini/ # 元数据文件
├── attribute.json # 属性定义
├── calibrated_sensor.json # 传感器校准信息
├── category.json # 类别定义
├── ego_pose.json # 车辆位姿
├── instance.json # 实例信息
├── log.json # 日志信息
├── map.json # 地图信息
├── sample.json # 样本信息
├── sample_annotation.json # 标注信息
├── sample_data.json # 样本数据信息
├── scene.json # 场景信息
├── sensor.json # 传感器信息
└── visibility.json # 可见性定义
5.2.2 核心元数据结构
- scene.json:场景信息,包含场景的起始和结束样本
- sample.json:样本信息,每个样本对应一个时间戳
- sample_data.json:传感器数据信息,关联样本和传感器数据文件
- sample_annotation.json:标注信息,包含障碍物的位置、大小、类别等
- instance.json:实例信息,跟踪障碍物在不同样本中的出现
6. 接口设计
6.1 命令行接口
bash
python apollo2nuscenes.py <record_path>
- record_path:Apollo Record文件所在目录
6.2 主要类接口
6.2.1 Apollo2NuScenesConverter类
- **init(record_path, output_dir, perception_params)**:初始化转换器
- create_calibrated_sensor():创建传感器校准信息
- process_samples():处理样本数据
6.2.2 Buffer类
- add(timestamp, data):添加数据到缓冲区
- get_nearest(target_timestamp):获取最近邻数据
7. 性能与优化
7.1 内存优化
- 缓存管理:自动清理过期数据,控制内存使用
- 数据处理:采用流式处理,避免一次性加载全部数据
7.2 时间优化
- 二分查找:使用二分查找提高时间戳查找效率
- 并行处理:对多传感器数据的处理可考虑并行化
7.3 存储优化
- 数据压缩:对图像数据进行适当压缩
- 格式选择:选择高效的点云存储格式
8. 错误处理与容错
8.1 错误处理
- 文件不存在:检查输入文件和参数的有效性
- 传感器数据缺失:当某传感器数据缺失时,跳过该样本
- 外参获取失败:当无法获取传感器外参时,记录警告并继续处理
8.2 容错机制
- 时间同步容错:允许一定的时间同步误差
- 数据质量容错:对低质量传感器数据进行过滤
9. 测试与验证
9.1 功能测试
- 数据格式验证:确保输出数据符合NuScenes格式规范
- 传感器同步验证:验证同一时间戳下的多传感器数据一致性
- 标注转换验证:验证障碍物标注的准确性和完整性
9.2 性能测试
- 处理速度:测试不同规模数据的处理速度
- 内存使用:监控处理过程中的内存使用情况
9.3 验证方法
- 可视化验证:使用NuScenes SDK可视化转换后的数据
- 统计验证:对比转换前后的数据量和分布
10. 总结与展望
10.1 总结
- 本工具实现了Apollo Record到NuScenes数据集的完整转换流程
- 支持多传感器数据同步、图像去畸变、坐标系转换等功能
- 生成符合NuScenes格式规范的数据,可直接用于模型训练和验证
10.2 展望
- 扩展传感器支持:增加对更多传感器类型的支持
- 优化处理速度:进一步提高大规模数据的处理效率
- 增强数据质量:添加数据质量评估和增强功能
- 支持更多数据集格式:扩展支持其他常用数据集格式
11. 参考资料
- Apollo传感器数据格式文档
- NuScenes数据集格式文档
- OpenCV相机标定与去畸变文档
- Open3D点云处理文档
- Python性能优化指南