InternVLA-N1双系统视觉语言导航

一句话

把「听懂导航指令」和「脚下怎么走」拆成两个系统:慢的 System 2 用 7B 视觉语言模型在图上指出下一步该去哪;快的 System 1 用扩散策略每秒几十次生成避障轨迹。中间不用含糊的像素点,而用学出来的 潜在计划;只在仿真训,真机可零样本换轮式 / 四足 / 人形。
关键词

任务 :VLN · VLN-CE · VLN-PE · VLA

方法 :InternVLA-N1 · 双系统 · Pixel Goal · Latent Plan · 分层 VLN

模块 :Qwen2.5-VL · Grounding · NavDP · Depth Anything · MPC · Wan2.1 · Flow Matching · Q-Former · DiT

数据 :InternData-N1 · R2R

指标:SR · SPL · NE · OSR


0. 论文结构(先看目录)

技术报告不长(正文约 17 页),按「问题 → 数据 → 方法 → 实验」写:

章节 在干什么
§1 Introduction 旧方法把语言直接映射成离散短动作,慢且碎;提出慢思考 + 快执行
§2 Related Work VLN、视觉导航策略、导航 VLA 三条线
§3 InternData-N1 自己造的大规模仿真数据集:VLN-N1 / VLN-CE / VLN-PE
§4 Approach 双系统架构、两阶段训练、潜在计划、世界模型扩展
§5 Experiments System 2、System 1、双系统、世界模型、真机
§6 Conclusion 开源模型 / 数据 / 代码
Appendix A 作者贡献(按姓氏字母序)

读法建议:先 §4 方法,再 §3 数据,最后 §5 数字。 §1 把「为什么不能端到端直接出动作」讲清楚了,适合新人。

和 DualVLN 别混

本文读的是 2025-09 技术报告 。ICLR 2026 正式论文 Ground Slow, Move Fast (DualVLN)另有精读;开源权重 InternVLA-N1-DualVLN 把 System 1 换成 RGB-only 的 NextDiT / Flow Matching。


1. 背景概念

VLN(Vision-Language Navigation,视觉语言导航):听一句人话(「出卧室,直行,楼梯口右转进左边浴室」),边看相机画面边走到目标。

以前常见两条路:

  1. 离散短动作:每一步只选「前进 0.25 m / 左转 15° / 右转 / 停」。像下棋只能走一格,路径碎,大模型推理也慢。
  2. 模块化导航:建图 → 全局规划 → 局部避障。链路长、误差叠、换机器人要重调。

这篇借用 Kahneman 的快慢脑比喻:

  • System 2(慢系统):想清楚「下一站在画面哪」。约 2 Hz。
  • System 1(快系统):脚下怎么走才不撞人。约 30 Hz。

中间接口先是图上的点(Pixel Goal),再升级成一组神经网络向量(Latent Plan)。

Grounding(视觉接地) 不是电路接地:就是「这句话对应图上哪一块」。问「红杯子在哪」,模型在图上点一下,就是 grounding。System 2 把「下一步路点」也当成这种指一指。


2. 论文在干什么

痛点

  • 连续环境基准(VLN-CE)上,很多「基础模型」仍只预测离散短动作,跟不上动态障碍。
  • 桌面操作里的双系统(Helix、GR00T、Hi Robot)面对的是「桌面全看得见」;导航是部分可观测:机器人边走边看,还要记长指令。
  • 用二维像素当目标会歧义(同一个像素对应远近不同的 3D 点);7B 模型同步推理会拖慢 System 1。

贡献

  1. 开源双系统导航基础模型:S2 像素/潜在规划 + S1 扩散执行。
  2. 课程式两阶段训练:先各自用显式像素目标预训练,再冻住 S2、用潜在计划做异步联合微调。
  3. InternData-N1:3000+ 场景、5350 万第一人称图、约 4839 km、80 万条指令。
  4. 六个基准 SOTA(自称提升 3%--28%);仿真训、真机零样本跨本体;长程 >150 m,决策 >30 Hz。

