自动驾驶-数据解析01:四元数03【自动驾驶中的四元数 [w, x, y, z] 到底从哪里来:采集、标定、定位还是标注?】
标题:自动驾驶中的四元数[w, x, y, z]到底从哪里来:采集、标定、定位还是标注?
1. 先给结论
在自动驾驶数据中看到四元数:
[w,x,y,z]不能简单地理解为:
自动驾驶采集数据时,所有数据都是用四元数采集的。也不能简单地理解为:
四元数全部都是后续人工标注转换得来的。更准确的说法是:
四元数不是相机、激光雷达、毫米波雷达等原始传感器数据的采集格式,而是用来表示三维旋转姿态的数据格式。它可能在采集阶段由定位系统或标定系统记录,也可能在后续处理、标注、融合、格式转换时生成。
所以答案不是单选题,而是要分情况:
1. 相机图像、激光雷达点云、毫米波雷达回波: 原始采集数据通常不是四元数。 2. 自车姿态 ego pose: 可能在采集阶段由定位系统记录,也可能经过离线定位优化后保存为四元数。 3. 传感器外参 calibrated sensor: 通常来自采集前或采集系统搭建阶段的传感器标定,保存时可以用四元数。 4. 目标 3D 框 annotation: 通常来自后续人工标注、半自动标注、自动标注或算法处理,最后可能保存为四元数。 5. IMU / INS 姿态: 原始 IMU 通常输出加速度和角速度,但融合后的 INS / GNSS-IMU 定位系统可能直接输出四元数姿态。一句话总结:
自动驾驶中的四元数
[w, x, y, z]本质上是“姿态表示格式”,不是“传感器原始采集格式”。自车姿态和传感器外参中的四元数多来自定位与标定流程;目标框朝向中的四元数多来自后续标注或算法处理流程。
2. 为什么会有这个疑问?
自动驾驶数据集中经常看到类似这样的字段:
rotation=[0.919637827,-0.000544678106,0.00976648310,-0.392645624]很多数据集或工具会说明它是四元数,并且顺序是:
[w,x,y,z]例如在 nuScenes 数据结构中,下面这些字段都可能使用四元数:
calibrated_sensor.rotation ego_pose.rotation sample_annotation.rotation它们分别表示:
calibrated_sensor.rotation:传感器相对于车体的外参旋转 ego_pose.rotation:自车在全局坐标系中的姿态 sample_annotation.rotation:目标 3D 框的朝向于是很容易产生一个误解:
是不是自动驾驶汽车采集数据时,传感器直接采集到的就是四元数?其实不是。
相机采集的是图像,激光雷达采集的是点云,毫米波雷达采集的是距离、速度、角度等信息。四元数主要描述的是“姿态”或“旋转关系”。
3. 自动驾驶车辆采集的原始数据是什么?
自动驾驶车辆在道路上行驶时,会采集多种传感器数据。
常见传感器包括:
Camera:相机 LiDAR:激光雷达 Radar:毫米波雷达 IMU:惯性测量单元 GNSS / GPS:卫星定位系统 Wheel Encoder:轮速计 CAN Bus:车辆底盘数据这些传感器的原始数据大致如下:
| 传感器 | 原始采集数据 | 是否天然就是四元数 |
|---|---|---|
| Camera 相机 | 图像像素 | 不是 |
| LiDAR 激光雷达 | 点云坐标、距离、强度等 | 不是 |
| Radar 毫米波雷达 | 距离、速度、方位角、俯仰角、反射强度等 | 不是 |
| IMU 惯性测量单元 | 加速度、角速度 | 原始输出通常不是 |
| GNSS / GPS | 经纬度、高度、速度、时间戳 | 不是 |
| Wheel Encoder 轮速计 | 轮速、里程 | 不是 |
| CAN Bus | 方向盘角、油门、刹车、车速等 | 不是 |
举例来说,最原始的感知数据通常长这样:
# 相机数据image=H x W x3# 激光雷达点云point=[x,y,z,intensity]# 毫米波雷达目标radar_object=[range,velocity,azimuth,elevation]# IMU 原始数据imu=[acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z]这些都不是四元数。
所以,四元数不是自动驾驶传感器“看见世界”的原始数据格式,而是系统为了描述空间旋转和坐标关系而使用的数学表示。
4. 四元数[w, x, y, z]到底表示什么?
四元数可以写成:
q = [w, x, y, z]也可以写成数学形式:
q = w + x i + y j + z k q = w + xi + yj + zkq=w+xi+yj+zk
其中:
w:实部 x, y, z:虚部如果四元数用来表示三维旋转,通常要求它是单位四元数:
∣ q ∣ = w 2 + x 2 + y 2 + z 2 = 1 |q| = \sqrt{w^2 + x^2 + y^2 + z^2} = 1∣q∣=w2+x2+y2+z2=1
四元数和旋转轴、旋转角之间的关系是:
q = [ cos θ 2 , u x sin θ 2 , u y sin θ 2 , u z sin θ 2 ] q = \left[ \cos\frac{\theta}{2}, u_x\sin\frac{\theta}{2}, u_y\sin\frac{\theta}{2}, u_z\sin\frac{\theta}{2} \right]q=[cos2θ,uxsin2θ,uysin2θ,uzsin2θ]
其中:
theta:旋转角度 [u_x, u_y, u_z]:旋转轴方向也就是说,四元数本质上表达的是:
绕某个三维方向旋转多少角度在自动驾驶里,它通常用来回答这些问题:
车辆当前朝向哪里? 传感器相对于车身怎么安装? 目标 3D 框朝向哪里? 点云怎么从 LiDAR 坐标系转换到车体坐标系? 车体坐标系怎么转换到全局地图坐标系? 不同传感器之间如何对齐?三维旋转常见的表示方式有三种:
1. 欧拉角:roll、pitch、yaw 2. 旋转矩阵:3 x 3 矩阵 3. 四元数:[w, x, y, z]四元数的优势是:
1. 比欧拉角更稳定,避免万向锁 2. 比旋转矩阵更紧凑,只需要 4 个数 3. 适合连续姿态更新 4. 适合旋转插值 5. 适合坐标系变换所以自动驾驶数据集中经常会把姿态信息保存为四元数。
5. 第一类来源:自车姿态 ego pose
自动驾驶中的自车通常叫:
ego vehicle自车位姿通常叫:
ego pose自车位姿包括两部分:
1. translation:车辆位置 2. rotation:车辆朝向可以写成:
ego_pose={"translation":[x,y,z],"rotation":[w,x,y,z]}其中:
translation 表示车在哪里 rotation 表示车朝哪里在 nuScenes 数据结构中,ego_pose表示某个时间戳下自车相对于全局坐标系的位置和姿态,其中:
translation:位置 rotation:姿态四元数,顺序为 w, x, y, znuScenes 官方 schema 还说明,ego_pose是基于激光雷达地图定位算法的输出。
这说明一个关键点:
自车姿态四元数通常不是人工标注出来的,而是采集车上的定位系统、地图定位系统或后处理定位系统估计出来的。
它可能来自:
GNSS / GPS IMU 轮速计 LiDAR SLAM 视觉 SLAM 地图匹配 多传感器融合定位算法因此,自车位姿中的四元数更接近“采集过程或采集后定位处理产生的元数据”,不是人工一帧一帧标注出来的。
6. ego pose 四元数:采集时就有,还是离线后处理得到?
自车姿态四元数通常有两种常见来源。
