3. 传感器基础(二):激光雷达:机械式与固态激光雷达、点云数据格式、安装位置与视野规划
好,咱们接着聊传感器。上一节我们把摄像头聊透了,这一节轮到激光雷达了。
说实话,在我刚入行那会儿,激光雷达还是个「奢侈品」。一台64线的机械式雷达,价格能顶上一辆小轿车。现在好多了,固态激光雷达把成本打下来不少,但选型和使用上,坑依然不少。
这一节,我就把我在项目里踩过的坑、积累的经验,一股脑倒给你。
3.1 机械式激光雷达:老大哥的优与劣
机械式激光雷达,说白了就是「转着圈扫」。它内部有一个或者多个激光收发模组,通过电机带动旋转,实现360°的水平视场覆盖。
优点很明显:
- 360° 全覆盖:没有盲区,这是它最大的优势。你想想看,车在路口左转,侧方突然窜出个电动车,机械式雷达能第一时间捕捉到。
- 技术成熟:Velodyne、禾赛这些老牌厂商,产品线非常稳定,算法适配也做得好。
- 点云密度高:64线、128线的产品,一帧能扫出几十万个点,细节丰富。
但缺点也让人头疼:
- 寿命和可靠性:机械旋转结构,意味着有磨损。我记得有个项目,车在矿区跑了三个月,雷达的旋转轴就开始出现异响,点云数据也开始抖动。嗯,这玩意儿在振动环境下确实娇气。
- 体积大、成本高:车顶上顶个「大花盆」,不仅影响风阻,还不好看。成本嘛,以前动辄几万美金,现在虽然降了,但依然不便宜。
- 散热问题:电机和激光器都在发热,夏天暴晒下,内部温度能到70-80度,容易导致数据丢帧。
我曾经在一个项目中,为了追求360°视野,在车顶装了双机械式雷达。结果两个雷达的旋转频率没同步好,互相干扰,点云里出现了大量「鬼影」。后来花了整整两周做时间同步和滤波才解决。所以,多雷达部署时,同步问题是第一道坎。
3.2 固态激光雷达:新秀的崛起
固态激光雷达,顾名思义,没有机械旋转部件。它通过电子方式控制激光束的扫描方向。目前主流的技术路线有MEMS微振镜、Flash面阵和OPA光学相控阵。
我个人的习惯是,在L4级以上的Robotaxi上,我会优先考虑混合固态(MEMS),而在L2+的乘用车上,Flash方案更合适。
固态雷达的优势:
- 体积小、成本低:可以嵌入到保险杠、翼子板里,不破坏车身造型。成本有望降到几百美金级别。
- 可靠性高:没有运动部件,抗振动、抗冲击能力强,寿命长。
- 扫描速度快:电子扫描,微秒级就能完成一帧扫描,适合高速场景。
但它的短板也很明显:
- 视场角有限:目前主流的MEMS雷达,水平FOV一般在120°左右。要覆盖360°,至少需要3-4颗。
- 点云密度不均匀:Flash方案在近处点云密,远处点云稀。MEMS方案在边缘视场,点云会有畸变。
- 抗干扰能力弱:多台固态雷达同时工作时,容易互相串扰。我见过一个测试,两辆并排的车都用了同一款MEMS雷达,结果点云里出现了对方的「镜像」。
如果你在选型时纠结,可以这样判断:
- 需要360°感知,预算充足 → 机械式(或混合固态+补盲雷达)
- 追求低成本、高可靠性,视场角够用就行 → 固态雷达
- 需要远距离探测(>200m) → 机械式或MEMS(Flash一般只能到100m左右)
3.3 点云数据格式:你看到的不是「点」,是「世界」
激光雷达输出的数据,我们叫「点云」。每个点,包含三维坐标(x, y, z)和反射强度(intensity)。有些雷达还会输出时间戳和环号。
常见的点云格式:
| 格式 | 说明 | 典型应用 |
|---|---|---|
| PCD | Point Cloud Library 原生格式,支持ASCII和二进制 | 算法开发、数据标注 |
| PLY | 多边形文件格式,可存储颜色、法向量 | 3D建模、可视化 |
| LAS/LAZ | 地理空间标准格式,支持分类 | 测绘、高精地图 |
| BIN | 裸二进制格式,无头信息 | 嵌入式系统、实时传输 |
我建议你在实际项目中,用PCD格式做开发和调试,用BIN格式做车端实时传输。 为什么?PCD有头信息,方便你检查点云的基本属性(点数、字段、坐标系)。而BIN格式最紧凑,传输效率高,适合嵌入式环境。
来看一个简单的点云读取示例(C++ + PCL):
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main() {
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
// 读取PCD文件
if (pcl::io::loadPCDFile<pcl::PointXYZI>("scan.pcd", *cloud) == -1) {
PCL_ERROR("Couldn't read file scan.pcd \n");
return -1;
}
std::cout << "Loaded " << cloud->points.size() << " data points." << std::endl;
// 遍历点云
for (const auto& point : cloud->points) {
// 每个点都有 x, y, z, intensity
std::cout << "x: " << point.x << " y: " << point.y
<< " z: " << point.z << " intensity: " << point.intensity << std::endl;
}
return 0;
}
点云里的 intensity(反射强度)非常有用!它反映了物体表面对激光的反射能力。
- 高反射(如交通标志、车牌)→ intensity 值高
- 低反射(如黑色轮胎、沥青路面)→ intensity 值低
利用这个特性,你可以快速区分车道线和路面,甚至识别出交通标志牌。
3.4 安装位置与视野规划:别让雷达「瞎」了
雷达装在哪,直接决定了它能「看」到什么。我见过太多项目,雷达装得挺漂亮,但实际跑起来,盲区大得吓人。
常见的安装位置:
- 车顶(机械式/混合固态):视野最好,360°无遮挡。但风阻大,容易脏污,需要配清洗系统。
- 保险杠(固态):隐蔽性好,适合乘用车。但容易被泥水遮挡,且视场角有限。
- 翼子板/后视镜(固态):用于侧向补盲。我建议左右各装一颗,覆盖侧方和后方。
- 前挡风玻璃后(固态):视野好,但玻璃会衰减激光能量,且容易起雾。
视野规划的核心原则:
- 最小化盲区:确保车头前方5米内、车侧2米内没有盲区。这是低速泊车和防碰撞的关键。
- 冗余覆盖:关键区域(如正前方)最好有两颗雷达同时覆盖。一颗坏了,另一颗还能顶上。
- 避免自遮挡:雷达不要装在会被雨刮、车标、车牌遮挡的位置。
- 考虑安装角度:机械式雷达要水平安装,固态雷达要留出俯仰角调节余量。
有一次,我们把一颗固态雷达装在了前保险杠的正中央,看起来对称又美观。结果上路一测,发现车头正前方1.5米处有个盲区——正好是雷达的垂直视场角下限。后来我们不得不把雷达向下倾斜了3°,才解决了这个问题。所以,安装前一定要做视场角仿真,别凭感觉来。
下面这张图,是我自己总结的典型L4级自动驾驶车辆雷达部署方案。你可以参考一下:
你看,这个方案用了5颗雷达:1颗车顶机械式做主感知,1颗前向固态做远距离探测,2颗侧向补盲覆盖左右,1颗后向负责倒车和变道。这样搭配,基本能做到无死角覆盖。
最后说一句,安装位置定了之后,一定要做标定。把雷达的坐标系和车辆坐标系对齐。不然你点云里的障碍物位置,和实际位置能差出几十厘米。标定的方法,我们后面章节会详细讲。
每次装完雷达,我都会在车周围放几个锥桶,然后看点云里锥桶的位置和实际位置是否吻合。如果偏差超过5cm,我就会重新标定。这个小习惯,帮我避免了好几次因标定误差导致的碰撞测试失败。
好了,激光雷达的基础就聊到这儿。记住,选型看场景,安装看视野,数据看格式。这三样搞明白了,你就算入门了。