type
status
date
slug
summary
tags
category
icon
password
comment
color
这篇论文能发tpami,在我看来是他们将VLN问题的Zero-shot解法各个方面都族的做到了极致,也比较符合我所设想的方案,值得学习。
Intro
CA-Nav 通过两个核心模块持续地将子指令转换为导航规划:约束感知子指令管理器(CSM)和约束感知价值映射器(CVM)。
- CSM 将分解后的子指令的完成条件定义为约束,并以约束感知的方式切换子指令,从而跟踪导航进度。
- CVM 在 CSM 的约束指导下,在线生成价值图(value map),并通过超像素聚类对其进行优化,以增强导航的稳定性。

值得注意的一点是作者强调了两点,
- 连续环境中的视觉-语言导航(VLN-CE)通过允许智能体在 3D 环境中基于导航网格自由移动,缓解了对连通图等结构先验的依赖。
- 视觉-语言模型(VLMs)和大语言模型(LLMs)的发展使零样本 VLN成为可能,即利用基础模型执行导航任务而无需专家标注的训练数据。
CA-Nav 将 VLN-CE 重新表述为一个顺序的、具有约束感知的子指令完成过程。在每个 episode 中,约束感知子指令管理器(CSM)会将完整指令分解为子指令,并通过判断相应约束是否满足来动态切换子指令。与此同时,约束感知价值映射器(CVM)根据当前约束与观测构建并持续更新价值图,捕获视觉细节与空间结构。利用 CVM 生成的价值图,CA-Nav 制定导航计划,并由经典控制算法执行。整个迭代过程持续引导智能体逐一完成子指令,直到 episode 结束。

Method

核心总结:我们只要记住,CSM是用来做任务管理的,子任务的拆解,判断是否完成当前子任务。可以理解为任务管理器。而CVM是用来在执行子任务的时候选择接下来去哪里。
Constraint-aware Sub-instruction Manager (CSM)
指令分解
在每个 episode 开始时,CSM 将指令分解为一系列子指令。每条子指令都会描述当前阶段的目标,并给出切换到下一条子指令的约束条件。我们将这些约束分为三类:
- 对象约束(object constraints)(例如 “chair”);
- 位置约束(location constraints)(例如 “bedroom”);
- 方向约束(direction constraints)(例如 “turn left”)。
任务切换
CSM 始终选择队列中第一个尚未满足的约束集作为当前子指令,并且仅当该集合中的所有约束均被满足后,才切换到下一组。智能体在每一步都会检查当前集合中的每个约束。我们利用 VLM 与里程计信息来设计各类约束的满足检测方法:

Constraint-aware Value Mapper

约束感知价值图生成
随着导航的推进,我们维护并持续更新一张价值图,它同时编码了环境布局以及与指令相关的价值。
环境布局通过维护一张语义地图来捕获,并根据SemExp到可导航区域。



基于超像素的航路点选择

建图底层:
arxiv.org![arxiv.org]()
arxiv.org
快速SAM:
实验
个人感觉改到tpami的这个过程中好像添加了大量的实验。
R2R-CE 和 RxR-CE 分别在 11 个未见过的环境中提供了 1839 和 3669 条逐步标注的轨迹-指令对,其中 RxR-CE 具有更详细的指令和更长的轨迹。
- Navigation Error (NE):最终位置与目标之间的平均距离;
- Success Rate (SR):NE 小于 3 米的 episode 比例;
- Oracle Success Rate (OSR):使用 oracle 停止策略计算的 SR;
- Success weighted by Trajectory Length (SPL):依据轨迹长度对 SR 进行归一化;
- Normalized Dynamic Time Warping (NDTW):评估智能体轨迹与标注轨迹的一致性;
- Success-weighted Dynamic Time Warping (SDTW):在成功 episode 上对 NDTW 加权。
主要结果
R2R

