A drone piloting training simulator built with Unreal Engine 5.0, featuring realistic physics via PID controllers, a modular training system, and VR support.
RosendroUE teaches drone piloting through a series of structured training modules with progressive difficulty. The simulation uses PID (Proportional-Integral-Derivative) control algorithms for realistic flight dynamics — the same control theory used in real-world drone autopilots.
Screenshots / gameplay GIF coming soon.
- Realistic drone physics driven by PID controllers for thrust, pitch/roll, and yaw
- Two camera modes: Third-Person View (TPV) and First-Person View (FPV)
- Mini-map / orthographic overhead view
- FPV object detection ring system (proximity warning)
- Environmental wind volume system
Modular, sequential training path with configurable difficulty:
| Module | Description |
|---|---|
| Trigger | Fly through designated zones |
| Hover | Maintain altitude for a set duration |
| Turn | Yaw/rotation control exercises |
| Encircle | Follow a circular path around a target |
| Landing | Precision landing within speed constraints |
Modules are orchestrated by a Module_Sequencer that controls timing, progression, and tutorial messages.
- Main menu, pause menu, in-game HUD
- Tutorial overlay system (title + image + description)
- Module progress widgets
- Custom loading screens
- Joystick indicator, altitude, and speed displays
- OpenXR, OculusVR (Meta), SteamVR, HoloLens
- 15+ device-specific controller bindings (Valve Knuckles, Vive Tracker, Oculus Touch, etc.)
- Fixed 90 FPS target for VR comfort
The project is primarily Blueprint-driven with C++ for core algorithms.
Drone_Class (abstract)
├── PID controllers (thrust, pitch/roll, yaw)
├── Camera system (TPV / FPV + spring-arm gimbal)
└── Mini_Drone (extended — per-propeller physics)
Base_Module (abstract)
├── Hover_Module
├── Landing_Module
├── Encircle_Module
├── Turn_Module
└── Trigger_Module
Module_Sequencer — orchestrates module order, timing, and tutorial messages
Wind_Volume — environmental physics volume
PID_FunctionLibrary (C++) — reusable Blueprint-callable PID functions
State machine: LevelState enum — Pre-Level → In Progress → Completed / Failed
| Layer | Technology |
|---|---|
| Engine | Unreal Engine 5.0 |
| Language | C++ + Blueprints |
| Rendering | Lumen, Nanite, Niagara, ray tracing |
| Build | Unreal Build Tool, IoStore, Oodle Kraken |
| VR | OpenXR, OculusVR, SteamVR |
| Scripting | Python (editor automation) |
| Diagrams | PlantUML |
Plugins: ModelingToolsEditorMode, AsyncLoadingScreen, SiriusUtilityNodes, RyHelpfulHelpers, SortPlugin
RosendroUE-main/
├── Source/ # C++ source (PID controllers, module definition)
├── Content/
│ ├── Characters/Drone/ # Drone blueprint classes
│ ├── Models/ # 3D drone meshes + PBR materials
│ ├── Level_Modules/ # Training module blueprints
│ ├── Levels/ # Maps, game modes, level templates
│ ├── UI/ # HUD, menus, progress widgets, fonts
│ └── Tests/ # Test levels
├── Config/ # Engine, input, VR bindings configuration
├── Script/
│ ├── PlantUML/ # Architecture diagrams
│ └── PythonScripts/ # Editor automation scripts
└── Drone_Simulation.uproject
Core flight algorithms are implemented in C++ and exposed to Blueprints via a function library, keeping the math performant while letting designers tune parameters without recompiling:
// Linear PID — used for thrust and altitude control
float PIDCalculation(float target, float current, float& integral,
float& prevError, float Kp, float Ki, float Kd, float dt);
// Rotation-aware PID — handles 360° wrapping for yaw control
float PIDCalculationRotation(float target, float current, float& integral,
float& prevError, float Kp, float Ki, float Kd, float dt);- Unreal Engine 5.0
- Visual Studio 2019 or 2022 (for C++ compilation)
- Windows 10/11
- Clone the repository
- Right-click
Drone_Simulation.uproject→ Generate Visual Studio project files - Open the
.slnand build theDevelopment Editorconfiguration - Open
Drone_Simulation.uprojectin Unreal Engine 5.0 - Open
Content/Levels/MainMenuand press Play
Enable VR in Config/DefaultEngine.ini by setting bStartInVR=True, or launch with the -vr flag.