3. 激光雷达基础
激光雷达是激光SLAM最核心的外部传感器。它通过主动发射激光并接收回波,直接获得环境中障碍物的距离与角度信息,从而形成高精度的点云。理解测距原理、雷达类型、点云格式以及时间戳与运动畸变,是后续建图、匹配和优化调试的基础。本节从物理原理出发,逐步过渡到工程中真正影响SLAM性能的关键细节。
一、核心原理:TOF与三角测距
激光雷达测距主要有两种物理机制:飞行时间法(Time of Flight,TOF)和三角测距法(Triangulation)。
TOF测距通过测量激光从发射到被目标反射回来的时间差来计算距离。若光速为 c,往返时间为 Δt,则距离 d = c·Δt/2。由于光速极快,TOF雷达需要极高精度的时间测量电路,通常采用脉冲飞行时间(Pulse TOF)或连续波调制的相位差法(iToF)。TOF雷达量程远、抗环境光能力强,适合室外和长距离场景,但近距离精度受时间分辨率限制。
三角测距则利用几何关系:激光发射器与摄像头(或线阵传感器)之间保持固定基线 b,激光打在目标上形成光斑,光斑在传感器上的成像位置随距离变化。根据相似三角形关系,距离 d = b·f / x,其中 f 为焦距,x 为光斑在传感器上的偏移量。三角测距在近距离精度高、成本低,但距离越远,x 越小,精度迅速下降,因此量程有限,多用于室内短距雷达。
工程含义:TOF雷达的误差主要来自时间测量噪声和回波强度;三角测距雷达的误差随距离平方增长。调试时若发现远处点云“发散”或“抖动”,往往与测距原理和标定精度直接相关。
二、2D与3D激光雷达
按扫描维度,激光雷达可分为2D单线和3D多线两类。
- 2D激光雷达:只有一条扫描线,输出一个平面内的距离序列,典型如RPLIDAR、Hokuyo UST-10LX。数据量小、频率高(5~20Hz),适合室内地面机器人、AGV的平面SLAM。其缺点是只能感知同一高度平面,遇到玻璃、镜面、黑色吸光物体容易丢点。
- 3D激光雷达:由多线激光束(16、32、64、128线)垂直排列并旋转扫描,输出三维点云,典型如Velodyne、Ouster、禾赛、速腾聚创。3D雷达能感知完整环境结构,适合自动驾驶、室外建图和LIO(激光惯性里程计),但数据量大、对时间同步和运动补偿要求更高。
此外还有固态激光雷达(MEMS、OPA、Flash),无机械旋转部件,寿命长、体积小,但视场角和点云规整性各有差异。工程选型时需综合考虑量程、角分辨率、帧率、视场角、接口和成本。
三、点云格式与时间戳
激光雷达原始数据通常以距离+角度+强度形式输出,驱动层再转换为笛卡尔坐标点云。常见格式包括:
| 格式 | 典型字段 | 特点与用途 |
|---|---|---|
| PCL PointXYZ | x, y, z | 最基础,便于PCL算法处理 |
| PointXYZI | x, y, z, intensity | 带反射强度,用于滤除低反射点 |
| PointXYZIRT | x, y, z, intensity, ring, time | 含线号和相对时间,运动补偿必需 |
| ROS sensor_msgs/PointCloud2 | header + fields + data | ROS标准消息,支持任意字段布局 |
| PCD文件 | ascii/binary/binary_compressed | 离线保存与回放,便于复盘 |
时间戳是点云中极易被忽视却极其关键的字段。一帧3D点云并非在同一瞬间采集完成:机械旋转雷达在一帧周期内(如100ms)逐列扫描,每个点都有各自的采集时刻。若只给整帧一个时间戳,后续运动补偿就无从下手。因此,规范的驱动会为每个点写入time或t字段,表示相对于帧起始时刻的偏移。
# ROS PointCloud2 中常见的字段定义
fields:
- name: x, offset: 0, datatype: FLOAT32
- name: y, offset: 4, datatype: FLOAT32
- name: z, offset: 8, datatype: FLOAT32
- name: intensity, offset: 12, datatype: FLOAT32
- name: ring, offset: 16, datatype: UINT16
- name: time, offset: 18, datatype: FLOAT32 # 相对帧起始的秒数
四、运动畸变与时间同步
运动畸变是指雷达在扫描一帧的过程中自身发生运动,导致同一帧内不同时刻采集的点被错误地投影到同一坐标系下,点云出现“拖尾”“弯曲”或“重影”。例如机器人以1m/s前进,雷达帧周期100ms,则一帧内机器人移动约10cm,远处墙面点云会被明显拉伸。
解决运动畸变的核心是运动补偿(去畸变):利用IMU或轮式里程计提供的位姿,将每个点按其采集时刻t插值到帧起始或帧结束时刻的坐标系。流程如下:
- 读取每个点的相对时间
t_i,计算绝对时刻。 - 从IMU/里程计缓存中查询该时刻的位姿
T_i。 - 将点从雷达坐标系变换到统一参考坐标系:
p_ref = T_ref^{-1} · T_i · p_i。 - 输出补偿后的点云,再送入NDT、ICP或LIO进行配准。
常见误区:很多初学者直接使用整帧时间戳做配准,忽略逐点时间,导致高速运动时建图出现“双层墙”或地图模糊。另一个误区是IMU与雷达时间未对齐,补偿后反而引入更大误差。调试时应先检查/imu/data与/points_raw的header.stamp是否在同一时间基准,并确认驱动是否真正填充了time字段。
调试建议:用rosbag record同时录制点云、IMU和TF,回放时用RViz观察去畸变前后点云形态;若发现点云边缘呈锯齿状,优先排查时间戳对齐和补偿插值方式。对于2D雷达,运动畸变通常较小,但在快速旋转或高速平移时同样不可忽略。
掌握测距原理、雷达类型、点云字段和时间戳机制,才能在后续的帧间匹配、地图构建和性能优化中准确定位问题。尤其是运动畸变与时间同步,往往是激光SLAM精度下降的隐蔽根源,需要在数据链路最前端就加以处理。