Drone-first photorealistic simulation, synthetic dataset generation, and cross-benchmark trajectory tooling for VLA research.
Project description
GS-DroneGym
Photorealistic drone simulation, synthetic aerial dataset generation, and cross-benchmark trajectory tooling for vision-language-action research.
GS-DroneGym is built around one problem: VLA-AN highlights the visual sim-to-real gap as a major blocker for drone VLA systems, while RaceVLA shows that aerial VLA policies can work but still degrade on safety and generalization. This project turns that motivation into a usable research stack: a drone simulator with 3D Gaussian Splatting rendering, waypoint supervision, task libraries, and now a synthetic VLA-AN-like dataset factory plus shared tooling for GS-DroneGym, LIBERO, and LeRobot-format data.
What This Repo Actually Does
GS-DroneGym can be used in four ways:
- Drone simulator
- run drone navigation tasks with RGB, depth, state, and language instructions
- Interactive viewer
- fly the drone manually and inspect RGB, depth, and top-down trajectories
- Synthetic dataset factory
- generate waypoint-supervised aerial datasets in Parquet shards
- Cross-benchmark data layer
- normalize, inspect, train on, and evaluate GS-DroneGym, LIBERO, and LeRobot-style trajectories
What's New
v0.1: core quadrotor simulator, renderer stack, tasks, metrics, and viewerv0.2: shared trajectory schema, benchmark adapters, dataset loaders, and behavior cloning baselinev0.3: synthetic VLA-AN-like dataset generation with staged curricula, expert waypoints, safety labels, Parquet shards, debug JSON episodes, preview CLI, and dataset validation
Visual Demos
Keyboard control demo
This shows manual waypoint control in the live viewer.
The left panel is RGB, the middle panel is depth, and the right panel is the top-down flight trace.
As you press movement keys, the path and heading update in real time.
Obstacle slalom
This task checks whether the drone can weave through a structured obstacle course.
The top-down view makes drift and near-collision behavior easy to inspect.
Dynamic follow
This task is about staying close to a moving target rather than reaching a fixed point.
It is useful for debugging temporal control and tracking lag.
Narrow corridor
This stresses precision and safety in tight geometry.
You can immediately see whether the drone stays centered or clips the corridor walls.
Install
After the PyPI release is available:
pip install gs-dronegym
Until then, install from GitHub:
pip install "gs-dronegym @ git+https://github.com/09Catho/gs-dronegym.git"
For development:
git clone https://github.com/09Catho/gs-dronegym.git
cd gs-dronegym
pip install -e .
For CUDA rendering extras from GitHub:
pip install "gs-dronegym[cuda] @ git+https://github.com/09Catho/gs-dronegym.git"
For LIBERO support:
pip install "gs-dronegym[libero] @ git+https://github.com/09Catho/gs-dronegym.git"
The libero extra only installs shared loader dependencies. Install the official LIBERO environment separately according to the upstream project you are using, because PyPI packages cannot depend on arbitrary GitHub repos.
For LeRobot-format support:
pip install "gs-dronegym[lerobot] @ git+https://github.com/09Catho/gs-dronegym.git"
For all benchmark extras:
pip install "gs-dronegym[benchmarks] @ git+https://github.com/09Catho/gs-dronegym.git"
5-Minute Start
1. Run the simulator
import gs_dronegym
env = gs_dronegym.make("PointNav-v0", scene=None)
obs, info = env.reset(seed=0)
obs, reward, terminated, truncated, info = env.step(env.action_space.sample())
print(obs["instruction"])
print(obs["rgb"].shape, obs["depth"].shape, obs["state"].shape)
2. Open the live viewer
gs-dronegym-live-view --env-id PointNav-v0 --scene None --policy keyboard --action-mode waypoint
Keyboard mapping:
I/K: forward/backJ/L: left/rightU/O: up/downN/M: yaw left/rightP: pauseR: resetEsc: quit
3. Generate a tiny synthetic dataset
gs-dronegym-generate-dataset outputs/synth_dataset --scenes mock://lab_a mock://lab_b --episodes-per-scene 12 --renderer-device cpu --allow-mock-rendering
4. Validate the generated dataset
gs-dronegym-validate-dataset outputs/synth_dataset
Core Workflows
Workflow A: Simulate a drone task
Use this when you want to prototype a policy, debug control logic, or inspect task behavior.
gs-dronegym-live-view --env-id PointNav-v0 --scene None --policy keyboard --action-mode waypoint
Workflow B: Generate synthetic VLA-style data
Use this when you want training data with RGB, depth, drone state, language instruction, expert waypoint, and safety labels.
gs-dronegym-generate-dataset outputs/synth_dataset --scenes mock://lab_a mock://lab_b --episodes-per-scene 12 --renderer-device cpu --allow-mock-rendering
gs-dronegym-validate-dataset outputs/synth_dataset
Workflow C: Preview a dataset task before generating at scale
Use this when you want to inspect a single scenario and save a GIF.
gs-dronegym-preview-dataset-task --scene None --stage stage2_flight_skills --task-id narrow_corridor --steps 40 --save-gif outputs/dataset_preview.gif --allow-mock-rendering
Workflow D: Load a real Gaussian scene
Use this when you already have a Gaussian .ply from Nerfstudio or another 3DGS pipeline.
gs-dronegym-live-view --env-id PointNav-v0 --scene C:\path\to\scene.ply --renderer-device cuda --policy keyboard
For synthetic dataset generation on a real scene:
gs-dronegym-generate-dataset outputs/real_dataset --scenes C:\path\to\scene.ply --episodes-per-scene 12 --renderer-device cuda
Synthetic Dataset Factory
GS-DroneGym v0.3 adds a staged aerial dataset generator designed to approximate the public ingredients described in VLA-AN.
Generated supervision per step:
instructionrgbdepthstateexpert_waypoint = [x, y, z, yaw]- safety labels:
collision_imminentmin_clearance_mrecovery_requiredcollision_occurredsuccess
Curriculum stages:
stage1_scene_comprehensionstage2_flight_skillsstage3_long_horizon_navigation
Output layout:
manifest.jsonsplits.jsonepisodes_debug/media/<split>/<shard>/rgb/*.pngmedia/<split>/<shard>/depth/*.npyparquet/<split>/steps-xxxxx.parquetparquet/<split>/episodes.parquet
Important note: this is a VLA-AN-like approximation, not a claim of exact reproduction of the paper's internal private dataset.
Cross-Benchmark Layer
GS-DroneGym also includes a shared benchmark/data layer for:
- live drone rollouts
- normalized offline trajectories
- LIBERO adapters
- LeRobot-format dataset loading
- behavior cloning
- evaluation reports
Main interfaces:
TaskSpecActionSpecObservationSpecTrajectoryStepTrajectoryEpisodeBenchmarkReportmake_benchmark(...)load_dataset(..., format="gs_dronegym" | "libero" | "lerobot")
Built-In Drone Tasks
| Task | Description | Success Metric | Max Steps |
|---|---|---|---|
PointNav-v0 |
Fly to a sampled 3D coordinate. | Reach goal within 0.5 m. |
200 |
ObjectNav-v0 |
Fly to a language-described region. | Reach region goal within 0.5 m. |
200 |
ObstacleSlalom-v0 |
Pass through five obstacle gates in sequence. | Clear all gates and finish. | 200 |
DynamicFollow-v0 |
Track a moving target. | Stay within 1.0 m for 15 consecutive steps. |
200 |
NarrowCorridor-v0 |
Traverse a tight corridor safely. | Reach corridor exit within 0.5 m. |
200 |
Architecture
flowchart LR
A["Drone state"] --> B["QuadrotorDynamics"]
B --> C["CameraModel pose"]
C --> D["GSplatRenderer / MockRenderer"]
D --> E["RGB + depth observations"]
E --> F["Policy / benchmark adapter"]
F --> G["Waypoint [x, y, z, yaw]"]
G --> H["WaypointController"]
H --> I["Thrust + body-rate commands"]
I --> B
E --> J["Trajectory schema / dataset writer / reports"]
K["LIBERO / LeRobot adapters"] --> J
CLI Reference
Inspect a dataset:
gs-dronegym-inspect-dataset path/to/dataset --format gs_dronegym
Train behavior cloning:
gs-dronegym-train-bc path/to/dataset --format gs_dronegym --epochs 3 --checkpoint outputs/policy.pt
Evaluate:
gs-dronegym-evaluate --benchmark gs_dronegym --env-id PointNav-v0 --n-episodes 5
Live viewer:
gs-dronegym-live-view --env-id PointNav-v0 --scene None --steps 60
Save a GIF without opening a window:
gs-dronegym-live-view --env-id PointNav-v0 --scene None --steps 60 --no-show --save-gif outputs/live_view.gif
Generate a scripted keyboard-style demo GIF:
gs-dronegym-live-view --env-id PointNav-v0 --scene None --policy scripted --steps 60 --no-show --save-gif outputs/keyboard_demo.gif
Examples
The examples/ folder includes:
export_drone_rollout.pygenerate_synthetic_dataset.pypreview_synthetic_dataset.pylive_viewer.pyload_libero_dataset.pyload_lerobot_dataset.pytrain_bc.pyevaluate_benchmark.py
Real Scene Workflow
If you want real rendering instead of mock rendering:
- capture a real room or outdoor space with images/video
- build a Gaussian
.plywith Nerfstudio or another 3DGS pipeline - pass that
.plyinto GS-DroneGym - run the viewer or dataset generator on top of that real scene
Example:
gs-dronegym-live-view --env-id PointNav-v0 --scene C:\path\to\scene.ply --renderer-device cuda --policy keyboard
Next Phase
Planned work from here:
-
Larger real-scene dataset generation
- better
gsplatbatching - multi-scene GPU scheduling
- stronger resume/checkpoint behavior
- better
-
Richer expert supervision
- stronger recovery labels
- better dynamic-target forecasting
- optional low-level control labels in addition to waypoints
-
Dataset publishing
- dataset cards
- Hugging Face export helpers
- benchmark tables for generated splits
References
- VLA-AN: An Efficient and Onboard Vision-Language-Action Framework for Aerial Navigation in Complex Environments
- RaceVLA: VLA-based Racing Drone Navigation with Human-like Behaviour
- LIBERO: Benchmarking Knowledge Transfer for Lifelong Robot Learning
- LeRobot GitHub
- Hugging Face LeRobot Docs
Development
pip install -e .[dev]
python -m ruff check .
python -m pytest -q
The core path remains CPU-only and fully testable with MockRenderer. Optional GPU rendering and external benchmark integrations are import-gated.
Citation
@software{saxena2025gsdronegym,
author = {Saxena, Atul},
title = {GS-DroneGym: Photorealistic Simulation for VLA Drone Navigation},
year = {2025},
url = {https://github.com/09Catho/gs-dronegym}
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gs_dronegym-0.3.0.tar.gz.
File metadata
- Download URL: gs_dronegym-0.3.0.tar.gz
- Upload date:
- Size: 84.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00c69e06e9263971e031a8dc445f6be38d4e615010e02e7913653b1cf8a30011
|
|
| MD5 |
4b4ade1e5acadf11250006cdd37eabce
|
|
| BLAKE2b-256 |
e0988a3e344f5fd541d8ee6f1dbe14b4bfa89e9c06ea3afbff9b405333fd950f
|
File details
Details for the file gs_dronegym-0.3.0-py3-none-any.whl.
File metadata
- Download URL: gs_dronegym-0.3.0-py3-none-any.whl
- Upload date:
- Size: 93.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dbdcd0c051a6aa7f35aaa600a430ed1619bdba12a2072bf29d66a8932c30d7e5
|
|
| MD5 |
7ddf0872acc6593c29742f8360428dc4
|
|
| BLAKE2b-256 |
844b81b87e2d74e2078a25b6adf7df746df661209f1e0bc7b2984fbacb82142e
|