ROS2与激光雷达:从核心概念到点云可视化

各位同学,欢迎来到第二章。上一章我们聊了激光雷达自主导航的整体图景,这一章咱们要动真格的了——把ROS2和激光雷达真正连起来。

说实话,我最早接触ROS1的时候,被它的节点、话题、服务搞得一头雾水。后来转到ROS2,发现虽然底层改了不少,但核心思想一脉相承。今天我就用最直白的方式,把这些概念讲清楚,然后带你把激光雷达的数据在rviz2里亮出来。

本章核心目标:理解ROS2的三大通信机制,学会配置激光雷达驱动,最终在rviz2中看到实时点云。

ROS2与激光雷达知识体系 ROS2与激光雷达:知识体系结构 ROS2核心概念 节点 (Node) 话题 (Topic) 服务 (Service) 激光雷达驱动配置 rviz2 点云可视化 说明:节点是执行单元,话题是异步通信管道,服务是同步请求-响应模式 激光雷达驱动将硬件数据转换为ROS2话题,rviz2订阅并可视化

2.1 ROS2核心概念:节点、话题、服务

ROS2本质上是一个分布式通信框架。什么意思呢?就是你的激光雷达、电机控制、路径规划这些模块,各自跑在不同的进程里,甚至不同的电脑上,但它们能互相说话。

2.1.1 节点(Node)

节点是ROS2中最基本的执行单元。每个节点负责一个具体的功能。比如激光雷达驱动是一个节点,里程计计算是另一个节点。

我个人习惯把节点想象成一个独立的小机器人——它有名字,有自己的任务,还能跟其他小机器人聊天。创建节点很简单:

# Python示例
import rclpy
from rclpy.node import Node

class LidarNode(Node):
    def __init__(self):
        super().__init__('lidar_driver_node')
        self.get_logger().info('激光雷达节点已启动!')

def main(args=None):
    rclpy.init(args=args)
    node = LidarNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

小技巧:节点命名要见名知意。我在项目中见过一堆叫node1、node2的,调试时简直想骂人。用lidar_driver、odometry_node这种名字,三个月后回头看还能秒懂。

2.1.2 话题(Topic)

话题是节点之间传递数据的通道。它是一种发布-订阅模式——发布者把数据扔到话题上,订阅者从话题上取数据。双方不需要知道对方是谁。

举个例子:激光雷达驱动节点发布/scan话题,里面装的是激光扫描数据。导航节点订阅/scan,拿到数据后做建图或定位。发布者和订阅者可以随时上线、下线,互不影响。

我曾经在一个项目中,需要同时让三个节点订阅同一个激光雷达话题——建图、避障、可视化。如果不用话题,你得写多少接口代码?ROS2一个话题全搞定。

概念 类比 特点
发布者 广播电台 只管发,不管谁在听
订阅者 收音机 只管收,不管谁在发
话题 频道频率 一对多,异步通信

2.1.3 服务(Service)

话题是单向流,服务是请求-响应模式。客户端发一个请求,服务端处理完返回结果。适合那些需要确认的场景,比如「帮我做个地图保存」或者「切换导航模式」。

说白了,话题适合高频数据流(激光雷达每秒10帧),服务适合低频指令(用户点个按钮)。

注意:不要在服务里做耗时操作。我曾经在服务回调里写了个文件保存,结果界面卡死5秒钟。服务讲究快进快出,耗时操作请另开线程。

2.2 激光雷达驱动配置

好了,概念讲完了,咱们来点实际的。把激光雷达接上电脑,让ROS2认识它。

2.2.1 常见激光雷达驱动

市面上常见的激光雷达品牌有思岚(RPLIDAR)、镭神、Velodyne、Ouster等。大部分厂商都提供了ROS2驱动包。以思岚A1/A2为例:

# 安装驱动
sudo apt install ros-humble-rplidar-ros

# 启动驱动
ros2 launch rplidar_ros rplidar.launch.py

启动后,你可以用ros2 topic list看看有哪些话题。正常情况下会看到/scan话题。

2.2.2 驱动配置要点

配置驱动时,有几个参数需要特别留意。我在项目中踩过不少坑,列出来给你参考:

  • 串口权限:Linux下默认用户没有串口权限。执行sudo chmod 666 /dev/ttyUSB0或者把用户加入dialout组。
  • 波特率:不同雷达不一样。RPLIDAR A1是115200,A2是256000。配错了就收不到数据。
  • 帧率:默认一般是5-10Hz。如果CPU吃紧,可以降到5Hz。
  • 坐标系:雷达的frame_id要设置正确,通常是laser_frame或base_laser。

避坑指南:我曾经在调试时,雷达明明在转,但rviz2里就是没点云。折腾了两小时,发现是串口被另一个进程占用了。用lsof /dev/ttyUSB0查一下,把占用的进程干掉就好了。

2.2.3 验证驱动是否正常工作

驱动启动后,用命令行验证数据流:

# 查看话题列表
ros2 topic list

# 查看话题频率
ros2 topic hz /scan

# 打印话题内容
ros2 topic echo /scan

如果/scan话题有数据输出,频率稳定,恭喜你,驱动配置成功了。

2.3 使用rviz2可视化点云数据

命令行看数据太抽象了。咱们用rviz2把点云变成图像,直观感受激光雷达「看到」的世界。

2.3.1 启动rviz2

ros2 run rviz2 rviz2

启动后是一个空白界面,需要手动添加显示组件。

2.3.2 配置rviz2显示点云

  1. 点击左下角「Add」按钮
  2. 选择「By topic」标签页
  3. 找到/scan话题,选择「LaserScan」类型
  4. 点击「OK」

这时候你应该能看到激光雷达扫描出来的点云了。如果看不到,检查一下Fixed Frame是否设置正确。在「Global Options」里把Fixed Frame改成laser_frame或你设置的frame_id。

个人经验:rviz2的配置可以保存成.rviz文件。下次启动时直接加载,省得每次重新配置。我一般把配置文件放在项目的config目录下。

2.3.3 点云数据解读

你看到的点云,每个点代表激光束打到障碍物上的位置。颜色通常表示距离——红色近,蓝色远。如果看到一圈均匀分布的点,说明雷达在正常工作。

嗯,这里要注意:如果点云出现大量「飞点」(孤立的、明显偏离的点),可能是雷达受到干扰或者物体表面反光太强。我在室内测试时,玻璃窗和镜面经常导致飞点。

2.3.4 保存点云数据

有时候需要把点云数据录下来,方便离线调试。ROS2提供了rosbag工具:

# 录制所有话题
ros2 bag record -a -o my_lidar_data

# 回放数据
ros2 bag play my_lidar_data

回放时,rviz2会像实时数据一样显示点云。这个功能在算法调试时特别有用——不用每次都搬着机器人跑来跑去。