第 1 章 ROS 2 核心概念

学习目标

  • 理解 ROS 2 的“图”式架构
  • 说清节点、话题、服务、动作、参数各自的角色
  • 知道什么时候该用话题、服务还是动作

1. ROS 2 是什么

ROS 2(Robot Operating System 2)是一套用于开发机器人软件的分布式通信框架。它不是一个操作系统,而是运行在操作系统(Linux/Windows/macOS)之上的一层软件框架,负责让机器人的各个“零件程序”互相通信、协同工作。

一个机器人系统里往往有几十个程序:控制底盘电机、读取激光雷达、做路径规划、处理摄像头画面……这些程序各自独立运行,又需要频繁交换数据。ROS 2 解决的问题就是:让这些程序能以统一、解耦的方式互相通信

ROS 2 程序运行时构成一个“计算图”(Graph)。图的每个节点负责一小块功能,节点之间通过“边”连接来通信。

2. 节点(Node)

节点是 ROS 2 中执行计算的最小单元。每个节点通常只负责一个单一职责,例如:

  • turtlesim 节点:模拟一只小乌龟
  • turtle_teleop_key 节点:读取键盘输入
  • 激光雷达驱动节点:读取传感器数据并发布

节点之间互相独立:一个节点崩溃不会拖垮整个系统,这就是“解耦”。多个节点还可以分布在多台电脑上,通过网络组建成一个更大的图。

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  teleop 节点 │    │  turtlesim  │    │  其他节点…   │
└──────┬──────┘    └──────┬──────┘    └─────────────┘
       │   发布 /cmd_vel   │
       └──────────────────→│

3. 话题(Topic)

话题是节点之间单向、异步、多对多的数据通道

  • 发送方叫发布者(Publisher),发送的数据叫消息(Message)
  • 接收方叫订阅者(Subscriber)
  • 消息类型用固定的“接口定义”描述,例如 geometry_msgs/msg/Twist(线速度/角速度)

特点:

  • 发布者发布消息时不需要知道谁在订阅,订阅者也不关心谁在发布
  • 一个话题可以有多个发布者和多个订阅者
  • 数据是持续流动的(例如传感器数据流)

典型场景:激光雷达数据、相机图像、底盘速度指令、里程计数据。

4. 服务(Service)

服务是节点之间一问一答的同步通信方式

  • 客户端(Client)发起请求(Request)
  • 服务端(Server)处理并返回响应(Response)
  • 一次性调用,调用完就结束

特点:

  • 严格的一问一答,适合“查询/命令”类操作
  • 响应是否到达是可以确认的

典型场景:查询电池电量、让乌龟瞬移(/spawn)、清空画布(/clear)。

5. 动作(Action)

动作是“长任务版的服务”,用于需要执行一段时间且可以取消、可以看到进度的任务。

一次动作调用包含三个阶段:

  1. 目标(Goal):告诉对方要做的事
  2. 反馈(Feedback):执行过程中持续收到进度
  3. 结果(Result):任务完成后的最终结果

特点:

  • 长时间运行,可中途取消
  • 执行期间持续反馈进度

典型场景:让机器人走到某个坐标点、让机械臂转到某个姿态。

6. 参数(Parameter)

参数是节点运行时可读取和修改的配置项。节点在启动时可以定义自己的参数(如背景色、速度上限),运行时通过命令行或其他节点修改,不必改代码。

例如 turtlesim 节点有背景色参数:background_rbackground_gbackground_b,运行中改掉,窗口立刻变色。

7. 命名空间(Namespace)

命名空间像文件夹一样,给节点和话题加一个前缀,避免不同机器人/模块之间的名字冲突。

例如两辆机器人同时运行,可以分别用 robot1/robot2/ 前缀区分:

/robot1/cmd_vel
/robot2/cmd_vel

话题、服务、参数等都可以位于命名空间下。名称最前面带 / 表示绝对路径。

8. 三种通信方式怎么选

通信方式 方向 持续时长 有无反馈 典型用途
话题 单向流动 持续 传感器数据、控制指令流
服务 一问一答 瞬时 只有结果 查询、触发一次性操作
动作 一问一答 长时间 有进度反馈、可取消 导航、机械臂运动

一句话总结:持续流动的数据用话题,一次性查询用服务,长时间可取消的任务用动作。

9. 补充:rclpy 与 rclcpp

ROS 2 的官方客户端库有两个主流版本:

  • rclpy:Python 客户端库(本教程代码全部使用它)
  • rclcpp:C++ 客户端库

两者功能完全对应,教程学会 Python 版后,换成 C++ 只是语法差异。

常见问题

问题 说明
节点、话题、服务有什么区别? 节点是“程序”,话题/服务/动作是“通信方式”,参数是“配置项”
一个节点能同时用多种通信方式吗? 能,实际节点经常既发话题又提供服务和动作
话题数据会丢失吗? 默认的 QoS 策略下,新订阅者只能收到订阅之后的消息,早期数据不会补发

练习题

  1. 给下面的场景选择通信方式:a) 摄像头每秒发 30 帧图像;b) 查询机器人当前电量;c) 让机器人送一杯咖啡到 3 号桌。
  2. 为什么机器人系统要把功能拆成多个节点,而不是写成一个巨型程序?
  3. 假设两个团队各自开发机器人底盘和激光雷达驱动,他们分别该用话题还是服务来共享数据?为什么?
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