上一课 Service 标准答案
-
/joint_states是连续状态数据,更适合 Topic。 -
"机械臂是否已经初始化完成?"属于一次询问、一次明确回答,更适合 Service。
-
Service 两个角色:
Client
Server
Client 发请求,Server 处理并返回结果。
- Service Server 的 callback 比 Subscriber callback 多一个核心任务:
生成 Response 并返回给 Client。
-
补全:
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。
本课小练习
-
"摄像头连续发送图片"应该用 Topic、Service 还是 Action?
-
"查询一次机械臂是否 Ready"应该用什么?
-
"让机械臂执行一条持续 5 秒的轨迹,并希望看到进度"应该用什么?
-
Action 最重要的三个东西分别是什么?
-
spin()与 Action 是否还有关系?为什么?
下一课我们会进入 第 37 课:ROS2 Executor 到底是什么,以及 spin() 和 Executor 的真正关系。
因为你现在已经把:
Subscriber
Timer
Service
Action
callback
都放进来了,再继续只说"spin 是调度员"就不够准确了。