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°无遮挡。但风阻大,容易脏污,需要配清洗系统。
  • 保险杠(固态):隐蔽性好,适合乘用车。但容易被泥水遮挡,且视场角有限。
  • 翼子板/后视镜(固态):用于侧向补盲。我建议左右各装一颗,覆盖侧方和后方。
  • 前挡风玻璃后(固态):视野好,但玻璃会衰减激光能量,且容易起雾。

视野规划的核心原则:

  1. 最小化盲区:确保车头前方5米内、车侧2米内没有盲区。这是低速泊车和防碰撞的关键。
  2. 冗余覆盖:关键区域(如正前方)最好有两颗雷达同时覆盖。一颗坏了,另一颗还能顶上。
  3. 避免自遮挡:雷达不要装在会被雨刮、车标、车牌遮挡的位置。
  4. 考虑安装角度:机械式雷达要水平安装,固态雷达要留出俯仰角调节余量。
⚠️ 我曾经踩过的坑
有一次,我们把一颗固态雷达装在了前保险杠的正中央,看起来对称又美观。结果上路一测,发现车头正前方1.5米处有个盲区——正好是雷达的垂直视场角下限。后来我们不得不把雷达向下倾斜了3°,才解决了这个问题。所以,安装前一定要做视场角仿真,别凭感觉来。

下面这张图,是我自己总结的典型L4级自动驾驶车辆雷达部署方案。你可以参考一下:

典型L4级自动驾驶车辆激光雷达部署方案 车辆俯视图 车头方向 主雷达 (机械式) 360° 覆盖 前向雷达 前向120° FOV 左补盲 右补盲 后向雷达 主雷达(360°) 前向雷达 侧向补盲 后向雷达

你看,这个方案用了5颗雷达:1颗车顶机械式做主感知,1颗前向固态做远距离探测,2颗侧向补盲覆盖左右,1颗后向负责倒车和变道。这样搭配,基本能做到无死角覆盖。

最后说一句,安装位置定了之后,一定要做标定。把雷达的坐标系和车辆坐标系对齐。不然你点云里的障碍物位置,和实际位置能差出几十厘米。标定的方法,我们后面章节会详细讲。

💡 我的个人习惯
每次装完雷达,我都会在车周围放几个锥桶,然后看点云里锥桶的位置和实际位置是否吻合。如果偏差超过5cm,我就会重新标定。这个小习惯,帮我避免了好几次因标定误差导致的碰撞测试失败。

好了,激光雷达的基础就聊到这儿。记住,选型看场景,安装看视野,数据看格式。这三样搞明白了,你就算入门了。


可可精品资料库