自动驾驶中的三维坐标系变换:原理、方法与实践
文章目录
-
1. 摘要
-
2. 背景介绍
-
2. 常用的坐标系定义
-
- 2.1 全局坐标系(Global Coordinate System)
- 2.2 车体坐标系(Vehicle Coordinate System)
- 2.3 相机坐标系(Camera Coordinate System)
- 2.4 图像坐标系(Image Coordinate System)
-
3. 变换矩阵的详细定义
-
4. 代码实现
-
5. 总结
1. 摘要
三维坐标系变换是自动驾驶技术中的一个核心概念,它涉及到不同坐标系之间的数据转换,以实现传感器数据的融合和车辆的精确控制。本文将深入探讨坐标系的基础知识、变换矩阵的详细定义、标定过程的概述,以及坐标系变换的具体实现步骤和代码示例。
2. 背景介绍
在自动驾驶系统中,各种传感器(如摄像头、激光雷达、IMU等)都以自己的坐标系收集数据。为了整合这些数据,必须将它们转换到一个统一的参考坐标系中。这一过程涉及到坐标系的定义、变换矩阵的构建、以及标定技术的应用。
2. 常用的坐标系定义
坐标系是用来确定空间中点的位置的参考框架。常用的坐标系定义如下。
2.1 全局坐标系(Global Coordinate System)
- 定义 :全局坐标系是一个与地球相关的固定参考框架,通常用于确定车辆在广阔空间中的绝对位置。
- 特点 :它不随车辆移动而变化,为车辆提供了一个稳定的参照点。
- 应用 :在自动驾驶中,全局坐标系用于路径规划、定位和地图构建。它通常采用东北天(North-East-Down, NED)坐标系,其中:
- X轴 (北向):指向地球表面正北方向。
- Y轴 (东向):指向地球表面正东方向。
- Z轴 (天向):垂直向上,与地面垂直。

2.2 车体坐标系(Vehicle Coordinate System)
- 定义 :车体坐标系以车辆的质心(Center of Gravity, CG)为原点,是车辆自身的参考框架。
- 特点 :它随着车辆的移动而移动,与车辆的动态状态密切相关。
- 应用 :车体坐标系用于车辆控制和传感器数据的初步处理。在这个坐标系中:
- X轴 :通常与车辆的行驶方向对齐,指向车辆前方。
- Y轴 :垂直于车辆的行驶方向,指向车辆的左侧。
- Z轴 :垂直于地面向上,如果车辆倾斜,这个轴会有所调整。
2.3 相机坐标系(Camera Coordinate System)
- 定义 :相机坐标系以摄像头的光心(Optical Center)为原点,是图像采集的参考框架。
- 特点 :它与摄像头的物理位置和方向紧密相关,是图像处理和计算机视觉算法的基础。
- 应用 :在自动驾驶的视觉感知中,相机坐标系用于将图像数据转换为车辆能够理解和使用的三维空间信息。在这个坐标系中:
- X轴 :通常指向摄像头的左侧。
- Y轴 :指向摄像头的下方(对于大多数相机而言)。
- Z轴 :指向摄像头的前方,与镜头的方向一致。
2.4 图像坐标系(Image Coordinate System)
- 定义 :图像坐标系是二维的,用于描述图像平面上点的位置。
- 特点 :它以图像的左上角为原点,与图像的像素网格对齐。
- 应用 :图像坐标系用于图像处理和特征提取。在这个坐标系中:
- u轴 :水平向右。
- v轴 :垂直向下。
- 坐标值通常表示为(u, v),其中(0, 0)是图像左上角的像素位置。
3. 变换矩阵的详细定义
变换矩阵用于将一个坐标系中的点转换到另一个坐标系。它包括:
- 旋转矩阵 (R):描述两个坐标系之间的方向关系。
- 平移向量 (t):描述坐标系原点之间的空间距离。
- 变换矩阵 (T):结合了旋转和平移,T = [R, t]。
标定是确定传感器坐标系相对于车体坐标系位置和方向的过程。它包括计算:
- 相机内参 :焦距、主点等,用于图像坐标到相机坐标的转换。
- 相机外参 :描述相机坐标系相对于车体坐标系的位置和方向。
内外参参数的详细定义和使用方法
- 内参 (Intrinsic Parameters):描述相机的物理特性,如焦距 ( (fx, fy) ) 和主点(cx, cy)。
- 外参 (Extrinsic Parameters):描述相机坐标系相对于车体坐标系的旋转R和平移t。
坐标系变换通常涉及以下步骤:
-
图像坐标到相机坐标 :使用相机内参进行变换。
P_{\text{cam}} = K \cdot P_{\text{img}} -
相机坐标到车体坐标 :首先转换到全局坐标系,然后使用外参转换到车体坐标系。
P_{\text{vehicle}} = T_{\text{cam-global}}^{-1} \cdot T_{\text{global-vehicle}} \cdot K \cdot P_{\text{img}}
4. 代码实现
以下是使用Python和NumPy库实现坐标系变换的示例代码:
import numpy as np
# 相机内参矩阵K(示例值,可替换为实际标定值)
fx, fy, cx, cy = 525.0, 525.0, 320.0, 240.0
K = np.array([[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]])
# 相机坐标系到车体坐标系的旋转矩阵R(相机轴方向相对于车体)
# 假设相机坐标系:
# X相机指向相机左侧,Y相机指向相机下方,Z相机指向相机前方
# 车体坐标系:
# X车体指向车前方,Y车体指向车左侧,Z车体指向车顶部
R_cam_vehicle = np.array([[0, 0, 1], # Z相机 -> X车体
[-1, 0, 0], # X相机 -> Y车体
[0, -1, 0]]) # Y相机 -> Z车体
# 相机在车体坐标系中的位置(平移向量)
t_cam_vehicle = np.array([0.5, -1.0, 2.0]) # 示例值
# 构造齐次变换矩阵T_cam_vehicle
T_cam_vehicle = np.eye(4)
T_cam_vehicle[:3, :3] = R_cam_vehicle
T_cam_vehicle[:3, 3] = t_cam_vehicle
# 图像像素坐标(u, v)(示例值,可替换为实际输入)
u, v = 300, 300
P_img = np.array([u, v, 1]) # 图像像素的齐次坐标
# 深度值(假设深度为1米,可根据实际深度图替换)
depth = 1.0
# 1. 从图像像素坐标转换到相机坐标
P_camera = np.linalg.inv(K).dot(P_img) * depth
# 2. 从相机坐标转换到车体坐标
P_camera_h = np.append(P_camera, 1) # 扩展为齐次坐标
P_vehicle = T_cam_vehicle.dot(P_camera_h)
# 输出车体坐标系中的点
print("车体坐标系中的点:", P_vehicle[:3])
python

5. 总结
三维坐标系变换是自动驾驶系统中实现传感器数据融合和精确控制的关键技术。通过本文的介绍,读者应该对坐标系的基础知识、变换矩阵的定义、标定过程以及坐标系变换的具体实现有了更深入的理解。希望本文能够帮助社区的读者在自己的自动驾驶项目中应用这些知识,并在未来的工作中取得成功。

