在这里插入图片描述

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 服务器”节点发送目标,后者确认目标并返回反馈流和结果。

在这里插入图片描述

通信流程底层逻辑:

  1. Client 调用 async_send_goal(goal) → 发出 Goal Request
  2. Server 收到 Goal Request 后,判断是否可以执行,通过后返回 Goal Response = Accepted
  3. Client 收到 Goal Response = Accepted 后,内部自动调用 async_get_result() 发送 Result Request
  4. Server 收到 Result Request,不会立刻回应,而是把"有人在等结果"这件事记下来
  5. 同时,Server 返回 Goal Response = Accepted 后,开始处理 Goal 的任务,期间发 Feedback、更新 Status
  6. 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               # 状态描述
Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