ROS基础与激光雷达驱动:从零开始让雷达转起来
说实话,很多初学者一上来就急着跑SLAM算法,结果连雷达数据都看不到。我当年也犯过这个错——花了两天时间折腾一个驱动问题,最后发现只是串口权限没配好。所以这一章,咱们踏踏实实把ROS的核心概念理清楚,再把思岚A1雷达驱动起来,用rviz亲眼看到激光点云。这一步走稳了,后面的建图和导航才能跑得顺。
本章目标:理解ROS四大核心概念(节点、话题、服务、参数),完成思岚A1激光雷达的驱动安装与配置,学会用rviz可视化激光雷达数据。
2.1 ROS核心概念:别被术语吓到
ROS说白了就是一个“机器人操作系统”的框架。它不是真正的操作系统,而是一个分布式通信中间件。你想想看,一个机器人可能有激光雷达、摄像头、电机、IMU……这么多硬件,如果每个程序都自己写通信协议,那得多累?ROS帮我们搞定了这件事。
2.1.1 节点(Node)
节点就是ROS中最小的执行单元。一个节点通常只做一件事,比如“读取雷达数据”或者“控制电机”。我习惯把节点想象成一个独立的小工人,各干各的活,互不干扰。
- 每个节点有独立的进程
- 节点之间通过话题或服务通信
- 用
rosrun启动单个节点,用roslaunch启动一组节点
我的习惯:写节点时尽量保持单一职责。一个节点既读雷达又做路径规划?那后期调试会非常痛苦。拆开,拆开,再拆开。
2.1.2 话题(Topic)
话题是ROS里最常用的通信方式。它是一种发布/订阅模型——发布者往话题里发数据,订阅者从话题里收数据。数据格式由消息类型定义。
举个例子:激光雷达节点发布 /scan 话题,类型是 sensor_msgs/LaserScan。任何想用雷达数据的节点,只要订阅这个话题就行。
# 查看当前所有话题
rostopic list
# 查看某个话题的消息类型
rostopic type /scan
# 实时打印话题数据
rostopic echo /scan
我曾经踩过的坑:话题名拼写错误。ROS不会报错,只会默默等待数据。检查了半小时才发现 /scan 写成了 /scann。建议用 rostopic list 确认话题名。
2.1.3 服务(Service)
话题是“发完就不管了”,服务是“一问一答”。客户端发送请求,服务端返回响应。适合那些需要确认结果的场景,比如“打开激光雷达”或者“获取当前里程计数据”。
# 查看所有服务
rosservice list
# 调用服务
rosservice call /service_name "request_data"
2.1.4 参数(Parameter)
参数服务器就像一个全局的配置中心。你可以把雷达的串口号、波特率、坐标系名称等参数放在这里,运行时动态修改,不用重新编译代码。
# 设置参数
rosparam set /laser_port "/dev/ttyUSB0"
# 获取参数
rosparam get /laser_port
# 保存所有参数到文件
rosparam dump params.yaml
嗯,这里要注意:参数服务器适合存少量、低频修改的配置。高频数据别放这里,会影响性能。
2.2 思岚A1激光雷达驱动安装与配置
思岚A1(RPLIDAR A1)是入门级激光雷达里最经典的一款。我带的几个项目都用过它,性价比确实高。下面咱们一步步把它跑起来。
2.2.1 硬件连接
- 将雷达的USB线连接到电脑或开发板
- 检查设备是否识别:
ls /dev/ttyUSB* - 给串口权限:
sudo chmod 666 /dev/ttyUSB0
注意:每次拔插USB后设备名可能变化。建议用 udev 规则固定设备名,或者用 ls -l /dev/serial/by-id/ 找到稳定路径。
2.2.2 安装驱动
思岚官方提供了ROS驱动包。我建议直接从源码编译,这样方便后续调试。
# 创建工作空间(如果还没有)
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 克隆驱动包
git clone https://github.com/Slamtec/rplidar_ros.git
# 编译
cd ~/catkin_ws
catkin_make
# 刷新环境
source devel/setup.bash
2.2.3 启动雷达
# 启动雷达节点
roslaunch rplidar_ros rplidar.launch
如果一切正常,你会看到类似这样的输出:
[ INFO] [1234567890.123456789]: RPLIDAR running on /dev/ttyUSB0...
[ INFO] [1234567890.234567890]: RPLIDAR S/N: A1XXXXXXXX
[ INFO] [1234567890.345678901]: Firmware version: 1.24
我的经验:如果启动后没有输出,先检查串口权限。八成是 chmod 没生效,或者用户不在 dialout 组里。加一下:sudo usermod -a -G dialout $USER,然后注销重登。
2.3 使用rviz可视化激光雷达数据
rviz是ROS里最常用的可视化工具。看到雷达点云在屏幕上转起来的那一刻,还是挺有成就感的。
2.3.1 启动rviz
# 新开一个终端,启动rviz
rviz
2.3.2 添加LaserScan显示
- 点击左下角 Add 按钮
- 选择 By topic 标签
- 找到
/scan话题下的 LaserScan,点击 OK - 在左侧 Displays 面板中,将 Global Options > Fixed Frame 设置为
laser
这时候你应该能看到雷达扫描出的环境轮廓了。转一转雷达,或者拿个纸板在雷达前面晃一晃,看看点云的变化。
常见问题:如果rviz里看不到点云,先检查 rostopic echo /scan 有没有数据。有数据说明雷达正常,问题在rviz配置;没数据说明驱动没跑起来。
2.4 本章知识体系
下面这张图帮你梳理了本章的核心逻辑。从ROS基础概念到雷达驱动,再到可视化,每一步都是环环相扣的。
2.5 本章小结
这一章我们做了三件事:理解了ROS的节点、话题、服务、参数这四个核心概念;安装了思岚A1的驱动并成功启动;用rviz看到了激光雷达数据。说实话,看到点云在屏幕上扫出来的时候,那种感觉还是挺爽的。
嗯,这里再啰嗦一句:别急着往下跑SLAM。先把雷达驱动玩熟,试试在不同环境下扫描,看看数据有什么变化。你越熟悉工具,后面遇到问题就越容易定位。