本章标志着我们从传统的几何导航(”到坐标 (x,y,z)“)向真正智能的语义导航(”帮我从厨房拿回那个昨天新买的蓝色马克杯”)的范式飞跃。我们将深入探讨如何让机器人理解并执行包含开集(Open-Vocabulary)目标的自然语言指令,这是实现通用人机交互的基石。学习目标包括:精通利用视觉-语言模型(VLM)进行开放词汇目标定位(Grounding)的核心算法与陷阱;掌握将复杂的语言约束(如空间、时间、偏好)融入代价地图与路径规划器的量化方法;设计处理指令歧义的对话澄清与状态管理机制;并构建能够处理中断、恢复和优先级排序的多轮任务执行栈。本章旨在为您提供一套完整的、从语言理解到物理执行的算法蓝图,是构建 VLA 大脑“语言中枢”的关键章节。
开集识别的本质,是让机器人摆脱预定义类别(['chair', 'table', 'cup'])的束缚,转而理解世界本身的概念多样性。其核心是利用基础模型学到的广阔世界知识,在具体场景中定位任意语言短语所指代的像素区域。
核心算法:提议-对齐-过滤 (Propose-Align-Filter) 框架
这是一个两阶段(或三阶段)的处理流程,兼顾了效率与精度。
阶段一:候选区域生成 (Candidate Proposal) 这一步的目标是快速、无类别偏见地从图像中分割出所有潜在的“物体”或“区域”。其产出质量直接决定了后续定位的上限。
阶段二:视觉-语言对齐与评分 (Vision-Language Alignment & Scoring) 这一步将语言指令与视觉候选区进行匹配,找出最契合的那个。
T,图像 I,以及候选区域集 \mathcal{R} = \{R_1, R_2, ..., R_n\}。目标是找到最佳匹配区域 R^*:
\(R^* = \arg\max_{R_i \in \mathcal{R}} \text{sim}(E_T(\text{prompt}(T)), E_I(\text{crop}(I, R_i)))\)
其中:
E_T 和 E_I 分别是 VLM 的文本和图像编码器(例如 CLIP 的 encoders)。\text{crop}(I, R_i) 是从图像 I 中根据区域 R_i 裁剪出的图像块。\text{prompt}(T) 是对文本进行包装,以提升匹配效果,例如使用模板 “a photo of a {T}”。\text{sim}(\cdot, \cdot) 通常是余弦相似度。[Find(object='lamp', name='anchor'), Find(object='book', name='candidate'), Check_Relation(subject='candidate', object='anchor', relation='left_of')]。ASCII 图解:复杂指令的分解执行
User: "the book left of the lamp"
|
V
+-------------------+
| VLA Brain (LLM) | --> Decomposes into a plan
+-------------------+
|
V
+-------------------------------------------------------------+
| Plan: |
| 1. Ground('lamp') -> bbox_lamp |
| 2. Ground('book') -> {bbox_book1, bbox_book2, ...} |
| 3. For each bbox_book_i: |
| If is_left_of(bbox_book_i, bbox_lamp): return book_i |
+-------------------------------------------------------------+
|
V
Execution Engine -> Robot Action
S_{max} 必须大于一个预设阈值 T_{abs}(例如 0.7)。如果 S_{max} < T_{abs},则认为目标在当前视野中不存在。S_{max} 必须显著高于次高分 S_{second},即 (S_{max} - S_{second}) > T_{rel}(例如 0.1)。如果差值过小,则进入下一节的“歧义处理”流程。导航的智能不仅体现在“能到”,更体现在“怎么到”。语言是表达复杂通行规则的理想载体。我们将这些规则“编译”到机器人能够理解的代价地图上。
核心算法:语义代价层叠加 (Semantic Costmap Layering)
语言到掩码的转换:首先,使用上一节的开集识别技术,将语言描述的区域(如“地毯”、“木地板”)在机器人当前或历史的观测中分割出来,形成语义掩码 M_{sem}。
约束类型与实现:
M_{sem} 覆盖的所有栅格 c 的代价值设为无穷大或一个极大的数 COST_{FORBIDDEN}。∀c ∈ M_{sem}, C(c) = 。M_{sem} 覆盖的栅格 c 的基础成本 C_{base}(c)(通常与离障碍物距离有关)进行加权调整。∀c ∈ M_{sem}, C(c) = C_{base}(c) + w_{sem} \cdot \Delta C_{sem}。
\Delta C_{sem} 是一个基础成本调整量。w_{sem} 是权重,w_{sem} > 0 表示厌恶(增加成本),w_{sem} < 0 表示偏好(降低成本)。\Delta C_{sem} 的值应与基础代价图的值域相匹配。例如,如果基础成本范围是 [0, 254],一个 \Delta C 设为 50 就足以产生显著影响,但又不会压倒性的覆盖避障需求。P 后,系统需要估算其执行时间 T_{est}(P)。T_{est}(P) = \int_{s \in P} \frac{1}{v(s)} ds,其中 v(s) 是路径上每一点的预期速度。T_{est}(P) > T_{limit},则该路径无效。规划器需要重新规划,或者通知用户任务不可行。架构:多层代价地图 (Layered Costmap) 一个鲁棒的系统通常会维护一个由多个图层叠加而成的代价地图。
+---------------------------+
| Final Costmap | (Planner uses this)
+---------------------------+
^
| (Additive Combination)
+------------+------------+
| Layer 3: Semantic | (e.g., avoid carpet)
+-------------------------+
| Layer 2: Social | (e.g., keep distance from humans)
+-------------------------+
| Layer 1: Static Map | (e.g., walls, furniture)
+-------------------------+
| Layer 0: Live Obstacles| (e.g., from LiDAR/Depth)
+-------------------------+
总成本公式:
\(C_{total}(c) = \alpha C_{static}(c) + \beta C_{obstacle}(c) + \gamma C_{social}(c) + \sum_{i} w_i C_{sem, i}(c)\)
其中 \alpha, \beta, \gamma, w_i 是各层的权重,提供了巨大的灵活性来调整机器人的行为“性格”。
一个无法处理歧义的机器人是危险且不可靠的。当指令不明确时(“拿那个瓶子”,而桌上有三个),系统必须有能力请求澄清。
核心算法:歧义检测与澄清对话生成
S_1, S_2, ..., S_k。S_1 > T_{abs} 且 (S_1 - S_2) < T_{rel},则触发歧义处理流程。这意味着至少有两个候选者都“很有可能”是目标,且它们之间的区分度不。R_i,使用一个 VQA 模型或一个多模态大模型进行“反向提问”,以挖掘其独有属性。VQA(I, R_i, "What color is this object?") -> “It is red.”VQA(I, R_i, "What is this object next to?") -> “It is next to the laptop.”VQA(I, R_i, "What type of cup is this?") -> “It is a mug.”"I see a few potential targets. Are you referring to the {description_1}, the {description_2}, or something else?""我看到了几个瓶子。您是指那个红色的,还是靠近笔记本电脑的那个?"AWAITING_CLARIFICATION 状态。
T_new = "the red bottle",然后重新执行 11.2 的定位流程。这次应该只有一个明确的胜出者。备选策略:子目标探索 (Subgoal Exploration) 在非交互式场景下,机器人可以并行地为每个可能的候选目标规划路径,然后选择一个“最优”的去执行,例如路径最短、或成功率估计最高的那个。这是一种高风险的探索性策略,适用于容错率高的任务。
真实世界的任务往往是多步骤的,并且可能被随时打断。VLA 大脑必须具备类似操作系统的进程管理能力。
核心算法:基于栈的任务规划与执行 (Stack-based Task Planning & Execution)
[
{"task": "GOTO", "params": {"destination": "study"}},
{"task": "CHECK_STATE", "params": {"object": "study_light", "state": "on"}, "on_false": "PUSH_TASK"},
{"task_to_push": {"task": "SET_STATE", "params": {"object": "study_light", "state": "on"}}},
{"task": "FIND_AND_PICKUP", "params": {"object": "glasses"}},
{"task": "GOTO", "params": {"destination": "living_room_sofa"}},
{"task": "PLACE", "params": {"object": "glasses"}}
]
GOTO("study") 被执行。POP 该任务。CHECK_STATE,如果灯是关的,它会把 SET_STATE 任务 PUSH 到栈顶。SET_STATE,机器人执行开灯。POP,继续执行原来的计划。PUSH 到执行栈的顶部。当前的 FIND_AND_PICKUP 任务被暂停(其状态,如已搜索过的区域,需要被保存)。POP 掉。机器人会自然地恢复到之前被中断的 FIND_AND_PICKUP 任务。处理语言指令意味着处理潜在的敏感数据。必须从算法设计之初就融入隐私保护原则,即“隐私设计(Privacy by Design)”。
GOTO([PERSON]'s [LOCATION])。本章系统地构建了从语言理解到能执行的完整算法链条,使 Humanoid 能够处理开放、复杂且符合人类习惯的导航任务。