[2026-06] 🎉 Habitat-GS is accepted to ECCV 2026! See you in Malmö!
[2026-05] 🎉 Try our NavMesh editing tool! It closes the loop from a raw 3DGS scene to navigable simulation (3DGS → NavMesh → simulation): draw/edit the walkable area on the 3DGS scene in your browser, bake a Habitat NavMesh, and use it for navigation in Habitat-GS.
[2026-05] 🎉 GS dataset is expanded with 64 InteriorGS scenes! Now 129 scenes in total!
[2026-04] 🎉 GS dataset is updated! We provide 65 high-quality GS scenes, as well as episodes and trajectories for training and evaluation!
[2026-04] 🎉 Paper, project page, code and dataset of Habitat-GS are released! Check it out!
🧭 What Is Habitat-GS and What Can Habitat-GS Do?
Habitat-GS is a non-intrusive extension of Habitat-Sim for embodied navigation tasks in Gaussian Splatting scenes. It keeps Habitat's standard scene dataset abstraction, NavMesh/pathfinding, agent control, and Habitat-Lab integration, while extending the rendering backbone to support 3D Gaussian Splatting, and incorporating a dynamic gaussian avatar module to drive humanoid gaussian avatars.
In practice, Habitat-GS can:
render photo-realistic GS scenes with Habitat RGB and depth sensors;
plug into Habitat-Lab for training and evaluation with the same scene dataset format.
Compared with traditional mesh-based simulators, Habitat-GS can achieve photo-realistic rendering and render high-fidelity gaussian avatars with high efficiency. By introducing Gaussian Splatting to embodied simulators, we hope our work can facilitate future embodied AI research.
Habitat-GS can be used standalone for rendering and scene inspection, but Habitat-Lab is typically used along with Habitat-GS for navigation task definition, training, and evaluation.
IMPORTANT: Before installing Habitat-Lab into the same environment, update its NumPy pin to avoid conflicts with Habitat-GS:
edit habitat-lab/habitat-lab/requirements.txt
change numpy==1.26.4 to numpy>=2.0.0,<2.4
Then install:
cd habitat-lab
pip install -e habitat-lab
pip install -e habitat-baselines
NOTE: The dynamic navigation tasks (avatar avoidance / tracking) require our own habitat-lab fork. In that case, clone with git clone https://github.com/RukawaY/habitat-lab-dynamic.git and then do the same edit/installation.
📦 Download GS Asset
Please refer to our 🤗 huggingface dataset for more details. We provide six categories of assets:
Category
Size
Required For
1
GS Scenes
~27 GB
Everything — core scene assets
2
Gaussian Avatars
~3.1 GB
Dynamic avatar simulation
3
Habitat-Lab Nav Data
~30 MB
PointNav / ImageNav / ObjectNav training & evaluation
a background 3DGS asset (background.ply) for far-field content like sky or distant geometry that was separated from the foreground during reconstruction. To render foreground and background together as a single stage, merge the two .ply files into one with tools_gs/merge_background_gs.py.
For NavMesh generation, use our interactive interactive web tool: it renders the GS scene in your browser and lets you draw/modify the walkable area, then bakes a Habitat .navmesh for simulation.
conda activate habitat-gs
python web_tools/navmesh_editor/server.py --port 8080 # Scene dir by default: data/scene_datasets/gs_scenes (train/ and val/ subfolders).
# then open http://localhost:8080
python web_tools/navmesh_editor/server.py --port 8080 --scene interior_0007_840137 # Open a specific scene
python web_tools/navmesh_editor/server.py --port 8080 --gs-dir /path/to/gs_scenes/train # Open scenes in a directory
driver.pkl depends on the target scene because it is generated on the scene NavMesh. Run the following command in the GAMMA environment after installing GAMMA and make sure habitat_sim is importable in that environment.
GAMMA env: For setting up the conda environment, please refer to environment.yml (conda env create -f environment.yml) and follow the instruction inside it to apply a necessary patch.
We provide two modes for generating the driver trajectory:
The generated driver.pkl contains precomputed joint_mats for rendering. Avatar rendering uses explicit Gaussians + CUDA LBS without neural forward pass at runtime. The .pkl also contains precomputed proxy_capsules used for NavMesh-level dynamic obstacle handling, guaranteeing agent cannot pass through gaussian avatars.
🗂️ Organize Scene Dataset
Habitat-GS follows Habitat's standard dataset hierarchy:
If you only want a static GS scene, simply omit gaussian_avatars.
If your GS exporter already stores normalized quaternions and you observe spikes or blur in rendering results, add "norm_quaternion": false to the stage config.
Time related fields explanation:
time_max: maximum simulation time in seconds. max(time_end) of all avatars by default. 0 if no avatars in scene.
time_loop: whether to loop the simulation time. True by default.
For each avatar, you can also specify:
time_begin: the simulation time when the avatar appears. 0 by default.
time_end: the simulation time when the avatar disappears. 0.025 * num_frames by default. If time_end > time_begin + 0.025 * num_frames, the avatar will be static at the destination in remaining time.
🖥️ Run Interactive Viewer
examples/gaussian_viewer.py is an interactive RGB/depth viewer for Habitat-GS scenes. A display is required to run the viewer (for example, a local desktop session, X11 session, or VNC session). We provide two modes to run it:
--enable-physics to enable physics simulation if you need physics interaction with mesh objects in a GS scene. Requires building with Bullet.
Click to expand: useful viewer controls
W/S: Move forward/backward
A/D: Move left/right
Z/X: Move up/down
Arrow keys: Rotate view
TAB: switch between RGB and depth
SPACE: play/pause Gaussian time
H: print help
[ / ]: scrub backward/forward
N: toggle NavMesh visualization
ESC: exit viewer
🦞 HabitatAgent
HabitatAgent is an LLM-powered agent system built on top of Habitat-GS, enabling
natural-language navigation, MCP tool integration, and interactive scene exploration
via a terminal chat interface.
Key features: TUI chat, 16 MCP bridge tools, autonomous nav loops, scene-graph
query, SPL evaluation, rerun live visualization, third-person camera with
optional visual robot mesh, multi-client support (Claude Code, Codex, OpenClaw).
Episode data must be generated before training and evaluating. We have provided 1000 episodes for each training scene and 100 episodes for each evaluation scene in our released dataset, but you can also generate your own episodes with the following commands:
💡 The ObjectNav episodes generator above auto-detects objects with SAM + CLIP, which may mislocalize them. For accurate hand-verified annotations on any scene, use our interactive web tool to place and label objects on the rendered GS scene in your browser.
Click to expand: ObjectNav episode generation details
ObjectNav uses SAM (Segment Anything) + CLIP (zero-shot classification) to automatically detect and classify objects in GS scenes, then generates navigation episodes to those objects.
--output DIR Output directory for checkpoints and tensorboard (required)
--num-envs N Number of parallel environments per GPU (default: 4)
--num-gpus N Number of GPUs for DDPPO (default: 1)
--total-steps N Total training steps
--num-ckpts N Number of checkpoints to save (default: 100)
--pretrained-ckpt PATH Fine-tune from an existing .pth checkpoint
(this sets ddppo.pretrained=True; critic is re-initialised)
Extra arguments are forwarded as Hydra overrides. Example with multi-GPU:
By default this loads the whole policy (encoder + RNN + actor head) and re-initialises the critic head — appropriate when continuing on the same task or transferring to a closely related one. To customise the load behaviour, append Hydra overrides, e.g.:
# keep the trained critic
bash scripts_gs/train_pointnav.sh \
--output output/pointnav_ft \
--pretrained-ckpt output/pointnav/checkpoints/ckpt.99.pth \
habitat_baselines.rl.ddppo.reset_critic=False
# load only the visual encoder backbone (e.g. transfer from PointNav to ImageNav)
bash scripts_gs/train_imagenav.sh \
--output output/imagenav_ft \
--pretrained-ckpt output/pointnav/checkpoints/ckpt.99.pth \
habitat_baselines.rl.ddppo.pretrained=False \
habitat_baselines.rl.ddppo.pretrained_encoder=True \
habitat_baselines.rl.ddppo.train_encoder=False # freeze the encoder
Note: optimizer state, step counter and seeds are reset — this is fine-tuning, not resume. To resume an interrupted run, just re-launch with the same --output directory; habitat-baselines auto-detects .resume_state.pth and continues seamlessly.
--ckpt PATH Path to a .pth checkpoint file or a directory of checkpoints (required)
--num-envs N Number of parallel environments (default: 1)
--video-dir DIR Directory to save evaluation rollout videos (optional)
Pass --ckpt a directory to evaluate all checkpoints in it sequentially.
🗣️ Vision-and-Language Navigation with StreamVLN
We also provide one-click training and evaluation pipelines for StreamVLN (a SOTA VLM-based VLN agent built on LLaVA-Video-7B-Qwen2 + SigLIP) on GS scenes. Unlike PointNav/ImageNav/ObjectNav which use Habitat-Lab + DDPPO, StreamVLN is trained via supervised fine-tuning of a vision-language model on demonstration trajectories.
Task
Goal
Sensors
Actions
Backbone
VLN-R2R
Natural-language instruction (e.g. "walk past the table and stop near the window")
RGB, GPS, Compass
move_forward, turn_left, turn_right, stop
LLaVA-Video-7B-Qwen2 + SigLIP
Prerequisites
A separatehabitat-gs-streamvln conda environment (see Step 1 below). StreamVLN pins specific package versions (transformers==4.45.1, accelerate==0.28.0, etc.) that conflict with the main habitat-gs env.
StreamVLN cloned as a sibling of habitat-gs/:
cd /path/to/parent
git clone https://github.com/InternRobotics/StreamVLN.git
GS data downloaded and placed under data/scene_datasets/gs_scenes/ (same layout as the section above)
Data Layout
Click to expand: VLN-specific files added on top of the base dataset layout:
setup_vln.sh creates the habitat-gs-streamvln conda environment cloned from habitat-gs, patches the StreamVLN repo for compatibility with Habitat-GS, installs StreamVLN Python dependencies, and downloads the LLaVA-Video-7B-Qwen2 (~15GB) and SigLIP (~3.3GB) checkpoints into StreamVLN/checkpoints/.
bash scripts_gs/setup_vln.sh
Click to expand: what setup_vln.sh actually does
The script applies scripts_gs/streamvln_compat.patch to the StreamVLN clone (4 files, +42/−13 lines) so that:
streamvln/habitat_extensions/measures.py works with habitat-lab 0.3.3 (which removed try_cv2_import)
streamvln/streamvln_train.py honors a --vision_tower CLI override for local model paths, fixes low_cpu_mem_usage for quantized loading, removes duplicate quantization kwargs, and adds a tokenizer-loading fallback for merged LoRA checkpoints
streamvln/streamvln_eval.py explicitly loads the SigLIP vision tower (fixes delay_load issue) and auto-selects flash_attention_2 with eager fallback
llava/model/multimodal_encoder/siglip_encoder.py passes low_cpu_mem_usage=True for device_map-based loading
The script is idempotent — re-running setup_vln.sh is safe. Available flags:
--skip-env Skip creating the conda environment
--skip-patch Skip applying the compat patch
--skip-download Skip downloading model checkpoints
--skip-deps Skip installing Python dependencies
--hf-token TOKEN HuggingFace token for gated models
Step 2: Generate Episodes and Trajectories
VLN needs both episodes (start/goal + natural-language instruction) and trajectory data (rendered RGB frames + ground-truth action sequences for SFT). We provide both in the released dataset, but you can also re-generate them:
conda activate habitat-gs-streamvln
# 1. Generate VLN episodes (samples paths on the navmesh, renders waypoints with GS,
# and queries a VLM to produce the instruction text). Outputs R2RVLN-v1 format.
python scripts_gs/generate_vln_episodes.py
# 2. Generate StreamVLN trajectory data by replaying each episode with a greedy
# path follower that records (RGB frame, action) pairs.
python scripts_gs/generate_vln_trajectories.py
Click to expand: episode/trajectory generation details
generate_vln_episodes.py produces 200 episodes per training scene and 50 per evaluation scene by default, in the standard R2RVLN-v1 format consumed by habitat-lab's vln_r2r task. Instructions are generated by querying an OpenAI-compatible VLM endpoint with multi-view renderings along the path. Configure the endpoint via OPENAI_BASE_URL + OPENAI_API_KEY environment variables, or pass --api-config /path/to/config.json.
generate_vln_trajectories.py runs a greedy heading-based path follower (forward_step=0.25m, turn_angle=15°, success_distance=0.25m for the final waypoint) on each episode and records:
annotations.json — one entry per episode with the instruction, the action sequence (-1=initial, 0=stop, 1=forward, 2=turn-left, 3=turn-right), and per-step poses
images/{scene}_gs_{ep_id}/rgb/*.jpg — RGB frame at each step, rendered through the GS pipeline
The script supports --resume to skip already-completed scenes, which is useful if generation is interrupted.
Step 3: Train
By default, the training script performs standard full fine-tune (vision tower + projector + LLM, matching StreamVLN official config). This requires ≥80 GB VRAM per GPU (A100 80GB recommended) with the default DeepSpeed ZeRO-2 config. For consumer GPUs (RTX 3090/4090), add --lora flag to enable memory-efficient LoRA training.
--output DIR Output directory for checkpoints (required)
--stage STAGE Training stage: stage-one | dagger | stage-two (default: stage-one)
--num-gpus N Number of GPUs (default: 1)
--ckpt PATH Base checkpoint (default: local LLaVA-Video-7B-Qwen2 for stage-one)
--epochs N Number of epochs (default: 1)
--batch-size N Per-device batch size (default: 2)
--grad-accum N Gradient accumulation steps (default: 2)
--lr RATE Learning rate (default: 2e-5)
--num-frames N Frames per sample (default: 32)
--lora Enable LoRA mode (see below)
Standard mode (default): full fine-tune of the entire model (~8 GB trainable parameters) with anyres_max_9 image tiling, 32 frames, 32K context, and torch.compile. Multi-GPU training uses DeepSpeed ZeRO-2. Requires ≥80 GB VRAM per GPU (A100 80GB recommended).
LoRA mode (--lora): freezes the LLM backbone, trains only the MM projector + LoRA adapters (r=64, alpha=128, ~17 MB trainable), reduces frames to 4 and context to 2K. Fits on a single 24GB RTX 4090. When chaining stages with --lora (e.g. stage-one → dagger), the script auto-merges the previous LoRA checkpoint before applying new adapters.
--ckpt PATH Path to a trained StreamVLN checkpoint (required)
--output DIR Output directory for results (default: results/vln/<ckpt>_<split>)
--num-gpus N Number of GPUs for parallel rollout (default: 1)
--split SPLIT Evaluation split: train | val (default: val)
--num-frames N Frames per sample (default: 32)
--save-video Save visualization videos
The evaluator uses data/scene_datasets/gs_scenes/configs/vln_gs_eval.yaml (RGB+Depth at 640x480, hfov=79°, forward_step=0.25m, turn_angle=15°, success_distance=3.0m, max_episode_steps=500) and reports the standard VLN metrics: Success, SPL, Oracle Success, Distance-to-Goal, and Oracle Navigation Error.
✈️ Vision-and-Language Navigation with Uni-NaVid
We also support one-click training and evaluation pipeline for Uni-NaVid (RSS 2025), a unified video-based vision-language-action model that handles multiple embodied navigation tasks (VLN, ObjectNav, EQA, etc.) with a single model. Uni-NaVid is built on Vicuna-7B + EVA-ViT-G with online token merging for efficient streaming inference.
Task
Goal
Sensors
Actions
Backbone
VLN-R2R
Natural-language instruction
RGB (120° HFOV)
move_forward (0.25m), turn_left/right (30°), stop
Vicuna-7B + EVA-ViT-G
Prerequisites
A separatehabitat-gs-uni-navid conda environment (see Step 1 below).
Uni-NaVid repo cloned as a sibling of habitat-gs/:
cd /path/to/parent
git clone https://github.com/jzhzhang/Uni-NaVid.git
GS data downloaded and placed under data/scene_datasets/gs_scenes/ (same layout as other tasks)
Data Layout
Click to expand: Uni-NaVid-specific files added on top of the base dataset layout:
setup_uninavid.sh creates the habitat-gs-uni-navid conda environment cloned from habitat-gs, installs Uni-NaVid's Python dependencies, applies scripts_gs/uninavid_compat.patch to guarantee compatibility, and downloads model checkpoints (EVA-ViT-G ~3.5GB, Vicuna-7B ~13GB, Uni-NaVid pretrained ~14GB).
bash scripts_gs/setup_uninavid.sh
Click to expand: setup options
--skip-env Skip creating the conda environment
--skip-deps Skip installing Python dependencies
--skip-patch Skip applying uninavid_compat.patch
--skip-download Skip downloading model checkpoints
--proxy URL HTTP proxy for downloads
Step 2: Generate Trajectory Data
Uni-NaVid is trained on video trajectories in a conversation format. This script replays each VLN episode with a greedy path follower and records RGB frames as .mp4 videos + action annotations in Uni-NaVid's conversation JSON format, which are both included in our released dataset.
The greedy controller uses forward_step=0.25m, turn_angle=30°, HFOV=120°. Each trajectory video is encoded at 10 fps. The output JSON uses Uni-NaVid's conversation format with NAV_ID prefix and NAVIGATION_IDENTIFIER string to trigger navigation-specific token processing during training.
Step 3: Train
Two-stage training is supported as standard Uni-NaVid. Requires ≥80 GB VRAM per GPU (A100 80GB recommended).
stage-1: Fine-tune from Vicuna-7B (training from scratch, requires large dataset)
stage-2: Fine-tune from pre-trained Uni-NaVid checkpoint (recommended)
conda activate habitat-gs-uni-navid
# Recommended: fine-tune from pre-trained Uni-NaVid
bash scripts_gs/train_uninavid.sh --output output/uninavid_gs --stage stage-2
# Or train from scratch with Vicuna-7B
bash scripts_gs/train_uninavid.sh --output output/uninavid_gs --stage stage-1
Click to expand: training options
--output DIR Output directory for checkpoints (required)
--stage STAGE Training stage: stage-1|stage-2 (default: stage-2)
--num-gpus N Number of GPUs (default: 1)
--ckpt PATH Base checkpoint path (auto-selected per stage)
--epochs N Number of epochs (default: 1)
--batch-size N Per-device batch size (default: 8)
--grad-accum N Gradient accumulation steps (default: 2)
--lr RATE Learning rate (default: 1e-5)
Step 4: Evaluate
Evaluation runs online in a habitat.Env with the VLN-v0 task, matching the NaVid-VLN-CE evaluation pattern.
--ckpt PATH Path to trained Uni-NaVid checkpoint (required)
--output DIR Output directory for results (default: results/uninavid/<ckpt>_<split>)
--num-gpus N Number of GPUs for parallel evaluation (default: 1)
--split SPLIT Evaluation split: train|val (default: val)
--save-video Save evaluation rollout videos
The evaluator reports: Success Rate (SR), SPL, Oracle Success (OSR), and Distance-to-Goal (DTG).
🚶 Dynamic Navigation with Gaussian Avatars
We provide one-click training and evaluation pipelines for dynamic navigation tasks on 10 sample scenes, where a gaussian avatar walks a GAMMA-generated trajectory through each scene. In the three avoidance tasks the avatar is a moving obstacle during navigation, while in the tracking task the avatar is the tracking target.
Dynamic-nav data for the 10 sample scenes above is included in the released dataset. To generate for new scenes or different avatar/trajectory choices:
conda activate habitat-gs
# --scenes takes any scene names; --avatars gives the avatar id per scene
# (or a single id for all). E.g. to reproduce the released 10-scene data:
python scripts_gs/generate_dynamic_nav.py \
--scenes scene01 scene02 scene03 scene04 scene05 scene06 scene07 scene08 scene09 scene10 \
--avatars 2 1 6 3 2 1 6 3 4 6
# ObjectNav episodes: retargets the annotated ObjectNav episodes onto the dynamic scenes
python scripts_gs/generate_dynamic_objectnav.py \
--scenes scene01 scene02 scene03 scene04 scene05 scene06 scene07 scene08 scene09 scene10
The scripts accept the same options as the static pipelines (--num-envs, --num-gpus, --total-steps, --num-ckpts, --pretrained-ckpt, plus Hydra overrides).
Since tracking is hard for from-scratch RL, we additionally provide a DAgger trainer that distills a geometric follower into a deployable tracking policy:
bash scripts_gs/eval_dynamic_nav.sh --task avoid --ckpt output/dyn_pointnav/checkpoints/latest.pth
# ... same for avoid_imagenav / avoid_objectnav / track
Besides the standard task metrics (Success, SPL, Distance-to-Goal for avoidance; track_rate, tracknav_success for tracking), all four tasks report per-episode avatar interaction metrics: avatar_proxy_collision_count and avatar_proxy_intrusion.
🧩 Agent Skills
We ship two Agent Skills that let a coding agent (Claude Code, Codex, OpenClaw, etc.) drive Habitat-GS without re-reading the whole repo:
Interactively pilot a robot in a live GS sim via the MCP tools (load a scene, move, observe RGB/depth, run autonomous nav loops, export video). Pairs with the HabitatAgent MCP server.
Quickly train and evaluate a navigation policy in Habitat-GS simulation environment, the full generate → train → evaluate flow for PointNav/ImageNav/ObjectNav and for VLN (StreamVLN, Uni-NaVid).
Install them into an agent's workspace with the skill manager:
tools/manage_habitat_gs_skill.sh install --workspace /path/to/agent/workspace
tools/manage_habitat_gs_skill.sh status --workspace /path/to/agent/workspace
If you find Habitat-GS useful in your research, please consider citing:
@misc{xia2026habitatgs,
title={Habitat-GS: A High-Fidelity Navigation Simulator with Dynamic Gaussian Splatting},
author={Ziyuan Xia and Jingyi Xu and Chong Cui and Yuanhong Yu and Jiazhao Zhang and Qingsong Yan and Tao Ni and Junbo Chen and Xiaowei Zhou and Hujun Bao and Ruizhen Hu and Sida Peng},
year={2026},
eprint={2604.12626},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2604.12626},
}
关于 About
[ECCV 2026] Habitat-GS: A High-Fidelity Navigation Simulator with Dynamic Gaussian Splatting