上一课 Service 标准答案

  1. /joint_states 是连续状态数据,更适合 Topic。

  2. “机械臂是否已经初始化完成?”属于一次询问、一次明确回答,更适合 Service。

  3. Service 两个角色:

Client
Server

Client 发请求,Server 处理并返回结果。

  1. Service Server 的 callback 比 Subscriber callback 多一个核心任务:

生成 Response 并返回给 Client。

  1. 补全:
Client
↓
Request
↓
Server callback
↓
Response
↓
Client

第 36 课:Action——机械臂/VLA 非常重要

现在进入一种比 Service 更适合机器人任务的通信方式:

Action

先问一个问题:

如果你让机械臂:

“移动到目标位置。”

它能瞬间完成吗?

不能。

可能需要:

0秒:收到目标
1秒:正在运动
2秒:运动70%
3秒:到达

所以这种任务既不是普通 Topic,也不太适合普通 Service。

因为它有三个特点:

任务需要时间
需要中途反馈
可能需要取消

这正是 Action。


1. Topic、Service、Action 一句话区别

Topic:

持续广播数据

例如:

/joint_states
/camera/image

Service:

请求一次 → 回答一次

例如:

“机器人Ready了吗?”
→
“Yes”

Action:

发一个目标
↓
执行一段时间
↓
持续反馈
↓
最后返回结果

比如:

“机械臂移动到位置A”

2. Action 有三个核心数据

这是你必须记住的。

Goal

目标:

我要你做什么?

例如:

目标关节角:
[30°, 20°, 10°, 0°, 40°, 15°]

Feedback

中途反馈:

你做到哪了?

比如:

进度30%
进度60%
当前关节角……

Result

最终结果:

最后成功还是失败?

例如:

Success

所以:

Goal
↓
Feedback
↓
Feedback
↓
Feedback
↓
Result

3. Action 的两个角色

类似 Service:

Action Client
Action Server

Client:

提交任务。

Server:

真正执行任务。

例如:

VLA / Planner
=
Action Client

机械臂轨迹控制器
=
Action Server

4. 机械臂例子

VLA 决定:

把物体抓起来

经过上层规划后,给机械臂一个运动目标:

Goal:
移动到抓取位姿

Action Server 开始执行:

Goal收到
↓
机械臂开始运动
↓
Feedback:当前位置
↓
Feedback:当前位置
↓
Feedback:当前位置
↓
到达
↓
Result:Success

如果突然需要急停:

Cancel

可以取消 Action。

这就是 Action 比普通 Service 强的地方。


5. 为什么不用 Service 做机械臂运动?

假设 Service:

Request:
“请移动到A”

然后……

等……
等……
等……

Response:
“完成”

中间你几乎没有天然的:

进度反馈
取消机制
长期任务状态

Action 就专门解决这个问题。

所以简单记:

很快完成的一问一答
→ Service

需要几秒甚至几分钟、需要进度/取消
→ Action

6. Action 和 spin 什么关系?

仍然没有换核心机制。

Action Server 也会产生各种事件:

收到Goal
收到Cancel
发送Feedback
完成Result

这些事件仍然需要 ROS2 执行器处理。

所以还是:

spin
↓
发现Action相关事件
↓
执行对应callback

你会发现 ROS2 的底层思维非常统一:

Topic事件
Timer事件
Service事件
Action事件
↓
Executor / spin
↓
callback

这就是我们为什么之前一直在学 callback。


7. Action 放到 VLA 里特别自然

未来你可能有:

VLA
↓
决定“抓红色方块”
↓
机器人任务规划
↓
Action Client发送Goal
↓
机械臂Action Server执行
↓
不断反馈执行状态
↓
成功/失败

例如:

Goal:
移动到抓取位姿

Feedback:
距离目标还有8cm
距离目标还有3cm
距离目标还有0.5cm

Result:
Success

VLA 系统就可以根据:

Success / Failed

决定下一步动作。


8. Topic / Service / Action / Timer 总表

机制用途有没有回应/反馈
Topic连续数据流不要求回应
Timer周期触发任务不是通信
Service一次请求-响应一个最终Response
Action长时间任务Feedback + Result + Cancel

而:

spin / Executor

负责:

调度这些机制产生的 callback。


本课小练习

  1. “摄像头连续发送图片”应该用 Topic、Service 还是 Action?

  2. “查询一次机械臂是否 Ready”应该用什么?

  3. “让机械臂执行一条持续 5 秒的轨迹,并希望看到进度”应该用什么?

  4. Action 最重要的三个东西分别是什么?

  5. spin() 与 Action 是否还有关系?为什么?

下一课我们会进入 第 37 课:ROS2 Executor 到底是什么,以及 spin() 和 Executor 的真正关系。

因为你现在已经把:

Subscriber
Timer
Service
Action
callback

都放进来了,再继续只说“spin 是调度员”就不够准确了。

Logo

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

更多推荐