一句话
把「听懂导航指令」和「脚下怎么走」拆成两个系统:慢的 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,视觉语言导航):听一句人话(「出卧室,直行,楼梯口右转进左边浴室」),边看相机画面边走到目标。
以前常见两条路:
- 离散短动作:每一步只选「前进 0.25 m / 左转 15° / 右转 / 停」。像下棋只能走一格,路径碎,大模型推理也慢。
- 模块化导航:建图 → 全局规划 → 局部避障。链路长、误差叠、换机器人要重调。
这篇借用 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。
贡献
- 开源双系统导航基础模型:S2 像素/潜在规划 + S1 扩散执行。
- 课程式两阶段训练:先各自用显式像素目标预训练,再冻住 S2、用潜在计划做异步联合微调。
- InternData-N1:3000+ 场景、5350 万第一人称图、约 4839 km、80 万条指令。
- 六个基准 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 预训练已经会指物体;本文把同一能力用到「最远可见路点」。
本文把高层规划写成 最远可见像素目标:
- 输入:第一人称图像序列 + 指令。
- 输出:当前画面上一个 2D 坐标 = 下一步该去的路点投影。
- 额外职责:任务完成时输出 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,取出.pretrainedViT 当rgb_model。它在单目深度任务上见过几何,当 S1 的眼睛;深度头可以不用。 - 相机深度:NavDP 式 S1 仍吃 RGB-D;像素目标则先画成 mask MgM_gMg(目标附近为 1),再和当前 RGB 进从零训的 ViT。
动作扩散怎么学
扩散像「从一团噪声里洗出一条轨迹」:
- 仿真里已有示教相对位姿序列 x0x_0x0(接下来几米怎么走)。
- 加噪声得到 xkx_kxk,网络 ϵθ\epsilon_\thetaϵθ 预测噪声(或 DualVLN 里预测速度场)。
- 损失 Lact\mathcal{L}_{\text{act}}Lact:预测与真噪声的 MSE。推理时从纯噪声逐步去噪,一次可采样多条候选轨(真机 TensorRT 并行 32 条约 0.03 s)。
Critic 怎么学
示教全是「不撞的好轨」,网络不会自己怕墙。NavDP / 本 S1:
- 把示教轨随机旋转、插值,造出可能擦墙的负样本。
- 用仿真全局 ESDF 算每个路点离障碍多远,做成安全分标签。
- 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 已经想好的计划向量。微调后,模型生成「如果按这个计划走,第一人称会看到什么」的视频。
作用:
- 视频预测逼 latent 里装空间信息(走错了画面会对不上)。
- 联合微调从 4 个 epoch 降到 2 个 就到 R2R-CE 最优。
- 为以后用互联网视频预训练留口子。
- 不是 真机控制器:机器人不播这段视频,只拿它当训练正则。
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。