-
Notifications
You must be signed in to change notification settings - Fork 10
/
endurance_calculator.py
129 lines (95 loc) · 3 KB
/
endurance_calculator.py
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from collections import defaultdict
import math
def make_dict():
return defaultdict(make_dict)
# Usage:
# tau = defaultdict(make_dict)
# v = 17
# i = 3
# j = 12
# tau[v][i][j] = 44
def Pi(T, Vvert):
return 0.8554*T*(Vvert/2.0 + math.sqrt((Vvert/2.0)**2 + T/(0.3051)**2))
def Pp(T):
return 0.3177*(T**1.5)
def Ppar(Vair):
return 0.0296*(Vair**3)
def Thrust(m, Vair): # MATTERNET M2 Weight without payload: 9.5 Kg
return math.sqrt(((1.5 + m)*9.8 - 0.0279*(Vair*math.cos(10*math.pi/180.0))**2)**2 + (0.0296*Vair**2)**2)
def give_endurance(node, vehicle, travel, v, i, j, k, Etype):
# for [v,i,j,k] in P:
p = vehicle[v].takeoffSpeed
q = vehicle[v].cruiseSpeed
r = vehicle[v].landingSpeed
TTvij = travel[v][i][j].takeoffTime
FTvij = travel[v][i][j].flyTime
LTvij = travel[v][i][j].landTime
TTvjk = travel[v][j][k].takeoffTime
FTvjk = travel[v][j][k].flyTime
LTvjk = travel[v][j][k].landTime
sj = node[j].serviceTimeUAV
mj = (node[j].parcelWtLbs)*0.453592 # Weight in Kg
E = vehicle[v].batteryPower
minimum_time_required = TTvij + FTvij + LTvij + sj + TTvjk + FTvjk + LTvjk
if Etype == 1: # Non-linear endurance model
# a) Takeoff from customer i:
newT = Thrust(mj, 0)
Ea = TTvij*(Pi(newT, p) + Pp(newT))
# b) Fly to customer j:
newT = Thrust(mj, q)
Eb = FTvij*(Pi(newT, 0) + Pp(newT) + Ppar(q))
# c) Land at customer j:
newT = Thrust(mj, 0)
Ec = LTvij*(Pi(newT, r) + Pp(newT))
# d) Takeoff from customer j:
newT = Thrust(0, 0)
Ed = TTvjk*(Pi(newT, p) + Pp(newT))
# e) Fly to customer k:
newT = Thrust(0, q)
Ee = FTvjk*(Pi(newT, 0) + Pp(newT) + Ppar(q))
# f) Land at customer k:
newT = Thrust(0, 0)
Ef = LTvjk*(Pi(newT, r) + Pp(newT))
minimum_energy_required = Ea + Eb + Ec + Ed + Ee + Ef
energy_left = E - minimum_energy_required
if energy_left >= 0:
newT = Thrust(0, 0)
PHover = Pi(newT, 0) + Pp(newT)
endurance = minimum_time_required + float(energy_left)/PHover
else:
endurance = -1
elif Etype == 2: # Linear endurance model
if q == 31.2928:
A = 24.2368
B = 1391.9916
elif q == 15.6464:
A = 210.8011
B = 181.2141
else:
print("ERROR: Choose the right vehicle speed")
exit()
# Energy required to travel from i to j:
Eij = (TTvij + FTvij + LTvij)*(A*mj + B)
# Energy required to travel from j to k:
Ejk = (TTvjk + FTvjk + LTvjk)*(A*0 + B)
energy_left = E - (Eij + Ejk)
if energy_left >= 0:
endurance = minimum_time_required + float(energy_left)/(A*0 + B)
else:
endurance = -1
elif Etype == 3: # Fixed endurance (time)
if int(E) == 291094:
endurance = 700
elif int(E) == 562990:
endurance = 1400
elif int(E) == 457503:
endurance = 350
elif int(E) == 904033:
endurance = 700
elif Etype in [4,5]: # Unlimited endurance in terms of time
endurance = 24*3600 # 1 Day
else:
print('ERROR: Sorry! Wrong endurance type.')
exit()
return endurance
# return 1200