如表 I 所示,我们的方法在 NE、SR 和 OSR 上均超过了多种使用全景图训练的模型。这表明,基于 LLM 和 VLM 构建自我中心(egocentric)的零样本 VLN-CE 系统是可行且具有潜力的。
然而,CA-Nav 的 SPL 略低于部分方法。这主要是因为在自我中心视角下,智能体获得的观测信息相较全景视角更加有限。因此,它需要更多步骤探索环境,从而稍微降低路径效率。相比之下,OpenNav 使用全景观测和 waypoint predictor,获得更丰富的信息,因此 SPL 更高。同样地,InstructNav 在全景视角下的 SPL 为 24,但当使用自我中心观测时下降到 11。因此,在自我中心视角设定下,CA-Nav 的 SPL 与其他方法相当。
总体而言,在自我中心观测设定下,CA-Nav 在 SR、NE 和 OSR 上达到了当前最优性能,并在 SPL 上取得了具有竞争力的结果。
RxR-CE Dataset

数据集的这些特性提高了任务难度,因为它们会导致更频繁的指令切换以及更复杂的约束识别。
尽管面临这些挑战,CA-Nav 仍展现出具有竞争力的性能,超过了多种使用全景观测训练的模型(如 LAW)以及使用自我中心观测训练的模型(如 WS-MGMap)。值得注意的是,CA-Nav 在 SR 与 NE 上均超越了 A2Nav,同时在 SPL 上保持竞争力。
Ablation study

考察八个方面:(1)不同约束的影响;(2)价值图更新方法;(3)基于超像素的航路点选择的有效性;(4)不同超像素尺寸的影响;(5)对子指令切换步数阈值的鲁棒性;(6)不同历史衰减因子的分析;(7)轨迹衰减因子的影响;(8)对不同 LLM 的泛化性。
不同约束的影响
我们首先研究 CA-Nav 在不同类型的约束下的性能,如表 III-1 所示。我们首先移除除最终子指令外的所有约束,使任务更类似于单目标导航,成功率相比最佳结果下降约 21%。接着,我们评估仅使用单一类型约束的情况,结果显示使用对象约束时提升最显著。
随后,我们探究两类约束组合的效果。当包含方向约束时(第 5、6 行),性能下降,尤其是 SPL。原因在于仅依赖方向约束而缺乏对象或位置约束,会导致过度探索,从而降低 SPL。
值得注意的是,当对象与位置约束结合使用时(第 7 行)性能显著提升,表明它们对有效导航贡献最大。只有同时具备对象与位置约束时,方向约束才变得有益,使智能体更好地遵循子指令并获得最优性能。
这进一步验证了 § IV-B 中的分析,即智能体在导航中更多依赖地标而非方向,这也解释了 CA-Nav 为什么优于 A2Nav。
通过合理设计约束并使用约束感知子指令管理器(CSM),我们的方法能够在长时序导航任务中自动切换子指令,不仅弥补了 VLFM [71] 无法处理序列任务的不足,还避免了频繁调用 LLM。
如何更好地更新价值图?
回顾 § III-C,我们在价值图生成中引入历史衰减机制以利用过往探索,并使用轨迹掩码促进探索。表 III-3 展示了其影响。
- 第 1 行:同时移除历史衰减和轨迹掩码,即每次切换约束均重置价值图 → 性能大幅下降(符合预期)。
- 第 2 行:移除轨迹掩码后性能下降,并出现智能体在走廊等狭窄空间“卡住”的现象,说明轨迹掩码确实促进探索。
- 第 3 行:移除历史衰减性能也较差,说明丢弃历史知识会迫使智能体重复探索已访问区域。
- 第 4 行:结合轨迹掩码与历史衰减,实现对探索与利用的平衡,从而达到最佳性能。
不同航路点选择方法的比较
为验证基于超像素的航路点选择方法的有效性,我们将其与 § III-C 中提到的基于 FBE 的方法进行对比,并额外加入像素级(Pixel-based)和 ORP-based 方法作对照。
- Pixel-based:直接选择价值图中价值最高的像素作为目标。
- ORP-based:先选择价值最高的区域,再选其中价值最高的像素作为航路点。
表 III-4 显示:
- 基于超像素的方法在 SR、NE、SPL 上均优于 FBE 与 Pixel-based 方法。
其原因包括:
- 价值图更新可能不均匀,FBE 易受到局部价值突变的影响(见 § IV-D)。
- 虽然价值图生成中用了置信度掩码进行加权,但轨迹掩码与历史衰减会影响图的平滑度。
ORP-based 的性能接近超像素方法,也明显优于 FBE 与 Pixel-based,说明对区域进行聚类有助于提升环境理解并实现更稳定的导航规划。
超像素尺寸的鲁棒性分析
超像素尺寸决定了航路点的细粒度程度。小尺寸带来更细的分辨率,大尺寸则区域更粗糙,可能影响准确导航。
我们测试了 4 种超像素尺寸,分辨率比为 5,即每个像素对应现实中的 5 cm × 5 cm。
表 III-7 显示:
- 25 × 25 较小超像素带来更低 NE 和更高 OSR,因为航路点更精准;
- 但 SR 降低,因为更易受价值图噪声影响;
- 100 × 100 过大时导航性能显著下降,尤其在面对小障碍或狭窄通道时易选不中精确区域。
结果表明:约 50 × 50 的超像素尺寸最平衡性能与鲁棒性。最终我们采用 48 × 48 作为默认尺寸。
定量与定性分析
经济性与低延迟

