第二章 激光雷达基础:工作原理、类型与点云数据格式

各位同学好,我是你们这门课的主讲。今天咱们来聊聊激光雷达最核心的基础知识。说实话,我入行那会儿,激光雷达还是个稀罕物,价格贵得吓人。现在不一样了,国产方案遍地开花,但不管怎么变,底层原理还是那些东西。

这一章,我会从工作原理讲起,然后聊聊常见的几种激光雷达类型,最后说说点云数据到底长什么样。嗯,都是干货,咱们直接开始。

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 本章知识体系

下面这张图,是我手绘的本章知识结构,帮你理清思路:

激光雷达基础 工作原理 TOF FMCW 常见类型 机械式 固态 MEMS 点云数据格式 PointCloud2 字段解析 核心要点 • TOF测距靠时间差,FMCW靠频率差 • 机械式360°但怕震动,固态可靠但视场角小 • MEMS是折中方案,量产车首选 • 点云包含xyz+强度,ROS用PointCloud2消息 • 一帧32线点云约1.6MB,处理要快

这张图把本章的三个核心模块串起来了。你从「工作原理」出发,理解激光雷达怎么测距;然后看「常见类型」,知道不同方案怎么实现扫描;最后落到「点云数据格式」,明白数据长什么样、怎么用。这三块是后续所有课程的基础。

好了,这一章就到这里。内容不多,但都是基本功。下一章我们会动手搭建ROS环境,开始真正的点云处理实战。到时候,我会带着你们写代码、调参数,把今天讲的理论用起来。

可可精品资料库