3. 方法原理

3.1 整体数据流

#mermaid-svg-XayqdBkmaB4YqP6N{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XayqdBkmaB4YqP6N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XayqdBkmaB4YqP6N .error-icon{fill:#552222;}#mermaid-svg-XayqdBkmaB4YqP6N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XayqdBkmaB4YqP6N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XayqdBkmaB4YqP6N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XayqdBkmaB4YqP6N .marker.cross{stroke:#333333;}#mermaid-svg-XayqdBkmaB4YqP6N svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XayqdBkmaB4YqP6N p{margin:0;}#mermaid-svg-XayqdBkmaB4YqP6N .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XayqdBkmaB4YqP6N .cluster-label text{fill:#333;}#mermaid-svg-XayqdBkmaB4YqP6N .cluster-label span{color:#333;}#mermaid-svg-XayqdBkmaB4YqP6N .cluster-label span p{background-color:transparent;}#mermaid-svg-XayqdBkmaB4YqP6N .label text,#mermaid-svg-XayqdBkmaB4YqP6N span{fill:#333;color:#333;}#mermaid-svg-XayqdBkmaB4YqP6N .node rect,#mermaid-svg-XayqdBkmaB4YqP6N .node circle,#mermaid-svg-XayqdBkmaB4YqP6N .node ellipse,#mermaid-svg-XayqdBkmaB4YqP6N .node polygon,#mermaid-svg-XayqdBkmaB4YqP6N .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XayqdBkmaB4YqP6N .rough-node .label text,#mermaid-svg-XayqdBkmaB4YqP6N .node .label text,#mermaid-svg-XayqdBkmaB4YqP6N .image-shape .label,#mermaid-svg-XayqdBkmaB4YqP6N .icon-shape .label{text-anchor:middle;}#mermaid-svg-XayqdBkmaB4YqP6N .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XayqdBkmaB4YqP6N .rough-node .label,#mermaid-svg-XayqdBkmaB4YqP6N .node .label,#mermaid-svg-XayqdBkmaB4YqP6N .image-shape .label,#mermaid-svg-XayqdBkmaB4YqP6N .icon-shape .label{text-align:center;}#mermaid-svg-XayqdBkmaB4YqP6N .node.clickable{cursor:pointer;}#mermaid-svg-XayqdBkmaB4YqP6N .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XayqdBkmaB4YqP6N .arrowheadPath{fill:#333333;}#mermaid-svg-XayqdBkmaB4YqP6N .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XayqdBkmaB4YqP6N .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XayqdBkmaB4YqP6N .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XayqdBkmaB4YqP6N .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XayqdBkmaB4YqP6N .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XayqdBkmaB4YqP6N .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XayqdBkmaB4YqP6N .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XayqdBkmaB4YqP6N .cluster text{fill:#333;}#mermaid-svg-XayqdBkmaB4YqP6N .cluster span{color:#333;}#mermaid-svg-XayqdBkmaB4YqP6N div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XayqdBkmaB4YqP6N .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XayqdBkmaB4YqP6N rect.text{fill:none;stroke-width:0;}#mermaid-svg-XayqdBkmaB4YqP6N .icon-shape,#mermaid-svg-XayqdBkmaB4YqP6N .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XayqdBkmaB4YqP6N .icon-shape p,#mermaid-svg-XayqdBkmaB4YqP6N .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XayqdBkmaB4YqP6N .icon-shape .label rect,#mermaid-svg-XayqdBkmaB4YqP6N .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XayqdBkmaB4YqP6N .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XayqdBkmaB4YqP6N .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XayqdBkmaB4YqP6N :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 底层
System 1 · 约 30 Hz
System 2 · 约 2 Hz
输入
语言指令
历史 RGB 约 10 帧
当前 RGB-D
Qwen2.5-VL 7B
像素目标 或 STOP / 原地转
可学习 latent queries → 潜在计划
目标条件扩散策略
多条短时轨迹 + 安全分
MPC / 运控 约 200 Hz

