### 自动驾驶中的常用坐标系
在自动驾驶领域,为了实现车辆感知环境并做出决策,通常会定义多个不同的坐标系。这些坐标系用于描述传感器数据、目标位置以及车辆自身的状态。
#### 1. **世界坐标系**
世界坐标系是一个全局固定的参考框架,用来表示整个场景的空间关系[^2]。它通常是三维直角坐标系,其原点可以任意设定,比如地图的一个固定点或者某个已知地标。
- 应用:作为其他局部坐标系的基础参照物,帮助定位车辆和其他动态对象在全球范围内的绝对位置。
- 特征:不随时间改变,适用于长期稳定的地理信息存储和处理。
#### 2. **自车坐标系**
自车坐标系是以汽车本身为基准建立的移动坐标系。它的原点位于车身特定部位(如后轴中心),三个轴分别指向水平面的不同方向:
- X 轴沿前进方向;
- Y 轴垂直于X轴朝向左侧或右侧;
- Z 轴向上延伸离开地面。
这种设置使得所有车载设备能够统一标准地报告它们检测到的信息相对于本体的姿态变化情况。
```python
import numpy as np
def car_to_world(car_pose, point_in_car):
"""
将自车坐标系下的点转换至世界坐标系
:param car_pose: 当前车辆位姿 (x,y,z,roll,pitch,yaw),列表形式
:param point_in_car: 需要变换的点,在自车坐标系下 [x', y', z']
:return: 变换后的点,在世界坐标系下 [x", y", z"]
"""
R = euler_angles_to_rotation_matrix(*car_pose[3:]) # 获取旋转矩阵
t = np.array(car_pose[:3]) # 平移向量
p_w = R @ point_in_car + t # 坐标变换公式
return p_w.tolist()
def euler_angles_to_rotation_matrix(roll, pitch, yaw):
"""欧拉角转旋转矩阵"""
Rx = np.array([[1, 0, 0 ],
[0, math.cos(roll), -math.sin(roll)],
[0, math.sin(roll), math.cos(roll)]])
Ry = np.array([[math.cos(pitch), 0, math.sin(pitch)],
[0, 1, 0 ],
[-math.sin(pitch), 0, math.cos(pitch)]])
Rz = np.array([[math.cos(yaw), -math.sin(yaw), 0],
[math.sin(yaw), math.cos(yaw), 0],
[0, 0, 1]])
R = Rz @ Ry @ Rx # 组合得到最终旋转矩阵
return R
```
上述代码展示了如何通过给定的车辆姿态参数(位置和平整度角度)完成从自车坐标系到世界坐标系之间的转换操作。
#### 3. **激光雷达坐标系**
激光雷达安装在其专用支架上之后便确立了一个独立的小型局部坐标体系——即所谓的“lidar frame”。此系统的零点设定了扫描平面所在之处,并规定了光线发射出去的方向作为正Z轴;而XY平面上则按照顺时针顺序依次分配给了横滚(row)与俯仰(pitch)[^1]。
#### 4. **毫米波雷达坐标系**
类似于LiDAR的情况,MMW Radar也有自己的一套专属座標系統。不过由于工作原理差异较大,所以两者之间并不能简单互换使用。具体而言,前者更多关注的是反射强度分布特征等方面的数据采集任务;后者则是侧重距离测量精度方面的表现效果更好一些。
---
### 各种坐标系间的相互转换
不同类型的传感装置所获取来的原始资料往往处于各自独特的几何空间当中,因此有必要建立起一套完整的映射机制以便后续融合分析阶段得以顺利开展下去:
假设存在两个待匹配的目标A(Body Frame Point) 和 B(Sensor Data Point),那么我们可以通过如下方式计算出B对应于A的新坐标值C(World Coordinate System Position):
\[ C = T_{world}^{sensor}(T_{body}^{-1}(A)) \]
其中\(T\)代表相应的仿射变换函数集合,包含了平移矢量t加上绕各个维度转动的角度组合而成的整体刚体运动学表达式。
---