我们比较了 CA-Nav 与 NavGPT-CE 的响应速度与成本效率。响应速度方面,我们测量了两种方法执行每一步动作所需的时间:
- CA-Nav:包含 Grounding-DINO、BLIP2、地图构建、SLIC 与 FMM 的运行时间;
- NavGPT-CE:包含 caption 模型调用以及 LLM 调用的时间。
由于 CSM 能显著减少 GPT-4 的调用次数,CA-Nav 在两项指标上都优于 NavGPT-CE。
如图 5 所示:
- NavGPT-CE:每步约需 1.29 秒,每个 episode 成本约 $0.85;
- CA-Nav:每步仅需 0.45 秒,每个 episode 成本仅 $0.04。
因此,CA-Nav 的速度约为其 3 倍,成本为其 5%。
指令复杂度的影响
为分析指令复杂度对导航性能的影响,我们将 R2R-CE val-unseen 划分中的指令根据子指令数量分为 1 至 7 个区间。对于每一类别,我们统计成功与失败轨迹数量并计算成功率(SR)。

图 6 显示:
- 随着子指令数量增加,SR 整体呈下降趋势。
- 子指令越多,智能体需要执行更多动作与决策,导致错误累计的概率上升。
- 当子指令达到 5 条或以上时,SR 下降更为明显。
这个实验挺有意思的。我个人也非常赞同。子任务越多,错误累积的可能性就越大。比如我在第三个任务走入了错误的房间,因为没有纠错机制,后面的子任务肯定会一直错下去了。
约束完成度评估
为展示 CSM 模块的有效性,我们通过人工评估测量当前约束的完成情况。
- 从成功轨迹中选取 SPL 排名前 25 的轨迹,检查高质量轨迹是否具有更高的约束完成度;
- 从 oracle 成功集中随机抽取 25 条轨迹,评估那些到达真实目标但未正确停止的 episode 的约束完成情况;
- 对失败轨迹,为覆盖不同长度,分别从短、中、长轨迹各随机抽取 25 条。


导航可视化

失败分析

1. 仿真环境中的视觉重建误差
仿真环境的视觉不准确可能导致目标检测失败。渲染误差会改变物体外观,使检测模型错过或误判关键对象。
2. 目标检测模型的语义歧义
例如 GroundingDINO 等模型可能将视觉或语义上相似的物体混淆,从而导致错误导航决策。
示例:把 bar 误识别为 message table。
3. 位置识别失败
视觉语言模型(如 BLIP2 VQA)可能给出错误的场景判定,即使图像中存在明确线索,也可能未识别位置。例如:
- 即便画面中有明显的马桶,BLIP2 仍无法正确识别为“bathroom”,导致定位错误。
4. LLM 的指令约束分解错误
大型语言模型在解析或分解指令时偶尔会遗漏某些约束。
例如:
- 指令中包含“turn left at table clock”,
- 但 LLM 忽略了这条子指令,因此未提取对应的方向约束。
此类错误会破坏导航规划,导致智能体偏离目标路径。
真机实验