直觉:S2 像领航员在地图上圈「下一个路口」;S1 像司机看挡风玻璃实时打方向。领航员不必每秒说话,司机用上一句指令继续开。

3.2 System 2:Qwen2.5-VL 要训,而且是整网微调

骨干是已经在海量图文上预训练好的 Qwen2.5-VL 7B。它本来就会 grounding:问「杯子在哪」就吐像素坐标。

不是「抽特征再接一个小 head」

论文写得很明确:视觉编码器、跨模态连接器(merger)、语言模型 全部一起做监督微调(SFT)一整轮 。输出仍是 文本 token(坐标数字、STOP、转向符号),不是在冻住的 Qwen 上面另接回归头。

Grounding 在这里指什么 :把指令里的「下一站」落到当前画面的 (u,v)(u,v)(u,v)。和电气接地无关。Qwen 预训练已经会指物体;本文把同一能力用到「最远可见路点」。

本文把高层规划写成 最远可见像素目标:

  1. 输入:第一人称图像序列 + 指令。
  2. 输出:当前画面上一个 2D 坐标 = 下一步该去的路点投影。
  3. 额外职责:任务完成时输出 STOP;画面里看不到合适路点时原地转(可先低头再看)。

为什么不直接预测「前进/左转」?因为「指到图上某处」更贴近 VLM 已有的 grounding,也给 S1 留下连续轨迹空间。

S2 怎么训(Stage 1)

项 内容
起点 Qwen/Qwen2.5-VL-7B-Instruct 官方权重
数据 InternData-N1 的 VLN-CE 子集:按可见性切 clip,把 3D 路点投到图像当标签,500 万+ 样本
监督 下一 token 预测:assistant 该输出 234 447 或 STOP / 转向
谁更新 tune_mm_vision / mlp / llm = True(InternNav 脚本)
论文配方 1 个 epoch 全量 SFT
DualVLN 附录 AdamW,lr 2×10−52\times 10^{-5}2×10−5,batch 128 段对话,约 1.4 万 step ;视觉塔可用更小 lr(脚本里 vision_tower_lr=5e-6)

Prompt 在代码里(internvla_n1_policy.py):

You are an autonomous navigation assistant. ... Please output the next waypoint's coordinates in the image. Please output STOP when you have successfully completed the task.

Stage 2 还训 S2 吗? 主体 冻住 (tune_mm_* = False)。新加的只有一组 latent queries(prompt tuning):插在序列末尾,用它们的 hidden state 当 S1 条件。7B 不再回传梯度,以免把已经学会的 grounding 冲掉。

3.3 System 1:结构、Depth Anything、三损失

