3. ROS2与激光雷达驱动:从概念到点云可视化

好,我们进入第三章。前面两章我们把激光雷达的原理和选型聊透了,现在该动真格的了——让激光雷达在ROS2里跑起来。

这一章,我会带你走完三个步骤:先快速回顾ROS2的核心概念,然后装上RPLIDAR的驱动,最后把点云数据可视化出来。嗯,每一步我都会穿插一些实际项目里的坑和技巧。

3.1 ROS2基础概念回顾

你可能已经接触过ROS2,但为了照顾不同基础的同学,我还是把最核心的几个概念捋一遍。说白了,ROS2就是一个分布式通信框架,让机器人上的各个模块能互相说话。

3.1.1 节点(Node)

节点是ROS2里最小的执行单元。每个节点负责一件事,比如驱动激光雷达、处理点云、控制电机。我习惯把节点想象成一个个独立的小程序,它们之间通过话题、服务等方式通信。

3.1.2 话题(Topic)

话题是节点之间传递数据的通道。发布者往话题上发数据,订阅者从话题上收数据。这是一种异步通信方式,适合传感器数据这种持续更新的信息流。

关键点:激光雷达的点云数据就是通过话题发布的。默认话题名通常是 /scan(2D激光雷达)或 /points(3D激光雷达)。

3.1.3 服务(Service)

服务是同步通信方式,客户端发送请求,服务端返回响应。适合一次性操作,比如打开/关闭激光雷达、修改扫描频率。

3.1.4 参数(Parameter)

参数是节点的配置项,可以在启动时设置,也可以在运行时动态修改。比如激光雷达的串口波特率、扫描频率,都可以通过参数来调整。

3.1.5 工作空间(Workspace)

工作空间是ROS2项目的组织方式。你所有的代码、依赖包都放在里面。我个人习惯用 colcon 来构建工作空间,比ROS1的 catkin 快不少。

概念 作用 类比
节点 执行单元 独立的小程序
话题 异步通信 广播电台
服务 同步通信 打电话
参数 配置项 配置文件
工作空间 项目组织 项目文件夹

3.2 安装RPLIDAR ROS2驱动

RPLIDAR是思岚科技(Slamtec)的2D激光雷达,性价比高,在机器人教育和小型项目中用得非常多。我最早接触ROS2时,就是用RPLIDAR A1来练手的。

3.2.1 准备工作

确保你已经安装了ROS2(我推荐Humble或Galactic版本)。如果没有,先去官网按教程装好。另外,你需要一个USB转串口模块,RPLIDAR通常通过串口通信。

3.2.2 下载驱动源码

RPLIDAR的ROS2驱动在GitHub上开源。我们直接克隆到工作空间的src目录下:

cd ~/ros2_ws/src
git clone https://github.com/Slamtec/rplidar_ros.git
cd ..
colcon build --packages-select rplidar_ros
source install/setup.bash

小技巧:如果build过程中报错缺少依赖,可以用 rosdep install --from-paths src --ignore-src -r -y 自动安装依赖。我每次建新工作空间都会先跑一遍这个命令。

3.2.3 配置串口权限

Linux下访问串口需要权限。把当前用户加到dialout组里:

sudo usermod -a -G dialout $USER

然后注销重新登录,或者重启一下。我曾经在这上面卡了半小时,一直报权限错误,后来发现就是忘了加组。

3.2.4 检查设备连接

把RPLIDAR通过USB线连接到电脑,然后查看设备节点:

ls -l /dev/ttyUSB*

正常情况下会看到 /dev/ttyUSB0 或类似的设备。如果没有,检查一下USB线是否插好,或者换个USB口试试。

3.3 启动驱动并可视化点云

驱动装好了,设备也认了,现在让它转起来。

3.3.1 启动RPLIDAR节点

ROS2里启动节点通常用 ros2 run 命令:

ros2 run rplidar_ros rplidar_node

如果一切正常,你会看到类似这样的输出:

[INFO] [rplidar_node]: RPLIDAR running on /dev/ttyUSB0 with baudrate 115200
[INFO] [rplidar_node]: Scan mode: Standard
[INFO] [rplidar_node]: Publishing scan data on /scan

注意:如果启动时报错“Cannot open serial port”,先检查串口权限,再确认设备节点是否正确。我遇到过几次是因为插了不同的USB口,设备名变成了 /dev/ttyUSB1。

3.3.2 查看话题数据

启动节点后,打开另一个终端,用 ros2 topic list 查看当前所有话题:

ros2 topic list

你应该能看到 /scan 话题。用 ros2 topic echo 查看数据内容:

ros2 topic echo /scan

你会看到一帧帧的激光扫描数据,包括角度、距离、强度等信息。

3.3.3 可视化点云

光看文字数据不够直观,我们用RViz2来可视化。RViz2是ROS2的3D可视化工具:

ros2 run rviz2 rviz2

在RViz2窗口中:

  1. 点击左下角的“Add”按钮
  2. 选择“By topic”选项卡
  3. 找到 /scan 话题,选择“LaserScan”类型
  4. 点击“OK”

现在你应该能看到激光雷达扫描出的点云了。转动雷达或者移动障碍物,点云会实时更新。

个人经验:RViz2的显示效果可以调整。在左侧的“LaserScan”面板里,可以修改点的大小、颜色、衰减范围。我习惯把点设成绿色,大小调成0.05,看起来更清晰。

3.4 核心流程总结

从安装驱动到可视化,整个流程其实就四步:

  • 准备环境:安装ROS2,创建工作空间
  • 安装驱动:克隆源码,编译,配置串口
  • 启动节点:运行驱动,检查话题
  • 可视化:用RViz2查看点云

下面这张图把整个流程串起来了,你可以对照着看:

ROS2 + RPLIDAR 驱动启动与可视化流程 RPLIDAR 硬件 rplidar_node 驱动节点 /scan 话题 ros2 topic echo /scan RViz2 可视化 说明:驱动节点从硬件读取数据,发布到 /scan 话题,然后可以通过命令行查看或 RViz2 可视化 整个流程只需要一个终端运行驱动,另一个终端运行可视化工具即可

3.5 常见问题与避坑

做这个实验时,我遇到过不少问题,挑几个典型的说说:

  • 串口权限问题:报错“Permission denied”。解决办法就是前面说的,把用户加到dialout组,然后注销重登。
  • 设备节点找不到:插上USB后没有 /dev/ttyUSB0。先检查USB线,再试试 dmesg | grep tty 看内核日志。我遇到过USB线接触不良的情况,换根线就好了。
  • RViz2里看不到点云:检查一下话题名是否匹配。有时候驱动默认的话题名和你在RViz2里选的不一样。用 ros2 topic list 确认一下。
  • 点云数据不更新:可能是雷达被挡住了,或者扫描频率设置得太低。检查一下雷达前面有没有障碍物。

重要提醒:RPLIDAR是旋转式激光雷达,内部有电机。使用时确保雷达固定好,不要用手去挡旋转部分。我曾经不小心让雷达撞到桌角,结果外壳裂了...嗯,从那以后我每次都用支架固定好。