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的劣势:
- 对时间测量电路要求高,成本相对贵一些
- 多台雷达同时工作时可能互相干扰
3.1.2 三角测距法
三角测距的原理稍微绕一点。它利用激光发射器、目标物体和接收器(通常是CMOS或CCD)构成一个三角形。激光打到物体上,反射光落在接收器上的位置会随距离变化而变化。通过几何关系,就能算出距离。
公式长这样:
d = (f × b) / (x × sin(θ))
其中f是透镜焦距,b是基线长度,x是光斑在成像面上的偏移量,θ是激光与基线的夹角。
三角测距的优势:
- 近距离精度非常高,毫米级没问题
- 成本低,适合消费级产品
三角测距的劣势:
- 距离越远精度越差,一般有效距离在10米以内
- 容易受环境光影响
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
3.4 本章知识体系
为了让你更直观地理解本章内容,我画了一张结构图。它把激光雷达的核心知识点串在了一起。
这张图把本章内容分成了三大块:工作原理、常见型号和点云格式。你顺着这个结构往下学,思路会清晰很多。
公众号:蓝海资料掘金营,微信deep3321