第一章:点云数据基础与传感器原理
大家好,我是你们这门课的主讲。在激光雷达这个行当摸爬滚打了快十年,踩过的坑比见过的点云还多。今天咱们开篇不讲虚的,直接聊点实在的——你手里那堆点云数据,到底是怎么来的?
1.1 激光雷达工作原理
说白了,激光雷达就是个“光学尺子”。它发射一束激光,打到物体上弹回来,通过计算时间差或者三角关系,算出距离。目前主流的有两种玩法:TOF和三角测距。
TOF(飞行时间法)
这个原理最直观。我打个比方:你对着山谷喊一声,听回声的时间就能估算距离。TOF激光雷达就是这么干的——发射激光脉冲,记录反射回来的时间,乘以光速再除以2,距离就出来了。
我在项目里用过Velodyne的64线雷达,就是典型的TOF方案。它的优势是探测距离远,能到200米以上,户外强光下也能工作。缺点嘛,成本高,而且对时间测量精度要求极高——光速是3×10⁸ m/s,你要测1厘米的精度,时间分辨率得做到67皮秒。嗯,这活儿不简单。
三角测距法
这个原理更“接地气”。激光发射器、物体、接收器(一般是CMOS相机)构成一个三角形。激光打到物体上,在接收器上成像的位置会偏移,通过几何关系就能算出距离。
我早期做室内机器人时用过这种方案。优点是近距离精度高,成本低,适合几十厘米到几米的范围。但一到户外,阳光一强,接收器就“瞎”了。你想想看,太阳光比激光强太多了,信噪比直接崩掉。
| 对比项 | TOF | 三角测距 |
|---|---|---|
| 测距范围 | 远(可达200m+) | 近(通常<10m) |
| 精度 | 厘米级 | 毫米级(近距离) |
| 抗环境光 | 强 | 弱 |
| 成本 | 高 | 低 |
1.2 点云数据格式
拿到激光雷达数据后,怎么存?市面上常见的格式有三种:PCD、PLY、BIN。我一个个说。
PCD格式
这是Point Cloud Library(PCL)的亲儿子。文本格式可读性好,二进制格式体积小。我个人习惯用二进制PCD,因为读写快,而且PCL直接支持。
# .pcd文件头示例
VERSION .7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 1000
HEIGHT 1
POINTS 1000
DATA ascii
1.0 2.0 3.0 128
...
PLY格式
这个格式最早是斯坦福大学搞出来的,常用于三维模型。它支持顶点和面片,还能存颜色信息。如果你做点云可视化或者三维重建,PLY是个好选择。
BIN格式
说白了就是纯二进制,没有头文件,直接存float数组。KITTI数据集用的就是这种。好处是体积最小,读写最快。坏处是——你得自己知道数据排布。我曾经因为字节对齐问题,解析错了整整一周的数据,后来才发现是结构体没对齐。
1.3 点云坐标系与坐标变换
点云数据本身没有“方向感”,它只是一堆(x,y,z)坐标。但坐标系怎么定义,直接决定了后续处理的难度。
常见坐标系
- 激光雷达坐标系:通常以雷达中心为原点,x轴朝前,y轴朝左,z轴朝上(右手系)。但不同厂家可能有差异,比如有些把z轴朝下。
- 车体坐标系:以车辆后轴中心为原点,x轴朝前,y轴朝左,z轴朝上。
- 世界坐标系:通常是UTM坐标系或者经纬度,用于多帧拼接。
坐标变换
说白了就是矩阵乘法。一个点从激光雷达坐标系转到车体坐标系,需要旋转矩阵R和平移向量t。公式很简单:
P_car = R * P_lidar + t
但实际项目中,标定参数往往不准。我记得有一次,因为雷达安装支架变形,标定参数偏了0.5度,导致点云投影到图像上差了20个像素。嗯,调了三天才发现是机械问题。
1.4 常见开源数据集介绍
做深度学习,没有数据就是纸上谈兵。下面这三个数据集,我建议你至少玩熟一个。
KITTI
这是自动驾驶领域的“MNIST”。2012年发布,至今仍是基准。包含点云、图像、GPS/IMU数据。点云是64线Velodyne HDL-64E采集的,BIN格式。我入门时就是拿KITTI练手的,它的标注质量很高,但场景相对单一——主要在德国卡尔斯鲁厄市区。
nuScenes
这个数据集我特别喜欢。它用了32线激光雷达,但关键是有1000个场景,每个场景20秒,覆盖了波士顿和新加坡。它的标注包含23个类别,还有雷达和摄像头数据。我个人觉得,nuScenes的多样性比KITTI好很多。
Waymo Open Dataset
Waymo的数据集是“土豪”级别的。用了5个激光雷达(1个中距+4个近距),点云密度极高。它有1150个场景,每个场景20秒,标注了车辆、行人、自行车等。但有个问题——数据量太大,普通显卡根本跑不动。我建议先下个子集试试。
| 数据集 | 激光雷达 | 场景数 | 标注类别 | 格式 |
|---|---|---|---|---|
| KITTI | 64线 | ~15k帧 | 8类 | BIN |
| nuScenes | 32线 | 1000场景 | 23类 | BIN+JSON |
| Waymo | 5个雷达 | 1150场景 | 4类 | TFRecord |
好了,第一章的内容就到这里。点云的世界很大,咱们慢慢聊。记住,理解数据是怎么来的,比直接调模型重要得多。下一章,我会带大家亲手搭建一个点云处理环境,把KITTI数据读进来看看。