跳到正文
EMBODIED INTELLIGENCE · 世界模型与长任务

技能会做一件事,编排负责让事情接得上

抓取、移动和放置各自能成功,并不意味着组合后能可靠完成任务。行为树组织条件和执行顺序,技能接口承载目标、反馈与结果;真正难的部分是异步运行、状态过期、取消确认和失败后的资源收尾。

机械臂搬运方块,周围的观察、接近、搬运和放置图景由编排面板连接;等待中的阶段与已完成的任务不是一回事。
直觉总览:机械臂搬运方块,周围的观察、接近、搬运和放置图景由编排面板连接;等待中的阶段与已完成的任务不是一回事。 生成插画不承载精确结构、尺寸或安全保证,正文机制图为准。 查看原图 ↗
01 · 不是函数串起来就结束

运行中是一种真实状态,不是失败,也不是成功

餐厅里,厨师说“已经开始煮面”,服务员不能立刻上菜;也不能每问一次进度,就重新下锅一份面。机器人技能同样需要区分开始请求、持续执行和最终结果。

行为树 BT(Behavior Tree)用树状结构组织任务控制流。根节点收到一次 tick,即一次调度检查;控制节点决定检查哪些子节点,叶节点读取条件或执行动作。按 BehaviorTree.CPP 的基本语义,运行回调返回 SUCCESS(成功)、FAILURE(失败)或 RUNNING(仍在运行)。节点生命周期还可涉及空闲状态,不能把这三个返回值理解为完整设备状态机。

技能第一次被调度时可以提交动作请求,之后返回 RUNNING 并读取同一个请求的进度。若每次 tick 都提交新目标,夹爪可能反复启动,运动目标也可能互相抢占。异步节点的回调应及时交还调度,不要在内部阻塞到整段轨迹结束;否则上层无法及时检查其他条件。

状态取决于合同

“移动技能成功”通常表示它自己的运动条件成立,不自动代表物体仍然在夹爪里。复合任务要用额外后置条件验证目标;底层返回成功和环境事实不一致时,要保留这份矛盾作为故障证据。

02 · 两种组合语法

顺序节点要全部成功,候选节点找到一个成功即可

Sequence(顺序节点)按顺序推进:子节点成功才继续,失败就停止向后执行,运行中就等待它推进。Fallback(候选回退节点,也称 Selector)按优先级尝试:子节点失败才换下一个,成功就结束,运行中不能当作失败跳过。它们的组合比一长串自然语言更容易检查“失败会走到哪里”。

Sequence
├─ Fallback
│  ├─ IsHoldingTarget?       观察到目标已稳定夹持
│  └─ Sequence
│     ├─ LocateTarget       定位目标
│     ├─ GraspTarget        尝试抓取
│     └─ IsHoldingTarget?   重新验证
├─ MoveToContainer         搬运到容器
├─ Release                 释放
└─ IsObjectSettledInBox?    验证最终任务结果
这是职责示意,不是可直接加载的 BehaviorTree.CPP XML。IsHoldingTarget 必须检查目标身份和夹持证据,而非只检查夹爪闭合;停止、超时与独立安全监督另行配置。

第一层 Fallback 先看目标是否已经在手里。如果确实夹持,就跳过再次抓取;否则执行定位与抓取,再验证夹持。无论走哪条分支,只有确认目标在手中,才允许进入搬运。最后的入盒检查保证“释放命令完成”不会被当作任务完成。

这里也藏着一个常见错误:把“失败后清理资源”放到普通 Sequence 的最后。当抓取失败,顺序节点已返回,末尾清理根本不会执行。收尾逻辑需要独立设计,并保留原任务的失败结果;不能因为成功关闭了界面或释放了锁,就把整项任务改报成功。

03 · 条件会过期

曾经检查过,不代表现在还成立