本技术报告的 S1 接近 NavDP(RGB-D + 扩散 + critic)。InternNav 后来的 DualVLN 权重把生成头换成 RGB-only 的 NextDiT / Flow Matching,骨干仍常用 Depth Anything 的 ViT。下面以本报告为主。
#mermaid-svg-x4UUjsPiP6UVNzHg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-x4UUjsPiP6UVNzHg .error-icon{fill:#552222;}#mermaid-svg-x4UUjsPiP6UVNzHg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-x4UUjsPiP6UVNzHg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-x4UUjsPiP6UVNzHg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-x4UUjsPiP6UVNzHg .marker.cross{stroke:#333333;}#mermaid-svg-x4UUjsPiP6UVNzHg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-x4UUjsPiP6UVNzHg p{margin:0;}#mermaid-svg-x4UUjsPiP6UVNzHg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster-label text{fill:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster-label span{color:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster-label span p{background-color:transparent;}#mermaid-svg-x4UUjsPiP6UVNzHg .label text,#mermaid-svg-x4UUjsPiP6UVNzHg span{fill:#333;color:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg .node rect,#mermaid-svg-x4UUjsPiP6UVNzHg .node circle,#mermaid-svg-x4UUjsPiP6UVNzHg .node ellipse,#mermaid-svg-x4UUjsPiP6UVNzHg .node polygon,#mermaid-svg-x4UUjsPiP6UVNzHg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-x4UUjsPiP6UVNzHg .rough-node .label text,#mermaid-svg-x4UUjsPiP6UVNzHg .node .label text,#mermaid-svg-x4UUjsPiP6UVNzHg .image-shape .label,#mermaid-svg-x4UUjsPiP6UVNzHg .icon-shape .label{text-anchor:middle;}#mermaid-svg-x4UUjsPiP6UVNzHg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-x4UUjsPiP6UVNzHg .rough-node .label,#mermaid-svg-x4UUjsPiP6UVNzHg .node .label,#mermaid-svg-x4UUjsPiP6UVNzHg .image-shape .label,#mermaid-svg-x4UUjsPiP6UVNzHg .icon-shape .label{text-align:center;}#mermaid-svg-x4UUjsPiP6UVNzHg .node.clickable{cursor:pointer;}#mermaid-svg-x4UUjsPiP6UVNzHg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-x4UUjsPiP6UVNzHg .arrowheadPath{fill:#333333;}#mermaid-svg-x4UUjsPiP6UVNzHg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-x4UUjsPiP6UVNzHg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-x4UUjsPiP6UVNzHg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x4UUjsPiP6UVNzHg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-x4UUjsPiP6UVNzHg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x4UUjsPiP6UVNzHg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster text{fill:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg .cluster span{color:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-x4UUjsPiP6UVNzHg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-x4UUjsPiP6UVNzHg rect.text{fill:none;stroke-width:0;}#mermaid-svg-x4UUjsPiP6UVNzHg .icon-shape,#mermaid-svg-x4UUjsPiP6UVNzHg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-x4UUjsPiP6UVNzHg .icon-shape p,#mermaid-svg-x4UUjsPiP6UVNzHg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-x4UUjsPiP6UVNzHg .icon-shape .label rect,#mermaid-svg-x4UUjsPiP6UVNzHg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-x4UUjsPiP6UVNzHg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-x4UUjsPiP6UVNzHg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-x4UUjsPiP6UVNzHg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 辅助头
两个头
视觉编码
输入
当前 RGB
当前 Depth(NavDP 变体)
目标:点 / 图像 / 像素 mask / 后期 latent
Depth Anything 的 RGB ViT · 预训练加载
ViT 从零训 · 融图像目标
ViT 从零训 · 融像素 mask
扩散头:噪声 → 短时相对轨迹
Critic 头:给轨迹打安全分 · 不看目标
MLP:从图像/像素编码预测点目标

和 Depth Anything 的关系

  • S1 不是「Depth Anything 深度图 → 再规划」这么一条简单链。
  • 论文:S1 除 DepthAnything 的 RGB 编码器外,全部从零训练。
  • 代码:build_depthanythingv2() 加载 DepthAnythingV2,取出 .pretrained ViT 当 rgb_model。它在单目深度任务上见过几何,当 S1 的眼睛;深度头可以不用。
  • 相机深度:NavDP 式 S1 仍吃 RGB-D;像素目标则先画成 mask MgM_gMg(目标附近为 1),再和当前 RGB 进从零训的 ViT。

动作扩散怎么学

扩散像「从一团噪声里洗出一条轨迹」:

  1. 仿真里已有示教相对位姿序列 x0x_0x0(接下来几米怎么走)。
  2. 加噪声得到 xkx_kxk,网络 ϵθ\epsilon_\thetaϵθ 预测噪声(或 DualVLN 里预测速度场)。
  3. 损失 Lact\mathcal{L}_{\text{act}}Lact:预测与真噪声的 MSE。推理时从纯噪声逐步去噪,一次可采样多条候选轨(真机 TensorRT 并行 32 条约 0.03 s)。

Critic 怎么学