该机器人半径为 22.5 cm,高度为 137 cm。与仿真实验(§ III)一致,我们仍采用低层动作:MOVE FORWARD(0.25 m)、TURN LEFT/RIGHT(30°)、STOP。唯一的改动是:成功导航定义为机器人在目标 1 米范围内停止。
在航路点导航方面,我们继续使用 FMM(Fast Marching Method),而并未使用 ROS 导航包或其他训练的 PointNav 策略 [84]。线速度与角速度分别设为 0.1 m/s 和 0.1 rad/s。
为评估 CA-Nav 的有效性,我们在多种室内环境中进行实验,包括:休息区(lounge)、会议室(meeting room)、接待室(reception room)、入口大厅(entrance hall)和办公室(office),如图 9 所示。这些多样化环境用于测试方法对不同空间布局与语义场景的适应性。

总结
在本研究中,我们致力于为具有挑战性的零样本连续环境视觉-语言导航任务(zero-shot VLN-CE)开发一种全新的 约束感知导航器(Constraint-Aware Navigator)。为实现这一目标,我们提出了 约束感知子指令管理器(CSM) 和 约束感知价值映射器(CVM)。这两个模块协同工作,通过识别并适应每条子指令的约束,使智能体能够在未知环境中完成导航。
我们在仿真和真实环境中进行了大量实验,验证了该方法的鲁棒性与适应性。这些结果表明,CA-Nav 具有将仿真基准与真实世界应用相连接的潜力,为未来零样本导航任务的发展提供了一个有效框架。
局限性与未来工作
在自我中心(egocentric)设定下,智能体通常需要更多步骤探索环境,从而使 SPL 略低。构建一种能够预测当前视野之外环境的 导航世界模型(world model) 是一个潜在的改进方向。
此外,CA-Nav 的性能还受到当前感知模型缺陷的限制,导致在指令分解与约束检测方面的准确性不足,尤其是在处理长指令时。未来可以探索使用更强大的基础模型或对特定模块进行微调,以进一步提升系统性能。
代码
多进程运行设置
我之前还在思考设置到LLM推理的VLNCE代码如何多进程的跑,这里作者很聪明,先用LLM处理一边所有的任务,然后将回复都写入
LLM_REPLYS_VAL_UNSEEN。这样运行的时候就不涉及到LLM推理了。
run_mp.py中完成的多进程设置。为不同的进程配置数据集并分配GPU。程序入口
程序的入口在
ZS_Evaluator_mp.py中的eval函数,一共做了 4 件核心事:
- 设置配置参数
- 初始化 Habitat 环境
- 加载 GT 路径(用于 NDTW)
- 初始化模型(SAM + Mapping + Policy)
之后多个episode环做rollout,rollout就是程序的核心
重点关注
语义处理
我们注意到代码中的class包含base_class以及destination_class,base_class是程序默认检测的类别,destination_class是指令中的landmark。
在拿到obs之后,
_batch_obs→_preprocess_obs→_preprocess_state→_get_sem_pred→这里其实有一个疑点,我应该是只需要关注和当前指令有关的物体种类就行啊?为什么要预测这么多种?似乎是没有必要的,多检测出来的类别还会调用更多次SAM,耽误时间。
_preprocess_state 返回的变量是一个concat之后的图像(RGB+depth+self.detected_classes的类别)最后处理好的obs为一个变量
batch_obs [1, N ,120, 160]。N就是RGB+depth+self.detected_classes的数量,120与160,为480与640除4.语义地图的构建与更新
主要内容在mapping.py中,重点关注forward以及update_map函数。
地图每层的含义如下,其整体采用local map在global map上滑动更新的策略。
forward
- 从 Depth 得到 3D 点云
- 将点云变换到世界坐标系
- 将点云 + 语义 “splat” 成体素(voxel)
- 沿高度方向投影为 BEV 地图
- 得到当前一帧 bird’s-eye map(agent_view)
- 用当前 pose 将其对齐并融合进
local_map
update_map
- 在 local_map 中标记 agent 位置(channel 2,3)
- 将 local_map 写入 full_map 的一个窗口(lmb):
- 更新
full_pose
- 每隔 CENTER_RESET_STEPS:
- 重新计算 lmb
- 调整 origin
- 从 full_map 裁剪新的 local_map
- 保证 agent 始终位于 local_map 中心
roullout的逻辑
总体的思路如下
如何判断子任务完成
通过
constraints_monitor判断。核心代码都在constraint.py中。location_constraint
VQA(视觉问答)模型询问是否在某个场景中
object_constraint
与当前的目标检测做配对
direction_constraint
计算当前位姿与之前位姿的差
value map的更新
算是本文的一个核心,核心函数在
value_map.py中,forward中的_update_value_map,对应论文中的用blip计算当前视野与object之间的相似度部分。history map与direction map的作用
history map
它在地图上记录机器人走过的轨迹(history/footprint),而且会随着时间“变淡”,从而形成一张访问历史权重图。
值 | 含义 |
1.0 | 从来没走过 |
<1 | 走过,并被衰减过 |
→0 | 走过很多次 |
direction map
根据指令里的方向词(前/后/左/右),在地图上生成一个“重点鼓励前往的扇形区域”
self.floor以及self.traversible
floor 必须同时满足:
- 在 explored area 里(我已经看到它了)
- 不是 obstacle
- 不是 object
- 是 ground / navigable 类
traversible
这里完全没要求 "必须 explored"
也就是说:
✅ 即使你没有看到,只要它不在“已知障碍/物体”里
✅ 通过形态学处理后
✅ 就可能被认为是 “traversible”
如何选择下一个路点
- 这个策略融合了两个东西:
- SuperPixelPolicy:用超像素、价值图等信息,从地图中挑出“好”的探索 waypoint。(论文中主要介绍的超体素方法)
- search_destination:最后一个子任务的时候触发,进入目标点搜索模式。
- 然后用
FMMPlanner在traversible(可通行)地图上做最短路规划,得到短期目标点 stg,再根据当前朝向,输出一个离散动作。
如何处理楼梯问题
在
constant.py中,设置了。在前问所说的建立floor或者是traversible的时候,会自动将识别到的navigable_classes中的区域设置为可以通行。指令分解中的decision作用?
我想问的是拆分出的任务中的
move away,approach之类的咋用的,因为我确实也思考过这个问题。有些指令是让我经过某个物体,这就特别的麻烦。最好能有个move away之类的东西,不过确实也不好做。作者有个
_check_destination 函数,不过似乎没有任何地方调用过。个人评论
总的来说,这篇文章在ICLR被拒之后,添加了大量的实验,最后中了tpami,是有含金量在其中的。
我个人是很喜欢这种 子任务拆解 的方法,但是这种类型的方法存在以下不足
- 一步错,步步错,没有错误的纠正方法。导致子任务一多,错误率就高。
- 方法本身是提供了一种约束,其性能的主要提升来自于VLM模型的性能提升。方法设计者能做的很有限。往往会遇到一些人类看起来很蠢的错误案例。
- 这种方法的实时性很难保证,就像作者说的,0.45秒一个step,一个step只会前进0.25m。现实场景中的实时性很难保证。
我个人认为这种方法已经做到了zero shot中非常顶尖的状态,可以改进的空间似乎不大。
参考
openreview:https://openreview.net/forum?id=eWFkMCBySw
义父,请我喝杯蜜雪冰城吧。


- 作者:LIU Xiao
- 链接:http://liuxiao916.com/article/CA_Nav
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。






