第四章:激光雷达原理——机械式与固态激光雷达、TOF与FMCW原理、点云数据结构、激光雷达与相机联合标定

各位同学,欢迎来到第四章。

这一章,我们聊聊激光雷达。说实话,激光雷达是自动驾驶感知系统里最“贵”的传感器,也是最“傲娇”的。它不像摄像头那样便宜,也不像毫米波雷达那样皮实。但它的优势,别的传感器真比不了——直接给你三维空间的距离信息,精度能到厘米级。

我刚开始做感知那会儿,公司买的第一台64线机械式激光雷达,价格够买一辆小轿车。每次调试都小心翼翼,生怕磕碰。现在固态雷达便宜多了,但原理上的门道,反而更多了。

4.1 机械式激光雷达 vs 固态激光雷达

先说说机械式。这玩意儿,说白了就是让激光发射器转起来。一个或者几个激光收发模块,装在旋转电机上,一边转一边发射激光,扫一圈就是一帧点云。

机械式雷达的好处是:视野广,360度全覆盖。我早期做无人车路测时,车顶装的就是Velodyne的64线机械雷达。那数据量,一秒钟几十万点,处理起来电脑风扇呼呼转。

但缺点也很明显:

  • 机械结构复杂——电机、滑环、旋转轴承,任何一个坏了,整个雷达就废了。
  • 寿命有限——旋转部件磨损,一般几千小时就得维护。
  • 成本高——精密机械加工,良率低。

固态激光雷达就不一样了。它没有旋转部件,靠电子扫描或者光学相控阵来实现光束偏转。常见的有两种:

  • MEMS微振镜式——一个小镜子高速振动,反射激光束实现扫描。我去年测试过一款MEMS雷达,体积只有火柴盒大小,但视场角只有120度左右。
  • OPA光学相控阵——通过控制阵列中每个发光单元的相位,让光束干涉偏转。这个技术更前沿,目前量产还不多。

固态雷达的优势很明显:体积小、寿命长、成本低。但视场角受限,一般需要多个组合才能覆盖360度。

我的经验:机械式雷达适合做研发测试,数据质量高,调试方便。量产车上,固态雷达是趋势。但别迷信“固态一定比机械好”——有些固态雷达在雨雾天气的表现,还不如老款机械式。

4.2 TOF与FMCW——两种测距原理

激光雷达怎么测距?主流就两种方法:TOF和FMCW。

TOF(飞行时间法),原理很简单:发射一个激光脉冲,等它反射回来,算时间差。光速是固定的,时间差除以2,再乘以光速,就是距离。

公式长这样:

距离 = (光速 × 飞行时间) / 2

TOF雷达的优点是:原理简单,技术成熟,响应快。市面上90%的激光雷达都是TOF的。

但TOF有个硬伤——抗干扰能力差。多个TOF雷达同时工作,容易互相串扰。我在一次多车协同测试中就遇到过,两辆车上的TOF雷达对射,点云里全是噪点。

FMCW(调频连续波),这个就高级一些了。它发射的是频率连续变化的激光,通过比较发射信号和反射信号的频率差,来推算距离和速度。

原理有点像毫米波雷达。FMCW的优势:

  • 抗干扰强——不同雷达可以用不同调频斜率,互不干扰。
  • 直接测速——多普勒效应,一次测量就能得到速度。
  • 灵敏度高——可以探测更远的距离,甚至透过一些遮挡物。

但FMCW也有缺点:系统复杂,成本高,对激光器的线宽要求极高。目前量产的FMCW激光雷达还不多,但我觉得这是未来方向。

避坑指南:我曾经在项目里选型时,被FMCW的“测速功能”吸引,结果发现它的点云密度远不如同价位的TOF雷达。做目标检测时,稀疏的点云让算法效果大打折扣。所以,选型不能只看原理,还得看具体应用场景。

4.3 点云数据结构——你看到的不是图像

激光雷达输出的数据,叫点云。它不是图像,而是一堆三维坐标点。

每个点通常包含:

  • x, y, z——三维坐标,单位米
  • intensity——反射强度,跟目标材质有关
  • ring——线束编号,机械式雷达常用
  • timestamp——时间戳,用于同步

点云数据量有多大?举个例子:一台32线机械式雷达,10Hz刷新率,每秒大约产生64万个点。每个点按16字节算,每秒数据量约10MB。一帧点云大约1MB。

点云在内存里怎么存?常见格式有两种:

  • PCD格式——Point Cloud Library的标准格式,可读性好,但文件大。
  • BIN格式——二进制文件,直接存储浮点数,解析快,体积小。KITTI数据集用的就是这种。

我一般用BIN格式做实时处理,PCD格式做离线分析。读取BIN文件的代码很简单:

import numpy as np

def load_bin_pointcloud(file_path):
    points = np.fromfile(file_path, dtype=np.float32)
    points = points.reshape(-1, 4)  # x, y, z, intensity
    return points

注意:不同雷达的BIN文件格式可能不一样。有的存的是(x,y,z,intensity),有的存的是(x,y,z,ring,timestamp)。一定要看雷达厂商的文档。

警告:点云数据是稀疏的,不像图像那样密集。一个100米外的行人,可能只有几个点。算法设计时,千万别用图像处理的思路去处理点云。我见过不少新手,上来就对点云做卷积,效果一塌糊涂。

4.4 激光雷达与相机联合标定——让两个世界对齐

激光雷达和相机,一个给三维点,一个给二维像素。怎么让它们对应起来?这就是联合标定要解决的问题。

说白了,就是求一个变换矩阵,把激光雷达坐标系下的点,投影到图像坐标系上。

标定需要两个步骤:

  1. 内参标定——相机本身的参数,焦距、畸变系数等。这个用棋盘格就能搞定。
  2. 外参标定——激光雷达和相机之间的旋转和平移关系。这个需要找对应点。

外参标定常用的方法:

  • 手动选点法——在点云和图像中,手动选择3对以上对应点,解算变换矩阵。简单,但精度看操作。
  • 自动标定法——用标定板或者特定场景,自动检测角点,优化求解。精度高,但需要专用工具。

我习惯用自动标定法。具体做法是:

  1. 放置一个棋盘格标定板,确保激光雷达能扫到,相机能拍到。
  2. 从点云中提取标定板的平面,计算角点的三维坐标。
  3. 从图像中提取标定板的角点,得到二维坐标。
  4. 用PnP算法求解外参矩阵。

代码示例(伪代码):

# 假设已经提取了3D点和2D点
# 3D_points: Nx3, 2D_points: Nx2
# 相机内参矩阵 K: 3x3

# 使用OpenCV的solvePnP
success, rvec, tvec = cv2.solvePnP(3D_points, 2D_points, K, dist_coeffs)

# 旋转向量转旋转矩阵
R, _ = cv2.Rodrigues(rvec)

# 外参矩阵 = [R | tvec]

标定完成后,验证方法很简单:把点云投影到图像上,看看轮廓是否对齐。如果行人点云投影到图像上,正好落在行人像素区域内,说明标定成功。

我的经验:标定不是一次性的。温度变化、振动、时间久了,外参都会漂移。我建议每次路测前,都做一次快速验证。如果发现投影偏差超过5个像素,就该重新标定了。

嗯,这一章的内容就到这里。激光雷达的原理,说白了就是“发射-接收-算距离”。但真正用好它,还得理解点云的特性,以及如何跟其他传感器配合。下一章,我们聊聊毫米波雷达,那个家伙虽然分辨率低,但测速和抗干扰能力,激光雷达还真比不了。