【ROS2】动作通信机制 Action
·

ROS1 系列教程(总目录)
ROS2 系列教程(总目录)
ROS2 系列教程源码、学习群
一、通信框架
1.1 基本介绍
Action 是 ROS2 中专为长时间运行的任务设计的,它结合了 Service 的请求-响应模式和 Topic 的持续数据流,提供了:
- Goal(目标):客户端发送的任务请求
- Feedback(反馈):执行过程中的实时进度
- Result(结果):任务最终完成状态
Action 基于 Topic 和 Service 构建,功能与Service类似,但Action可以取消。此外,它提供持续的反馈,而Service只返回一次响应。
Action 底层由 5 个通信通道组成:3 个 Service + 2 个 Topic。
| 通道 | 类型 | 方向 | 用途 |
|---|---|---|---|
/send_goal |
Service | Client → Server | 提交目标,Server 返回是否接受 |
/cancel_goal |
Service | Client → Server | 取消目标 |
/get_result |
Service | Client → Server | 最终结果(含状态) |
/feedback |
Topic | Server → Client | 任务执行中的周期性反馈 |
/status |
Topic | Server → Client | 所有 Goal 的状态变更通知 |
Action 服务启动后,可以使用如下指令查看底层通道(默认隐藏,需要加参数显示):
ros2 service list --include-hidden-services
ros2 topic list --include-hidden-topics
查看结果示例(其中 fibonacci 为 Action 名字):
$ ros2 service list --include-hidden-services
/fibonacci/_action/cancel_goal
/fibonacci/_action/get_result
/fibonacci/_action/send_goal
$ ros2 topic list --include-hidden-topics
/fibonacci/_action/feedback
/fibonacci/_action/status
1.2 基本通信流程
Actions 使用客户端-服务器模型,类似于发布者-订阅者模型。“Action 客户端”节点向“Action 服务器”节点发送目标,后者确认目标并返回反馈流和结果。

通信流程底层逻辑:
Client调用async_send_goal(goal)→ 发出 Goal RequestServer收到 Goal Request 后,判断是否可以执行,通过后返回 Goal Response = AcceptedClient收到 Goal Response = Accepted 后,内部自动调用async_get_result()发送 Result RequestServer收到 Result Request,不会立刻回应,而是把"有人在等结果"这件事记下来- 同时,
Server返回 Goal Response = Accepted 后,开始处理 Goal 的任务,期间发 Feedback、更新 Status Server执行完成后,用之前缓存的 Result Request 返回 Result Response
如果任务耗时且需要实时进度,则适合使用Action。
Action 典型应用场景:
机器人导航 → "去厨房" (Goal) → "距离5m..." (Feedback) → "已到达" (Result)
机械臂控制 → "转到90°" (Goal) → "当前45°..." (Feedback) → "到位" (Result)
图像处理 → "识别物体" (Goal) → "处理50%..." (Feedback) → "结果" (Result)
系统校准 → "校准传感器" (Goal) → "第3/5步..." (Feedback) → "完成" (Result)
任务调度 → "执行任务A" (Goal) → "子任务2/5..." (Feedback) → "完成" (Result)
二、Action 与 Topic 、 Service
2.1 场景适用对比
| 场景 | Topic | Service | Action |
|---|---|---|---|
| 传感器数据流 | √ | × | × |
| 一次性查询 | × | √ | × |
| 导航到目标点 | × | 无进度 | √ |
| 机械臂运动 | × | 无进度 | √ |
| 文件下载/处理 | × | 无进度 | √ |
2.2 通信机制特性对比
| 特性 | Topic | Service | Action |
|---|---|---|---|
| 通信模式 | 发布-订阅 | 请求-响应 | 目标-反馈-结果 |
| 方向 | 单向(多对多) | 双向(一对一) | 双向(一对一) |
| 同步/异步 | 异步 | 同步 | 异步 |
| 持续性 | 持续数据流 | 一次性 | 持续到完成 |
| 进度反馈 | × | × | √ |
| 可取消 | × | × | √ |
| 执行时间 | 无限制 | 应短(<1s) | 可长 |
| 典型频率 | 10~1000Hz | 按需 | 按需 |
三、Action 消息定义
Action 消息定义在 .action 文件中,三个部分用 --- 分隔:
# Goal —— 客户端发送的目标内容
<类型> <字段名>
---
# Result —— 服务端返回的最终结果
<类型> <字段名>
---
# Feedback —— 服务端发布的实时反馈
<类型> <字段名>
一个控制机械臂的action示例:
# Goal
float64 target_angle # 目标角度 (弧度)
float64 speed # 速度因子 (0.1~2.0)
---
# Result
bool success # 是否成功
float64 final_angle # 最终角度
float64 elapsed_time # 耗时(秒)
string message # 描述信息
---
# Feedback
float64 current_angle # 当前角度
float32 progress_percent # 进度百分比
string status # 状态描述
更多推荐



所有评论(0)