第二章 激光雷达基础:工作原理、类型与点云数据格式
各位同学好,我是你们这门课的主讲。今天咱们来聊聊激光雷达最核心的基础知识。说实话,我入行那会儿,激光雷达还是个稀罕物,价格贵得吓人。现在不一样了,国产方案遍地开花,但不管怎么变,底层原理还是那些东西。
这一章,我会从工作原理讲起,然后聊聊常见的几种激光雷达类型,最后说说点云数据到底长什么样。嗯,都是干货,咱们直接开始。
2.1 激光雷达工作原理:TOF与FMCW
激光雷达,英文叫LiDAR,全称是Light Detection And Ranging。说白了,就是「用激光来测距」。怎么测?目前主流就两种方法:TOF(飞行时间法)和FMCW(调频连续波法)。
2.1.1 TOF(飞行时间法)
TOF的原理特别简单,你想想看:我发出一束激光,打到物体上反射回来,我记录下从发射到接收的时间差Δt。光速c是已知的,那距离d = c × Δt / 2。就这么直接。
我个人习惯把TOF比作「回声定位」——你对着山谷喊一声,听回声回来的时间,就知道山有多远。激光雷达只不过把声波换成了激光,精度高了好几个数量级。
核心公式:
d = (c × Δt) / 2
其中c ≈ 3×10⁸ m/s,Δt是激光飞行时间。
我在项目中遇到过一个问题:TOF雷达在强阳光下容易受干扰。因为太阳光里也有近红外成分,会淹没激光回波信号。后来我们加了窄带滤光片,才把信噪比提上来。这个坑,你们以后做系统集成时要注意。
2.1.2 FMCW(调频连续波法)
FMCW就稍微复杂一点了。它不直接测时间,而是发射频率连续变化的激光,然后通过比较发射信号和回波信号的频率差,来反推距离和速度。
为什么要有FMCW?说白了,TOF有个硬伤——它测不了速度。FMCW利用多普勒效应,一次测量就能同时得到距离和速度。这在自动驾驶里很有用,比如判断前方车辆是静止还是运动。
我的经验:FMCW雷达目前成本还比较高,但抗干扰能力比TOF强。如果你做的是L4级以上的自动驾驶方案,我建议重点关注FMCW。如果是L2/L3的辅助驾驶,TOF性价比更高。
2.2 常见激光雷达类型
激光雷达按扫描方式分,主要有三大类:机械式、固态、MEMS。每种都有各自的脾气,我一个个说。
2.2.1 机械式激光雷达
机械式是最早商用的方案。它的核心就是一个旋转的电机,带着激光收发模块转圈扫。你想想看,就像灯塔上的探照灯一样,转一圈扫一个面。
- 优点:视场角大(360°),技术成熟,点云密度高。
- 缺点:有运动部件,寿命短,震动敏感,成本高。
我记得2018年做无人驾驶测试时,用的就是Velodyne的64线机械雷达。那玩意儿转起来嗡嗡响,像个小风扇。有一次在颠簸路面跑了一圈,回来发现电机轴偏了,点云全歪了。嗯,机械式的可靠性确实是个问题。
2.2.2 固态激光雷达
固态激光雷达没有旋转部件,完全靠电子方式控制激光束的指向。常见的有OPA(光学相控阵)和Flash(闪光式)两种。
- OPA:通过控制阵列天线的相位差,实现光束偏转。有点像相控阵雷达的原理。
- Flash:一次性发射大面积激光,用焦平面阵列接收。就像相机闪光灯一样,啪一下照亮整个场景。
固态雷达最大的好处是「固态」——没有机械磨损,寿命长,体积小。但缺点是视场角有限,一般只有120°左右。所以车上通常要装好几颗才能覆盖360°。
避坑指南:我曾经在选型时被固态雷达的「固态」二字迷惑了,以为它绝对可靠。结果发现OPA雷达对温度特别敏感,夏天暴晒后光束指向会漂移。所以,选型时一定要看工作温度范围。
2.2.3 MEMS激光雷达
MEMS(微机电系统)激光雷达是机械式和固态的「混血儿」。它用一片微小的振镜来代替电机,通过振镜的摆动来反射激光,实现扫描。
说白了,MEMS就是把一个「小镜子」装在一个微小的弹簧片上,通电后镜子会来回摆动。激光打到镜子上,反射出去的方向就变了。
| 类型 | 扫描方式 | 视场角 | 可靠性 | 成本 |
|---|---|---|---|---|
| 机械式 | 电机旋转 | 360° | 低 | 高 |
| 固态(OPA/Flash) | 电子控制 | ~120° | 高 | 中 |
| MEMS | 振镜摆动 | ~120° | 中 | 低 |
MEMS雷达目前是量产车的热门选择。成本低、体积小,可靠性介于机械式和固态之间。但振镜的摆动幅度有限,所以视场角做不大,一般需要多颗拼接。
2.3 点云数据格式
激光雷达输出的数据,我们叫「点云」。说白了,就是一大堆三维坐标点的集合。每个点代表激光打到物体表面的一个反射点。
2.3.1 点云的基本结构
一个点云文件里,每个点通常包含以下信息:
- xyz坐标:点在三维空间中的位置。
- intensity(强度):反射信号的强度,反映物体材质和颜色。
- ring(环号):多线雷达中,该点属于第几根激光束。
- timestamp(时间戳):该点被采集的时间。
你想想看,一帧64线的机械式雷达,每秒能产生几十万个点。这些点堆在一起,就构成了周围环境的「三维快照」。
2.3.2 常见的点云格式
在ROS里,点云数据最常用的格式是sensor_msgs/PointCloud2。这是一个ROS消息类型,可以存储任意字段的点云数据。
下面是一个简单的Python示例,展示如何读取和解析PointCloud2消息:
import rosbag
from sensor_msgs.msg import PointCloud2
import sensor_msgs.point_cloud2 as pc2
# 打开bag文件
bag = rosbag.Bag('lidar_data.bag')
# 遍历点云话题
for topic, msg, t in bag.read_messages(topics=['/velodyne_points']):
# 解析点云
for point in pc2.read_points(msg, field_names=("x", "y", "z", "intensity"), skip_nans=True):
x, y, z, intensity = point
# 这里可以处理每个点
print(f"点坐标: ({x:.2f}, {y:.2f}, {z:.2f}), 强度: {intensity:.2f}")
break # 只打印第一个点做演示
break # 只处理第一帧
bag.close()
这段代码从rosbag里读取一帧点云,然后遍历每个点,打印坐标和强度。实际项目中,你可能会对点云做滤波、分割、聚类等操作,但第一步永远是先把数据读进来。
我的习惯:处理点云时,我一般先检查is_dense字段。如果为False,说明点云里有NaN值(无效点),需要先过滤掉,否则后续算法会出问题。这个坑我踩过好几次。
2.3.3 点云数据量有多大?
很多人对点云的数据量没概念。我算给你看:
- 一个32线机械雷达,每秒10帧,每帧约10万个点。
- 每个点包含xyz(3个float32)和intensity(1个float32),共16字节。
- 一帧数据:10万 × 16字节 = 1.6 MB。
- 每秒数据:1.6 MB × 10帧 = 16 MB/s。
16 MB/s什么概念?相当于每秒下载一部高清照片。如果做实时处理,你的算法必须在100毫秒内处理完一帧数据。嗯,这就是为什么点云处理对性能要求那么高。
2.4 本章知识体系
下面这张图,是我手绘的本章知识结构,帮你理清思路:
这张图把本章的三个核心模块串起来了。你从「工作原理」出发,理解激光雷达怎么测距;然后看「常见类型」,知道不同方案怎么实现扫描;最后落到「点云数据格式」,明白数据长什么样、怎么用。这三块是后续所有课程的基础。
好了,这一章就到这里。内容不多,但都是基本功。下一章我们会动手搭建ROS环境,开始真正的点云处理实战。到时候,我会带着你们写代码、调参数,把今天讲的理论用起来。
可可精品资料库