1. 课程导论与点云基础:激光雷达工作原理、点云数据格式与坐标变换
大家好,欢迎来到这门课。我是你们的老朋友,一个在自动驾驶感知领域摸爬滚打了好几年的工程师。今天咱们正式开始第一讲,聊聊激光雷达和点云的那些基础事儿。
说实话,我刚入行那会儿,面对一堆密密麻麻的点云数据,心里也是发怵的。但后来我发现,只要把底层原理搞明白,这东西其实没那么玄乎。咱们这节课,就是帮你把这层窗户纸捅破。
1.1 激光雷达是怎么“看”世界的?
激光雷达,英文叫 LiDAR,说白了就是“激光+雷达”。它不像摄像头那样拍照片,而是主动发射激光束,然后接收反射回来的信号。
为什么会这样?因为激光的速度是恒定的(光速),我们只要记录下发射和接收的时间差,就能算出目标的距离。这就是最核心的原理——飞行时间法(ToF)。
核心公式:距离 = (光速 × 飞行时间) / 2
除以2是因为激光走了个来回。
我在项目中遇到过一个问题:雨天的时候,激光打到雨滴上会产生大量噪点。嗯,这里要注意,ToF 原理虽然简单,但实际工程中要考虑多回波、环境光干扰等问题。
目前主流的激光雷达,按扫描方式分主要有这么几种:
- 机械旋转式: 像个小风扇一样转圈扫描。Velodyne 的经典款就是代表。优点是视场角大,缺点是机械结构容易坏。
- 固态式(MEMS/Flash): 没有旋转部件,靠芯片控制光束偏转。成本低、体积小,是未来的趋势。
- 混合固态(转镜式): 介于两者之间,目前很多量产车在用。
你想想看,一个 64 线的激光雷达,每秒能发出几十万个点。这些点组合在一起,就形成了我们常说的“点云”。
1.2 点云数据格式:PCD 和 PLY
拿到点云数据后,总得有个文件存起来吧。行业里最常见的两种格式就是 PCD 和 PLY。
我个人习惯用 PCD 格式,因为它是 Point Cloud Library(PCL)的亲儿子,处理起来特别方便。咱们来看看一个 PCD 文件长什么样:
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.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
VIEWPOINT 0 0 0 1 0 0 0
POINTS 1000
DATA ascii
0.1 0.2 0.3 50
0.4 0.5 0.6 120
...
看到没?头部是元信息,告诉程序这个文件有多少点、每个点有哪些字段。后面就是具体的数据了。这里有个小细节:intensity 字段代表反射强度,不同材质的物体反射率不同,这个信息在障碍物分类时很有用。
避坑指南: 我曾经因为没注意 PCD 文件头部的 VIEWPOINT 字段,导致点云坐标全部偏移。如果你从不同视角采集的数据要融合,一定要检查这个值。
PLY 格式呢?它更通用一些,支持多边形网格。如果你要做三维重建或者渲染,PLY 会更合适。但单纯做障碍物检测,PCD 就够用了。
两种格式的对比,我整理了个表格:
| 特性 | PCD | PLY |
|---|---|---|
| 主要用途 | 点云处理(PCL) | 三维模型/网格 |
| 支持字段 | 灵活自定义 | 标准字段+自定义 |
| 二进制支持 | 是 | 是 |
| 文件大小 | 较小(二进制) | 较大(含网格信息) |
| 我的推荐 | ⭐ 日常开发首选 | ⭐ 可视化/建模用 |
1.3 坐标系与坐标变换基础
做感知,最头疼的就是坐标系。一辆车上至少有四个坐标系:
- 激光雷达坐标系(LiDAR Frame): 原点在雷达中心,x轴朝前,y轴朝左,z轴朝上。
- 车身坐标系(Vehicle Frame): 原点在后轴中心,x轴朝前,y轴朝左,z轴朝上。
- 相机坐标系(Camera Frame): 原点在相机光心,z轴朝前(看你怎么定义)。
- 世界坐标系(World Frame): 通常是大地坐标系,比如UTM。
说白了,你要把激光雷达检测到的障碍物位置,告诉规划控制模块,就得把点云坐标从雷达坐标系变换到车身坐标系。这个过程就是 坐标变换。
数学上,坐标变换用 旋转矩阵 R 和 平移向量 t 来表示。一个点从坐标系A变换到坐标系B,公式是:
P_B = R * P_A + t
这里 R 是 3x3 的矩阵,t 是 3x1 的向量。如果你学过线性代数,应该不陌生。没学过也没关系,咱们在后面的课程里会手把手教你用代码实现。
重要提醒: 坐标变换的顺序不能乱!先旋转,后平移。而且旋转矩阵必须是正交矩阵(R^T = R^(-1))。我见过有人把顺序搞反,结果障碍物飞到天上去。
在实际工程中,我们通常用 齐次坐标 来简化计算。把旋转和平移合并到一个 4x4 的变换矩阵里:
| R t |
| 0 1 |
这样,一次矩阵乘法就能搞定变换。PCL 里提供了现成的函数,比如 pcl::transformPointCloud(),非常方便。
我记得有一次做多雷达融合,两个雷达的安装位置有偏差。我手动标定后,用齐次变换矩阵把点云对齐,效果立竿见影。嗯,这就是坐标变换的魅力。
小结
这节课咱们聊了三个核心点:
- 激光雷达用 ToF 原理测距,机械式和固态式各有优劣。
- PCD 格式适合点云处理,PLY 适合三维建模。
- 坐标变换是感知的基础,用齐次矩阵可以优雅地解决。
下一节课,咱们会动手写代码,读取一个真实的 PCD 文件,并把它可视化出来。到时候你就知道,点云其实没那么神秘。
好了,今天就到这儿。有什么问题,欢迎在评论区留言。咱们下节课见!
公众号:蓝海资料掘金营,微信deep3321