第1章 激光雷达基础:从原理到ROS实战
各位同学,欢迎来到《激光雷达路径规划与避障实战》的第一章。我是你们这门课的老朋友,一个在机器人导航领域摸爬滚打了十来年的工程师。今天咱们不聊虚的,直接切入正题——激光雷达。
你可能会问,为什么第一课就要讲激光雷达?说白了,激光雷达就是机器人的“眼睛”。没有它,路径规划和避障就是盲人摸象。我刚开始做机器人那会儿,用的还是超声波,那体验,啧啧……后来换了激光雷达,整个世界都清晰了。
1.1 激光雷达工作原理:TOF vs 三角测距
激光雷达怎么测距的?其实就两大流派:TOF(飞行时间法)和三角测距法。咱们一个一个说。
1.1.1 TOF(飞行时间法)
TOF的原理特别简单:激光发射器发出一束光,打到物体上反射回来,接收器收到。记下这段时间差,乘以光速,再除以2,就是距离。
公式长这样:
距离 = (光速 × 飞行时间) / 2
嗯,这里要注意:光速是3×10⁸ m/s,时间差通常以纳秒计。所以TOF雷达对计时电路要求极高。我当年调试一个TOF雷达,因为PCB走线长了那么几毫米,测距就偏了十几厘米……后来老老实实重新画板子。
TOF核心特点:
- 测量范围远:室内外都能用,几十米到上百米
- 精度高:厘米级甚至毫米级
- 抗干扰强:不受环境光影响太大
- 成本高:因为需要高精度计时芯片
1.1.2 三角测距法
三角测距就有点意思了。它利用激光发射点和接收摄像头之间的固定基线,通过几何三角关系算距离。激光打到物体上,在摄像头成像平面上的位置会变化——物体越近,光斑偏移越大。
公式也不复杂:
距离 = (基线长度 × 焦距) / 成像偏移量
你想想看,这个方法的精度跟基线长度和成像分辨率直接挂钩。所以三角测距雷达通常短小精悍,适合室内近距离使用。
我的经验之谈:如果你做室内扫地机器人、服务机器人,三角测距完全够用,性价比高。但要做自动驾驶、户外巡检,老老实实上TOF。我曾经在一个户外项目中硬用三角测距,结果大太阳底下直接“瞎”了——环境光太强,成像点都找不到了。
两种方法对比一下:
| 对比项 | TOF | 三角测距 |
|---|---|---|
| 测距原理 | 光飞行时间 | 几何三角 |
| 测量范围 | 远(10-100m+) | 近(0.1-10m) |
| 精度 | 高(cm级) | 中等(cm-dm级) |
| 环境光影响 | 小 | 大 |
| 成本 | 高 | 低 |
| 典型代表 | Velodyne、Hesai | RPLIDAR、Slamtec |
1.2 单线与多线雷达区别
聊完原理,咱们说说线数。单线雷达和多线雷达,名字听着像,但完全是两个物种。
1.2.1 单线激光雷达
单线雷达,就是只有一个激光发射器和一个接收器。它旋转一圈,只能扫出一个平面的点云。说白了,就是在一个二维平面上画轮廓。
- 优点:结构简单、成本低、数据处理快
- 缺点:只能感知一个平面,无法获取三维信息
- 典型应用:室内导航、SLAM建图、避障
我记得刚入行时,用单线雷达做室内SLAM,效果出奇的好。但一遇到斜坡、台阶,它就傻了——因为它只能看到同一高度上的东西。
1.2.2 多线激光雷达
多线雷达,顾名思义,有多个激光发射器(16线、32线、64线甚至128线)。每个发射器对应一个不同的垂直角度,旋转一圈就能扫出一个三维点云。
- 优点:三维感知、目标识别、地形建模
- 缺点:贵、数据量大、处理复杂
- 典型应用:自动驾驶、无人机、户外机器人
避坑指南:我曾经帮一个学生选型,他非要用16线雷达做室内小机器人。结果数据量太大,树莓派直接卡死。后来换成单线雷达,跑得飞起。记住:杀鸡不要用牛刀,选型要匹配场景。
再给个直观对比:
| 维度 | 单线雷达 | 多线雷达 |
|---|---|---|
| 线数 | 1 | 16/32/64/128 |
| 输出数据 | 2D点云 | 3D点云 |
| 数据量 | 小(~10KB/s) | 大(~MB/s) |
| 价格 | 几百~几千 | 几千~几十万 |
| 适用场景 | 室内导航、SLAM | 自动驾驶、3D感知 |
1.3 ROS驱动安装与点云可视化
理论讲完了,咱们来点实操。这部分我建议你跟着我一步步来,别跳步。
1.3.1 安装ROS驱动
以最常见的RPLIDAR A1为例(单线三角测距雷达),驱动安装其实就几条命令:
# 创建ROS工作空间
mkdir -p ~/lidar_ws/src
cd ~/lidar_ws/src
# 克隆驱动包
git clone https://github.com/Slamtec/rplidar_ros.git
# 编译
cd ~/lidar_ws
catkin_make
# 设置环境变量
echo "source ~/lidar_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
嗯,这里要注意:不同雷达的驱动包不一样。比如思岚的A系列用rplidar_ros,镭神的用lslidar_ros,Velodyne的用velodyne_driver。我建议你先查清楚自己雷达的型号,再找对应的驱动。
我的习惯:每次装新驱动前,我都会先跑一下 ls /dev/ttyUSB* 看看雷达有没有被系统识别。如果没识别,八成是USB转串口驱动没装。别问我怎么知道的……
1.3.2 启动雷达并可视化
驱动装好了,启动雷达:
# 启动RPLIDAR节点
roslaunch rplidar_ros rplidar.launch
# 新开终端,查看话题
rostopic list
# 你应该能看到 /scan 话题
# 可视化点云
rosrun rviz rviz
在RViz中,添加一个LaserScan显示,选择话题为/scan。如果一切正常,你就能看到雷达扫描出来的点云了——一圈一圈的,像雷达屏幕一样。
我第一次在RViz里看到点云时,说实话,挺激动的。那些小点就是机器人眼中的世界。
1.3.3 点云数据解读
点云数据长什么样?咱们看看话题消息结构:
rostopic echo /scan | head -20
输出大概是这样:
header:
seq: 1234
stamp:
secs: 1695000000
nsecs: 123456789
frame_id: "laser"
angle_min: -3.14159
angle_max: 3.14159
angle_increment: 0.0174533
time_increment: 0.0001
scan_time: 0.1
range_min: 0.15
range_max: 12.0
ranges: [0.5, 0.52, 0.55, ...]
intensities: [10, 12, 15, ...]
关键字段解释:
- angle_min/angle_max:扫描角度范围,这里是-π到π(360度)
- angle_increment:角度分辨率,约1度
- range_min/range_max:有效测距范围
- ranges:每个角度对应的距离值
- intensities:反射强度,可以用来区分不同材质
实战小技巧:如果你发现点云有大量NaN或Inf值,别慌。这通常是雷达没打到物体(超出量程)或者反射太弱。在代码里记得做滤波处理,不然路径规划会出问题。
本章知识体系总览
为了让你对本章内容有个整体把握,我画了一张结构图。你可以把它当作本章的“地图”。
这张图把本章的三个核心模块串起来了。你可以看到,从工作原理到选型对比,再到ROS实战,是一条完整的知识链。后面的章节,我们会在这个基础上,一步步深入路径规划和避障算法。