[坐标系转换]车体坐标系 转 像素坐标系

博客围绕无人车激光雷达BEV图绘制展开,因原始激光雷达点处于车体局部坐标系,需转换到像素坐标系。介绍了二维坐标系变换,包括翻转和平移两步,给出了相应矩阵公式,合并后得到最终坐标变换公式,还提供了C++代码及旋转平移矩阵公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动机

在项目中,我们常常需要绘制无人车激光雷达的BEV图。而原始激光雷达的点所处的坐标是车体局部坐标系(简称为vehiclepose)。所以就涉及到一个坐标系的转换,如图所示,由vehiclepose坐标系(记为O1)转换到pixel坐标系(记为O4)。

在这里插入图片描述

这里直接给出变换公式:
{R=−x1+dRC=−y1+dC \begin{cases} R=-x1+dR \\ C=-y1+dC \end{cases} {R=x1+dRC=y1+dC
可以看到实际上计算非常简单。感兴趣可以看下面的细节。

2.细节

二维坐标系的变换涉及到翻转和平移。下面就分成翻转和平移 2步完成这个转换:

2.1翻转

首先需要由O1,xy坐标轴都翻转,变成O2:
在这里插入图片描述
用翻转矩阵表达就是:

[x2y2]=[−100−1][x1y1]\begin{bmatrix} x2 \\ y2 \end{bmatrix}=\begin{bmatrix} -1& 0\\ 0 & -1\end{bmatrix}\begin{bmatrix} x1 \\ y1 \end{bmatrix}[x2y2]=[1001][x1y1]

2.2 平移

第二步是平移,要把坐标原点平移到像素图的左上角,这里是像素坐标的原点。
需要平移的距离dR是y方向需要平移的距离,dC是x方向需要平移的距离。
在这里插入图片描述

用平移矩阵表达就是:
[x3y3]=[x2y2]+[dRdC] \begin{bmatrix} x3 \\ y3 \end{bmatrix} =\begin{bmatrix} x2 \\ y2 \end{bmatrix} + \begin{bmatrix} dR \\ dC \end{bmatrix} [x3y3]=[x2y2]+[dRdC]

2.3 总结

将翻转矩阵和平移矩阵合并,就能得到最终的坐标变换公式:
[x3y3]=[−100−1][x1y1]+[dRdC] \begin{bmatrix} x3 \\ y3 \end{bmatrix}=\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}\begin{bmatrix} x1 \\ y1 \end{bmatrix} + \begin{bmatrix} dR \\ dC \end{bmatrix} [x3y3]=[1001][x1y1]+[dRdC]

带入旋转角度,然后化成等式形式为:

{x3=−x1+dRy3=−y1+dC \begin{cases} x3=-x1+dR \\ y3=-y1+dC \end{cases} {x3=x1+dRy3=y1+dC

一般像素坐标不用(x,y)表示,我们换成行和列(R,C)的形式
在这里插入图片描述

由于像素坐标中,行R对应的是x轴,列C对应的是y轴:

{R=−x1+dRC=−y1+dC \begin{cases} R=-x1+dR \\ C=-y1+dC \end{cases} {R=x1+dRC=y1+dC

2.4 C++代码:

这里编写了一个函数,输入车体坐标(x,y),可以返回一个Qvector变量,存储转换后的像素坐标q。

QVector<int> local2img(float x,float y)
{
    QVector<int> q;
    int img_r = pixel_dR - floor(x/grid_size);
    int img_c = pixel_dC - floor(y/grid_size);
    q.append(img_r);
    q.append(img_c);
    return q;
}
  • 代码变量注释:
    pixel_dR :平移量dR
    pixel_dC :平移量dC
    grid_size:雷达栅格尺寸

3.拓展

3.1 旋转平移矩阵公式

[x2y2]=[cosθ−sinθsinθcosθ][x1y1]+[dxdy] \begin{bmatrix} x2 \\ y2 \end{bmatrix}=\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\begin{bmatrix} x1 \\ y1 \end{bmatrix} + \begin{bmatrix} dx \\ dy \end{bmatrix} [x2y2]=[cosθsinθsinθcosθ][x1y1]+[dxdy]
θ\thetaθ逆时针为正。

### 将 BEV 坐标转换为线性坐标系的方法 为了实现从鸟瞰图(Bird's Eye View, BEV)坐标到线性坐标系转换,可以采用逆向几何投影的方式。这种转换通常涉及以下几个核心概念: #### 1. **定义坐标系** 在自动驾驶或多传感器融合场景中,常见的坐标系包括车体坐标系像素坐标系和 BEV 坐标系。假设已知 BEV 坐标的点 \( P_{BEV} = (X_{BEV}, Y_{BEV}) \),目标是将其映射回线性空间中的对应位置。 - 车体坐标系:原点位于车辆中心,\( X \)-轴指向前方,\( Y \)-轴指向左侧。 - 像素坐标系:二维图像平面,\( u \)-轴水平方向,\( v \)-axis垂直方向。 - BEV 坐标系:俯视视角下的网格化表示,单位通常是米或厘米。 #### 2. **反向变换公式** 基于引用的内容[^2],可以通过以下方式完成 BEV 到线性坐标转换。设 BEV 的某个点 \( P_{BEV} = (X_{BEV}, Y_{BEV}) \) 需要被映射至对应的线性坐标系下某一点 \( P_L = (u, v) \): \[ P_L = K^{-1} \cdot [T_R | T_C]^T \cdot P_{BEV} \] 其中: - \( K \): 内参矩阵,用于描述相机成像模型; - \( T_R, T_C \): 平移参数,分别代表行偏移和列偏移; - \( K^{-1} \): 内参矩阵的逆矩阵,负责将齐次坐标还原为实际物理距离。 具体计算过程如下所示: ```python import numpy as np def bev_to_linear(bev_point, intrinsic_matrix_inv, translation_vector): """ Convert a point from Bird's Eye View coordinates to linear image space. Args: bev_point (tuple): The BEV coordinate of the form (X_BEV, Y_BEV). intrinsic_matrix_inv (np.ndarray): Inverse of camera intrinsics matrix. translation_vector (list or tuple): Translation vector [dR, dC]. Returns: list: Linearized pixel coordinates [u, v]. """ # Define transformation matrices and vectors flip_matrix = np.array([[-1, 0], [0, -1]]) # Apply inverse transformations step-by-step intermediate_result = np.dot(flip_matrix, np.array(bev_point).reshape(-1, 1)) + \ np.array(translation_vector).reshape(-1, 1) # Map back into original frame using intrinsic parameters result_homogeneous = np.dot(intrinsic_matrix_inv, intermediate_result) uv_coordinates = result_homogeneous[:2].flatten().tolist() return uv_coordinates ``` 上述代码实现了由 BEV 点到线性坐标的空间映射逻辑。 #### 3. **优化与加速方法** 如果需要进一步提升效率,则可考虑引入 Transformer 结构来简化复杂的矩阵运算流程[^3]。例如,在某些高性能框架中支持自定义插件开发,从而减少冗余计算开销并提高运行速度。 另外,对于大规模数据处理任务而言,利用预计算好的特征传输矩阵 \( MFT \)[^4] 进行批量操作也是一种有效手段。这种方式不仅能够显著降低内存占用率,还能充分利用现代硬件资源的优势。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值