2. ROS2核心概念与环境搭建:节点、话题、服务、动作的概念,ROS2 Humble安装与工作空间配置

各位同学,欢迎来到ROS2自动驾驶实战的第一站。

说实话,很多初学者一上来就急着写代码、跑仿真,结果连节点和话题都分不清,后面调试起来一头雾水。我个人习惯是,先把核心概念吃透,再动手搭环境。这就像盖房子,地基没打好,后面全是坑。

这一章,咱们就聊聊ROS2的四个核心概念——节点、话题、服务、动作,然后手把手把ROS2 Humble装好,再把工作空间配明白。嗯,内容不少,但都是硬货。

2.1 核心概念:ROS2的“四驾马车”

ROS2的通信机制,说白了就是这四种模式。你想想看,一辆自动驾驶的车,传感器要发数据,控制器要收指令,规划模块要请求路径——这些通信需求,正好被这四种模式覆盖了。

2.1.1 节点(Node)

节点是ROS2中最基本的执行单元。每个节点负责一个具体的功能,比如“激光雷达驱动节点”、“路径规划节点”、“车辆控制节点”。

我刚开始做项目时,喜欢把所有功能写在一个大程序里。后来发现,改一个地方就得重新编译整个项目,太痛苦了。ROS2的节点机制,说白了就是“高内聚、低耦合”——每个节点独立运行,互不干扰。

  • 特点:每个节点是一个独立的进程,可以单独启动、停止、调试。
  • 命名:每个节点有唯一的名称,比如 /lidar_driver、/path_planner。
  • 生命周期:节点可以配置为“未配置→未激活→激活→失活”等状态,方便管理。
我的小技巧:给节点命名时,尽量用有意义的英文单词,别用拼音。我在项目中见过有人用 /ceshi_jiedian,后来维护的人根本看不懂。

2.1.2 话题(Topic)

话题是ROS2中最常用的通信方式,属于“发布-订阅”模式。一个节点发布消息到某个话题,其他节点订阅这个话题就能收到消息。

举个例子:激光雷达节点不断发布点云数据到 /scan 话题,路径规划节点订阅 /scan 话题,就能实时拿到环境数据。

  • 异步通信:发布者和订阅者不需要同时存在,发布者只管发,订阅者只管收。
  • 多对多:一个话题可以有多个发布者和多个订阅者。
  • 数据类型:每个话题有固定的消息类型,比如 sensor_msgs/msg/LaserScan。
避坑指南:我曾经在实车调试时,发现激光雷达数据时有时无。查了半天,原来是话题名称拼写错了——发布的是 /scan,订阅的是 /scann。多了一个n,数据就丢了。所以,话题名称一定要仔细核对。

2.1.3 服务(Service)

服务是一种“请求-响应”模式,适合需要即时返回结果的场景。比如,你让车辆“查询当前电量”,车辆必须立刻回复“电量80%”。

  • 同步通信:客户端发送请求,服务器处理并返回响应,期间客户端会等待。
  • 一对一:一个服务只能由一个服务器提供,但可以有多个客户端调用。
  • 典型场景:获取地图、设置参数、触发某个动作。

你想想看,如果用电量查询用话题来做,那你就得一直订阅一个“电量话题”,不断接收数据。但服务就简单了——需要的时候问一句,拿到结果就完事。

2.1.4 动作(Action)

动作是ROS2里最“高级”的通信方式,专门用于长时间执行的任务。比如“车辆从A点导航到B点”,这个过程可能需要几十秒甚至几分钟。

  • 三阶段:目标(Goal)→ 反馈(Feedback)→ 结果(Result)。
  • 可取消:执行过程中,客户端可以随时取消任务。
  • 典型场景:路径跟踪、机械臂抓取、车辆泊车。
我的经验:在自动驾驶项目中,动作用得非常多。比如“自动泊车”这个动作,车辆需要一边移动一边反馈“还剩多少距离”,最后告诉你“停好了”或者“失败了”。用动作来实现,逻辑非常清晰。

2.2 知识体系总览

下面这张图,把ROS2的核心概念和它们之间的关系串起来了。你可以把它当作本章的“地图”,后面学起来会更有方向感。

节点 (Node) 话题 (Topic) 发布/订阅 服务 (Service) 请求/响应 动作 (Action) 目标/反馈/结果 ROS2 核心通信机制:节点通过话题、服务、动作进行交互

2.3 ROS2 Humble 安装

好,概念讲完了,咱们来点实际的。ROS2 Humble 是目前最稳定的版本之一,也是我们课程的主力版本。我建议你直接用 Ubuntu 22.04,兼容性最好。

2.3.1 安装步骤

  1. 设置语言环境:确保系统支持 UTF-8。
  2. 添加 ROS2 源:把官方软件源加到系统里。
  3. 安装 ROS2 Humble:推荐安装桌面版(Desktop),包含常用工具和可视化库。
  4. 配置环境变量:把 ROS2 的 setup 脚本加到 .bashrc 里。
核心命令:
# 安装 ROS2 Humble Desktop
sudo apt update
sudo apt install ros-humble-desktop

# 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:安装过程中可能会遇到依赖冲突。我曾经在旧系统上装 ROS2,结果因为 Python 版本不对,折腾了一下午。建议你直接用 Ubuntu 22.04 的干净系统,能省很多事。

2.3.2 验证安装

装完之后,跑一个简单的例子试试:

# 启动一个发布者节点
ros2 run demo_nodes_cpp talker

# 再开一个终端,启动订阅者节点
ros2 run demo_nodes_cpp listener

如果能看到“Hello World”在终端里来回传,说明安装成功了。

2.4 工作空间配置

工作空间(Workspace)是 ROS2 开发的基本单位。说白了,就是一个文件夹,里面放着你的代码、依赖和编译产物。

2.4.1 创建工作空间

# 创建工作空间目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

# 编译空工作空间
colcon build

编译完成后,你会看到 build、install、log 三个文件夹。别慌,这是正常的。

  • src:放你的源代码。
  • build:编译中间文件,不用管。
  • install:编译产物,相当于安装后的程序。
  • log:编译日志,出错了可以来这里查。

2.4.2 配置环境变量

每次打开新终端,都要 source 一下工作空间的环境,否则系统找不到你的节点。

echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
我的习惯:我会在 .bashrc 里加一行注释,比如 # ROS2 workspace,这样以后换工作空间时,一眼就能找到位置。

2.5 本章小结

这一章,咱们把 ROS2 的四个核心概念捋了一遍:节点是执行单元,话题是广播式通信,服务是问答式通信,动作是带反馈的长任务。然后亲手装了 ROS2 Humble,配好了工作空间。

说实话,这些内容看起来简单,但真正用起来,你会发现每个概念都有它的设计哲学。比如为什么要有动作?因为话题和服务搞不定长时间任务。为什么节点要独立?因为方便调试和复用。

嗯,基础打牢了,后面咱们就可以开始写真正的自动驾驶代码了。

课后小练习:
  1. 用 ros2 node list 和 ros2 topic list 查看当前系统中的节点和话题。
  2. 创建一个新的工作空间,并在 src 目录下创建一个简单的 Python 节点,发布“Hello ROS2”到 /hello 话题。
可可精品资料库