自动驾驶03 点云预处理——01

点云预处理是激光雷达感知系统的基础步骤,通过去噪、滤波、分割、聚类等操作,将原始点云数据转换为结构化、高质量的数据,为后续的目标检测、跟踪和场景理解提供支持。高效的预处理能够显著提升感知系统的性能和实时性。

1. 从数据采集开始

激光雷达的原始点云数据都会被存放在一个数据包里(pcap),此时数据包里面的数据都是一连串的字节符号,无法直接使用。

以Velodyne的16线激光雷达为例,原始点云数据的接收主要是通过UDP(用户数据报协议)的形式向网络发送数据。具体来说,在激光雷达的web端进行设置或通过命令行进行设置后,技术人员会在接收端匹配激光雷达的IP地址与自身的UDP端口号,从而即可接收原始点云数据。

VLP-16 以 UDP 形式发送点云数据,每个 UDP 数据包大小为 1248 字节,其结构如下:

偏移量字节大小内容描述
042以太网 + IP + UDP 头部
42120012 个 Fire 区块,每个 100 字节
12426时间戳(4B)+ 工厂信息(2B)

每个 UDP 负载(1200 字节)由 12 个 Fire 区块 组成,每个 Fire 区块 100 字节,其结构如下:

偏移量字节大小内容描述
02块标识符(0xFFEE)
22旋转角度(0~35999,单位 0.01°)
49632 个点数据,每个点 3D 坐标 + 反射强度
1002下一个块标识符

每个 占用 3B(X 轴 + Y 轴 + Z 轴)+ 1B(反射强度),共 4 字节。

在 Velodyne VLP-16 激光雷达的数据包中,每个 Fire Block(数据块)包含一个 旋转角度(Azimuth),用于表示该数据块中所有点的旋转方向。

这个 旋转角度 存储在 Fire Block 的第 2~3 字节,占 2 字节(16 位无符号整数),其取值范围是 0 ~ 35999

为什么是 0~35999?

  • 角度的物理范围是 0° ~ 359.99°,但 VLP-16 以 0.01°(1/100 度) 的单位存储旋转角度,因此:

  • 例如:

    • 存储值 = 0 → 物理角度 = 0.00°

    • 存储值 = 9000 → 物理角度 = 90.00°

    • 存储值 = 18000 → 物理角度 = 180.00°

    • 存储值 = 35999 → 物理角度 = 359.99°

如何解析旋转角度?

假设你读取了一个 Fire Block 的数据,发现其 Azimuth 字段的值是 12345,那么对应的物理角度计算如下:

也就是说,这一数据块对应的激光点是 朝着 123.45° 方向扫描的

2. 点云数据转换

数据包(pcap)中的原始数据需要进一步转换为可被感知技术人员使用的pcd格式的数据集。

点云数据的pcd格式文件是激光点云的一种存储格式,pcd文件主要是由笛卡尔坐标(x,y,z)和强度值i组成的列表,即每个点云都会附带独有的三维坐标系和能量反射强度。

在这个坐标系中,x轴指向汽车的前部,y轴指向汽车的左侧。由于这个坐标系采用右手定则,坐标系z轴指向汽车上方。

以FF EE E0 63 B6 07 2A为例:

FF EE为块标识符
E0 63为旋转角度;

B6 07为某一点:

把角度和距离信息转化为三维坐标XYZ值

三维坐标XYZ值可通过旋转角度α(已在第一步中求得)、垂直角度ω(每束激光线对应的固定值)和距离值R(已在第二步中求得)来综合求出,具体的坐标换算如下图所示。

3.运动畸变补偿

运动畸变是指在一帧时间内,激光雷达或者其载体在发生运动后,产生的点云位置不一样的问题。

要理解运动畸变补偿,我们首先要知道自动驾驶车端的激光雷达点云为什么会产生运动畸变。

其实,激光雷达发射的一帧激光点云会由多个激光点组成,而这些激光点云是由扫描器件经过一次扫描后才形成的。在静止的场景中时,车辆处于静止状态且场景中的目标物也处于相对静止状态,那么采集到的一帧点云是没有畸变的,每条激光线束最终会形成一个闭合的圆形。

