Paper · 2025-12-09 · cs.RO
Ground Slow, Move Fast: A Dual-System Foundation Model for Generalizable Vision-and-Language Navigation
DualVLN splits vision-and-language navigation into a 7B VLM (System 2) that predicts a pixel waypoint and a latent goal, and a 384-wide diffusion transformer (System 1) that turns them into 32 waypoints. The two run asynchronously. Author-reported: 64.3 SR on R2R-CE val-unseen with RGB only (StreamVLN 56.9), and 51.60 SR on VLN-PE val-unseen without training on VLN-PE.
Vision-language-action modelFlow matchingMultimodal language modelObject queries (learned query slots in transformer decoders)vision-language-navigationdual-systemflow-matchingdiffusion-transformerasynchronous-inferenceembodied-navigation
arXivPDFCodeMarkdown15 min read
AI-compiled by claude-haiku-5-5 on 2026-10-25, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
A robot that follows spoken directions through a building has two jobs. It has to work out where to go next from what it sees, which is slow and needs a large model. It also has to steer around chairs and people in real time, which must be quick. DualVLN handles these with two parts that run at different speeds. A large vision-language model acts as the slow planner: it looks at the camera images and the instruction, then points to a spot in the image that it wants to reach next.
A small, fast network acts as the driver. It takes the planner's chosen spot, plus a compact summary of the planner's internal state, and draws a short smooth path for the robot to follow. The planner runs now and then, and the driver keeps updating its path from the newest camera frames in between. The authors train the two parts in sequence, so the large model keeps its general knowledge while the driver learns local steering.
The paper is a report from a research lab, and it ships an official code repository. The results it reports come from simulation benchmarks and a small set of real robots, and they are the authors' own measurements.
TL;DR
- Dual-system VLN: System 2 is a Qwen2.5-VL 7B planner that outputs a pixel goal or a view-adjustment action; System 1 is a diffusion transformer that outputs a 32-waypoint trajectory §3.1 §3.2.
- System 2 gets its image-grounded goal from projected 3D trajectories; System 1 is conditioned on four learned latent tokens taken from System 2's last hidden layer and on a 32-token summary of two RGB frames §3.2 app. A.
- Training is sequential: System 2 first, then System 2 is frozen and System 1 plus the latent queries are trained on pixel-goal samples §1 app. A.
- Author-reported: 64.3 SR and 58.5 SPL on R2R-CE val-unseen with RGB only, against 56.9 SR for StreamVLN tab. 1. On VLN-PE val-unseen, 51.60 SR with no VLN-PE training, against 22.42 for NaVid tab. 2.
- Not reproducible from the paper alone for three reasons: the sampler, the trajectory scale and the sample aggregation are not stated, and they are set in code. See Pitfalls.
Problem
Most VLN-with-VLM systems map camera frames and an instruction straight to a short discrete action, such as "move forward 0.25 m" §1. The authors say this gives jerky motion, high latency because the large model runs on every step, and no clear split between high-level planning and local control, which makes dynamic obstacle avoidance hard §1.
DualVLN aims for an open-ended navigation model that keeps a VLM's generalization, runs in real time, and avoids moving obstacles §1.
Method
System 2: pixel-goal grounding with view adjustment §3.1
System 2 is a Qwen-VL-2.5 model adapted to VLN. It reads a sequence of egocentric frames and the instruction, and it predicts either a view-adjustment action or a 2-D pixel coordinate for the next waypoint fig. 2 §3.1.
- Training targets. Each VLN-CE trajectory is projected onto the egocentric frames. A point counts as visible only when its distance is not larger than the depth at its pixel. The farthest visible waypoint is the pixel-goal target §3.1 app. A.
- View adjustment. When no future waypoint is visible, for example at the start of a sequence of turns, the model predicts turn actions instead. It can turn left or right by 15 degrees, or look up or down by 15 degrees §3.1. The discrete action set is STOP, forward 25 cm, turn left 15 degrees and turn right 15 degrees; at most four turn actions are predicted per chunk app. A.
- Stop. The last step of each sequence is supervised with STOP app. A.
System 1: diffusion transformer with multimodal conditioning §3.2
System 1 generates a trajectory of 32 waypoints. Its conditions are a latent goal from System 2 and high-frequency RGB input §3.2 fig. 2.
Latent goal. After System 2 writes the pixel goal, four learnable tokens
<TRAJ> are appended to the text sequence. Their final-layer hidden states are
taken as the latent goal app. A §3.3 internvla_n1.py. The
latent tokens are initialized randomly and trained by prompt tuning §3.2.
RGB branch. The current frame and the frame from System 2's time step are each encoded by a ViT, the DepthAnythingV2-Small backbone §3.3. The two feature sets are fused with a self-attention encoder. A Q-Former then compresses them into 32 tokens §3.2 internvla_n1_arch.py.
Diffusion transformer. The policy is a DiT with hidden size 384, 12 layers and 6 heads §3.3 nextdit_crossattn_traj.py. The latent goal is first projected from 3584 to 768 dimensions §3.3.
Asynchronous use of latents. System 2 runs at a lower rate than System 1. System 1 is conditioned on the stale latent goal from time t, together with the newest frame at time t+k, so that it can estimate the distance already travelled §3.2 fig. 1.
Flow matching. The training objective is a flow-matching loss eq. 1 eq. 2 eq. 3:
- A noisy trajectory is
X_u = alpha_u X_0 + sigma_u eps, wherealpha_ufalls andsigma_urises withueq. 1. - The network predicts the velocity of the trajectory from
X_u, the timeuand the concatenated conditions eq. 2. - The loss is the mean squared error between predicted and true velocity eq. 3.
The paper does not give the noise schedule. The code uses a linear blend and a library scheduler (see Paper vs code).
# System 1 training step, flow matching [§3.2] [eq. 1-3]
# [code: internnav/model/basemodel/internvla_n1/internvla_n1.py#L263-L286]
def system1_loss(waypoints, latents, frames, valid):
# Draw one noise level per trajectory, u ~ U(0, 1) [§3.2]
u = uniform(0, 1, size=batch) # (B,)
# Map u to the scheduler timestep and its sigma [code: L263-L266]
timestep, sigma = schedule_lookup(u) # (B,), (B, 1, 1)
# Draw Gaussian noise [§3.2]
noise = normal_like(waypoints) # (B, 32, 3)
# Blend trajectory and noise [eq. 1] [code: L270]
noisy = (1 - sigma) * waypoints + sigma * noise
# Embed the noisy waypoints and add their positions [code: L271-L274]
features = action_encoder(noisy) + position_embedding(32)
# Predict the velocity from the time and the conditions [eq. 2]
predicted = dit(features, timestep, context=latents)
predicted = action_decoder(predicted) # (B, 32, 3)
# Velocity target is noise minus the clean trajectory [code: L282]
target = noise - waypoints
# Mean squared error over valid frames only [eq. 3] [code: L283-L286]
return masked_mean_square(predicted - target, valid)In the pseudocode below, policy means
internnav/model/basemodel/internvla_n1/internvla_n1_policy.py.
# System 1 inference: 32 samples, 10 Euler steps [§3.2] [app. A]
# [code: internnav/model/basemodel/internvla_n1/internvla_n1.py#L349-L435]
# [code: internnav/model/utils/vln_utils.py#L129-L131]
def generate_actions(latents, frames):
# Visual memory from the two frames [§3.2]
memory = qformer(fuse(frames)) # (1, 32, 768)
# Context is visual memory followed by the projected latent goal [§3.2]
context = concat(memory, cond_projector(latents)) # (1, 36, 768)
# Start 32 independent samples from Gaussian noise [code: L389-L392]
samples = normal((32, 32, 3)) # (N, waypoints, 3)
# Integrate the flow over 10 steps, sigma from 1.0 down to 0.1 [code: L396]
for step in schedule_10_steps:
velocity = dit(samples, step, context)
samples = euler_step(samples, velocity, step)
# Undo the x, y scale and average the paths [code: vln_utils L129-L131]
paths = cumulative_xy(samples with xy divided by 4.0)
mean_path = mean(paths, over the 32 samples)
# Convert the mean path to discrete actions, keep the first four [code: policy#L212-L214]
return path_to_discrete_actions(mean_path)[:4]Training recipe §3.3 app. A
| Stage | Trainable | Data | Optimizer and schedule |
|---|---|---|---|
| System 2 | all of Qwen2.5-VL-7B (vision encoder and LLM) | VLN-CE and StreamVLN-style data | AdamW, lr 2e-5, batch 128 conversations, 14,000 steps |
| System 1 (stage 2) | latent queries and DiT only; System 2 frozen | pixel-goal grounding samples only | AdamW, lr 1e-4, batch 128 trajectory samples, 15,000 steps |
Hyperparameters
Values from the paper are cited to the paper. Values marked "code" appear only in the released scripts and config, not in the paper.
| Name | Value | Where | Notes |
|---|---|---|---|
| System 2 base model | Qwen2.5-VL-7B | §3.3 train_system2.sh | fully unfrozen in stage 1 app. A |
| System 2 optimizer | AdamW | app. A | |
| System 2 learning rate | 2e-5 | app. A train_system2.sh | paper: cosine not stated |
| System 2 vision-tower learning rate | not stated | train_system2.sh | 5e-6 in code only |
| System 2 epochs | one epoch | §3.3 | code runs 2.0 epochs train_system2.sh |
| System 2 batch | 128 conversations | app. A | code: 2 per device across 8 nodes x 8 GPUs = 128 train_system2.sh |
| System 2 steps | 14,000 | app. A | |
| System 1 optimizer | AdamW | app. A | |
| System 1 learning rate | 1e-4 | app. A train_dual_system.sh | code uses cosine_with_min_lr, min 1e-5 train_dual_system.sh |
| System 1 batch | 128 trajectory samples | app. A | code: 2 per device, 8 nodes x 8 GPUs train_dual_system.sh |
| System 1 steps | 15,000 | app. A | code runs 3.0 epochs train_dual_system.sh; step count not stated in code |
| Latent queries | 4 | §3.3 internvla_n1_argument.py | appended as <TRAJ> tokens app. A |
| Latent dimension | 3584 projected to 768 | §3.3 | MLP in code, see Paper vs code |
| DiT hidden size | 384 | §3.3 nextdit_crossattn_traj.py | |
| DiT layers | 12 | §3.3 nextdit_crossattn_traj.py | |
| DiT heads | 6 | §3.3 nextdit_crossattn_traj.py | |
| Waypoints per trajectory | 32 | §3.2 internvla_n1_argument.py | 33 points resampled, 32 deltas internvla_n1_lerobot_dataset.py |
| Visual memory tokens | 32 | §3.2 | Q-Former, 3 decoder layers, 768 wide internvla_n1_arch.py |
| ViT for RGB | DepthAnythingV2-Small | §3.3 internvla_n1_arch.py | code loads the metric-Hypersim ViT-S checkpoint |
| History frames | not stated in paper | internvla_n1_argument.py | 8 in code |
| Frame sampling | not stated in paper | internvla_n1_argument.py | step 4, future steps 4 in code |
| Input resolution | not stated in paper | train_dual_system.sh | 384 x 384 in code |
| Inference steps | not stated in paper | internvla_n1.py | 10 in code |
| Samples per call | 32 | §5.2 internvla_n1.py | averaged, see Pitfalls |
| Guidance scale | not stated in paper | internvla_n1.py | 1.0 in code |
| Discrete step size | 0.25 m | app. A vln_utils.py | |
| Turn angle | 15 degrees | app. A vln_utils.py | |
| Real-world camera | RealSense D455, tilted 15 degrees | §5.2 | |
| Real-world GPU | RTX 4090, about 20 GB | §5.2 | |
| System 2 latency | 0.7 s per trajectory (KV-cache) | §5.2 | was 1.1 s |
| System 1 latency | 0.03 s for 32 trajectories (TensorRT) | §5.2 |
Results
Author-reported. Each table below is copied from the paper and cited to it. The paper evaluates on R2R-CE and RxR-CE (VLN-CE, Habitat), on VLN-PE (Unitree H1, physical controller), on its Social-VLN benchmark, and on real robots (CMA, NaVid, NaVILA and StreamVLN as baselines) §5.1 §5.2.
Table 1: VLN-CE, val-unseen tab. 1. Observation columns are marked x when the method uses them: Pano = panoramic
RGB, Odo = odometry, Depth = depth, S.RGB = single first-person RGB. * marks
methods that use the waypoint predictor from Hong et al.
| Method | Pano | Odo | Depth | S.RGB | R2R NE | R2R OS | R2R SR | R2R SPL | RxR NE | RxR SR | RxR SPL | RxR nDTW |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| HPN+DN* | x | x | x | 6.31 | 40.0 | 36.0 | 34.0 | - | - | - | - | |
| CMA* | x | x | x | 6.20 | 52.0 | 41.0 | 36.0 | 8.76 | 26.5 | 22.1 | 47.0 | |
| GridMM* | x | x | x | 5.11 | 61.0 | 49.0 | 41.0 | - | - | - | - | |
| ETPNav* | x | x | x | 4.71 | 65.0 | 57.0 | 49.0 | 5.64 | 54.7 | 44.8 | 61.9 | |
| ScaleVLN* | x | x | x | 4.80 | - | 55.0 | 51.0 | - | - | - | - | |
| InstructNav | x | x | x | x | 6.89 | - | 31.0 | 24.0 | - | - | - | - |
| R2R-CMTP | x | x | x | 7.90 | 38.0 | 26.4 | 22.7 | - | - | - | - | |
| LAW | x | x | x | 6.83 | 44.0 | 35.0 | 31.0 | 10.90 | 8.0 | 8.0 | 38.0 | |
| CM2 | x | x | x | 7.02 | 41.5 | 34.3 | 27.6 | - | - | - | - | |
| WS-MGMap | x | x | x | 6.28 | 47.6 | 38.9 | 34.3 | - | - | - | - | |
| ETPNav + FF | x | x | x | 5.95 | 55.8 | 44.9 | 30.4 | 8.79 | 25.5 | 18.1 | - | |
| Seq2Seq | x | x | 7.77 | 37.0 | 25.0 | 22.0 | 12.10 | 13.9 | 11.9 | 30.8 | ||
| CMA | x | x | 7.37 | 40.0 | 32.0 | 30.0 | - | - | - | - | ||
| NaVid | x | 5.47 | 49.1 | 37.4 | 35.9 | - | - | - | - | |||
| MapNav | x | 4.93 | 53.0 | 39.7 | 37.2 | - | - | - | - | |||
| NaVILA | x | 5.22 | 62.5 | 54.0 | 49.0 | 6.77 | 49.3 | 44.0 | 58.8 | |||
| UniNaVid | x | 5.58 | 53.3 | 47.0 | 42.7 | 6.24 | 48.7 | 40.9 | - | |||
| StreamVLN | x | 4.98 | 64.2 | 56.9 | 51.9 | 6.22 | 52.9 | 46.0 | 61.9 | |||
| DualVLN | x | 4.05 | 70.7 | 64.3 | 58.5 | 4.58 | 61.4 | 51.8 | 70.0 |
Table 2: VLN-PE, R2R tab. 2. Physical locomotion controller, Unitree H1.
"Train on VLN-PE" rows were trained on VLN-PE; "zero-shot" rows were trained on
VLN-CE only. Fall and stuck rates are lower-is-better. Per the paper's caption,
+ means trained on Habitat and then fine-tuned on VLN-PE (no such row here),
and † means trained with data augmentation (the Seq2Seq and CMA zero-shot rows).
| Method | Split | TL | NE | FR | StR | OS | SR | SPL |
|---|---|---|---|---|---|---|---|---|
| CMA | seen | 11.13 | 7.59 | 23.71 | 3.19 | 34.94 | 21.58 | 16.10 |
| CMA+ | seen | 8.86 | 7.14 | 23.56 | 3.50 | 36.17 | 25.84 | 21.75 |
| RDP | seen | 13.26 | 6.76 | 27.51 | 1.82 | 38.60 | 25.08 | 17.07 |
| Seq2Seq (zero-shot) | seen | 7.80 | 7.62 | 20.21 | 3.04 | 19.30 | 15.20 | 12.79 |
| CMA (zero-shot) | seen | 6.62 | 7.37 | 20.06 | 3.95 | 18.54 | 16.11 | 14.64 |
| NaVid (zero-shot) | seen | 7.54 | 6.20 | 11.25 | 0.46 | 24.32 | 21.58 | 17.45 |
| DualVLN (zero-shot) | seen | 10.65 | 4.13 | 17.78 | 1.82 | 62.31 | 58.97 | 47.78 |
| CMA | unseen | 11.16 | 7.98 | 22.64 | 3.27 | 33.11 | 19.15 | 14.05 |
| CMA+ | unseen | 8.70 | 7.26 | 21.75 | 3.27 | 31.40 | 22.12 | 18.65 |
| RDP | unseen | 12.70 | 6.72 | 24.57 | 3.11 | 36.9 | 25.24 | 17.73 |
| Seq2Seq (zero-shot) | unseen | 7.73 | 7.18 | 18.04 | 3.04 | 22.42 | 16.48 | 14.11 |
| CMA (zero-shot) | unseen | 6.58 | 7.09 | 17.07 | 3.79 | 20.86 | 16.93 | 15.24 |
| NaVid (zero-shot) | unseen | 7.12 | 5.94 | 8.61 | 0.45 | 27.32 | 22.42 | 18.58 |
| DualVLN (zero-shot) | unseen | 10.09 | 4.66 | 12.32 | 2.23 | 55.9 | 51.60 | 42.49 |
Table 3: R2R val-unseen, standard and Social-VLN tab. 3. HCR = human collision rate, lower is better. Social-VLN is the authors' benchmark (see Pitfalls).
| Method | VLN NE | VLN OS | VLN SR | VLN SPL | Social NE | Social OS | Social SR | Social SPL | Social HCR |
|---|---|---|---|---|---|---|---|---|---|
| StreamVLN | 4.98 | 64.2 | 56.9 | 51.9 | 6.50 | 36.3 | 31.4 | 29.1 | 36.4 |
| DualVLN | 4.05 | 70.7 | 64.3 | 58.5 | 5.97 | 41.0 | 37.2 | 35.8 | 35.4 |
Table 4: System 1 versus point-goal local planners, VLN-PE with flash controller tab. 4. The paper's text says these planners get oracle depth for the pixel goal. Rows show that System 1 beats iPlanner and NavDP on both splits.
| Local planner | Seen TL | Seen NE | Seen OS | Seen SR | Seen SPL | Unseen TL | Unseen NE | Unseen OS | Unseen SR | Unseen SPL |
|---|---|---|---|---|---|---|---|---|---|---|
| iPlanner | 10.9 | 4.08 | 66.26 | 58.66 | 49.43 | 9.58 | 4.91 | 55.53 | 47.07 | 41.09 |
| NavDP | 11.68 | 3.75 | 76.44 | 66.11 | 56.26 | 10.18 | 4.22 | 67.33 | 58.72 | 50.98 |
| System 1 | 11.26 | 3.15 | 78.42 | 73.25 | 64.00 | 10.08 | 3.90 | 69.93 | 63.62 | 56.49 |
Ablations of System 1 conditioning fig. 7. The paper compares three variants on one plot: training System 1 and System 2 jointly in one stage (w/o Sys.2 Train), removing the pixel-goal text before the latent queries (w/o Pixel Goal), and using only the frozen last-layer hidden states of the pixel-goal text (w/o Latent Goal). The text reports that each variant is worse and that joint training converges more slowly, but gives no numbers, so the exact values are only in the figure.
Data scaling of System 1 fig. 9. Using 1%, 10% and 50% of the System 2 trajectories: 10% is near saturation and 50% adds little. Only the figure reports the values.
Real-world fig. 5 fig. 6. Hallway, bedroom and office scenarios, 20 trials per scenario per model, measured by success rate and navigation error. The text gives no numbers. The authors describe DualVLN as achieving high SR and low NE in both static and dynamic scenes.
Paper vs code
Code: https://github.com/InternRobotics/InternNav, MIT, commit
7a5c62400ac45b313d9b709c740b64191556a242. The abstract links the repository,
and its owner is the InternRobotics organisation, which the paper names as
the authors' project §5.2 LICENSE.
Each difference below is a place where the released code and the paper disagree, or where the paper is silent and the code fixes a value.
- Latent projection. Paper: the 3584-dim latent is linearly projected to 768 §3.3. Code: a two-layer MLP with GELU,
Linear(3584, 768) -> GELU -> Linear(768, 768)internvla_n1_arch.py. - Noise blend. Paper:
alpha_u X_0 + sigma_u epswith generic decreasing and increasing functions eq. 1. Code:(1 - sigma) X_0 + sigma eps, with sigma taken from a library scheduler internvla_n1.py. - Time sampling. Paper:
u ~ U(0, 1)§3.2. Code:uis mapped to a discrete index on the scheduler's timestep grid,floor(u * num_train_timesteps)internvla_n1.py. The scheduler is built with library defaults internvla_n1_arch.py. The paper states no schedule. - Loss mask. Paper: plain MSE eq. 3. Code: MSE masked to valid frames and averaged over the valid count internvla_n1.py.
- Trajectory scale. Not in paper. Code multiplies x and y deltas by 4 at data preparation internvla_n1_lerobot_dataset.py and divides by 4 at inference vln_utils.py.
- Inference sampler. Not in paper. Code: 10 Euler steps with sigma from 1.0 to 0.1 internvla_n1.py internvla_n1.py.
- Guidance. Not in paper. Code: a null-condition branch with zeros and guidance scale 1.0 internvla_n1.py internvla_n1.py.
- Aggregation of 32 samples. Paper: "generates 32 trajectories in parallel" §5.2 with no rule for choosing among them. Code: the 32 paths are averaged before conversion to actions vln_utils.py.
- System 2 epochs. Paper: one epoch §3.3. Code: 2.0 epochs train_system2.sh.
- System 2 vision-tower rate. Not in paper. Code: 5e-6 train_system2.sh.
- System 1 schedule. Paper: none stated. Code: cosine with minimum 1e-5, 3 epochs train_dual_system.sh train_dual_system.sh.
- Visual memory. Paper: a self-attention module fuses the two frames, then a Q-Former outputs 32 tokens §3.2. Code: a 3-layer Transformer encoder with learned positions, then a 3-layer Q-Former internvla_n1_arch.py.
- Depth ViT checkpoint. Paper: DepthAnythingV2-Small §3.3. Code: loads the metric-Hypersim ViT-S weights internvla_n1_arch.py.
- Second System 1 type. The repository also has a NavDP-based System 1 with its own loss internvla_n1.py. The DualVLN training script selects the
nextdit_asyncvariant train_dual_system.sh, which is the one matching the paper.
Checked and consistent: the latent token count (four), the 32 waypoints, the
DiT size (384 wide, 12 layers, 6 heads), the frozen System 2 during System 1
training (tune_mm_* False and pixel_goal_only True) train_dual_system.sh
train_dual_system.sh, and System 1 learning rate and batch.
Pitfalls
- Scale factor 4. A reimplementation that skips the x and y scale at either end gets trajectories that are 4 times too long or too short. The paper does not mention it internvla_n1_lerobot_dataset.py vln_utils.py.
- Averaging 32 samples. The paper says the model generates 32 trajectories but does not say how one is used. The code averages the paths. Choosing one sample instead would change the behaviour vln_utils.py.
- Guidance branch. At inference the guidance scale is 1.0, so the null-condition branch has no effect internvla_n1.py. The training forward (L234-L286) shows no condition dropout, so the null branch is never trained. Adding guidance will need a training change as well.
- Scheduler defaults. Sigma values come from the library's default flow-matching scheduler, not from the paper. Pin the library version or you will get a different noise schedule internvla_n1_arch.py.
- Stale latent goal. System 1 is conditioned on the latent from an earlier System 2 step, and it must cope with the robot having moved since. The paper argues it can estimate the distance already travelled §3.2. It reports that System 1 tolerates small pixel-goal errors in the right direction, but not large or semantically wrong goals fig. 8.
- Point-goal baselines are not like-for-like. The comparison in tab. 4 gives the point-goal planners oracle depth. The paper attributes their gap partly to trajectory-distribution shift in System 2 §5.1.
- Social-VLN is not in the repository. Searches for "social", "HCR" and the human-collision pipeline found nothing in the released code. The paper describes the benchmark and a 763K-episode training pipeline built on Habitat 3.0 humanoids and 60 MP3D scenes §4. Treat tab. 3 as unverified.
- Zero-shot VLN-PE claim. DualVLN was not trained on VLN-PE §5.1. The table comparison is valid, but the baselines trained on VLN-PE are the stronger reference in that setting.
- Real-world latency. System 2 takes 0.7 s per output with KV-cache reuse and System 1 takes 0.03 s with TensorRT. These are author measurements on one RTX 4090 §5.2. The asynchronous pipeline is needed to reach the reported behaviour.
- Data and weights. The training data (InternData-N1, linked from the abstract) and the released checkpoint were not checked for licence and are not used on this card.
- Figure and equation numbers. Counted from the LaTeX source order (11 figures, 3 numbered equations, 4 tables). If the compiled PDF numbers differ, cite the section instead.
Lineage
- Builds on: StreamVLN, which supplies the System 2 data recipe §3.3. DepthAnythingV2 provides the ViT §3.3. Qwen-VL-2.5 is the planner §3.1.
- Compared against: NaVid, NaVILA, UniNaVid, StreamVLN, MapNav, ETPNav, GridMM and others on VLN-CE tab. 1; RDP, CMA, Seq2Seq and NaVid on VLN-PE tab. 2; iPlanner and NavDP as local planners tab. 4.
- Part of: the InternVLA-N1 framework, according to the paper's acknowledgments (Contributions and Acknowledgments section). The repository README lists DualVLN as one InternVLA-N1 configuration README.md README.md.
- Superseded by: not known from content already in this wiki.
Source and license
Adapted from “Ground Slow, Move Fast: A Dual-System Foundation Model for Generalizable Vision-and-Language Navigation” by Meng Wei, Chenyang Wan, Jiaqi Peng, Xiqian Yu, Yuqiang Yang, Delin Feng, Wenzhe Cai, Chenming Zhu, Tai Wang, Jiangmiao Pang, Xihui Liu (arXiv:2512.08186), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/InternRobotics/InternNav at commit 7a5c62400ac4 (MIT). Any quoted code is shown under that license.