自动驾驶感知:常用坐标系转换过程与可视化思路
本文主要针对nuScenes数据集而言
将全局坐标系下的3D目标框的检测结果分别可视化在六个环视相机以及BEV坐标系下的过程主要涉及坐标系的转换;
全局坐标系的3D目标检测框可视化在六个环视相机采集到的图像中涉及的坐标系转换过程
全局坐标系 -> 自身车辆坐标系(ego vehicle)
主要是涉及旋转和平移过程,涉及到的核心代码如下,其中pose_record['translation']和pose_record['rotation']分别代表车辆自身在全局坐标系下的3D位置坐标以及方位角;
# Move box to ego vehicle coord system.
"""
box:代表3D预测框实例对象,分别进行平移和旋转变换转换到自身车辆坐标系
"""
box.translate(-np.array(pose_record['translation']))# Quaternion() 将方位角信息转换成了四元数的形式
box.rotate(Quaternion(pose_record['rotation']).inverse)
自身车辆坐标系 -> 相机坐标系
主要涉及旋转和平移过程,涉及到的核心代码如下,其中cs_record['translation']和cs_record['rotation'] 分别代表传感器(这里指相机)在车辆坐标系下的3D坐标位置以及方位角;
# Move box to sensor coord system.
box.translate(-np.array(cs_record['translation']))
box.rotate(Quaternion(cs_record['rotation']).inverse)
相机坐标系 -> 图像的像素坐标系
通过相机内参将相机坐标系下的3D坐标转换到图像平面上
box_in_image(box, cam_intrinsic, imsize, vis_level=box_vis_level)
全局坐标系的3D目标检测框可视化在BEV视角中涉及的坐标系转换过程
需要说明的是,在转换过程中BEV视角下的坐标系就是lidar坐标系
全局坐标系 -> 自身车辆坐标系(ego vehicle)
与环视图像上可视化检测框的代码一样,参数含义也相同
# Move box to ego vehicle coord system.
box.translate(-np.array(pose_record['translation']))
box.rotate(Quaternion(pose_record['rotation']).inverse)
自身车辆坐标系 -> BEV视角(lidar坐标系)
注意:这里的sensor coord system指代的是lidar坐标系
# Move box to sensor coord system.
box.translate(-np.array(cs_record['translation']))
box.rotate(Quaternion(cs_record['rotation']).inverse)
由于此时已经转换为lidar坐标系,不存在内参转换的过程了。