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

上一课 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 是调度员"就不够准确了。

相关推荐
无名猿1 小时前
锁进阶:atomic_flag 自旋锁、shared_mutex 读写锁与无锁的代价
c++·性能优化·并发编程·现代c++
谢亮_vipxieliang1 小时前
Go 接口设计原则核心知识点
开发语言·ios·golang
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Feign 替代 RestTemplate 实现声明式远程调用
java·开发语言·spring cloud
谢亮_vipxieliang1 小时前
Go 结构体与方法集核心知识点
java·开发语言·golang
ra90fy1 小时前
B3873 [GESP202309 六级] 小杨买饮料
c++·算法
郝学胜-神的一滴1 小时前
Numpy数据处理详解 01:NumPy 从环境搭建到入门上手
开发语言·人工智能·python·程序人生·数据分析·numpy
尘客-追梦1 小时前
qmake / jom / 影子构建:把编译管起来
开发语言·c++·qt
Ai-_Man1 小时前
从聊天框到正式文档:AI导出鸭瞄准AI大模型应用的“最后一公里”
开发语言·前端·javascript·人工智能·小程序
EatFan1 小时前
2026 Java 后端面试风向变了:八股文只是门槛,场景化追问才是淘汰线
java·开发语言·jvm·面试·后端面试·八股文·full gc