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窗口中:
- 点击左下角的“Add”按钮
- 选择“By topic”选项卡
- 找到
/scan话题,选择“LaserScan”类型 - 点击“OK”
现在你应该能看到激光雷达扫描出的点云了。转动雷达或者移动障碍物,点云会实时更新。
个人经验:RViz2的显示效果可以调整。在左侧的“LaserScan”面板里,可以修改点的大小、颜色、衰减范围。我习惯把点设成绿色,大小调成0.05,看起来更清晰。
3.4 核心流程总结
从安装驱动到可视化,整个流程其实就四步:
- 准备环境:安装ROS2,创建工作空间
- 安装驱动:克隆源码,编译,配置串口
- 启动节点:运行驱动,检查话题
- 可视化:用RViz2查看点云
下面这张图把整个流程串起来了,你可以对照着看:
3.5 常见问题与避坑
做这个实验时,我遇到过不少问题,挑几个典型的说说:
- 串口权限问题:报错“Permission denied”。解决办法就是前面说的,把用户加到dialout组,然后注销重登。
- 设备节点找不到:插上USB后没有
/dev/ttyUSB0。先检查USB线,再试试dmesg | grep tty看内核日志。我遇到过USB线接触不良的情况,换根线就好了。 - RViz2里看不到点云:检查一下话题名是否匹配。有时候驱动默认的话题名和你在RViz2里选的不一样。用
ros2 topic list确认一下。 - 点云数据不更新:可能是雷达被挡住了,或者扫描频率设置得太低。检查一下雷达前面有没有障碍物。
重要提醒:RPLIDAR是旋转式激光雷达,内部有电机。使用时确保雷达固定好,不要用手去挡旋转部分。我曾经不小心让雷达撞到桌角,结果外壳裂了...嗯,从那以后我每次都用支架固定好。