1. ROS2与激光雷达概述

各位同学好,我是你们这门课的老朋友。说实话,做机器人开发这些年,激光雷达一直是我工具箱里最趁手的家伙之一。今天咱们先不急着敲代码,把底层的概念理清楚,后面实战才能少踩坑。

1.1 ROS2到底是什么?

ROS2,全称 Robot Operating System 2。名字里带个「操作系统」,但它其实不是真正的操作系统,而是一个分布式通信框架。你可以把它想象成一套标准化的乐高接口——不同厂家的传感器、算法模块、执行器,只要遵循这套接口,就能像拼乐高一样组合起来。

我个人习惯把ROS2的核心价值总结成三点:

  • 节点化:每个功能模块都是一个独立节点,比如激光雷达驱动是一个节点,建图算法是另一个节点。它们各自跑各自的进程,互不干扰。
  • 话题通信:节点之间通过「话题」收发消息。激光雷达发布扫描数据到 /scan 话题,建图节点订阅这个话题,拿到数据就开始干活。说白了,就是发布-订阅模式。
  • 服务与动作:除了单向的话题,还有一问一答的服务,以及带反馈的动作接口。后面配置激光雷达参数时,服务接口会经常用到。
一个小经验:我刚从ROS1迁移到ROS2时,最不习惯的就是通信机制从TCP换成了DDS。ROS2默认用DDS(Data Distribution Service)做底层通信,这玩意儿天生支持分布式、实时性更好。但代价是——如果你网络环境复杂,DDS的发现协议可能会让你抓狂。嗯,这个坑后面我们会专门讲。

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固态雷达,室内效果不错,一到室外阳光下就各种噪点。

选型建议:做ROS2开发,如果只是室内导航、建图,单线雷达完全够用,性价比最高。如果要做三维感知,预算有限就上16线,预算充足直接上32线或64线。固态雷达建议再等两年,等产业链成熟了再入坑。

1.4 ROS2驱动架构概览

好了,前面铺垫了这么多,终于到核心了。ROS2里驱动一个激光雷达,到底长什么样?

我画了一张架构图,你看一眼就明白了:

ROS2 激光雷达驱动架构 激光雷达硬件 (串口/USB/以太网) 驱动节点 数据解析 + 参数配置 发布 /scan 话题 TF变换 雷达坐标系 → 机器人坐标系 发布 /tf 话题 应用节点 建图 / 定位 / 避障 订阅 /scan + /tf /scan 话题 💡 架构要点 • 驱动节点负责与硬件通信,解析原始数据,发布标准化的 LaserScan 消息 • TF变换将雷达坐标系下的数据转换到机器人基坐标系,这是多传感器融合的关键 • 应用节点只订阅 /scan 和 /tf,不关心底层硬件细节——这就是ROS2的模块化思想

从这张图你能看到,ROS2激光雷达驱动的核心就是驱动节点。它负责三件事:

  1. 与硬件通信:通过串口、USB或以太网读取雷达原始数据包。
  2. 数据解析:把二进制数据包解析成角度、距离、强度等信息,然后封装成ROS2标准消息 sensor_msgs/msg/LaserScan。
  3. 参数配置:通过ROS2参数服务器或服务接口,动态调整雷达的扫描频率、测距范围、滤波参数等。
曾经踩过的坑:我刚开始写驱动时,以为只要把数据解析出来发布就完事了。结果发现雷达数据在机器人坐标系下的朝向是反的——因为雷达安装时转了180度,而我忘了在TF里做补偿。后来机器人一边走一边撞墙,我才意识到坐标系变换有多重要。所以,TF变换不是可选项,是必选项。

另外,ROS2的驱动架构还有一个好处:热插拔。你可以在机器人运行时更换雷达型号,只要新雷达的驱动节点发布同样的 /scan 话题,上层应用完全不受影响。我曾在同一个机器人上先后测试过思岚A1和镭神N10,切换时只需要停掉一个驱动节点、启动另一个,建图节点全程无感。

好了,这一章的概念铺垫就到这儿。后面我们会一步步搭建开发环境,然后手写一个激光雷达驱动。到时候你会发现,理解了这些底层原理,写代码其实就是把概念翻译成ROS2 API而已。