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.
Files changed (78) hide show
  1. {flightanalysis-0.2.6/flightanalysis.egg-info → flightanalysis-0.2.7}/PKG-INFO +3 -3
  2. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +16 -6
  3. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/basic.py +16 -15
  4. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/complete.py +18 -11
  5. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/scored.py +1 -1
  6. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/sch_analysis.py +1 -1
  7. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/continuous.py +11 -13
  8. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/measurement.py +33 -11
  9. {flightanalysis-0.2.6 → flightanalysis-0.2.7/flightanalysis.egg-info}/PKG-INFO +3 -3
  10. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/requires.txt +2 -2
  11. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/setup.cfg +3 -3
  12. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/LICENSE +0 -0
  13. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/MANIFEST.in +0 -0
  14. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/README.md +0 -0
  15. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/__init__.py +0 -0
  16. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/__init__.py +0 -0
  17. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/el_analysis.py +0 -0
  18. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
  19. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
  20. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +0 -0
  21. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/__init__.py +0 -0
  22. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_a25_schedule.json +0 -0
  23. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_f25_schedule.json +0 -0
  24. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_p23_schedule.json +0 -0
  25. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3a_p25_schedule.json +0 -0
  26. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3auk_clubman_schedule.json +0 -0
  27. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/data/f3auk_inter_schedule.json +0 -0
  28. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/__init__.py +0 -0
  29. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/__init__.py +0 -0
  30. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/elbuilders.py +0 -0
  31. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/lines.py +0 -0
  32. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/builders/manbuilder.py +0 -0
  33. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/collectors.py +0 -0
  34. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/eldef.py +0 -0
  35. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/mandef.py +0 -0
  36. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/maninfo.py +0 -0
  37. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/manoption.py +0 -0
  38. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/manparm.py +0 -0
  39. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/__init__.py +0 -0
  40. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/funopp.py +0 -0
  41. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/itemopp.py +0 -0
  42. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/mathopp.py +0 -0
  43. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/operations/operation.py +0 -0
  44. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/scheddef.py +0 -0
  45. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/definition/scheduleinfo.py +0 -0
  46. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/__init__.py +0 -0
  47. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/autorotation.py +0 -0
  48. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/element.py +0 -0
  49. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/line.py +0 -0
  50. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/loop.py +0 -0
  51. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/nose_drop.py +0 -0
  52. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/pitch_break.py +0 -0
  53. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/recovery.py +0 -0
  54. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/elements/stall_turn.py +0 -0
  55. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/manoeuvre.py +0 -0
  56. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/schedule.py +0 -0
  57. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/__init__.py +0 -0
  58. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/__init__.py +0 -0
  59. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/criteria.py +0 -0
  60. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/exponential.py +0 -0
  61. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/f3a_criteria.py +0 -0
  62. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
  63. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
  64. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/inter/comparison.py +0 -0
  65. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
  66. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/bounded.py +0 -0
  67. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/criteria/intra/single.py +0 -0
  68. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/downgrade.py +0 -0
  69. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis/scoring/results.py +0 -0
  70. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/SOURCES.txt +0 -0
  71. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/dependency_links.txt +0 -0
  72. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/flightanalysis.egg-info/top_level.txt +0 -0
  73. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/__init__.py +0 -0
  74. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/batch_analyse.py +0 -0
  75. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/scripts/collect_scores.py +0 -0
  76. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/setup.py +0 -0
  77. {flightanalysis-0.2.6 → flightanalysis-0.2.7}/tests/test_criiteria.py +0 -0
  78. {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.6
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.4
16
- Requires-Dist: flightdata>=0.2.6
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)[1]
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
 
@@ -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 for s in [s.run_all() for s in self.run()] if isinstance(s, Scored)]
23
-
24
- if len(res) == 0:
25
- return self
26
-
27
- min_dg = None
28
- for n in res:
29
- if hasattr(n, 'scores'):
30
- if min_dg is None or n.scores.intra.total < min_dg:
31
- min_dg = n.scores.intra.total
32
- self = n
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
 
@@ -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
- aligned = self.manoeuvre.optimise_alignment(self.template, self.flown)
67
- manoeuvre, template = self.manoeuvre.match_intention(self.template[0], aligned)
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(
@@ -23,5 +23,5 @@ class Scored(Complete):
23
23
  raise e
24
24
  return ca
25
25
 
26
- def run(self):
26
+ def run(self, optimise_alignment=True):
27
27
  return self
@@ -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(0)[0].direction()[0]
42
+ direction = -state.get_manoeuvre(1)[0].direction()[0]
43
43
 
44
44
  return ScheduleAnalysis(
45
45
  [analysis.Basic(
@@ -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
- outd[int(np.ceil(ld)):-int(np.floor(ld))] = conv
56
- outd[:width//2] = np.linspace(np.mean(data[0:width//4]), outd[width//2],width//2)
57
- outd[-width//2:] = np.linspace(outd[-width//2], np.mean(data[-1-width//4:-1]),width//2)
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) <= window:
67
+ if len(sample) <= 8:
70
68
  return np.linspace(values[0],values[-1], len(sample))
71
69
  else:
72
- return Continuous.convolve(sample, window)
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) <= window:
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, window))
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(loc: Point, att: Quaternion) -> Union[Point, npt.NDArray]:
78
- #a roll error is more visible if the movement of the wing tips is perpendicular to the view vector
79
- #the wing tips move in the local body Z axis
80
- world_tip_movement_direction = att.transform_point(PZ())
81
- return world_tip_movement_direction, (1-0.8*np.abs(Point.cos_angle_between(loc, world_tip_movement_direction))) * Measurement._pos_vis(loc)
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.pos, fl.att)
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.pos, fl.att)
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(abs(wrvel) * np.sign(fl.p), np.mean(tp.p), *Measurement._roll_vis(fl.pos, fl.att))
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
- return Measurement(flpit, np.array([0]), *Measurement._roll_vis(fl.pos[-1], fl.att[-1]))
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(Point.vector_rejection(fwvel, twvel).unit(), fl.pos)
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.6
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.4
16
- Requires-Dist: flightdata>=0.2.6
15
+ Requires-Dist: pfc-geometry>=0.2.5
16
+ Requires-Dist: flightdata>=0.2.7
17
17
 
18
18
  # FlightAnalysis
19
19
 
@@ -3,5 +3,5 @@ pandas
3
3
  scipy
4
4
  fastdtw
5
5
  simplejson
6
- pfc-geometry>=0.2.4
7
- flightdata>=0.2.6
6
+ pfc-geometry>=0.2.5
7
+ flightdata>=0.2.7
@@ -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.6
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.4
26
- flightdata>=0.2.6
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