图:静止状态下的车辆点云不产生畸变

在运动场景下,如车辆高速行驶或者转弯时,一帧点云中的起始点云和终止点云只能在不同坐标系下获得测量结果,这便导致了三维环境信息产生了畸变。如下图所示,当车辆在运动过程中,车端上的激光雷达在扫描完一圈后,在最后一束激光照射到目标物时,跟第一束激光照射到目标时相比,目标物的空间位置已发生了相对位移——该物体在两个不同时刻的点云,显示在坐标系中的信息是不同的。

图:目标物在不同时刻被激光照射到的情况

运动畸变补偿就是为了解决上述问题——把激光在采集过程中的运动轨迹计算出来,并在对应的激光点云上补偿这部分运动位移带来的变化,将同一帧的点云统一到同一时刻的坐标系下。

为了进一步解释运动畸变补偿,某主机厂感知算法工程师举例说:“比如,若车端配有IMU或者轮式里程计,感知算法人员就可以通过IMU和轮式里程计(或者直接用IMU)的方式,推算出0.1秒内车是怎么运动的,然后利用运动模型来做运动畸变补偿。”

### 自动驾驶中的点云与图像融合技术 在自动驾驶领域,点云与图像的融合是一种重要的多模态感知技术。通过结合激光雷达获取的三维点云数据和摄像头捕捉到的二维图像信息,能够显著提升环境理解能力。 #### 数据预处理 为了实现有效的点云与图像融合,通常需要先完成数据的预处理工作。由于传感器之间的安装位置不同以及各自的成像原理差异,点云和图像之间可能存在空间上的不一致。因此,在实际应用中,需采用几何变换模型对点云数据进行配准操作,从而将其投影至图像平面[^2]。这种配准过程旨在使两种异构数据源的空间分布尽可能匹配,以便后续联合分析。 #### 特征提取 针对交通标志牌这类特定目标物体而言,其表面往往呈现出较强的反射属性却缺少足够的细节纹理特征。单独依靠某一种单一传感方式难以全面描述此类对象的所有物理特性。例如仅依赖于传统RGB影像虽然容易识别颜色图案等外观样式;但如果遇到光照条件变化剧烈或者遮挡情况,则可能降低检测精度甚至失败率增加。此时引入LiDAR设备所采集回来的高度精确距离测量值作为补充依据就显得尤为重要了——它能提供关于这些反光材料独特回波强度响应方面的额外线索[^1]。 #### 融合策略 目前主流存在几种典型架构用于解决上述挑战: - **早期级联式(Early Fusion)** 将原始输入层面上直接拼接起来形成更高维度的新表示形式供下游网络进一步学习挖掘潜在关联规律; - **中期混合型(Mid-Level Fusion)** 对各自独立计算得出中间表达后再加以综合考虑相互作用关系构建更复杂的交互机制; - **晚期决策阶段(Late Decision Level Fusion)** 各自分别做出预测判断之后再由顶层模块统筹权衡最终输出结论结果 。 ```python import numpy as np from scipy.spatial.transform import Rotation as R def lidar_to_camera(lidar_points, extrinsic_matrix): """ Transform LiDAR points into camera coordinates. Args: lidar_points (np.ndarray): N x 3 array of LiDAR points. extrinsic_matrix (np.ndarray): 4x4 transformation matrix from LiDAR to Camera frame. Returns: np.ndarray: Transformed point cloud in the camera coordinate system. """ ones = np.ones((lidar_points.shape[0], 1)) homogeneous_lidar = np.hstack([lidar_points, ones]) transformed_points = np.dot(extrinsic_matrix, homogeneous_lidar.T).T[:, :3] return transformed_points # Example usage with dummy data if __name__ == "__main__": # Dummy LiDAR points and extrinsics lidar_data = np.array([[1, 2, 3], [4, 5, 6]]) ext_mat = R.random().as_matrix()[:3] cam_coords = lidar_to_camera(lidar_data, ext_mat) print(cam_coords) ``` 以上代码片段展示了如何将来自LiDAR扫描得到的世界坐标系下的三维散列转换映射为摄像机视场内部对应像素区域内的近似定位位置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值