4、传感器选型与布置:不同L4方案传感器套件对比、布置原则
聊到L4自动驾驶,传感器选型这块,我见过太多团队踩坑了。说白了,传感器就是车的眼睛和耳朵。眼睛选不对,耳朵放不好,后面算法再牛也白搭。今天咱们就掰开揉碎,聊聊传感器套件怎么搭、怎么放、怎么标定。
4.1 主流L4传感器套件对比
先看市面上几套主流方案。我习惯把它们分成三类:视觉主导型、激光雷达主导型、以及融合均衡型。
| 方案类型 | 典型传感器配置 | 代表企业 | 优势 | 劣势 |
|---|---|---|---|---|
| 视觉主导型 | 12+摄像头、5+毫米波雷达、超声波 | 特斯拉 | 成本低、数据丰富、算法迭代快 | 对光照敏感、深度估计依赖模型 |
| 激光雷达主导型 | 3-5颗激光雷达、6-8摄像头、雷达 | Waymo、百度 | 3D感知精准、不依赖光照 | 成本高、点云稀疏时语义弱 |
| 融合均衡型 | 1-2颗激光雷达、8-10摄像头、5雷达 | 小马智行、Cruise | 冗余度高、场景适应性强 | 系统复杂、标定难度大 |
我个人更倾向于融合均衡型。为什么?因为L4要求的是安全冗余,不是单项冠军。我在项目中遇到过纯视觉方案在隧道出入口瞬间失效的情况——光线突变,摄像头直接懵了。这时候激光雷达的数据就是救命稻草。
核心观点:L4传感器选型不是做单选题,而是做组合题。关键看你的ODD(运行设计域)是什么。城市道路和高速场景,传感器配置可以差一倍的成本。
4.2 布置原则:视场角覆盖与冗余设计
传感器买回来了,往车上一堆就完事?当然不是。布置位置直接影响感知效果。我总结了三句话:全覆盖、无死角、有备份。
4.2.1 视场角覆盖原则
你想想看,一辆车在路上跑,周围360度都可能出现危险。所以传感器必须做到全向覆盖。具体来说:
- 前向:主激光雷达+长焦摄像头+广角摄像头。覆盖0-200米范围,水平FOV至少120度。
- 侧向:左右各2-3个摄像头,覆盖盲区。特别是A柱附近的30度盲区,很多事故都出在这里。
- 后向:1个广角摄像头+2个角雷达。变道、倒车全靠它。
- 顶部:如果有条件,加一个360度环视激光雷达。我建议放在车顶正中,视野最好。
我的经验:前向摄像头安装高度建议在1.2-1.5米之间。太低容易被前车遮挡,太高又会影响近处地面检测。我曾经在一个项目里把摄像头装在挡风玻璃顶部,结果发现近处10米内的行人完全在盲区里——后来改到了后视镜位置才解决。
4.2.2 冗余设计原则
L4要求的是单点故障不影响安全。所以每个关键感知区域,至少要有两种不同原理的传感器覆盖。
举个例子:前向感知区域,我通常会这样配:
# 前向传感器冗余配置示例
sensor_config = {
'forward': {
'lidar': {
'model': 'Hesai AT128',
'fov': 120, # 水平视场角
'range': 200, # 探测距离(米)
'redundancy': 'primary'
},
'camera_long': {
'model': '8MP 长焦',
'fov': 30,
'range': 250,
'redundancy': 'primary'
},
'camera_wide': {
'model': '8MP 广角',
'fov': 120,
'range': 80,
'redundancy': 'backup'
},
'radar': {
'model': '4D成像雷达',
'fov': 90,
'range': 250,
'redundancy': 'independent'
}
}
}
你看,前向有激光雷达、长焦摄像头、广角摄像头、毫米波雷达四种传感器。就算激光雷达坏了,摄像头+雷达依然能保证基本感知能力。这就是冗余设计的精髓。
注意:冗余不是简单堆叠。不同传感器的失效模式要正交。比如摄像头怕强光,激光雷达怕雨雾,毫米波雷达不怕这些。所以冗余设计要选失效模式互补的传感器组合。
4.3 标定基础:内参与外参
传感器装好了,但数据是乱的。摄像头看到的是像素坐标,激光雷达看到的是三维点云。怎么对齐?这就靠标定。
4.3.1 内参标定
内参是传感器自身的参数。对于摄像头,内参包括焦距、主点、畸变系数。说白了,就是搞清楚镜头是怎么把真实世界投影到图像上的。
我常用的标定方法是棋盘格法:
# 摄像头内参标定示例(使用OpenCV)
import cv2
import numpy as np
# 准备棋盘格角点
checkerboard_size = (9, 6) # 内角点数量
objp = np.zeros((checkerboard_size[0] * checkerboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:checkerboard_size[0], 0:checkerboard_size[1]].T.reshape(-1, 2)
# 收集多张图片的角点
objpoints = [] # 世界坐标系中的点
imgpoints = [] # 图像坐标系中的点
for img_path in image_paths:
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, checkerboard_size, None)
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None
)
print("内参矩阵:\n", mtx)
print("畸变系数:\n", dist)
嗯,这里要注意:标定图片至少拍20张,覆盖不同角度和距离。我见过有人只拍5张就完事,结果标定出来的内参偏差很大,外参怎么调都对不准。
4.3.2 外参标定
外参解决的是传感器之间的相对位置关系。比如激光雷达坐标系到摄像头坐标系的旋转和平移。
外参标定有两种主流方法:
- 目标法:用标定板、标定杆等已知物体,通过检测同一物体在不同传感器中的位置,解算变换矩阵。
- 无目标法:利用场景中的自然特征(如道路边缘、建筑物角点)进行匹配。适合在线标定。
我建议量产车用目标法做初始标定,再用无目标法做在线微调。为什么?因为车辆运行中,传感器支架可能因为振动、温度变化产生微小位移。我曾经遇到过一辆车跑了三个月,激光雷达和摄像头的对齐误差从0.1度漂到了0.8度——直接导致远处目标检测出现1米的偏差。
外参标定公式(简化版):
P_cam = R * P_lidar + T
其中R是3x3旋转矩阵,T是3x1平移向量。标定的目标就是找到最优的R和T,使得同一目标在两种传感器中的投影误差最小。
4.3.3 标定流程与注意事项
完整的标定流程我建议这样走:
- 单传感器内参标定:先搞定每个传感器自己的参数。
- 两两外参标定:激光雷达-摄像头、激光雷达-毫米波雷达、摄像头-毫米波雷达。
- 全局优化:把所有外参放到一个图优化框架里,做联合优化。
- 在线验证:在真实道路上跑一圈,看融合效果。
避坑指南:我曾经在标定激光雷达和摄像头时,发现投影误差总是很大。查了两天才发现,是激光雷达的安装支架有0.5度的倾斜。所以标定前,一定要先确认传感器安装的机械精度。机械误差是标定无法完全补偿的。
4.4 小结
传感器选型与布置,说白了就是三个字:看得全、测得准、对得齐。选型看场景,布置讲冗余,标定求精度。这三步走扎实了,L4的感知系统才算有了地基。
下一章咱们聊聊感知算法——有了数据,怎么让车真正「看懂」这个世界。