假设树先检查“通道空闲”,再执行一个持续数秒的搬运。普通 Sequence 在子动作返回 RUNNING 时,下次通常继续检查那个运行中的子动作,不会自动重查前面的所有条件。把关键监测写在前面,并不意味着它会持续生效。

BehaviorTree.CPP 4.8 区分普通 Sequence、带记忆的 SequenceWithMemory 与反应式 ReactiveSequence 等节点。反应式顺序会从前面的条件重新检查,适用于条件变化需要中断后续动作的情况;代价是此前节点会反复被调用,因此前面应放可重复的检查,不能不加区分地放有副作用的“重新抓一次”。

“反应式”也不是硬实时安全承诺。树多久被调度、回调是否阻塞、取消如何传到控制器、设备多久停下,都会影响结果。已运行的动作被树 halt(停止调度)后,底层物理动作是否停止,取决于节点实现和设备协议。独立保护不应依赖语言模型或同一个可能阻塞的执行线程。

时间预算 · 独立教学设定

10 Hz 调度不等于 100 ms 内已经停稳

10 Hz 对应 100 ms 周期。若条件刚好在一次检查后改变,仅等待下次检查就可能接近 100 ms;还要加传感延迟、调度抖动、取消处理和机械制动。这个周期只能解释一项等待来源,不能用来宣称设备停止时间。

04 · 异步任务合同

目标、反馈与结果应该各有位置

  1. 提交有身份的目标

    记录请求标识、对象、坐标系、单位、有效期和资源归属。

  2. 确认是否接收

    拒绝与接受分开;接收只说明进入服务端处理,并不表示完成。

  3. 接收进度与取消状态

    更新同一请求的反馈;超时先核实状态,不凭缺少响应启动重复动作。

  4. 读取终态并验收

    成功、终止或取消均要记录;必要时继续验证环境与资源状态。

参照 ROS 2 Action 的目标—反馈—结果分工,补充应用层的对象、时效和验收合同。这些额外字段与策略需要开发者实现,不是通信接口自动提供的安全保证。

ROS 2 Action为耗时操作区分 Goal(目标)、Feedback(进度反馈)与 Result(结果),并定义接收、执行、取消中及终态。取消请求被接受之后可能进入 CANCELING,最终 CANCELED 是另一件事。因此“已发送取消”“已接受取消”“设备已达到预期停止状态”必须分开记录。

网络超时尤其容易制造重复动作:客户端没收到结果,但服务端可能仍在执行。请求身份、结果查询与应用层去重可以帮助消除歧义,却不意味着任意网络条件下自动拥有“恰好一次”物理执行。重启后也不要盲目重放命令;先确认机器人状态、物体位置、旧请求是否仍活跃,再决定恢复路径。

若语言规划器接在上层,它只应从允许的技能及参数范围中选择。资源冲突、坐标变换、超时和保护不能由一段自由文本兜底。技能可以换成学习策略或传统控制器,但接口合同和结果证据仍然需要保持。

05 · 看失败路径是否也正确

用事件序列验证编排,不只播放成功演示

至少设计四类测试:抓取运行三次调度后才成功,确认只启动一次;抓取失败,确认搬运没有启动;取消被接受但未结束,确认新动作没有抢用同一资源;旧目标的延迟结果到达,确认不会误更新新目标。每次记录时间、请求标识、节点状态、观测来源与状态新鲜度。

这类逻辑测试只能证明给定事件序列下的编排行为。还要在仿真与设备上验证真实时序、资源清理和停止语义。进入失败恢复时,恢复动作本身也要作为受约束、可能失败的技能,而不是写一个“忽略错误继续”的分支。

KNOWLEDGE CONNECTIONS

把这一层放回完整机器人

返回具身智能知识地图,或沿本专栏继续展开:

RESEARCH LEDGER

一手来源与证据边界

优先使用论文、官方文档、官方模型卡和代码仓库。页面中的数字只代表来源所述设置,不自动外推到其他模型与数据。