示教全是「不撞的好轨」,网络不会自己怕墙。NavDP / 本 S1:

  1. 把示教轨随机旋转、插值,造出可能擦墙的负样本。
  2. 用仿真全局 ESDF 算每个路点离障碍多远,做成安全分标签。
  3. Critic 看局部视觉 + 这条轨,回归安全分。推理时不看目标,只比哪条更安全。

真机没有 ESDF:critic 必须从 RGB-D 泛化出「这条看起来会撞」。

目标对齐怎么理解

三种目标说法不一样:点目标 (x,y,θ)(x,y,\theta)(x,y,θ) 最不含糊;图像目标是一张图;像素目标是 (u,v)(u,v)(u,v),深度不确定。

对齐 = 逼图像编码、像素编码都能还原出同一个点目标:

Lgoal=1N∑i∥MLP(zimg)−pg∥2+1N∑i∥MLP(zpix)−pg∥2 \mathcal{L}{\text{goal}} = \frac{1}{N}\sum_i \lVert \mathrm{MLP}(z{\text{img}}) - p_g \rVert^2 + \frac{1}{N}\sum_i \lVert \mathrm{MLP}(z_{\text{pix}}) - p_g \rVert^2 Lgoal=N1i∑∥MLP(zimg)−pg∥2+N1i∑∥MLP(zpix)−pg∥2

直觉:先学会「无论你用照片还是用手指点,我都理解成地面上同一个点」,再在这个空间上做扩散,比三种目标各学各的要容易。这是 辅助损失 ,推理时不必真的输出 pgp_gpg。

总损失(α=0.8, β=0.2, γ=0.5\alpha=0.8,\ \beta=0.2,\ \gamma=0.5α=0.8, β=0.2, γ=0.5):

Lsystem1=αLact+βLcritic+γLgoal \mathcal{L}{\text{system1}} = \alpha \mathcal{L}{\text{act}} + \beta \mathcal{L}{\text{critic}} + \gamma \mathcal{L}{\text{goal}} Lsystem1=αLact+βLcritic+γLgoal

S1 预训练数据:VLN-N1 子集。

3.4 两阶段课程训练与资源

Stage 1:分开预训练(同步、显式目标)

  • S2:上一节的全量 SFT,学会「指令 → 像素路点」。
  • S1:动作扩散 + critic + 目标对齐。

此时两套级联已经能跑 VLN,但有两个硬伤:像素歧义、S2 太慢导致 S1 干等。

Stage 2:联合微调(异步、潜在计划)

  • 冻住 S2 的 vision / merger / LLM。
  • 插入可学习 latent queries(DualVLN 附录默认 4 个;Qwen hidden 3584 维,再投影到 768 给 S1)。
  • 不用整段 VLM hidden(太杂),只用 query 对应的紧凑特征。
  • 故意错开时间 :S1 看当前 TTT;S2 的 RGB 记忆从 (0,T−K)(0,T-K)(0,T−K) 采样,KKK 在 (0,12)(0,12)(0,12) 随机。逼 S1 判断「这个计划走完没有」。

为什么换成潜在计划

一个像素对应一条射线,远近不确定。潜在向量可以编码「往哪、多远、过没过」,且 S1 不必等 S2 每个字生成完。

训练 / 推理资源(报告没写 GPU·小时,下面把论文 + 开源脚本分开写)

阶段 算什么 规模直觉
造数据 仿真出轨迹 单机约 5 万条/天;全集 5350 万图
S2 SFT 7B 全开 论文 1 epoch ;脚本 train_system2.sh:8 节点 × 8 卡 、DeepSpeed ZeRO-2、每卡 batch 2 → 全局 128;lr 2×10−52\times 10^{-5}2×10−5
S1 预训练 NavDP 式小模型 脚本示例单机 8 卡、batch 16/卡、epoch 可到千级(NavDP 配置);除 DA 骨干外从零训
联合微调 冻 7B,训 queries + S1 脚本 train_dual_system.sh 同样 64 卡 量级;冻 tune_mm_*=False;lr 1×10−41\times 10^{-4}1×10−4;DualVLN 写约 1.5 万 step、batch 128
世界模型 1.3B Wan2.1 可选扩展,不是主控;加速联合微调 4→2 epoch
推理 整模部署 论文:一块 RTX 4090,约 20 GB;S2+KV 约 0.7 s;S1 TensorRT 0.03 s

