1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//! # drone-vrp
//!
//! Drone Vehicle Routing Problem solver with physics-based energy models.
//!
//! Supports 9 drone platforms including 6 Ukrainian-made drones used for
//! logistics and supply delivery, plus the DJI FlyCart 30 and Wing.
//!
//! ## Energy Model
//!
//! Uses the Dorling et al. (2017) linear power model:
//!
//! ```text
//! Power = P_p + (P_l - P_p) × (payload / max_payload)
//! Energy = Power × (Distance / GroundSpeed) / 3600
//! GroundSpeed = max(CruiseSpeed - WindSpeed, 1.0)
//! ```
//!
//! ## Supported Drones
//!
//! | Model | Country | Type | Payload | Battery | Cruise |
//! |-------|---------|------|---------|--------|--------|
//! | FlyCart30 | CN | Heavy-lift | 30 kg | 2000 Wh | 15 m/s |
//! | Wing | US | Light delivery | 1.2 kg | 150 Wh | 30 m/s |
//! | R18 | UA | Octocopter | 5 kg | 1440 Wh | 12 m/s |
//! | PD-2 | UA | VTOL fixed-wing | 11 kg | 29000 Wh* | 27.8 m/s |
//! | Vampire | UA | Hexacopter | 15 kg | 3200 Wh | 16.7 m/s |
//! | HeavyShot | UA | Quadcopter | 30 kg | 5000 Wh | 14 m/s |
//! | Kazhan | UA | Hexacopter | 20 kg | 4000 Wh | 15 m/s |
//! | Nemesis | UA | Quadcopter | 20 kg | 3800 Wh | 18 m/s |
//! | Matrice350RTK | CN | Multi-rotor | 2.7 kg | 798 Wh | 15 m/s |
//!
//! *PD-2 uses gasoline propulsion; effective energy converted at ~30% efficiency.
//!
//! ## Quick Start
//!
//! ```rust
//! use drone_vrp::{DroneSpec, DroneModel, Propulsion};
//!
//! let r18 = DroneSpec::r18();
//! assert_eq!(r18.model, DroneModel::R18);
//! assert_eq!(r18.country, "UA");
//!
//! // Calculate energy for a 5 km flight with 3 kg payload and 2 m/s headwind
//! let energy = r18.calculate_energy_wh(5000.0, 3.0, 2.0);
//!
//! // Estimate maximum range at full payload
//! let range = r18.estimate_max_range_m(5.0, 0.0);
//! 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);
//! ```
pub use ;
pub use DroneSolver;