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