7B 全量微调不是 4090 练着玩的量级;开源配方按 几十张 GPU 写。单卡 4090 够 跑 开源权重,不够按官方配方从零复现 S2。

3.5 扩展:Wan2.1 世界模型与「T5 文本条件」

把 S2 的潜在计划接到 1.3B Wan2.1(视频生成基础模型)。

T5 文本条件是什么 :Wan2.1 原版用 T5 (Text-To-Text Transfer Transformer,谷歌的文本编码器)把一句提示词编成向量,告诉视频模型「生成什么样的画面」------这叫 text condition(文本条件)。没有这句话,模型不知道该演厨房还是马路。

本文 拆掉 T5,把条件换成 System 2 的 latent plan tokens:不再输入「走向橙色雕塑再上楼」这句人话,而是输入 S2 已经想好的计划向量。微调后,模型生成「如果按这个计划走,第一人称会看到什么」的视频。

作用:

  1. 视频预测逼 latent 里装空间信息(走错了画面会对不上)。
  2. 联合微调从 4 个 epoch 降到 2 个 就到 R2R-CE 最优。
  3. 为以后用互联网视频预训练留口子。
  4. 不是 真机控制器:机器人不播这段视频,只拿它当训练正则。

4. 数据:InternData-N1

单机一天约 5 万条导航轨迹。总表(论文 Table 1):3154 场景、4839.9 km、1344 小时、5350 万图、80 万指令。动作同时有轨迹和关节级。

子集 怎么造 解决什么
VLN-N1 Replica / MP3D / Gibson / 3D-Front / HSSD / HM3D;ESDF + A* 规划 → 平滑 → BlenderProc 渲染;LLaVA-OneVision 字幕 + Qwen3-72B 改写/汇总 场景多样、域随机,泛化
VLN-CE Habitat 重放 R2R/EnvDrop/ScaleVLN;离散四动作;切 clip 并投影像素标签 细指令、给 S2 对齐
VLN-PE InternUtopia 物理仿真;AlienGo / H1 / G1 / Jetbot + 学习式运控跟路径;去掉上下楼 缩小 sim-to-real

VLN-N1 指令流水线:按急转弯等几何切 sub-clip → 细指令 → 再汇总成长指令 → 过滤(Landmark 多、空旷少)。过滤后约 21 万条轨迹。


5. 实验结论

5.1 System 2 / 双系统 · VLN-CE Val-Unseen

指标:NE 越小越好;SR / SPL / OSR 越大越好。成功 = 停在目标 3 m 内。

方法 观测 R2R SR R2R SPL RxR SR RxR SPL
NaVILA† 单 RGB 54.0 49.0 49.3 44.0
InternVLA-N1 (S2)† 单 RGB 55.4 52.1 49.5 41.8
InternVLA-N1 (S1+S2)† RGB-D 58.2 54.0 53.5 46.1

S1 接上后 R2R / RxR 的 SR 再涨约 2.8 / 4.0 个点:规划对了还要会躲障碍、走连通。

5.2 System 1 局部导航(Isaac Sim)

四类场景:ClutterEnv Easy/Hard、InternScenes Home/Commercial。任务:无目标探索、点目标、图像目标(成功半径 1 m)。

相对 NoMaD / ViPlanner 等:

  • 杂乱探索碰撞表现约 2.7×
  • 复杂室内连通点目标 SR +10.9%
  • 远距离图像目标平均 +27.1%

5.3 物理仿真 VLN-PE(Unitree H1)

模型没有用 H1 的 VLN-PE 数据微调,零样本从 VLN-CE 迁过去。

