3、激光雷达基础:激光雷达工作原理、常见型号与点云数据格式

做SLAM这几年,我摸过的激光雷达少说也有七八种。从最早的SICK到现在的固态激光雷达,技术迭代确实快。但不管怎么变,核心原理就那几样。今天咱们就把激光雷达的老底儿翻一翻。

3.1 激光雷达工作原理

激光雷达说白了就是「用光测距」。它发射一束激光,打到物体上反射回来,通过计算时间差或角度差,就能知道物体有多远。目前主流的测距方式有两种:TOF(飞行时间法)三角测距法

3.1.1 TOF(飞行时间法)

TOF的原理非常直观:激光发射器发出一束脉冲光,打到目标后反射回来,接收器捕获到回波。记录下从发射到接收的时间差Δt,乘以光速c再除以2,就是距离。

距离 d = (c × Δt) / 2

举个例子:如果Δt是10纳秒,光速是3×10⁸ m/s,那么距离就是1.5米。嗯,小学数学就能算明白。

TOF的优势

  • 测量距离远,几十米到几百米都没问题
  • 抗环境光干扰能力强
  • 精度相对稳定,不随距离变化而大幅波动

TOF的劣势

  • 对时间测量电路要求高,成本相对贵一些
  • 多台雷达同时工作时可能互相干扰
个人经验:我在做园区无人车项目时,用的就是TOF雷达。当时遇到一个坑——雨天时激光打在雨滴上会产生「噪点」,导致建图出现大量飞点。后来加了滤波算法才解决。所以用TOF雷达,天气因素一定要考虑进去。

3.1.2 三角测距法

三角测距的原理稍微绕一点。它利用激光发射器、目标物体和接收器(通常是CMOS或CCD)构成一个三角形。激光打到物体上,反射光落在接收器上的位置会随距离变化而变化。通过几何关系,就能算出距离。

公式长这样:

d = (f × b) / (x × sin(θ))

其中f是透镜焦距,b是基线长度,x是光斑在成像面上的偏移量,θ是激光与基线的夹角。

三角测距的优势

  • 近距离精度非常高,毫米级没问题
  • 成本低,适合消费级产品

三角测距的劣势

  • 距离越远精度越差,一般有效距离在10米以内
  • 容易受环境光影响
避坑指南:我曾经在室内扫地机器人项目里用过三角测距雷达。一开始没注意,把雷达装在靠近地面10cm的位置。结果地毯边缘的反射光斑严重偏移,导致建图扭曲。后来把雷达抬高到15cm以上,问题才解决。所以安装位置真的不能马虎。

3.2 常见激光雷达型号介绍

市面上激光雷达型号多如牛毛。我按应用场景给大家梳理一下,方便选型时参考。

型号 测距方式 线数 最大测距 典型应用
Velodyne VLP-16 TOF 16线 100m 自动驾驶、室外SLAM
Hesai Pandar40P TOF 40线 200m 自动驾驶、高精地图
SICK LMS111 TOF 单线 20m 工业AGV、室内导航
RPLIDAR A1 三角测距 单线 12m 扫地机器人、教育科研
Livox Mid-40 TOF 非重复扫描 260m 无人机、机器人

我个人习惯把雷达分成三类:

  • 工业级:SICK、Hokuyo,皮实耐用,但价格感人。一个SICK LMS111能买两台RPLIDAR A1还有找零。
  • 车规级:Velodyne、Hesai、RoboSense,性能强悍,适合自动驾驶。我记得第一次用VLP-16时,被它的点云密度惊到了——16线扫一圈,数据量比单线雷达大了不止一个量级。
  • 消费级:RPLIDAR、YDLIDAR,便宜够用,适合入门学习。你想想看,几百块钱就能搞一套,拿来练手再合适不过了。

3.3 点云数据格式

激光雷达采集到的数据,最终以「点云」的形式呈现。每个点包含三维坐标(x, y, z)和反射强度(intensity)。有些雷达还会返回时间戳和环号。

最常见的点云格式有两种:

3.3.1 PCD格式

PCD是Point Cloud Library(PCL)的标准格式。它支持二进制和ASCII两种存储方式。ASCII格式可读性好,但文件大;二进制格式紧凑,适合大规模数据。

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 36000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 36000
DATA ascii
0.123 0.456 1.789 85
0.124 0.457 1.790 87
...

3.3.2 ROS中的点云消息

在ROS里,点云数据通过sensor_msgs::PointCloud2消息传递。它的结构比PCD更灵活,支持自定义字段。

# ROS PointCloud2消息结构
std_msgs/Header header
uint32 height
uint32 width
sensor_msgs/PointField[] fields
  uint8 INT8=1
  uint8 UINT8=2
  uint8 INT16=3
  uint8 UINT16=4
  uint8 INT32=5
  uint8 UINT32=6
  uint8 FLOAT32=7
  uint8 FLOAT64=8
  string name
  uint32 offset
  uint8 datatype
  uint32 count
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense
重点提醒:在实际开发中,我建议你优先使用ROS的PointCloud2格式。原因很简单——它自带时间戳和坐标系信息,方便做时间同步和坐标变换。我在做多传感器融合时,就靠这个字段对齐了激光雷达和IMU的数据。

3.4 本章知识体系

为了让你更直观地理解本章内容,我画了一张结构图。它把激光雷达的核心知识点串在了一起。

激光雷达基础 工作原理 TOF飞行时间法 三角测距法 常见型号 工业级 车规级 消费级 点云数据格式 PCD格式 PointCloud2

这张图把本章内容分成了三大块:工作原理、常见型号和点云格式。你顺着这个结构往下学,思路会清晰很多。

学习建议:如果你刚开始接触激光雷达,我建议先搞懂TOF和三角测距的区别。选型时,先问自己三个问题:测距多远?精度多高?预算多少?答案自然就有了。

公众号:蓝海资料掘金营,微信deep3321