1. ROS2与激光雷达概述
各位同学好,我是你们这门课的老朋友。说实话,做机器人开发这些年,激光雷达一直是我工具箱里最趁手的家伙之一。今天咱们先不急着敲代码,把底层的概念理清楚,后面实战才能少踩坑。
1.1 ROS2到底是什么?
ROS2,全称 Robot Operating System 2。名字里带个「操作系统」,但它其实不是真正的操作系统,而是一个分布式通信框架。你可以把它想象成一套标准化的乐高接口——不同厂家的传感器、算法模块、执行器,只要遵循这套接口,就能像拼乐高一样组合起来。
我个人习惯把ROS2的核心价值总结成三点:
- 节点化:每个功能模块都是一个独立节点,比如激光雷达驱动是一个节点,建图算法是另一个节点。它们各自跑各自的进程,互不干扰。
- 话题通信:节点之间通过「话题」收发消息。激光雷达发布扫描数据到
/scan话题,建图节点订阅这个话题,拿到数据就开始干活。说白了,就是发布-订阅模式。 - 服务与动作:除了单向的话题,还有一问一答的服务,以及带反馈的动作接口。后面配置激光雷达参数时,服务接口会经常用到。
1.2 激光雷达是怎么工作的?
激光雷达,英文叫 LiDAR(Light Detection And Ranging)。原理其实不复杂:发射激光束,打到目标物体后反射回来,测量往返时间,就能算出距离。你想想看,这跟蝙蝠用超声波回声定位是一个道理,只不过激光雷达用的是光。
具体来说,激光雷达内部有一个激光发射器和一个接收器。发射器发出一束脉冲激光,接收器等着反射回来的信号。通过记录发射和接收的时间差 Δt,距离 d 就可以用光速 c 算出来:
d = c × Δt / 2
除以2是因为光走了个来回。这个公式简单吧?但实际工程中,难点在于如何精确测量那几纳秒甚至皮秒级的时间差。我早期用过一款国产单线雷达,标称测距30米,结果在强光下只能测到15米——就是因为接收器灵敏度不够,弱信号检测不到。
除了飞行时间法(ToF),还有一种常见的测距原理叫三角测距法。它利用激光发射点和接收器之间的基线,通过三角几何关系计算距离。这种方案成本低,但精度和测距范围都不如ToF。目前市面上消费级扫地机器人用的多是三角法,而工业级、自动驾驶级的基本都是ToF。
| 测距原理 | 精度 | 测距范围 | 成本 | 典型应用 |
|---|---|---|---|---|
| 飞行时间法(ToF) | 高(±2cm) | 远(100m+) | 高 | 自动驾驶、AGV |
| 三角测距法 | 中(±5cm) | 近(10m以内) | 低 | 扫地机器人、室内导航 |
1.3 常见激光雷达类型
市面上的激光雷达五花八门,但按扫描维度来分,主要就三类:
单线激光雷达
只有一个激光发射-接收对,通过旋转机构扫描出一个平面。说白了,它只能看到二维截面。我最早做室内移动机器人时用的就是单线雷达,比如Sick LMS系列、思岚RPLIDAR系列。优点是便宜、数据量小、处理简单;缺点嘛——只能扫一个平面,遇到台阶或者悬空障碍物就瞎了。
多线激光雷达
把多个激光收发对堆叠在一起,同时扫描多个平面,形成三维点云。Velodyne的HDL-64E有64线,当年可是自动驾驶界的标配。多线雷达能获取三维环境信息,但价格也感人——一台64线雷达够买一辆小汽车了。我记得2016年做无人车项目时,团队凑钱买了一台二手的16线雷达,大家都当宝贝供着。
固态激光雷达
没有旋转部件,靠光学相控阵(OPA)或微振镜(MEMS)实现光束扫描。固态雷达体积小、寿命长、成本低,是未来的趋势。但现阶段的问题是视场角有限,而且容易受环境光干扰。我去年测试过一款国产MEMS固态雷达,室内效果不错,一到室外阳光下就各种噪点。
1.4 ROS2驱动架构概览
好了,前面铺垫了这么多,终于到核心了。ROS2里驱动一个激光雷达,到底长什么样?
我画了一张架构图,你看一眼就明白了:
从这张图你能看到,ROS2激光雷达驱动的核心就是驱动节点。它负责三件事:
- 与硬件通信:通过串口、USB或以太网读取雷达原始数据包。
- 数据解析:把二进制数据包解析成角度、距离、强度等信息,然后封装成ROS2标准消息
sensor_msgs/msg/LaserScan。 - 参数配置:通过ROS2参数服务器或服务接口,动态调整雷达的扫描频率、测距范围、滤波参数等。
另外,ROS2的驱动架构还有一个好处:热插拔。你可以在机器人运行时更换雷达型号,只要新雷达的驱动节点发布同样的 /scan 话题,上层应用完全不受影响。我曾在同一个机器人上先后测试过思岚A1和镭神N10,切换时只需要停掉一个驱动节点、启动另一个,建图节点全程无感。
好了,这一章的概念铺垫就到这儿。后面我们会一步步搭建开发环境,然后手写一个激光雷达驱动。到时候你会发现,理解了这些底层原理,写代码其实就是把概念翻译成ROS2 API而已。