使用Blender可视化多传感器坐标系转换
一、背景与问题场景:为什么需要坐标转换?
在自动驾驶汽车或机器人系统中,通常会配备多种传感器,如激光雷达 (LiDAR) 和 摄像头 (Camera)。激光雷达擅长精确测量物体的距离和三维形状,而摄像头则能提供丰富的颜色和纹理信息。为了更全面地理解周围环境,我们需要将这两种不同类型的数据“融合”在一起。
核心问题:
- 物理位置不同: 激光雷达和摄像头安装在车辆的不同位置(车顶、保险杠、后视镜等),如下图所示。
- 数据坐标系不同: 每个传感器都有自己的“世界”,即坐标系。激光雷达数据点记录在“激光雷达坐标系”中,而摄像头拍摄的像素位置则基于“相机坐标系”。
- 融合的前提: 要想知道激光雷达扫描到的某个点对应摄像头图像中的哪个像素(或者反过来),我们必须知道如何将数据从一个传感器的坐标系转换到另一个传感器的坐标系。
解决方案的核心:变换矩阵
将一个点从坐标系A转换到坐标系B,需要知道坐标系B相对于坐标系A的变换矩阵。
- 变换矩阵 = 旋转矩阵 + 平移向量
- 旋转矩阵: 描述了坐标系B相对于坐标系A是如何旋转的(比如旋转了多少度,绕哪个轴旋转)。
- 平移向量: 描述了坐标系B的原点相对于坐标系A的原点在X, Y, Z三个方向偏移了多少距离。
- 为什么用四元数?
- 旋转可以用多种方式表示(如欧拉角)。但欧拉角存在“万向节死锁”问题(在特定旋转角度时会丢失一个旋转自由度),导致计算不稳定。
- 四元数 (Quaternion): 是一种用四个数值
(w, x, y, z)
表示3D旋转的数学工具。它巧妙地避免了万向节死锁问题,计算效率高,且能平滑地表示旋转,因此在机器人学和计算机图形学中被广泛使用。你可以把它想象成一种更“聪明”的表示旋转的方式。我们的目标: 计算出每个相机坐标系到激光雷达坐标系的变换矩阵(包含旋转四元数和平移向量)。
二、解决方案:使用Blender进行可视化转换
既然知道了需要变换矩阵,如何精确地获取它们呢?特别是如何直观地理解和验证这些数值?这里我们引入一个强大的开源工具:Blender。
为什么选择Blender?
- 专业的3D建模与可视化: Blender是一个功能强大的开源3D创作套件,可以精确地导入、编辑和可视化3D模型。
- 直观操作: 我们可以直接在3D空间中放置和调整代表传感器坐标系的物体,所见即所得。
- 精确读取数据: Blender能直接显示物体的位置(平移向量)和旋转(四元数形式),这正是我们需要的变换参数。
步骤详解:Blender可视化操作指南
步骤1:准备基础环境 - 导入车辆3D模型并设置坐标系
- 获取精确的3D模型: 找到或创建包含车辆主体以及激光雷达和摄像头精确安装位置的3D模型文件(如.obj, .fbx, .blend格式)。
- 导入模型到Blender: 打开Blender,通过
File -> Import
菜单导入你的车辆模型。 - 关键设置:统一世界坐标系
- 为了与自动驾驶/机器人领域常用的坐标系(以及后续Python代码)保持一致,我们需要将Blender的世界坐标系设置为:
- Z轴朝上 (Up)
- X轴朝前 (Forward - 通常是车辆前进方向/激光雷达主朝向)
- Y轴朝左 (Left - 面向车辆前方时,你的左侧)
- (注:Blender默认是Z轴朝上,Y轴朝前,X轴朝右。我们的设置是将Y轴前向旋转到X轴前向)
- 如何设置: 通常需要在建模时就约定好,或在导入后整体旋转模型使其符合此约定。
- 为了与自动驾驶/机器人领域常用的坐标系(以及后续Python代码)保持一致,我们需要将Blender的世界坐标系设置为:
步骤2:创建代表相机坐标系的标记物
我们需要在3D空间中可视化每个相机的坐标系原点及其朝向。
- 创建长方体:
- 在Blender中,按
Shift + A
->Mesh -> Cube
添加一个长方体。 - 这个长方体将代表一个相机的坐标系原点及其三个轴的方向。
- 在Blender中,按
- 调整长方体的局部坐标系:
- 选中长方体,按
Tab
键进入编辑模式 (Edit Mode)。 - 在视图左上角的变换方向下拉菜单中(默认可能是“全局”),选择局部坐标系 (Local Orientation)。这确保我们对长方体的旋转操作是基于它自身的轴,而不是世界轴。
- 按
R
键进行旋转,调整长方体,使其:
- 选中长方体,按