自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。
车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam.

方法1:先旋转再平移

p_cam = T_car2Cam * p_car + T_car2Cam
需要注意的是,这里的平移矩阵T_car2Cam是车身坐标系原点在相机坐标系下面的坐标!
用具体数值表示如下:

import numpy as np

rot = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],
       [ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],
       [ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])

tran = np.array([0.106073,  1.411398, -1.971551])

p_veh = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = rot.dot(p_veh) + tran.reshape(3,1)
print(p_cam_1)

#[[-6.16055871]
 #[-6.28240156]
 #[ 1.27418073]]

方法2:先平移再旋转

在方法1中, 是把p经过旋转,转到相机坐标系, 再加上平移向量,这个平移向量就是相机坐标系的,所以可以直接相加减。
同样的,我们这里的方法2是需要先平移,就要求平移的向量是车身坐标系下的才能相加减。就是我们如果现在需要先平移,那么就要求这个平移向量是在车身坐标系下的才能直接相加减。
即需要知道相机坐标原点相对于车身坐标系。

如图就是把左边的相机坐标系原点(0,0,0)先平移到车身坐标系的原点(0,0,0)处,注意平移后的还是在相机坐标系下,现在tran = np.array([0.106073, 1.411398, -1.971551])是相机坐标系下,car坐标系原点的位置。
就是在相机坐标系下一个点Q(0.106073, 1.411398, -1.971551),我现在就要把我相机坐标系原点挪到这个Q点。就是Q点在新相机坐标系下是(0, 0, 0). 所以之前的点n转到以Q点为原点的新相机坐标系需要经过n-(0.106073, 1.411398, -1.971551),

比如之前的原点(0,0,0)转到新平移后的Q为原点相机坐标系下是:(0,0,0)-(0.106073, 1.411398, -1.971551)

相机坐标系原点平移到车身坐标系原点,这个时候还差一步旋转。旋转,注意这个时候的旋转矩阵是需要相机坐标系到车身坐标系的,因为我们现在点都在相机坐标系下,只是平移了,需要相机到车身的旋转矩阵,直接R_car2Cam取个逆就是。

Cam_0_to_car = inv(R_car2Cam) * (Cam_0 - T_car2Cam)

import numpy as np

R_car2Cam = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],
       [ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],
       [ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])

T_car2Cam = np.array([0.106073,  1.411398, -1.971551])

p_car = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = R_car2Cam.dot(p_car) + T_car2Cam.reshape(3,1)
print(p_cam_1)

                                      #旋转矩阵的逆等于其转置
Cam_0_to_car = (np.dot(R_car2Cam.T, (np.array([[0, 0, 0]]).T - T_car2Cam[..., np.newaxis])).T).reshape(3,1)
p_cam_2 = R_car2Cam.dot(p_car - Cam_0_to_car)
print(p_cam_2)
输出:
[[-6.16055871]
 [-6.28240156]
 [ 1.27418073]]
[[-6.16055872]
 [-6.28240152]
 [ 1.27418082]]

RT矩阵的逆

import numpy as np

R_car2Cam = np.array([[ 4.6776832e-04, -9.9942386e-01, -3.3936482e-02],
       [ 3.1350527e-02,  3.3934463e-02, -9.9893224e-01],
       [ 9.9950832e-01, -5.9665786e-04,  3.1348340e-02]])

T_car2Cam = np.array([0.106073,  1.411398, -1.971551])

p_car = np.array([3, 6, 8]).reshape(3, 1)
p_cam_1 = R_car2Cam.dot(p_car) + T_car2Cam.reshape(3,1)
print(p_cam_1)



Cam_0_to_car = (np.dot(R_car2Cam.T, (np.array([[0, 0, 0]]).T - T_car2Cam[..., np.newaxis])).T).reshape(3,1)
p_cam_2 = R_car2Cam.dot(p_car - Cam_0_to_car)
print(p_cam_2)



rt = np.eye(4)
rt[:3, :3] = R_car2Cam
rt[:3, -1] = T_car2Cam
rt_1 = np.linalg.inv(rt)

print("===>rt")
print(rt)
print("===>inv rt")
print(rt_1)

print("==>>Cam_0_to_car")
print(Cam_0_to_car)
[[-6.16055871]
 [-6.28240156]
 [ 1.27418073]]
[[-6.16055872]
 [-6.28240152]
 [ 1.27418082]]
===>rt
[[ 4.6776832e-04 -9.9942386e-01 -3.3936482e-02  1.0607300e-01]
 [ 3.1350527e-02  3.3934463e-02 -9.9893224e-01  1.4113980e+00]
 [ 9.9950832e-01 -5.9665786e-04  3.1348340e-02 -1.9715510e+00]
 [ 0.0000000e+00  0.0000000e+00  0.0000000e+00  1.0000000e+00]]
