点云预处理是激光雷达感知系统的基础步骤,通过去噪、滤波、分割、聚类等操作,将原始点云数据转换为结构化、高质量的数据,为后续的目标检测、跟踪和场景理解提供支持。高效的预处理能够显著提升感知系统的性能和实时性。
1. 从数据采集开始
激光雷达的原始点云数据都会被存放在一个数据包里(pcap),此时数据包里面的数据都是一连串的字节符号,无法直接使用。
以Velodyne的16线激光雷达为例,原始点云数据的接收主要是通过UDP(用户数据报协议)的形式向网络发送数据。具体来说,在激光雷达的web端进行设置或通过命令行进行设置后,技术人员会在接收端匹配激光雷达的IP地址与自身的UDP端口号,从而即可接收原始点云数据。
VLP-16 以 UDP 形式发送点云数据,每个 UDP 数据包大小为 1248 字节,其结构如下:
偏移量 | 字节大小 | 内容描述 |
---|---|---|
0 | 42 | 以太网 + IP + UDP 头部 |
42 | 1200 | 12 个 Fire 区块,每个 100 字节 |
1242 | 6 | 时间戳(4B)+ 工厂信息(2B) |
每个 UDP 负载(1200 字节)由 12 个 Fire 区块 组成,每个 Fire 区块 100 字节,其结构如下:
偏移量 | 字节大小 | 内容描述 |
---|---|---|
0 | 2 | 块标识符(0xFFEE) |
2 | 2 | 旋转角度(0~35999,单位 0.01°) |
4 | 96 | 32 个点数据,每个点 3D 坐标 + 反射强度 |
100 | 2 | 下一个块标识符 |
每个 点 占用 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秒内车是怎么运动的,然后利用运动模型来做运动畸变补偿。”