物理运控(会摔倒、会卡住):

  • InternVLA-N1 Unseen SR 50.63 / SPL 43.31
  • NaVid 零样本 SR 22.42 / SPL 18.58
  • 相对 NaVid:SR +20.21 、SPL +17.22

Flash 控制器(瞬移到目标点、几乎不摔):Unseen SR 60.36。说明去掉动力学后规划本身更强。

额外指标:Fall Rate(摔倒率)、Stuck Rate(卡住率)。

5.4 真机

  • 本体:Turtlebot4、Go2、G1;相机 RealSense D455,高度不同但都下倾 15°。
  • 推理:远程 RTX 4090,整模约 20 GB。
  • 速度:S2 多轮对话复用 KV Cache,轨迹 token 约 1.1 s → 0.7 s;S1 TensorRT 并行 32 条轨迹约 0.03 s。
  • 轨迹变到世界系后用 MPC 跟踪(原理见上文 §3.1:滚动优化速度,不理解语言)。
  • 成功条件:不撞静/动态障碍 + 经过地标 + 停在目标。
  • 对比 CMA / NaVid / NaVILA / StreamVLN:走廊、卧室、办公室 20 次/场景。离散动作模型怕行人;本模型动态场景 SR / NE 更好。

要点总结

  • 导航 VLA 不必每步由 7B 模型出转向角;指目标 + 快局部策略 更接近真机频率。
  • Pixel Goal 好训、好可视化,但 2D 有歧义;Latent Plan 是这篇真正的接口创新。
  • 异步要在训练里模拟(S2 看旧帧),不能只在部署时开线程。
  • 规模靠仿真流水线,不靠昂贵真机遥操作。
  • 世界模型是「把计划演成视频」的正则,不是主控制器。

开放问题

  • DualVLN 的 NextDiT S1 是否还保留 pixel-goal 预训练,还是直接 latent?
  • 真机轨迹依赖里程计变到世界系:没有可靠里程计时接口怎么改?
  • 潜在计划维度、query 个数 n_query 与「走完没有」的可解释性?
  • 上下楼被 VLN-PE 剔除:人形楼梯场景如何补?

补充:System 1 结构图名词

本模型 S1 不用 SigLIP、也 没有 操作 VLA 那种 proprio encoder;视觉是 Depth Anything ViT,目标在 DualVLN 里是 latent plan。

相关推荐
滴啦嘟啦哒1 天前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
滴啦嘟啦哒2 天前
【具身笔记】【π0.5 微调与仿真】三、libero数据可视化
笔记·python·ros·vla
猫先生Mr.Mao5 天前
具身智能之京东 WLA³详解:用世界状态转换统一人类视频和机器人动作
机器人·论文解读·具身智能·vla·京东·wla3
朝朝辞暮i6 天前
第 22 课:Conditional 1D U-Net——Diffusion Policy 怎样理解一整段未来动作?
人工智能·pytorch·深度学习·transformer·vla
朝朝辞暮i6 天前
VLA 系统学习第 21 课——DDPM 与 Noise Scheduler:扩散模型究竟怎样从随机噪声生成机器人动作?
人工智能·深度学习·神经网络·transformer·vla
猫先生Mr.Mao7 天前
具身智能之Open X-Embodiment详解:22种机器人数据如何训练出RT-X的跨本体迁移
机器人·论文解读·rt-x·具身智能·vla·open x-embodiment
朝朝辞暮i7 天前
VLA 系统学习第 20 课——Diffusion Policy 为什么要先给动作加噪,再学习把噪声去掉?
人工智能·python·深度学习·transformer·vla
朝朝辞暮i7 天前
第一部分:ACT 阶段总结——从 Behavior Cloning 到完整的 Transformer Action Policy
人工智能·pytorch·深度学习·transformer·vla
朝朝辞暮i9 天前
VLA 系统学习第 17 课:正式进入 ACT——为什么需要 CVAE、潜变量 z 和 KL Loss?
人工智能·深度学习·神经网络·transformer·vla