# drone-vrp
Drone Vehicle Routing Problem solver with physics-based energy models for UAV delivery. Supports **9 drone platforms** including 6 Ukrainian-made drones used for logistics and supply delivery.
## Supported Drones
| FlyCart30 | DJI | CN | Heavy-lift copter | 30 kg | 2000 Wh | 15 m/s | 36 km |
| Wing | Alphabet | US | Light delivery | 1.2 kg | 150 Wh | 30 m/s | 43 km |
| **R18** | **Aerorozvidka** | **UA** | **Octocopter** | **5 kg** | **1440 Wh** | **12 m/s** | **11 km** |
| **PD-2** | **UkrSpecSystems** | **UA** | **VTOL fixed-wing** | **11 kg** | **29000 Wh†** | **27.8 m/s** | **320 km** |
| **Vampire** | **SkyFall** | **UA** | **Hexacopter** | **15 kg** | **3200 Wh** | **16.7 m/s** | **18 km** |
| **HeavyShot** | **Gurzuf Defence** | **UA** | **Quadcopter** | **30 kg** | **5000 Wh** | **14 m/s** | **18 km** |
| **Kazhan** | **Reactive Drone** | **UA** | **Hexacopter** | **20 kg** | **4000 Wh** | **15 m/s** | **19 km** |
| **Nemesis** | **UFORCE** | **UA** | **Quadcopter** | **20 kg** | **3800 Wh** | **18 m/s** | **23 km** |
| Matrice350RTK | DJI | CN | Multi-rotor | 2.7 kg | 798 Wh | 15 m/s | 13 km |
\* Range = max round-trip radius at full payload, 20% battery reserve, no wind.
† PD-2 uses gasoline propulsion; effective energy converted from 11L fuel at ~30% efficiency.
## Energy Model
Based on **Dorling et al. (2017)**:
```
Power = P_p + (P_l − P_p) × (payload / max_payload)
Energy (Wh) = Power × (Distance / GroundSpeed) / 3600
GroundSpeed = max(CruiseSpeed − WindSpeed, 1.0)
```
## Installation
```bash
cargo install drone-vrp
```
## CLI Usage
```bash
# Show all drone specs
drone-vrp specs
# Show specific drone (with aliases)
drone-vrp specs --drone R18
drone-vrp specs --drone baba_yaga # → Vampire
drone-vrp specs --drone m350 # → Matrice350RTK
# Calculate energy for a flight leg
drone-vrp energy --drone Vampire --distance 10000 --payload 10 --wind 3
# Estimate max range
drone-vrp range --drone Kazhan --payload 15 --wind 0
# Solve a full Drone VRP (from GeoJSON customers)
drone-vrp solve --drone Vampire --customers customers.geojson \
--depot-lat 48.5 --depot-lon 32.2 --wind 3
```
## Library Usage
```rust
use drone_vrp::{DroneSpec, DroneModel, DroneSolver, DroneVrpInstance};
// Get a drone spec
let r18 = DroneSpec::r18();
assert_eq!(r18.model, DroneModel::R18);
assert_eq!(r18.country, "UA");
// Calculate energy
let energy = r18.calculate_energy_wh(5000.0, 3.0, 2.0); // 5km, 3kg, 2m/s headwind
// Estimate max range
let range = r18.estimate_max_range_m(5.0, 0.0); // full payload, no wind
println!("R18 range at full payload: {:.1} km", range / 1000.0);
// Parse by name (with aliases)
let vampire = DroneSpec::from_name("baba_yaga").unwrap();
assert_eq!(vampire.model, DroneModel::Vampire);
// Solve a VRP
let instance = DroneVrpInstance {
drone_model: DroneModel::Vampire,
depot: [48.5, 32.2],
customers: vec![[48.55, 32.25], [48.6, 32.3]],
demands_kg: vec![5.0, 10.0],
wind_speed_ms: 3.0,
no_fly_zones: vec![],
};
let result = DroneSolver::solve(&instance).unwrap();
println!("Routes: {}, Energy: {:.0} Wh", result.routes.len(), result.energy_used_wh);
```
## Aliases
| `fc30`, `dji_fc30` | FlyCart30 |
| `aerorozvidka` | R18 |
| `pd-2`, `ukrspecsystems` | PD-2 |
| `baba_yaga`, `skyfall` | Vampire |
| `heavy_shot`, `gurzuf` | HeavyShot |
| `kazhan630`, `reactive_drone` | Kazhan |
| `uforce` | Nemesis |
| `m350`, `m350rtk`, `matrice`, `dji_m350` | Matrice350RTK |
## Drone Details
### 🇺🇦 R18 (Aerorozvidka)
Ukrainian octocopter used since 2019 for strike missions, cargo delivery, and reconnaissance. 8 motors for redundancy. Armed with RKG-1600 cumulative anti-tank grenades. Official specs: 17 kg MTOW, 5 kg payload, 45 min flight, 12 m/s cruise, 2× Li-ion 6S 24V 32.5Ah battery packs.
### 🇺🇦 PD-2 (UkrSpecSystems)
Ukrainian VTOL fixed-wing UAV with 100cc gasoline engine + electric VTOL motors. 55 kg MTOW, 11 kg payload, 100 km/h cruise, 8+ hours endurance. Modular design converts from VTOL to conventional in 15 minutes. Gasoline-powered, modeled here as hybrid with effective 29 kWh energy store.
### 🇺🇦 Vampire (SkyFall)
The most famous Ukrainian "Baba Yaga" hexacopter. 15 kg payload, ~23 min endurance, combat radius up to 20 km. Used for night strikes, mine-laying, and humanitarian supply delivery. Production: thousands per month as of 2025.
### 🇺🇦 HeavyShot (Gurzuf Defence)
Ukrainian heavy quadcopter with 30 kg payload and Starlink control. Combat radius up to 25 km. Among the heaviest Ukrainian bomber drones.
### 🇺🇦 Kazhan (Reactive Drone)
Ukrainian hexacopter with 20 kg payload, AI-assisted targeting, and triple communication (encrypted radio + Starlink + LTE). Self-heating Li-Po solid-state batteries for winter operations.
### 🇺🇦 Nemesis (UFORCE)
Ukrainian heavy quadcopter developed for the 412th separate SBS brigade. 20 kg payload, Starlink satellite control for beyond-line-of-sight operations up to 25 km radius.
### 🇨🇳 Matrice 350 RTK (DJI)
Industrial multi-rotor widely deployed in Ukraine for ISR and light delivery. IP54 rated, 2× TB65 batteries (798 Wh total), ~55 min flight time, 2.7 kg payload.
## License
MIT OR Apache-2.0