ROS 2 核心概念
第 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)
动作是“长任务版的服务”,用于需要执行一段时间且可以取消、可以看到进度的任务。
一次动作调用包含三个阶段:
- 目标(Goal):告诉对方要做的事
- 反馈(Feedback):执行过程中持续收到进度
- 结果(Result):任务完成后的最终结果
特点:
- 长时间运行,可中途取消
- 执行期间持续反馈进度
典型场景:让机器人走到某个坐标点、让机械臂转到某个姿态。
6. 参数(Parameter)
参数是节点运行时可读取和修改的配置项。节点在启动时可以定义自己的参数(如背景色、速度上限),运行时通过命令行或其他节点修改,不必改代码。
例如 turtlesim 节点有背景色参数:background_r、background_g、background_b,运行中改掉,窗口立刻变色。
7. 命名空间(Namespace)
命名空间像文件夹一样,给节点和话题加一个前缀,避免不同机器人/模块之间的名字冲突。
例如两辆机器人同时运行,可以分别用 robot1/ 和 robot2/ 前缀区分:
/robot1/cmd_vel
/robot2/cmd_vel
话题、服务、参数等都可以位于命名空间下。名称最前面带 / 表示绝对路径。
8. 三种通信方式怎么选
| 通信方式 | 方向 | 持续时长 | 有无反馈 | 典型用途 |
|---|---|---|---|---|
| 话题 | 单向流动 | 持续 | 无 | 传感器数据、控制指令流 |
| 服务 | 一问一答 | 瞬时 | 只有结果 | 查询、触发一次性操作 |
| 动作 | 一问一答 | 长时间 | 有进度反馈、可取消 | 导航、机械臂运动 |
一句话总结:持续流动的数据用话题,一次性查询用服务,长时间可取消的任务用动作。
9. 补充:rclpy 与 rclcpp
ROS 2 的官方客户端库有两个主流版本:
- rclpy:Python 客户端库(本教程代码全部使用它)
- rclcpp:C++ 客户端库
两者功能完全对应,教程学会 Python 版后,换成 C++ 只是语法差异。
常见问题
| 问题 | 说明 |
|---|---|
| 节点、话题、服务有什么区别? | 节点是“程序”,话题/服务/动作是“通信方式”,参数是“配置项” |
| 一个节点能同时用多种通信方式吗? | 能,实际节点经常既发话题又提供服务和动作 |
| 话题数据会丢失吗? | 默认的 QoS 策略下,新订阅者只能收到订阅之后的消息,早期数据不会补发 |
练习题
- 给下面的场景选择通信方式:a) 摄像头每秒发 30 帧图像;b) 查询机器人当前电量;c) 让机器人送一杯咖啡到 3 号桌。
- 为什么机器人系统要把功能拆成多个节点,而不是写成一个巨型程序?
- 假设两个团队各自开发机器人底盘和激光雷达驱动,他们分别该用话题还是服务来共享数据?为什么?
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)