flightanalysis 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flightanalysis-0.2.0/flightanalysis.egg-info → flightanalysis-0.2.2}/PKG-INFO +1 -1
- flightanalysis-0.2.2/examples/schedules_construction/create_all.py +21 -0
- flightanalysis-0.2.0/examples/schedules_construction/a25.py → flightanalysis-0.2.2/examples/schedules_construction/f3a_a25.py +6 -8
- flightanalysis-0.2.0/examples/schedules_construction/f25.py → flightanalysis-0.2.2/examples/schedules_construction/f3a_f25.py +3 -1
- flightanalysis-0.2.0/examples/schedules_construction/p23.py → flightanalysis-0.2.2/examples/schedules_construction/f3a_p23.py +3 -1
- flightanalysis-0.2.0/examples/schedules_construction/p25.py → flightanalysis-0.2.2/examples/schedules_construction/f3a_p25.py +3 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/f3auk_Intermediate.py +4 -6
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/f3auk_clubman.py +5 -8
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/imac_unlimited_2024.py +9 -17
- flightanalysis-0.2.2/examples/schedules_construction/make_manoeuvre.py +56 -0
- flightanalysis-0.2.2/examples/scoring/analysis_reprocess.py +12 -0
- flightanalysis-0.2.2/examples/scoring/f3a_criteria_maker.py +41 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/judging.py +20 -7
- flightanalysis-0.2.2/examples/scoring/manoeuvres/intra_analysis.py +26 -0
- flightanalysis-0.2.2/examples/scoring/manoeuvres/mans/extract_mans.py +28 -0
- flightanalysis-0.2.2/examples/scoring/split_optimisation.py +50 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/__init__.py +1 -1
- flightanalysis-0.2.2/flightanalysis/analysis/__init__.py +3 -0
- flightanalysis-0.2.2/flightanalysis/analysis/el_analysis.py +33 -0
- flightanalysis-0.2.2/flightanalysis/analysis/man_analysis.py +275 -0
- flightanalysis-0.2.2/flightanalysis/analysis/sch_analysis.py +48 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +124 -191
- flightanalysis-0.2.0/flightanalysis/data/a25_schedule.json → flightanalysis-0.2.2/flightanalysis/data/f3a_a25_schedule.json +57 -123
- flightanalysis-0.2.0/flightanalysis/data/f25_schedule.json → flightanalysis-0.2.2/flightanalysis/data/f3a_f25_schedule.json +179 -407
- flightanalysis-0.2.0/flightanalysis/data/p23_schedule.json → flightanalysis-0.2.2/flightanalysis/data/f3a_p23_schedule.json +144 -240
- flightanalysis-0.2.0/flightanalysis/data/p25_schedule.json → flightanalysis-0.2.2/flightanalysis/data/f3a_p25_schedule.json +106 -213
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/data/f3auk_clubman_schedule.json +37 -89
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/data/f3auk_inter_schedule.json +41 -137
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/builders/elbuilders.py +14 -10
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/builders/manbuilder.py +1 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/mandef.py +22 -18
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/maninfo.py +28 -10
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/manparm.py +14 -12
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/scheddef.py +57 -14
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/autorotation.py +4 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/element.py +60 -9
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/loop.py +20 -8
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/nose_drop.py +9 -3
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/pitch_break.py +15 -7
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/recovery.py +6 -5
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/stall_turn.py +14 -7
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/manoeuvre.py +19 -5
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/__init__.py +1 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/__init__.py +2 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/criteria.py +19 -5
- flightanalysis-0.2.2/flightanalysis/scoring/criteria/f3a_criteria.py +38 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/inter/combination.py +1 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/inter/comparison.py +3 -5
- flightanalysis-0.2.2/flightanalysis/scoring/criteria/intra/bounded.py +68 -0
- flightanalysis-0.2.2/flightanalysis/scoring/criteria/intra/continuous.py +89 -0
- flightanalysis-0.2.2/flightanalysis/scoring/criteria/intra/single.py +38 -0
- flightanalysis-0.2.2/flightanalysis/scoring/downgrade.py +46 -0
- flightanalysis-0.2.2/flightanalysis/scoring/measurement.py +234 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/results.py +34 -6
- {flightanalysis-0.2.0 → flightanalysis-0.2.2/flightanalysis.egg-info}/PKG-INFO +1 -1
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis.egg-info/SOURCES.txt +16 -10
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/setup.cfg +1 -1
- flightanalysis-0.2.2/tests/test_criiteria.py +156 -0
- flightanalysis-0.2.0/examples/schedules_construction/make_manoeuvre.py +0 -41
- flightanalysis-0.2.0/examples/scoring/f3a_criteria_maker.py +0 -40
- flightanalysis-0.2.0/examples/scoring/manoeuvres/intra_analysis.py +0 -24
- flightanalysis-0.2.0/examples/scoring/manoeuvres/mans/extract_mans.py +0 -37
- flightanalysis-0.2.0/flightanalysis/manoeuvre_analysis.py +0 -345
- flightanalysis-0.2.0/flightanalysis/scoring/criteria/f3a_criteria.py +0 -34
- flightanalysis-0.2.0/flightanalysis/scoring/criteria/intra/continuous.py +0 -58
- flightanalysis-0.2.0/flightanalysis/scoring/criteria/intra/single.py +0 -24
- flightanalysis-0.2.0/flightanalysis/scoring/criteria/single.py +0 -26
- flightanalysis-0.2.0/flightanalysis/scoring/downgrade.py +0 -106
- flightanalysis-0.2.0/flightanalysis/scoring/measurement.py +0 -160
- flightanalysis-0.2.0/tests/test_criiteria.py +0 -77
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/LICENSE +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/MANIFEST.in +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/README.md +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/data/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/manoeuvres/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/manoeuvres/mans/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/data/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/builders/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/builders/lines.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/collectors.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/eldef.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/operations/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/operations/funopp.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/operations/itemopp.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/operations/mathopp.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/definition/operations/operation.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/elements/line.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/schedule.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/exponential.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis.egg-info/dependency_links.txt +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/flightanalysis.egg-info/top_level.txt +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/setup.py +0 -0
- {flightanalysis-0.2.0 → flightanalysis-0.2.2}/tests/test_data.py +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from .f3a_p23 import p23_def
|
|
2
|
+
from .f3a_a25 import a25_def
|
|
3
|
+
from .f3a_p25 import p25_def
|
|
4
|
+
from .f3a_f25 import f25_def
|
|
5
|
+
from .imac_unlimited_2024 import sdef as imac_unl2024_def
|
|
6
|
+
from .f3auk_clubman import clubman_def as f3auk_club_def
|
|
7
|
+
from .f3auk_Intermediate import intermediate_def as f3auk_int_def
|
|
8
|
+
|
|
9
|
+
sdefs = {
|
|
10
|
+
'f3a_p23_schedule': p23_def,
|
|
11
|
+
'f3a_a25_schedule': a25_def,
|
|
12
|
+
'f3a_p25_schedule': p25_def,
|
|
13
|
+
'f3a_f25_schedule': f25_def,
|
|
14
|
+
'IMAC_Unlimited2024_schedule': imac_unl2024_def,
|
|
15
|
+
'f3auk_clubman_schedule': f3auk_club_def,
|
|
16
|
+
'f3auk_inter_schedule': f3auk_int_def
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
for sdef in sdefs:
|
|
21
|
+
sdef.to_json("flightanalysis/data/p23_schedule.json")
|
|
@@ -230,11 +230,9 @@ a25_def = SchedDef([
|
|
|
230
230
|
MBTags.CENTRE,
|
|
231
231
|
], )
|
|
232
232
|
|
|
233
|
-
]
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
233
|
+
]
|
|
234
|
+
)
|
|
235
|
+
|
|
238
236
|
|
|
239
237
|
if __name__ == "__main__":
|
|
240
238
|
|
|
@@ -242,8 +240,8 @@ if __name__ == "__main__":
|
|
|
242
240
|
|
|
243
241
|
# for mdef in a25_def:
|
|
244
242
|
# mdef.plot(depth=170, wind=1).show()
|
|
243
|
+
# import os
|
|
244
|
+
# a25_def.create_fcjs('a25', f'{os.environ['HOME']}/Desktop/templates/')
|
|
245
245
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
a25_def.to_json("flightanalysis/data/a25_schedule.json")
|
|
246
|
+
a25_def.to_json("flightanalysis/data/f3a_a25_schedule.json")
|
|
249
247
|
|
|
@@ -260,4 +260,6 @@ if __name__ == "__main__":
|
|
|
260
260
|
|
|
261
261
|
#f25_def.plot().show()
|
|
262
262
|
# f25_def.create_fcj('F25', 'f25_template_fcj.json')
|
|
263
|
-
f25_def.to_json("flightanalysis/data/
|
|
263
|
+
f25_def.to_json("flightanalysis/data/f3a_f25_schedule.json")
|
|
264
|
+
#import os
|
|
265
|
+
#f25_def.create_fcjs('f25', f'{os.environ['HOME']}/Desktop/templates/')
|
|
@@ -226,4 +226,6 @@ if __name__ == "__main__":
|
|
|
226
226
|
|
|
227
227
|
# p23_def.plot().show()
|
|
228
228
|
# p23_def.create_fcj('P23', 'p23_template_fcj.json')
|
|
229
|
-
p23_def.to_json("flightanalysis/data/
|
|
229
|
+
p23_def.to_json("flightanalysis/data/f3a_p23_schedule.json")
|
|
230
|
+
# import os
|
|
231
|
+
# p23_def.create_fcjs('p23', f'{os.environ['HOME']}/Desktop/templates/')
|
|
@@ -217,4 +217,6 @@ if __name__ == "__main__":
|
|
|
217
217
|
|
|
218
218
|
#p25_def.plot().show()
|
|
219
219
|
#p25_def.create_fcj('P25', 'p25_template_fcj.json')
|
|
220
|
-
p25_def.to_json("flightanalysis/data/
|
|
220
|
+
p25_def.to_json("flightanalysis/data/f3a_p25_schedule.json")
|
|
221
|
+
# import os
|
|
222
|
+
# p25_def.create_fcjs('p25', f'{os.environ['HOME']}/Desktop/templates/')
|
{flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/f3auk_Intermediate.py
RENAMED
|
@@ -156,7 +156,7 @@ intermediate_def = SchedDef([
|
|
|
156
156
|
[
|
|
157
157
|
f3amb.roll(np.pi/2, padded=False),
|
|
158
158
|
centred(f3amb.line(length=100)),
|
|
159
|
-
f3amb.roll(np.pi/2),
|
|
159
|
+
f3amb.roll(np.pi/2, padded=False),
|
|
160
160
|
],
|
|
161
161
|
),
|
|
162
162
|
|
|
@@ -196,8 +196,6 @@ intermediate_def = SchedDef([
|
|
|
196
196
|
if __name__ == "__main__":
|
|
197
197
|
|
|
198
198
|
#intermediate_def.plot().show()
|
|
199
|
-
#
|
|
200
|
-
#intermediate_def.
|
|
201
|
-
|
|
202
|
-
#intermediate_def.create_fcj('intermediate', 'intermediate_template_fcj_150_b.json', -1, 150/170)
|
|
203
|
-
intermediate_def.to_json("flightanalysis/data/f3auk_inter_schedule.json")
|
|
199
|
+
#import os
|
|
200
|
+
#intermediate_def.create_fcjs('f3auk_intermediate', f'{os.environ['HOME']}/Desktop/templates/')
|
|
201
|
+
intermediate_def.to_json('flightanalysis/data/f3auk_inter_schedule.json')
|
{flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/f3auk_clubman.py
RENAMED
|
@@ -193,18 +193,15 @@ clubman_def = SchedDef([
|
|
|
193
193
|
f3amb.line(),
|
|
194
194
|
],
|
|
195
195
|
),
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
) # close of Sched_def
|
|
196
|
+
]
|
|
197
|
+
)
|
|
199
198
|
|
|
200
199
|
|
|
201
200
|
|
|
202
201
|
if __name__ == "__main__":
|
|
203
202
|
|
|
204
203
|
# clubman_def.plot().show()
|
|
205
|
-
# clubman_def.create_fcj('clubman', 'clubman_template_fcj_170.json', 1)
|
|
206
|
-
# clubman_def.create_fcj('clubman', 'clubman_template_fcj_170_b.json', -1)
|
|
207
|
-
# clubman_def.create_fcj('clubman', 'clubman_template_fcj_150.json', 1, 150/170)
|
|
208
|
-
# clubman_def.create_fcj('clubman', 'clubman_template_fcj_150_b.json', -1, 150/170)
|
|
209
|
-
#clubman_def.create_fcj('clubman', 'clubman_template_fcj.json')
|
|
210
204
|
clubman_def.to_json("flightanalysis/data/f3auk_clubman_schedule.json")
|
|
205
|
+
|
|
206
|
+
# import os
|
|
207
|
+
# clubman_def.create_fcjs('f3auk_clubman', f'{os.environ['HOME']}/Desktop/templates/')
|
{flightanalysis-0.2.0 → flightanalysis-0.2.2}/examples/schedules_construction/imac_unlimited_2024.py
RENAMED
|
@@ -71,16 +71,16 @@ sdef = SchedDef([
|
|
|
71
71
|
end=BoxLocation(Height.BTM)
|
|
72
72
|
),[
|
|
73
73
|
imacmb.spin('directions[0]'),
|
|
74
|
-
imacmb.snap(r(1)),
|
|
74
|
+
imacmb.snap(r(-1), 'directions[1]'),
|
|
75
75
|
imacmb.loop(np.pi),
|
|
76
76
|
imacmb.snap(r(2)),
|
|
77
77
|
imacmb.loop(np.pi),
|
|
78
|
-
imacmb.roll('directions[
|
|
78
|
+
imacmb.roll('directions[2]'),
|
|
79
79
|
imacmb.loop(np.pi/2)
|
|
80
80
|
],
|
|
81
81
|
directions=ManParm('directions', Combination(desired=[
|
|
82
|
-
[-r(1.75), r(1.75)],
|
|
83
|
-
[r(1.75), -r(1.75)]
|
|
82
|
+
[-r(1.75), r(1), r(1.75)],
|
|
83
|
+
[r(1.75), -r(1), -r(1.75)]
|
|
84
84
|
]), 1),
|
|
85
85
|
full_roll_rate=2*np.pi
|
|
86
86
|
),
|
|
@@ -100,7 +100,7 @@ sdef = SchedDef([
|
|
|
100
100
|
imacmb.loop(-r(1/8)),
|
|
101
101
|
imacmb.roll('4x8', line_length=110 / c45 + 2*50),
|
|
102
102
|
imacmb.loop(r(-3/8)),
|
|
103
|
-
imacmb.roll([r(1.25), r(-0.75)], rolltypes='rs', line_length=110),
|
|
103
|
+
imacmb.roll([r(1.25), r(-0.75)], rolltypes='rs', break_angle=-np.radians(15), line_length=110),
|
|
104
104
|
imacmb.loop(r(1/4)),
|
|
105
105
|
], partial_roll_rate=np.pi/2, full_roll_rate=1.5*np.pi
|
|
106
106
|
),
|
|
@@ -115,15 +115,6 @@ sdef = SchedDef([
|
|
|
115
115
|
imacmb.roll([r(1/4), r(1/4), r(1)], rolltypes='rrs', line_length=130, break_angle=-np.radians(15)),
|
|
116
116
|
imacmb.loop(r(1/4)),
|
|
117
117
|
]),
|
|
118
|
-
imacmb.create(ManInfo(
|
|
119
|
-
"Half Cuban", "hcu", k=41, position=Position.END,
|
|
120
|
-
start=BoxLocation(Height.BTM, Direction.UPWIND, Orientation.UPRIGHT),
|
|
121
|
-
end=BoxLocation(Height.BTM)
|
|
122
|
-
),[
|
|
123
|
-
imacmb.snap(r(1.5), padded=False),
|
|
124
|
-
imacmb.loop(-r(5/8)),
|
|
125
|
-
imacmb.roll([r(1/4), r(1/4), -r(1)], line_length=130 / c45),
|
|
126
|
-
]),
|
|
127
118
|
imacmb.create(ManInfo(
|
|
128
119
|
"Half Cuban", "hcu", k=41, position=Position.END,
|
|
129
120
|
start=BoxLocation(Height.BTM, Direction.UPWIND, Orientation.UPRIGHT),
|
|
@@ -142,6 +133,7 @@ sdef = SchedDef([
|
|
|
142
133
|
if __name__ == "__main__":
|
|
143
134
|
|
|
144
135
|
|
|
145
|
-
|
|
146
|
-
#
|
|
147
|
-
sdef.
|
|
136
|
+
sdef.plot().show()
|
|
137
|
+
# import os
|
|
138
|
+
# sdef.create_fcjs('imac_unlimited_2024', f'{os.environ['HOME']}/Desktop/templates', 'IMAC')
|
|
139
|
+
# sdef.to_json("flightanalysis/data/IMAC_Unlimited2024_schedule.json")
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from flightanalysis.schedule import *
|
|
2
|
+
import numpy as np
|
|
3
|
+
from flightanalysis import *
|
|
4
|
+
from flightdata import State
|
|
5
|
+
|
|
6
|
+
if True:
|
|
7
|
+
mdef = f3amb.create(ManInfo(
|
|
8
|
+
"Square on Corner", "sLoop", k=4, position=Position.CENTRE,
|
|
9
|
+
start=BoxLocation(Height.BTM, Direction.UPWIND, Orientation.UPRIGHT),
|
|
10
|
+
end=BoxLocation(Height.BTM)
|
|
11
|
+
),[
|
|
12
|
+
MBTags.CENTRE,
|
|
13
|
+
f3amb.loop(np.pi/4, rolls="roll_option[0]"),
|
|
14
|
+
f3amb.line(),
|
|
15
|
+
f3amb.loop("roll_option[1]", rolls=r(1/2), ke=True),
|
|
16
|
+
f3amb.line(),
|
|
17
|
+
centred(f3amb.loop("roll_option[2]", rolls=r(1/2), ke=True)),
|
|
18
|
+
f3amb.line(),
|
|
19
|
+
f3amb.loop("roll_option[3]", rolls=r(1/2), ke=True),
|
|
20
|
+
f3amb.line(),
|
|
21
|
+
f3amb.loop("roll_option[4]", rolls="roll_option[5]", ke=True),
|
|
22
|
+
MBTags.CENTRE
|
|
23
|
+
],
|
|
24
|
+
roll_option=ManParm("roll_option", Combination(desired=[
|
|
25
|
+
[r(1/4), -r(1/4), r(1/4), -r(1/4), r(1/8), -r(1/4)],
|
|
26
|
+
[-r(1/4), r(1/4), -r(1/4), r(1/4), -r(1/8), r(1/4)]
|
|
27
|
+
]), 0),
|
|
28
|
+
line_length=70
|
|
29
|
+
)
|
|
30
|
+
else:
|
|
31
|
+
from imac_unlimited_2024 import sdef
|
|
32
|
+
mdef = sdef[7]
|
|
33
|
+
|
|
34
|
+
#mdef.mps.top_roll_option.default = 1
|
|
35
|
+
|
|
36
|
+
it = mdef.info.initial_transform(170, 1)
|
|
37
|
+
man = mdef.create(it)
|
|
38
|
+
|
|
39
|
+
tp = man.create_template(it)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
from flightdata import State
|
|
45
|
+
from flightplotting import plotdtw, boxtrace, plotsec
|
|
46
|
+
from flightplotting.traces import axis_rate_trace
|
|
47
|
+
|
|
48
|
+
import plotly.graph_objects as go
|
|
49
|
+
|
|
50
|
+
fig = plotdtw(tp, tp.data.element.unique())
|
|
51
|
+
fig = plotsec(tp, fig=fig, nmodels=10, scale=2)
|
|
52
|
+
#fig.add_traces(boxtrace())
|
|
53
|
+
fig.show()
|
|
54
|
+
|
|
55
|
+
fig = go.Figure(data=axis_rate_trace(tp))
|
|
56
|
+
fig.show()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from flightanalysis import ScheduleAnalysis, DownGrade, Result
|
|
2
|
+
|
|
3
|
+
sa = ScheduleAnalysis.from_fcscore("examples/scoring/example_analysis_p23.json")
|
|
4
|
+
|
|
5
|
+
ma=sa.M
|
|
6
|
+
ea=ma.e_2
|
|
7
|
+
|
|
8
|
+
dg: DownGrade = ea.el.intra_scoring.roll_angle
|
|
9
|
+
res: Result = dg(ea.fl, ea.tp)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
pass
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from flightanalysis.scoring.criteria import *
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
f3a=dict(
|
|
6
|
+
single=dict(
|
|
7
|
+
track=Single(Exponential.fit_points(np.radians([30, 90]), [2, 6], 100)),
|
|
8
|
+
roll=Single(Exponential.fit_points(np.radians([30, 90]), [1, 6], 100)),
|
|
9
|
+
angle=Single(Exponential.fit_points(np.radians([30, 90]), [2, 6], 100)),
|
|
10
|
+
distance = Single(Exponential.fit_points([20, 40], [0.5, 1]))
|
|
11
|
+
),
|
|
12
|
+
intra=dict(
|
|
13
|
+
track=ContAbs(Exponential.fit_points(np.radians([30, 90]), [2, 6])),
|
|
14
|
+
roll=ContAbs(Exponential.fit_points(np.radians([30, 90]), [1.5, 6])),
|
|
15
|
+
radius=ContRat(Exponential.fit_points([1,5], [0.5, 4], 2)),
|
|
16
|
+
speed=ContRat(Exponential.fit_points([1,5], [0.15, 0.75], 1)),
|
|
17
|
+
roll_rate=ContRat(Exponential.fit_points([1,5], [0.15, 0.75], 1)),
|
|
18
|
+
stallturn_speed=InsideBound(Exponential.fit_points([2, 5], [0.1,0.5]), [-2,2]),
|
|
19
|
+
stallturn_width=InsideBound(Exponential.fit_points([2, 5], [0.1,0.5]), [-2,2]),
|
|
20
|
+
spin_entry_length=MaxBound(Exponential.fit_points([2, 5], [0.1,0.5]), 5),
|
|
21
|
+
pitch_break_length=MaxBound(Exponential.fit_points([2, 5], [0.1,0.5]), 2),
|
|
22
|
+
recovery_length=MaxBound(Exponential.fit_points([2, 5], [0.1,0.5]), 3),
|
|
23
|
+
),
|
|
24
|
+
inter=dict(
|
|
25
|
+
radius=Comparison(Exponential.fit_points([1,5], [1, 2], 2)),
|
|
26
|
+
speed=Comparison(Exponential.fit_points([1,5], [0.25, 1.0])),
|
|
27
|
+
roll_rate=Comparison(Exponential.fit_points([1,5], [0.25, 1.5],2)),
|
|
28
|
+
length=Comparison(Exponential.fit_points([1,5], [1, 3], 3)),
|
|
29
|
+
free=Comparison(free),
|
|
30
|
+
)
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
if __name__ == "__main__":
|
|
35
|
+
|
|
36
|
+
with open('examples/scoring/temp.py', 'w') as f:
|
|
37
|
+
for group, v in f3a.items():
|
|
38
|
+
f.write(f'class F3A{group.capitalize()}:\n')
|
|
39
|
+
for n, crit in v.items():
|
|
40
|
+
f.write(f' {n}={crit.to_py()}\n')
|
|
41
|
+
|
|
@@ -4,13 +4,13 @@ from flightanalysis import SchedDef, ScheduleAnalysis, ManoeuvreAnalysis
|
|
|
4
4
|
from flightdata import Flight
|
|
5
5
|
import numpy as np
|
|
6
6
|
import pandas as pd
|
|
7
|
-
from flightplotting import plotsec
|
|
8
|
-
|
|
7
|
+
from flightplotting import plotsec, plotdtw
|
|
8
|
+
from time import time
|
|
9
9
|
|
|
10
10
|
with open("examples/data/manual_F3A_P23_22_05_31_00000350.json", "r") as f:
|
|
11
11
|
data = load(f)
|
|
12
12
|
|
|
13
|
-
flight = Flight.from_fc_json(data)
|
|
13
|
+
flight = Flight.from_fc_json(data).remove_time_flutter()
|
|
14
14
|
box = Origin.from_fcjson_parmameters(data["parameters"])
|
|
15
15
|
state = State.from_flight(flight, box).splitter_labels(data["mans"])
|
|
16
16
|
sdef = SchedDef.load(data["parameters"]["schedule"][1])
|
|
@@ -21,13 +21,26 @@ analysis = ScheduleAnalysis()
|
|
|
21
21
|
dgs = []
|
|
22
22
|
|
|
23
23
|
for mdef in sdef:
|
|
24
|
-
|
|
24
|
+
t0 = time()
|
|
25
|
+
print(f'Analyzing {mdef.info.name}')
|
|
25
26
|
ma = ManoeuvreAnalysis.build(mdef, state.get_manoeuvre(mdef.info.short_name))
|
|
26
|
-
plotsec(ma.intended_template).show()
|
|
27
27
|
scores = ma.scores()
|
|
28
|
-
|
|
28
|
+
print( time()-t0,mdef.info.name, scores.score(), scores.summary())
|
|
29
|
+
|
|
30
|
+
ma.plot_3d().show()
|
|
31
|
+
|
|
32
|
+
print('Optimising Alignment')
|
|
33
|
+
t0 = time()
|
|
34
|
+
ma=ma.optimise_alignment()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
scores = ma.scores()
|
|
38
|
+
print( time()-t0,mdef.info.name, scores.score(), scores.summary())
|
|
39
|
+
ma.plot_3d().show()
|
|
40
|
+
|
|
29
41
|
dgs.append(scores.summary())
|
|
30
|
-
|
|
42
|
+
|
|
43
|
+
|
|
31
44
|
|
|
32
45
|
df = pd.DataFrame.from_dict(dgs)
|
|
33
46
|
print(df)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from flightanalysis import ManoeuvreAnalysis as MA, ElementAnalysis as EA
|
|
2
|
+
from json import load, dumps
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
with open('examples/scoring/manoeuvres/mans/tHat_opt.json', 'r') as f:
|
|
6
|
+
ma = MA.from_dict(load(f))
|
|
7
|
+
|
|
8
|
+
from flightplotting import plotsec
|
|
9
|
+
from flightplotting.traces import vectors
|
|
10
|
+
from flightanalysis.scoring import Result, DownGrade
|
|
11
|
+
|
|
12
|
+
ea = ma[0]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
dg: DownGrade = ea.el.intra_scoring.radius
|
|
16
|
+
res: Result = dg(ea.fl, ea.tp)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
fig = ea.plot_3d()
|
|
20
|
+
|
|
21
|
+
fig.add_traces(vectors(5, ea.tp, 5*res.measurement.direction, name='vel_err', line=dict(color='red', width=3)))
|
|
22
|
+
fig.add_traces(vectors(5, ea.tp, 0.5*ea.tp.att.transform_point(ea.tp.vel), name='template_vel', line=dict(color='blue', width=3)))
|
|
23
|
+
fig.add_traces(vectors(5, ea.tp, 0.5*ea.fl.att.transform_point(ea.fl.vel), name='flown_vel', line=dict(color='green', width=3)))
|
|
24
|
+
fig.show()
|
|
25
|
+
res.plot().show()
|
|
26
|
+
pass
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from json import load, dump
|
|
2
|
+
from flightdata import State, Origin
|
|
3
|
+
from flightanalysis import SchedDef
|
|
4
|
+
from flightdata import Flight, NumpyEncoder
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
with open("examples/data/manual_F3A_P23_22_05_31_00000350.json", "r") as f:
|
|
9
|
+
data = load(f)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
flight = Flight.from_fc_json(data).remove_time_flutter().butter_filter(4,5)
|
|
13
|
+
box = Origin.from_fcjson_parmameters(data["parameters"])
|
|
14
|
+
state = State.from_flight(flight, box).splitter_labels(data["mans"])
|
|
15
|
+
sdef = SchedDef.load(data["parameters"]["schedule"][1])
|
|
16
|
+
|
|
17
|
+
from flightanalysis import ScheduleAnalysis, ManoeuvreAnalysis
|
|
18
|
+
|
|
19
|
+
analysis = ScheduleAnalysis()
|
|
20
|
+
dgs = []
|
|
21
|
+
|
|
22
|
+
for mdef in sdef:
|
|
23
|
+
ma = ManoeuvreAnalysis.build(mdef, state.get_manoeuvre(mdef.info.short_name))
|
|
24
|
+
with open(f'examples/scoring/manoeuvres/mans/{mdef.info.short_name}.json', 'w') as f:
|
|
25
|
+
dump(ma.to_dict(), f, cls=NumpyEncoder)
|
|
26
|
+
ma = ma.optimise_alignment()
|
|
27
|
+
with open(f'examples/scoring/manoeuvres/mans/{mdef.info.short_name}_opt.json', 'w') as f:
|
|
28
|
+
dump(ma.to_dict(), f, cls=NumpyEncoder)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Trial of running an optimiser to find the optimum split location between two
|
|
3
|
+
elements. A simple manoeuvre is created(half loop and entry line). a dummy
|
|
4
|
+
flown manoeuvre is also created with the split in slightly the wrong place.
|
|
5
|
+
a local minimizer is then run to find the minimum intra element downgrade,
|
|
6
|
+
which corresponds to the split moving back to the correct location.
|
|
7
|
+
'''
|
|
8
|
+
|
|
9
|
+
from flightdata import *
|
|
10
|
+
from flightanalysis import *
|
|
11
|
+
import geometry as g
|
|
12
|
+
import numpy as np
|
|
13
|
+
from flightplotting import plotdtw, axis_rate_traces
|
|
14
|
+
import plotly.graph_objects as go
|
|
15
|
+
import plotly.express as px
|
|
16
|
+
from time import time
|
|
17
|
+
|
|
18
|
+
mdef = f3amb.create(ManInfo(
|
|
19
|
+
"Half Loop", "hloop", k=2, position=Position.END,
|
|
20
|
+
start=BoxLocation(Height.BTM, Direction.UPWIND, Orientation.UPRIGHT),
|
|
21
|
+
end=BoxLocation(Height.TOP)
|
|
22
|
+
),[
|
|
23
|
+
f3amb.loop(np.pi),
|
|
24
|
+
])
|
|
25
|
+
|
|
26
|
+
itrans = mdef.info.initial_transform(170, 1)
|
|
27
|
+
man = mdef.create(itrans)
|
|
28
|
+
tp = man.create_template(itrans)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
man2 = man.copy()
|
|
32
|
+
man2.elements.e_0.radius=40
|
|
33
|
+
fl = man2.create_template(itrans).remove_labels()
|
|
34
|
+
|
|
35
|
+
al = fl.label(manoeuvre='hloop', element=tp.element[len(tp)-len(fl):]) # simulate a poor alignment
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
els = man.all_elements()
|
|
39
|
+
|
|
40
|
+
t0=time()
|
|
41
|
+
al2 = man.optimise_alignment(al[0], al)
|
|
42
|
+
print(time() - t0)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
#px.line(intra.e_0.radius.sample).show()
|
|
46
|
+
plotdtw(al, tp.data.element.unique()).show()
|
|
47
|
+
plotdtw(al2, tp.data.element.unique()).show()
|
|
48
|
+
pass
|
|
49
|
+
#go.Figure(data=axis_rate_traces(dict(tp=tp,al=al))).show()
|
|
50
|
+
|
|
@@ -3,4 +3,4 @@ from .manoeuvre import Manoeuvre
|
|
|
3
3
|
from .schedule import Schedule
|
|
4
4
|
from .definition import *
|
|
5
5
|
from .scoring import *
|
|
6
|
-
from .
|
|
6
|
+
from .analysis import ManoeuvreAnalysis, ElementAnalysis, ScheduleAnalysis
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
from flightdata import State
|
|
3
|
+
from typing import Self
|
|
4
|
+
from flightanalysis.definition import ElDef
|
|
5
|
+
from flightanalysis.elements import Element
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
import geometry as g
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class ElementAnalysis:
|
|
12
|
+
edef:ElDef
|
|
13
|
+
el: Element
|
|
14
|
+
fl: State
|
|
15
|
+
tp: State
|
|
16
|
+
ref_frame: g.Transformation
|
|
17
|
+
|
|
18
|
+
def plot_3d(self, origin=False, **kwargs):
|
|
19
|
+
from flightplotting import plotsec
|
|
20
|
+
return plotsec([self.fl, self.tp], 2, 5, origin=origin, **kwargs)
|
|
21
|
+
|
|
22
|
+
def to_dict(self):
|
|
23
|
+
return {k: v.to_dict() for k, v in self.__dict__.items()}
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def from_dict(data) -> Self:
|
|
27
|
+
return ElementAnalysis(
|
|
28
|
+
ElDef.from_dict(data['edef']),
|
|
29
|
+
Element.from_dict(data['el']),
|
|
30
|
+
State.from_dict(data['fl']),
|
|
31
|
+
State.from_dict(data['tp']),
|
|
32
|
+
g.Transformation.from_dict(data['ref_frame'])
|
|
33
|
+
)
|