===>inv rt
[[ 4.67768326e-04  3.13505285e-02  9.99508364e-01  1.92628402e+00]
 [-9.99423904e-01  3.39344610e-02 -5.96657759e-04  5.69405203e-02]
 [-3.39364847e-02 -9.98932217e-01  3.13483392e-02  1.47529553e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]
==>>Cam_0_to_car
[[1.92628394]
 [0.05694051]
 [1.47529556]]

这里求相机坐标原点在车身坐标系下的坐标, 其实用RT矩阵再求逆就可以得到。

### 自动驾驶中坐标转换的技术实现和算法 #### 1. 坐标系概述 在自动驾驶领域,不同设备采集的数据通常位于不同的坐标系中。为了统一数据处理流程并支持导航、感知和控制等功能,需要进行坐标转换。常见的坐标系包括相机传感器坐标系[^2]、激光雷达坐标系[^2]、坐标系[^2]以及世界坐标系[^2]。 --- #### 2. 坐标转换方法 ##### (1) **二维(2D)坐标转换** 对于平面场景下的坐标转换,主要包括平移、缩放和旋转操作: - **平移** 如果 \( P(x, y) \) 经过向量 \( T(t_x, t_y) \) 的平移,则新位置为: ```python new_x = x + t_x new_y = y + t_y ``` 这种简单的线性运算适用于大多数情况[^1]。 - **缩放** 对于比例因子 \( S(s_x, s_y) \),缩放后的可以表示为: ```python scaled_x = x * s_x scaled_y = y * s_y ``` - **旋转** 当围绕原逆时针旋转角度 \( \theta \) 时,新的坐标可以通过矩阵乘法计算得到: ```python import math cos_theta = math.cos(theta) sin_theta = math.sin(theta) rotated_x = x * cos_theta - y * sin_theta rotated_y = x * sin_theta + y * cos_theta ``` 上述公式基于标准的旋转变换理论[^1]。 综合以上三种基本变换,可完成任意复杂的2D坐标转换。 --- ##### (2) **三维(3D)坐标转换** 3D空间中的坐标转换更加复杂,涉及更多的自由度。主要分为两部分:平移和旋转。 - **3D平移** 类似于2D平移,只需增加一个维度即可: ```python new_x = x + t_x new_y = y + t_y new_z = z + t_z ``` - **3D旋转** 使用四元数或欧拉角来描述旋转更为常见。以下是通过四元数实现的一个例子: ```python class Quaternion: def __init__(self, w=1.0, x=0.0, y=0.0, z=0.0): self.w = w self.x = x self.y = y self.z = z def rotate(self, point): q_point = Quaternion(w=0, x=point[0], y=point[1], z=point[2]) conjugate_q = Quaternion(w=self.w, x=-self.x, y=-self.y, z=-self.z) result = (self * q_point) * conjugate_q return [result.x, result.y, result.z] def __mul__(self, other): w = self.w*other.w - self.x*other.x - self.y*other.y - self.z*other.z x = self.w*other.x + self.x*other.w + self.y*other.z - self.z*other.y y = self.w*other.y - self.x*other.z + self.y*other.w + self.z*other.x z = self.w*other.z + self.x*other.y - self.y*other.x + self.z*other.w return Quaternion(w=w, x=x, y=y, z=z) ``` 此代码片段展示了如何利用四元数执行高效的3D旋转操作[^1]。 --- ##### (3) **Frenet坐标系到笛卡尔坐标系转换** 在路径规划阶段,常需将辆状态从Frenet坐标系映射回全局笛卡尔坐标系。假设道路曲线由多项式定义,具体过程如下: 给定当前弧长 \( s_0 \) 和横向偏移 \( d_0 \),可通过数值积分求解对应的位置矢量 \( X(s), Y(s) \)[^3]: ```python import numpy as np def frenet_to_cartesian(s_values, d_values, path_points): xs, ys = [], [] for i in range(len(s_values)): s_i = s_values[i] d_i = d_values[i] # Interpolate the closest segment of the curve. idx = find_closest_segment(path_points, s_i) dx_ds = derivative_of_path_with_respect_to_s(idx) dy_ds = derivative_of_path_with_respect_to_tangent(idx) tangent_vector = normalize([dx_ds, dy_ds]) # Unit vector along the road. normal_vector = [-tangent_vector[1], tangent_vector[0]] # Perpendicular to it. position_on_curve = interpolate_position_along_curve(path_points, s_i) offset_from_curve = scale(normal_vector, d_i) final_position = add_vectors(position_on_curve, offset_from_curve) xs.append(final_position[0]) ys.append(final_position[1]) return xs, ys ``` 该函数实现了从局部Frenet参数至全球坐标的精确映射[^3]。 --- #### 3. 技术挑战与优化方向 尽管已有成熟的数学工具用于解决坐标转换问题,但在实际应用中仍面临诸多困难,例如噪声干扰、实时性能需求等。未来研究重可能集中在以下几个方面: - 提升多源异构数据融合效率; - 开发鲁棒性强且适应动态环境变化的新模型; - 探索轻量化解决方案以便嵌入资源受限平台。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值