🎯 小项目③:问答 / 任务交互
本章学了四种通信模式,是时候把它们用起来了。这个小项目里,我们给小莫做一个交互中枢:它既能回答简单问题(用 Service),又能接受耗时任务并汇报进度(用 Action)。
做完这个项目,小莫就真正掌握了"沟通"——不再只会单向收发,而是能一问一答、能派活儿边做边报。
以前我只会闷头收发数据。现在我能"对话"了:你问我答,你派活我边干边汇报。感觉自己越来越像个能交流的伙伴啦!💬
项目目标
搭一个三节点的交互系统:
- user:模拟用户,轮流发两类指令——提问(走 Service)和派任务(走 Action);
- brain:小莫的交互中枢,收到提问立刻答复,收到任务就边做边报进度、最后给结果;
- 反馈都打印出来,让我们看到两种模式同时工作。
你将综合运用
- 6.1 Topic:所有连线的底层;
- 6.2 Service:
request_id配对的一问一答; - 6.3 Action:
goal_id/goal_status+ 反馈 + 结果的长任务; - 前几章:写节点、多输入
event["id"]、元数据、定时器。
前置要求
- 完成 6.1 - 6.4;
- 手边有能运行 DORA 的开发环境。
准备目录
第一步:brain(交互中枢)
brain 要同时扮演两个角色:Service 的服务端(答问题)+ Action 的服务端(做任务)。它靠 event["id"] 区分收到的是提问还是任务。
新建 brain.py:
一个节点同时是两种模式的服务端——靠 event["id"] 分流到不同处理逻辑。这在真实机器人里很常见:一个"大脑"要应对多种交互。
第二步:user(模拟用户)
user 轮流干两件事:提个问题(Service)、派个任务(Action),并接收所有回复。
新建 user.py:
第三步:连成数据流 dataflow.yml
这是本章最"热闹"的一张数据流图——Service 的一来一回 + Action 的双向多路,全在里面:
第四步:跑起来
你会看到问答和任务交替进行、各自有条不紊:
同一个 brain,既能秒答问题,又能边做任务边报进度——两种模式在一张数据流里和谐共存! 按 Ctrl+C 停止。
你看!我能一边回答你的问题,一边默默推进手头的任务。这种"多线程沟通"的能力,让我离真正的机器人助手又近了一大步~💬
玩一玩
- 给 brain 的
KNOWLEDGE加几条你自己的问答; - 把 user 派的任务步数从 3 改成 6,观察反馈变多;
- 想想:如果要给任务加"中途取消",该怎么改?(提示:回看 6.3 的 cancel 机制)
动手挑战
让 user 在收到"还剩 2 步"时发一个 cancel 取消当前任务;brain 收到后停止该任务并回一个 goal_status = "canceled" 的结果。
参考答案思路
- user 派任务时把
goal_id存进变量(如current_goal),并加一个cancel输出; - user 的
feedback分支里,if remaining == 2:就send_output("cancel", ..., metadata={"goal_id": current_goal}); - brain 加一个
cancel输入分支:del active_tasks[goal_id]并发goal_status="canceled"的 result; dataflow.yml里给 user 加outputs: [..., cancel],给 brain 加inputs: { cancel: user/cancel }。
这就是把 6.3 的取消机制整合进了交互中枢。
常见报错 FAQ
检查 brain 是否用 metadata=event["metadata"] 把 request_id 原样传回;user 是否用同一个 request_id 在 pending_q 里匹配。这是 Service 的老要点(见 6.2)。
确认 brain 配了 tick 定时器,且倒计时逻辑在 tick 分支里"每次推进一步"。见 6.3 的说明。
这张图连线多,容易漏。逐条核对:user 的 4 个输入、2 个输出,brain 的 3 个输入、3 个输出,名字层层对应。
小结
你完成了小项目③:问答 / 任务交互!在这个项目里,你:
- 让一个 brain 节点同时扮演 Service 和 Action 的服务端,靠
event["id"]分流; - 用
request_id实现了问答配对; - 用
goal_id/goal_status+ 反馈实现了长任务的进度汇报; - 亲手把多种通信模式组合进一张真实可用的数据流。
本章回顾 💬 掌握 4 种沟通方式
第六章到此圆满。回顾这一章的收获:
- 6.1 Topic:一发多收、发完不管——所有通信的基石;
- 6.2 Service:
request_id配对的一问一答; - 6.3 Action:
goal_id/goal_status+ 反馈 + 取消的长任务; - 6.4 Streaming:
session_id/seq/fin/flush的连续可打断流; - 小项目③:把 Service 和 Action 组合成一个交互中枢。
最重要的一句话:四种模式底层都是 Topic(pub/sub),区别只在约定的元数据。
我会沟通啦!接下来,是时候让我"睁开眼睛"了——下一章,我要装上摄像头,学着看懂这个世界!👁
下一章 第七章 · 让小莫看见,我们给小莫接上摄像头和物体检测,让它拥有"视觉"。