网上很多文章只提了NuScenes坐标系有哪些,但是没有找到一篇文章把NuScenes坐标系的转换结合代码说全说明白了,结合工作需要,针对OpenPCDet里读取NuScenes数据集对数据做坐标转换的代码说一下。
OpenPCDet是3D点云目标检测框架,顾名思义,模型的输入数据都是点云数据!只有在近来OpenPCDet把多模态融合模型BEVFusion加入进来后才考虑了图像和点云两种输入数据!所以模型在加载NuScenes数据集或者其他数据集时都得把其他坐标系下的标注数据转换到激光雷达坐标系下!
另外,由于NuScenes数据集采集数据时是使用的32线扫描式激光雷达,这种雷达的点数实在是有限,和现在市场上自驾使用的128线扫描式激光雷达或固态激光雷达的密集点云比,成像效果真是太差了(有点云的范围内稍远一点的目标身上就那么几个点,让人去分辨是目标是人还是车还是其他物体都困难,就别说让模型学习特征差异了)!所以纯单帧点云的检测效果肯定很差!所以一般模型使用NuScenes数据集做实验时都对点云做了多帧叠加(也就是以ref frame为基准把多个sweep frame里的点云和ref frame的点云合并,因为标注是标在ref frame上的)!这时也需要用到坐标转换!因为采集数据的自车是运动的,扫描帧采集时的激光雷达坐标原点和朝向和关键帧采集时的激光雷达坐标的原点和朝向是不一样的,所以做点云叠加时必须要考虑运动补偿做坐标转换!
NuScenes数据集经常参与数据的坐标系转换的主要有四个坐标系,下面列一下要点:
1. 四个坐标系:全局坐标系(地图坐标系)、自车坐标系、相机坐标系、雷达坐标系(含激光雷达和毫米波雷达,激光雷达只有一个安装在车顶的TOP雷达,以TOP为reference),像素坐标系和图像坐标系和相机坐标系之间是相机内参决定的,通常换算到相机坐标系下,不单独提。
2. 标注数据的bbox是在全局坐标系下标注的
3. 重要数据的概念:
-
scene:采集场景
[token, log_token,nbr_samples,first_sample_token,last_sample_token,
name,description]
-
sensor:传感器。
[token,channel,modality], modelity指{camera,lidar,radar}
-
calibrated_sensor:传感器相对自车坐标系的标定参数[token,sensor_token,translation,roation,camera_intrinsic]
-
ego_pose:自车在特定时间戳的pose,基于激光雷达地图的定位算法给出 [token,rimestamp,rotation,translation]
-
sample_data:某时刻(timestamp)的传感器数据,例如图片,点云或者Radar等 [token,sample_token,ego_pose_token,calibrated_sensor_token,timestamp,fileformat,is_key_frame,height,width,filename,prev,next]
-
sample_annotation:标注数据[token,sample_token,instance_token,visibility_token,attribution_tokens, translation,size, rotation, prev,next, num_lidar_pts, num_radar_pts]
4.OpenPCDet对输入的NuScenes数据的处理:
执行下面的命令生成用于训练的pkl文件:
python -m pcdet.datasets.nuscenes.nuscenes_dataset --func create_nuscenes_infos
--cfg_file tools/cfgs/dataset_configs/nuscenes_dataset.yaml
--version v1.0-trainval
此处调用的 pcdet/datasets/nuscenes/nuscenes_dataset.py里的create_nuscenes_infos()函数。
def create_nuscenes_infos(version, data_path, save_path, max_sweeps=10, with_cam=False)
--> train_nusc_infos, val_nusc_infos = nuscenes_utils.fill_trainval_infos(
data_path=data_path, nusc=nusc, train_scenes=train_scenes, val_scenes=val_scenes,
test='test' in version, max_sweeps=max_sweeps, with_cam=with_cam)
pcdet/datasets/nuscenes/nuscenes_utils.py:
def fill_trainval_infos(data_path, nusc, train_scenes, val_scenes, test=False, max_sweeps=10, with_cam=False)
--> ref_lidar_path, ref_boxes, _ = get_sample_data(nusc, ref_sd_token)
…
tm = reduce(np.dot, [ref_from_car, car_from_global, global_from_car, car_from_current])
lidar_path = nusc.get_sample_data_path(curr_sd_rec['token'])
time_lag = ref_time - 1e-6 * curr_sd_rec['timestamp']
sweep = {
'lidar_path': Path(lidar_path).relative_to(data_path).__str__(),
'sample_data_token': curr_sd_rec['token'],
'transform_matrix': tm,

本文详细解释了在OpenPCDet中处理NuScenes数据集时,如何进行坐标转换,包括从全局坐标系到传感器坐标系,以及关键帧和sweep帧之间的转换,以适应激光雷达传感器的特性。
最低0.47元/天 解锁文章
1734

被折叠的 条评论
为什么被折叠?



