flightanalysis 0.2.6__tar.gz → 0.2.7__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.6/flightanalysis.egg-info → flightanalysis-0.2.7}/PKG-INFO +3 -3
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +16 -6
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/basic.py +16 -15
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/complete.py +18 -11
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/scored.py +1 -1
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/sch_analysis.py +1 -1
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/continuous.py +11 -13
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/measurement.py +33 -11
- {flightanalysis-0.2.6 → flightanalysis-0.2.7/flightanalysis.egg-info}/PKG-INFO +3 -3
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/requires.txt +2 -2
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/setup.cfg +3 -3
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/LICENSE +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/MANIFEST.in +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/README.md +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/el_analysis.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_a25_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_f25_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_p23_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_p25_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3auk_clubman_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3auk_inter_schedule.json +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/elbuilders.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/lines.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/manbuilder.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/collectors.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/eldef.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/mandef.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/maninfo.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/manoption.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/manparm.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/funopp.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/itemopp.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/mathopp.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/operation.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/scheddef.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/scheduleinfo.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/autorotation.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/element.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/line.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/loop.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/nose_drop.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/pitch_break.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/recovery.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/stall_turn.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/manoeuvre.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/schedule.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/criteria.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/exponential.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/f3a_criteria.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/comparison.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/bounded.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/single.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/downgrade.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/results.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/SOURCES.txt +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/dependency_links.txt +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/top_level.txt +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/__init__.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/batch_analyse.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/collect_scores.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/setup.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/tests/test_criiteria.py +0 -0
- {flightanalysis-0.2.6 → flightanalysis-0.2.7}/tests/test_data.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flightanalysis
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: A package for analysing flight data
|
|
5
5
|
Home-page: https://github.com/PyFlightCoach/FlightAnalysis
|
|
6
6
|
Author: Thomas David
|
|
@@ -12,8 +12,8 @@ Requires-Dist: pandas
|
|
|
12
12
|
Requires-Dist: scipy
|
|
13
13
|
Requires-Dist: fastdtw
|
|
14
14
|
Requires-Dist: simplejson
|
|
15
|
-
Requires-Dist: pfc-geometry>=0.2.
|
|
16
|
-
Requires-Dist: flightdata>=0.2.
|
|
15
|
+
Requires-Dist: pfc-geometry>=0.2.5
|
|
16
|
+
Requires-Dist: flightdata>=0.2.7
|
|
17
17
|
|
|
18
18
|
# FlightAnalysis
|
|
19
19
|
|
|
@@ -9,12 +9,14 @@ from flightanalysis.definition import ManDef
|
|
|
9
9
|
|
|
10
10
|
@dataclass
|
|
11
11
|
class Alignment(Basic):
|
|
12
|
+
dist: float
|
|
12
13
|
manoeuvre: Manoeuvre
|
|
13
14
|
template: State
|
|
14
15
|
|
|
15
|
-
def run_all(self):
|
|
16
|
+
def run_all(self, optimise_aligment=True):
|
|
17
|
+
new = self
|
|
16
18
|
while self.__class__.__name__ != 'Scored':
|
|
17
|
-
new = self.run()
|
|
19
|
+
new = self.run(optimise_aligment)
|
|
18
20
|
if new.__class__.__name__ == self.__class__.__name__:
|
|
19
21
|
break
|
|
20
22
|
self = new
|
|
@@ -25,6 +27,7 @@ class Alignment(Basic):
|
|
|
25
27
|
ia = Basic.from_dict(data)
|
|
26
28
|
try:
|
|
27
29
|
ia = Alignment(
|
|
30
|
+
dist=data['dist'] if 'dist' in data else 0,
|
|
28
31
|
manoeuvre=Manoeuvre.from_dict(data['manoeuvre']),
|
|
29
32
|
template=State.from_dict(data['template']),
|
|
30
33
|
**ia.__dict__
|
|
@@ -39,13 +42,19 @@ class Alignment(Basic):
|
|
|
39
42
|
def alignment(self, radius=10):
|
|
40
43
|
assert self.stage < AlinmentStage.SECONDARY
|
|
41
44
|
logger.debug(f'Running alignment stage {self.stage}')
|
|
42
|
-
aligned = State.align(self.flown, self.template, radius, self.stage==AlinmentStage.SETUP)
|
|
45
|
+
dist, aligned = State.align(self.flown, self.template, radius, self.stage==AlinmentStage.SETUP)
|
|
43
46
|
return Alignment(
|
|
44
|
-
self.mdef, aligned, self.direction, self.stage + 1,
|
|
47
|
+
self.mdef, aligned, self.direction, self.stage + 1, dist,
|
|
45
48
|
*self.manoeuvre.match_intention(self.template[0], aligned)
|
|
46
49
|
)
|
|
50
|
+
|
|
47
51
|
|
|
48
52
|
def run_alignment(self, radius=10):
|
|
53
|
+
if self.stage > AlinmentStage.SETUP:
|
|
54
|
+
self = Alignment(
|
|
55
|
+
self.mdef, self.flown, self.direction, self.stage + 1, self.dist,
|
|
56
|
+
*self.manoeuvre.match_intention(self.template[0], self.flown)
|
|
57
|
+
)
|
|
49
58
|
while self.stage < AlinmentStage.SECONDARY:
|
|
50
59
|
try:
|
|
51
60
|
self = self.alignment(radius)
|
|
@@ -54,8 +63,9 @@ class Alignment(Basic):
|
|
|
54
63
|
break
|
|
55
64
|
return self
|
|
56
65
|
|
|
57
|
-
def run(self) -> Complete:
|
|
66
|
+
def run(self, optimise_aligment=True) -> Complete:
|
|
58
67
|
self = self.run_alignment()
|
|
68
|
+
|
|
59
69
|
if self.stage < AlinmentStage.SECONDARY:
|
|
60
70
|
return self
|
|
61
71
|
else:
|
|
@@ -64,7 +74,7 @@ class Alignment(Basic):
|
|
|
64
74
|
|
|
65
75
|
return Complete(
|
|
66
76
|
mdef, self.flown, self.direction, AlinmentStage.SECONDARY,
|
|
67
|
-
self.manoeuvre, self.template, correction,
|
|
77
|
+
self.dist, self.manoeuvre, self.template, correction,
|
|
68
78
|
correction.create_template(self.template[0], self.flown)
|
|
69
79
|
)
|
|
70
80
|
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/basic.py
RENAMED
|
@@ -5,6 +5,7 @@ from flightanalysis.definition import ManDef, SchedDef, ManOption
|
|
|
5
5
|
import geometry as g
|
|
6
6
|
from json import load
|
|
7
7
|
from .analysis import AlinmentStage, Analysis
|
|
8
|
+
import numpy as np
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
@dataclass
|
|
@@ -18,22 +19,22 @@ class Basic(Analysis):
|
|
|
18
19
|
def name(self):
|
|
19
20
|
return self.mdef.uid
|
|
20
21
|
|
|
21
|
-
def run_all(self):
|
|
22
|
-
res = [s
|
|
23
|
-
|
|
24
|
-
if len(res)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
def run_all(self, optimise_aligment=True):
|
|
23
|
+
res = [s.run_all(False) for s in self.run(False)]
|
|
24
|
+
self = res[0]
|
|
25
|
+
if len(res) > 1:
|
|
26
|
+
for r in res[1:]:
|
|
27
|
+
if r.stage < self.stage:
|
|
28
|
+
continue
|
|
29
|
+
if r.dist < self.dist:
|
|
30
|
+
self = r
|
|
31
|
+
|
|
32
|
+
if isinstance(self, Scored) and optimise_aligment:
|
|
33
|
+
self.stage = AlinmentStage.SECONDARY
|
|
34
|
+
self = self.run(True)
|
|
33
35
|
|
|
34
36
|
return self
|
|
35
37
|
|
|
36
|
-
|
|
37
38
|
@classmethod
|
|
38
39
|
def from_dict(Cls, data:dict) -> Basic:
|
|
39
40
|
return Basic(
|
|
@@ -65,7 +66,7 @@ class Basic(Analysis):
|
|
|
65
66
|
mdef= sdef[mid]
|
|
66
67
|
return Basic(mdef, state.get_manoeuvre(mdef.uid), AlinmentStage.SETUP)
|
|
67
68
|
|
|
68
|
-
def run(self) -> list[Alignment]:
|
|
69
|
+
def run(self, optimise_aligment=True) -> list[Alignment]:
|
|
69
70
|
itrans = self.create_itrans()
|
|
70
71
|
mopt = ManOption([self.mdef]) if isinstance(self.mdef, ManDef) else self.mdef
|
|
71
72
|
|
|
@@ -74,7 +75,7 @@ class Basic(Analysis):
|
|
|
74
75
|
man = mdef.create(itrans).add_lines()
|
|
75
76
|
als.append(Alignment(
|
|
76
77
|
mdef, self.flown, self.direction, AlinmentStage.SETUP,
|
|
77
|
-
man, man.create_template(itrans)
|
|
78
|
+
1e9, man, man.create_template(itrans)
|
|
78
79
|
))
|
|
79
80
|
return als
|
|
80
81
|
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/complete.py
RENAMED
|
@@ -33,9 +33,10 @@ class Complete(Alignment):
|
|
|
33
33
|
raise e
|
|
34
34
|
return pa
|
|
35
35
|
|
|
36
|
-
def run(self) -> Scored:
|
|
37
|
-
if self.stage < AlinmentStage.OPTIMISED:
|
|
36
|
+
def run(self, optimise_aligment=True) -> Scored:
|
|
37
|
+
if self.stage < AlinmentStage.OPTIMISED and optimise_aligment:
|
|
38
38
|
self = self.optimise_alignment()
|
|
39
|
+
self = self.update_templates()
|
|
39
40
|
return Scored(**self.__dict__,
|
|
40
41
|
scores=ManoeuvreResults(self.inter(), self.intra(), self.positioning())
|
|
41
42
|
)
|
|
@@ -62,16 +63,22 @@ class Complete(Alignment):
|
|
|
62
63
|
tp = el.get_data(self.template).relocate(st.pos[0])
|
|
63
64
|
return ElementAnalysis(edef, self.mdef.mps, el, st, tp, el.ref_frame(tp))
|
|
64
65
|
|
|
66
|
+
def update_templates(self):
|
|
67
|
+
if not np.all(self.flown.element == self.template.element):
|
|
68
|
+
manoeuvre, template = self.manoeuvre.match_intention(self.template[0], self.flown)
|
|
69
|
+
mdef = ManDef(self.mdef.info, self.mdef.mps.update_defaults(self.manoeuvre), self.mdef.eds)
|
|
70
|
+
correction = mdef.create(self.template[0].transform).add_lines()
|
|
71
|
+
|
|
72
|
+
return Complete(
|
|
73
|
+
mdef, self.flown, self.direction, AlinmentStage.OPTIMISED, self.dist,
|
|
74
|
+
manoeuvre, template, correction, correction.create_template(template[0])
|
|
75
|
+
)
|
|
76
|
+
else:
|
|
77
|
+
return self
|
|
78
|
+
|
|
65
79
|
def optimise_alignment(self):
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
mdef = ManDef(self.mdef.info, self.mdef.mps.update_defaults(self.manoeuvre), self.mdef.eds)
|
|
69
|
-
correction = mdef.create(self.template[0].transform).add_lines()
|
|
70
|
-
|
|
71
|
-
return Complete(
|
|
72
|
-
mdef, aligned, self.direction, AlinmentStage.OPTIMISED,
|
|
73
|
-
manoeuvre, template, correction, correction.create_template(template[0])
|
|
74
|
-
)
|
|
80
|
+
self.flown = self.manoeuvre.optimise_alignment(self.template, self.flown)
|
|
81
|
+
return self.update_templates()
|
|
75
82
|
|
|
76
83
|
def side_box(self):
|
|
77
84
|
return F3A.intra.box(
|
|
@@ -39,7 +39,7 @@ class ScheduleAnalysis(Collection):
|
|
|
39
39
|
sdef.uids
|
|
40
40
|
)#.move(g.Transformation(g.Point(-data['parameters']['moveEast'], -data['parameters']['moveNorth'], 0)))
|
|
41
41
|
|
|
42
|
-
direction = -state.get_manoeuvre(
|
|
42
|
+
direction = -state.get_manoeuvre(1)[0].direction()[0]
|
|
43
43
|
|
|
44
44
|
return ScheduleAnalysis(
|
|
45
45
|
[analysis.Basic(
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/continuous.py
RENAMED
|
@@ -52,24 +52,22 @@ class Continuous(Criteria):
|
|
|
52
52
|
outd = np.full(len(data), np.nan)
|
|
53
53
|
conv = np.convolve(data, kernel, mode='valid')
|
|
54
54
|
ld = (len(data) - len(conv))/2
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
outd[
|
|
55
|
+
ldc = int(np.ceil(ld))
|
|
56
|
+
ldf = int(np.floor(ld))
|
|
57
|
+
outd[ldf:-ldc] = conv
|
|
58
|
+
outd[:ldf] = np.linspace(np.mean(data[:ldf]), conv[0],ldf+1)[:-1]
|
|
59
|
+
outd[-ldc:] = np.linspace(conv[-1], np.mean(data[-ldc:]), ldc+1)[1:]
|
|
58
60
|
return outd
|
|
59
61
|
|
|
60
62
|
|
|
61
63
|
class ContAbs(Continuous):
|
|
62
|
-
# def prepare(self, value: npt.NDArray, expected: float):
|
|
63
|
-
#
|
|
64
|
-
# return value - expected
|
|
65
|
-
|
|
66
64
|
def prepare(self, values: npt.NDArray, expected: float):
|
|
67
|
-
window = 30
|
|
65
|
+
# window = 30
|
|
68
66
|
sample = values - expected
|
|
69
|
-
if len(sample) <=
|
|
67
|
+
if len(sample) <= 8:
|
|
70
68
|
return np.linspace(values[0],values[-1], len(sample))
|
|
71
69
|
else:
|
|
72
|
-
return Continuous.convolve(sample,
|
|
70
|
+
return Continuous.convolve(sample, min(len(values)//3, 40))
|
|
73
71
|
|
|
74
72
|
@staticmethod
|
|
75
73
|
def mistakes(data, peaks, troughs):
|
|
@@ -87,15 +85,15 @@ class ContAbs(Continuous):
|
|
|
87
85
|
class ContRat(Continuous):
|
|
88
86
|
|
|
89
87
|
def prepare(self, values: npt.NDArray, expected: float):
|
|
90
|
-
window = 40
|
|
91
|
-
if len(values) <=
|
|
88
|
+
#window = 40
|
|
89
|
+
if len(values) <= 8:
|
|
92
90
|
return np.abs(np.linspace(
|
|
93
91
|
np.mean(values[:1+len(values)//3]),
|
|
94
92
|
np.mean(values[-1-len(values)//3:]),
|
|
95
93
|
len(values)
|
|
96
94
|
))
|
|
97
95
|
else:
|
|
98
|
-
return np.abs(Continuous.convolve(values,
|
|
96
|
+
return np.abs(Continuous.convolve(values, min(len(values)//3, 40)))
|
|
99
97
|
|
|
100
98
|
@staticmethod
|
|
101
99
|
def mistakes(data, peaks, troughs):
|
|
@@ -74,11 +74,23 @@ class Measurement:
|
|
|
74
74
|
return direction, (1 - 0.8* np.abs(Point.cos_angle_between(loc, direction))) * Measurement._pos_vis(loc)
|
|
75
75
|
|
|
76
76
|
@staticmethod
|
|
77
|
-
def _roll_vis(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
def _roll_vis(fl: State, tp: State) -> Union[Point, npt.NDArray]:
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
afl = Point.cos_angle_between(fl.pos, fl.att.transform_point(PZ()))
|
|
81
|
+
atp = Point.cos_angle_between(tp.pos, tp.att.transform_point(PZ()))
|
|
82
|
+
|
|
83
|
+
azfl = np.cos(fl.att.inverse().transform_point(-fl.pos).planar_angles().x)
|
|
84
|
+
aztp = np.cos(tp.att.inverse().transform_point(-tp.pos).planar_angles().x)
|
|
85
|
+
|
|
86
|
+
ao = afl.copy()
|
|
87
|
+
|
|
88
|
+
ao[np.abs(afl) > np.abs(atp)] = atp[np.abs(afl) > np.abs(atp)]
|
|
89
|
+
ao[np.sign(azfl) != np.sign(aztp)] = 0 # wings have passed through the view vector
|
|
90
|
+
|
|
91
|
+
rvis = (1-0.8*np.abs(ao))
|
|
92
|
+
|
|
93
|
+
return fl.att.transform_point(PZ()), rvis * Measurement._pos_vis(fl.pos)
|
|
82
94
|
|
|
83
95
|
@staticmethod
|
|
84
96
|
def _rad_vis(loc:Point, axial_dir: Point) -> Union[Point, npt.NDArray]:
|
|
@@ -115,7 +127,7 @@ class Measurement:
|
|
|
115
127
|
return Measurement(
|
|
116
128
|
np.unwrap(abs(world_roll_error) * np.sign(body_roll_error.x)),
|
|
117
129
|
0,
|
|
118
|
-
*Measurement._roll_vis(fl
|
|
130
|
+
*Measurement._roll_vis(fl, tp)
|
|
119
131
|
)
|
|
120
132
|
|
|
121
133
|
@staticmethod
|
|
@@ -140,7 +152,7 @@ class Measurement:
|
|
|
140
152
|
return Measurement(
|
|
141
153
|
int(flturns - tpturns) * 2 * np.pi + fl_roll_angle - tp_roll_angle,
|
|
142
154
|
0,
|
|
143
|
-
*Measurement._roll_vis(fl
|
|
155
|
+
*Measurement._roll_vis(fl, tp)
|
|
144
156
|
)
|
|
145
157
|
|
|
146
158
|
@staticmethod
|
|
@@ -168,14 +180,21 @@ class Measurement:
|
|
|
168
180
|
def roll_rate(fl: State, tp: State) -> Measurement:
|
|
169
181
|
"""vector in the body X axis, length is equal to the roll rate"""
|
|
170
182
|
wrvel = fl.att.transform_point(fl.p * PX())
|
|
171
|
-
return Measurement(
|
|
183
|
+
return Measurement(
|
|
184
|
+
abs(wrvel) * np.sign(fl.p),
|
|
185
|
+
np.mean(tp.p),
|
|
186
|
+
*Measurement._roll_vis(fl, tp)
|
|
187
|
+
)
|
|
172
188
|
|
|
173
189
|
@staticmethod
|
|
174
190
|
def nose_drop(fl: State, tp: State) -> Measurement:
|
|
175
191
|
"""Check the change in body pitch angle between the start and end of the element"""
|
|
176
192
|
flpit = Quaternion.body_axis_rates(fl.att[0], fl.att[-1]).y
|
|
177
|
-
|
|
178
|
-
|
|
193
|
+
return Measurement(
|
|
194
|
+
flpit,
|
|
195
|
+
np.array([0]),
|
|
196
|
+
*Measurement._roll_vis(fl[-1], tp[-1])
|
|
197
|
+
)
|
|
179
198
|
|
|
180
199
|
@staticmethod
|
|
181
200
|
def track_proj(fl: State, tp: State, proj: Point, fix='ang'):
|
|
@@ -192,7 +211,10 @@ class Measurement:
|
|
|
192
211
|
fwvel = fl.att.transform_point(fl.vel)
|
|
193
212
|
twvel = tp.att.transform_point(tp.vel)
|
|
194
213
|
|
|
195
|
-
direction, vis = Measurement._vector_vis(
|
|
214
|
+
direction, vis = Measurement._vector_vis(
|
|
215
|
+
Point.vector_rejection(fwvel, twvel).unit(),
|
|
216
|
+
fl.pos
|
|
217
|
+
)
|
|
196
218
|
|
|
197
219
|
fcvel = tr.transform_point(fwvel)
|
|
198
220
|
tcvel = tr.transform_point(twvel)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flightanalysis
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: A package for analysing flight data
|
|
5
5
|
Home-page: https://github.com/PyFlightCoach/FlightAnalysis
|
|
6
6
|
Author: Thomas David
|
|
@@ -12,8 +12,8 @@ Requires-Dist: pandas
|
|
|
12
12
|
Requires-Dist: scipy
|
|
13
13
|
Requires-Dist: fastdtw
|
|
14
14
|
Requires-Dist: simplejson
|
|
15
|
-
Requires-Dist: pfc-geometry>=0.2.
|
|
16
|
-
Requires-Dist: flightdata>=0.2.
|
|
15
|
+
Requires-Dist: pfc-geometry>=0.2.5
|
|
16
|
+
Requires-Dist: flightdata>=0.2.7
|
|
17
17
|
|
|
18
18
|
# FlightAnalysis
|
|
19
19
|
|
|
@@ -5,7 +5,7 @@ author_email = thomasdavid0@gmail.com
|
|
|
5
5
|
description = A package for analysing flight data
|
|
6
6
|
long_description = file: README.md
|
|
7
7
|
long_description_content_type = text/markdown
|
|
8
|
-
version = 0.2.
|
|
8
|
+
version = 0.2.7
|
|
9
9
|
url = https://github.com/PyFlightCoach/FlightAnalysis
|
|
10
10
|
|
|
11
11
|
[options]
|
|
@@ -22,8 +22,8 @@ install_requires =
|
|
|
22
22
|
scipy
|
|
23
23
|
fastdtw
|
|
24
24
|
simplejson
|
|
25
|
-
pfc-geometry>=0.2.
|
|
26
|
-
flightdata>=0.2.
|
|
25
|
+
pfc-geometry>=0.2.5
|
|
26
|
+
flightdata>=0.2.7
|
|
27
27
|
|
|
28
28
|
[egg_info]
|
|
29
29
|
tag_build =
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/__init__.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/analysis.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/IMAC_Unlimited2024_schedule.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3auk_clubman_schedule.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/__init__.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/elbuilders.py
RENAMED
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/manbuilder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/__init__.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/funopp.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/itemopp.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/mathopp.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/operation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/exponential.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/f3a_criteria.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/__init__.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/combination.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/comparison.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/__init__.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/bounded.py
RENAMED
|
File without changes
|
{flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/single.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|