flightanalysis 0.3.0__tar.gz → 0.3.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.
Files changed (160) hide show
  1. {flightanalysis-0.3.0/flightanalysis.egg-info → flightanalysis-0.3.2}/PKG-INFO +5 -5
  2. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/complete.py +1 -1
  3. flightanalysis-0.3.2/flightanalysis/data/__init__.py +15 -0
  4. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3a_a25_schedule.json +3 -0
  5. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3a_f25_schedule.json +7 -0
  6. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3a_p23_schedule.json +6 -0
  7. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3a_p25_schedule.json +4 -0
  8. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3auk_clubman_schedule.json +3 -0
  9. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/f3auk_inter_schedule.json +1 -0
  10. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/scheddef.py +1 -1
  11. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/line.py +0 -3
  12. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/__init__.py +3 -3
  13. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/criteria.py +6 -4
  14. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/exponential.py +4 -0
  15. flightanalysis-0.3.2/flightanalysis/scoring/criteria/f3a_criteria.py +84 -0
  16. flightanalysis-0.3.2/flightanalysis/scoring/criteria/intra/bounded.py +69 -0
  17. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/intra/continuous.py +1 -3
  18. flightanalysis-0.3.2/flightanalysis/scoring/criteria/intra/peak.py +38 -0
  19. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/intra/single.py +16 -5
  20. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/downgrade.py +1 -1
  21. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/f3a_downgrades.py +22 -16
  22. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/measurement.py +52 -28
  23. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/results.py +13 -11
  24. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/selectors.py +8 -3
  25. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/visibility.py +1 -1
  26. {flightanalysis-0.3.0 → flightanalysis-0.3.2/flightanalysis.egg-info}/PKG-INFO +5 -5
  27. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis.egg-info/SOURCES.txt +0 -4
  28. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis.egg-info/requires.txt +4 -4
  29. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/requirements-dev.txt +2 -2
  30. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/requirements.txt +2 -2
  31. flightanalysis-0.3.2/tests/test_criiteria.py +194 -0
  32. flightanalysis-0.3.2/tests/test_data.py +8 -0
  33. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/test_definition_eldef.py +2 -1
  34. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/test_schedule_definition.py +2 -1
  35. flightanalysis-0.3.2/tests/test_schedule/test_element/test_schedule_element_line.py +47 -0
  36. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/test_schedule_element_loop.py +16 -12
  37. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/test_schedule_element_snap.py +6 -5
  38. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_measurement.py +2 -1
  39. flightanalysis-0.3.0/flightanalysis/data/__init__.py +0 -14
  40. flightanalysis-0.3.0/flightanalysis/scoring/criteria/f3a_criteria.py +0 -81
  41. flightanalysis-0.3.0/flightanalysis/scoring/criteria/intra/bounded.py +0 -86
  42. flightanalysis-0.3.0/flightanalysis/scoring/criteria/intra/peak.py +0 -20
  43. flightanalysis-0.3.0/tests/test_criiteria.py +0 -227
  44. flightanalysis-0.3.0/tests/test_data.py +0 -8
  45. flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_line.py +0 -50
  46. flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_nose_drop.py +0 -37
  47. flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_pitch_break.py +0 -46
  48. flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_recovery.py +0 -38
  49. flightanalysis-0.3.0/tests/test_selectors.py +0 -27
  50. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/.github/workflows/publish_pypi.yml +0 -0
  51. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/.gitignore +0 -0
  52. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/LICENSE +0 -0
  53. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/MANIFEST.in +0 -0
  54. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/README.md +0 -0
  55. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/create_schedules.py +0 -0
  56. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/__init__.py +0 -0
  57. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/data/__init__.py +0 -0
  58. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/data/manual_F3A_F23_22_04_28_00000231.json +0 -0
  59. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/data/manual_F3A_P23_22_05_31_00000350.json +0 -0
  60. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/data/manual_F3A_P23_23_08_11_00000094.json +0 -0
  61. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/make_manoeuvre.py +0 -0
  62. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/__init__.py +0 -0
  63. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/judging.py +0 -0
  64. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/__init__.py +0 -0
  65. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
  66. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/intra_analysis.py +0 -0
  67. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/mans/__init__.py +0 -0
  68. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/mans/extract_mans.py +0 -0
  69. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/mans/tHat.json +0 -0
  70. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
  71. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/__init__.py +0 -0
  72. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/__init__.py +0 -0
  73. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/el_analysis.py +0 -0
  74. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
  75. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +0 -0
  76. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
  77. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/basic.py +0 -0
  78. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/manoeuvre_analysis/scored.py +0 -0
  79. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/analysis/sch_analysis.py +0 -0
  80. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/base/ref_funcs.py +0 -0
  81. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/base/utils.py +0 -0
  82. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +0 -0
  83. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/__init__.py +0 -0
  84. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/__init__.py +0 -0
  85. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/elbuilders.py +0 -0
  86. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/manbuilder.py +0 -0
  87. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/AMA_Intermediate2024.py +0 -0
  88. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/__init__.py +0 -0
  89. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3a_a25.py +0 -0
  90. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3a_f25.py +0 -0
  91. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3a_p23.py +0 -0
  92. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3a_p25.py +0 -0
  93. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3auk_clubman.py +0 -0
  94. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/f3auk_intermediate.py +0 -0
  95. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/imac_sport2024.py +0 -0
  96. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/imac_unlim2024.py +0 -0
  97. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/builders/schedules/nsrca_inter2024.py +0 -0
  98. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/collectors.py +0 -0
  99. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/eldef.py +0 -0
  100. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/mandef.py +0 -0
  101. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/maninfo.py +0 -0
  102. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/manoption.py +0 -0
  103. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/manparm.py +0 -0
  104. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/__init__.py +0 -0
  105. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/funopp.py +0 -0
  106. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/itemopp.py +0 -0
  107. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/mathopp.py +0 -0
  108. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/operation.py +0 -0
  109. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/operations/sumopp.py +0 -0
  110. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/definition/scheduleinfo.py +0 -0
  111. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/__init__.py +0 -0
  112. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/element.py +0 -0
  113. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/loop.py +0 -0
  114. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/snap.py +0 -0
  115. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/spin.py +0 -0
  116. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/elements/stall_turn.py +0 -0
  117. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/fcjson.py +0 -0
  118. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/manoeuvre.py +0 -0
  119. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/schedule.py +0 -0
  120. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/__init__.py +0 -0
  121. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
  122. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
  123. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/inter/comparison.py +0 -0
  124. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
  125. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scoring/smoothing.py +0 -0
  126. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scripts/collect_scores.py +0 -0
  127. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/scripts/plot_scores.py +0 -0
  128. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis/version.py +0 -0
  129. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis.egg-info/dependency_links.txt +0 -0
  130. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis.egg-info/entry_points.txt +0 -0
  131. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/flightanalysis.egg-info/top_level.txt +0 -0
  132. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/pyproject.toml +0 -0
  133. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/setup.cfg +0 -0
  134. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/EmailedBox.f3a +0 -0
  135. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/__init__.py +0 -0
  136. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/conftest.py +0 -0
  137. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/manual_F3A_P23.json +0 -0
  138. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/old_json.json +0 -0
  139. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/p23.BIN +0 -0
  140. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/p23_box.f3a +0 -0
  141. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/p23_fc.json +0 -0
  142. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/p23_flight.json +0 -0
  143. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/scored_fcj.json +0 -0
  144. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/data/unscored_fcj.json +0 -0
  145. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_fcjscore.py +0 -0
  146. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_rfuncs.py +0 -0
  147. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/__init__.py +0 -0
  148. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/__init__.py +0 -0
  149. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/test_definition_manparm.py +0 -0
  150. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/test_definition_mpopp.py +0 -0
  151. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_definition/test_schedule_definition_maninfo.py +0 -0
  152. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/__init__.py +0 -0
  153. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/loop_analysis.json +0 -0
  154. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/p23_th_e0.csv +0 -0
  155. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/p23_th_e0.json +0 -0
  156. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/p23_th_e0_template.csv +0 -0
  157. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/test_schedule_element.py +0 -0
  158. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/test_schedule_element_spin.py +0 -0
  159. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_element/test_schedule_element_stallturn.py +0 -0
  160. {flightanalysis-0.3.0 → flightanalysis-0.3.2}/tests/test_schedule/test_schedule_manoeuvre.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flightanalysis
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: A package for analysing flight data
5
5
  Author-email: Thomas David <thomasdavid0@gmail.com>
6
6
  License: GNU GPL v3
@@ -15,8 +15,8 @@ Requires-Dist: fastdtw
15
15
  Requires-Dist: simplejson
16
16
  Requires-Dist: loguru
17
17
  Requires-Dist: joblib
18
- Requires-Dist: pfc-geometry>=0.2.9
19
- Requires-Dist: flightdata>=0.2.17
18
+ Requires-Dist: pfc-geometry>=0.2.10
19
+ Requires-Dist: flightdata>=0.2.18
20
20
  Requires-Dist: GitPython
21
21
  Requires-Dist: pyperclip
22
22
  Provides-Extra: dev
@@ -27,8 +27,8 @@ Requires-Dist: fastdtw; extra == "dev"
27
27
  Requires-Dist: simplejson; extra == "dev"
28
28
  Requires-Dist: loguru; extra == "dev"
29
29
  Requires-Dist: joblib; extra == "dev"
30
- Requires-Dist: pfc-geometry>=0.2.9; extra == "dev"
31
- Requires-Dist: flightdata>=0.2.17; extra == "dev"
30
+ Requires-Dist: pfc-geometry>=0.2.10; extra == "dev"
31
+ Requires-Dist: flightdata>=0.2.18; extra == "dev"
32
32
  Requires-Dist: ardupilot_log_reader>=0.3.3; extra == "dev"
33
33
  Requires-Dist: pymavlink; extra == "dev"
34
34
  Requires-Dist: GitPython; extra == "dev"
@@ -163,7 +163,7 @@ class Complete(Alignment):
163
163
 
164
164
  def optimise_alignment(self):
165
165
  fl = self.flown.copy()
166
- elns = ["entry_line"] + list(self.mdef.eds.data.keys())
166
+ elns = list(self.mdef.eds.data.keys())
167
167
 
168
168
  padjusted = set(elns)
169
169
  count = 0
@@ -0,0 +1,15 @@
1
+ from importlib_resources import files
2
+ from json import load
3
+
4
+
5
+ def get_json_resource(name):
6
+ return load(files("flightanalysis.data").joinpath(name).open('r'))
7
+
8
+
9
+ def list_resources(rtype: str):
10
+ return [file.name for file in files("flightanalysis.data").iterdir() if file.name.endswith(f"{rtype}.json")]
11
+
12
+ if __name__ == "__main__":
13
+ resources = list_resources('schedule')
14
+ print(resources)
15
+ data = get_json_resource(resources[0])
@@ -1521,6 +1521,8 @@
1521
1521
  "length": "(0.5*(180-((abs(e_3_rolls[0])*speed)/partial_roll_rate)))"
1522
1522
  },
1523
1523
  "dgs": [
1524
+ "initial_track_y_after_speedup",
1525
+ "initial_track_z_after_speedup",
1524
1526
  "track_y_after_speedup",
1525
1527
  "track_z_after_speedup",
1526
1528
  "line_roll_angle"
@@ -2993,6 +2995,7 @@
2993
2995
  "dgs": [
2994
2996
  "snap_spin_turns",
2995
2997
  "spin_alpha",
2998
+ "peak_drop_pitch_rate",
2996
2999
  "drop_pitch_rate",
2997
3000
  "recovery_rate_delta",
2998
3001
  "end_track_y",
@@ -1216,6 +1216,7 @@
1216
1216
  },
1217
1217
  "dgs": [
1218
1218
  "snap_spin_turns",
1219
+ "peak_break_pitch_rate",
1219
1220
  "break_pitch_rate",
1220
1221
  "snap_alpha",
1221
1222
  "recovery_rate_delta",
@@ -1461,6 +1462,7 @@
1461
1462
  "dgs": [
1462
1463
  "snap_spin_turns",
1463
1464
  "spin_alpha",
1465
+ "peak_drop_pitch_rate",
1464
1466
  "drop_pitch_rate",
1465
1467
  "recovery_rate_delta",
1466
1468
  "end_track_y",
@@ -1994,6 +1996,7 @@
1994
1996
  },
1995
1997
  "dgs": [
1996
1998
  "snap_spin_turns",
1999
+ "peak_break_pitch_rate",
1997
2000
  "break_pitch_rate",
1998
2001
  "snap_alpha",
1999
2002
  "recovery_rate_delta"
@@ -4537,6 +4540,7 @@
4537
4540
  },
4538
4541
  "dgs": [
4539
4542
  "snap_spin_turns",
4543
+ "peak_break_pitch_rate",
4540
4544
  "break_pitch_rate",
4541
4545
  "snap_alpha",
4542
4546
  "recovery_rate_delta",
@@ -5218,6 +5222,8 @@
5218
5222
  "length": "(0.5*(line_length-((speed*abs(e_5_rolls[0]))/snap_rate)))"
5219
5223
  },
5220
5224
  "dgs": [
5225
+ "initial_track_y_after_speedup",
5226
+ "initial_track_z_after_speedup",
5221
5227
  "track_y_after_speedup",
5222
5228
  "track_z_after_speedup",
5223
5229
  "line_roll_angle"
@@ -5236,6 +5242,7 @@
5236
5242
  },
5237
5243
  "dgs": [
5238
5244
  "snap_spin_turns",
5245
+ "peak_break_pitch_rate",
5239
5246
  "break_pitch_rate",
5240
5247
  "snap_alpha",
5241
5248
  "recovery_rate_delta",
@@ -1510,6 +1510,7 @@
1510
1510
  },
1511
1511
  "dgs": [
1512
1512
  "snap_spin_turns",
1513
+ "peak_break_pitch_rate",
1513
1514
  "break_pitch_rate",
1514
1515
  "snap_alpha",
1515
1516
  "recovery_rate_delta",
@@ -2245,6 +2246,7 @@
2245
2246
  "dgs": [
2246
2247
  "snap_spin_turns",
2247
2248
  "spin_alpha",
2249
+ "peak_drop_pitch_rate",
2248
2250
  "drop_pitch_rate",
2249
2251
  "recovery_rate_delta",
2250
2252
  "end_track_y",
@@ -3395,6 +3397,8 @@
3395
3397
  "length": "line_length"
3396
3398
  },
3397
3399
  "dgs": [
3400
+ "initial_track_y_after_speedup",
3401
+ "initial_track_z_after_speedup",
3398
3402
  "track_y_after_speedup",
3399
3403
  "track_z_after_speedup",
3400
3404
  "line_roll_angle"
@@ -3455,6 +3459,8 @@
3455
3459
  "length": "(0.5*(line_length-((abs(roll_option[1])*30)/partial_roll_rate)))"
3456
3460
  },
3457
3461
  "dgs": [
3462
+ "initial_track_y_after_speedup",
3463
+ "initial_track_z_after_speedup",
3458
3464
  "track_y_after_speedup",
3459
3465
  "track_z_after_speedup",
3460
3466
  "line_roll_angle"
@@ -1908,6 +1908,8 @@
1908
1908
  "length": "(0.5*(180-((abs(e_3_rolls[0])*speed)/partial_roll_rate)))"
1909
1909
  },
1910
1910
  "dgs": [
1911
+ "initial_track_y_after_speedup",
1912
+ "initial_track_z_after_speedup",
1911
1913
  "track_y_after_speedup",
1912
1914
  "track_z_after_speedup",
1913
1915
  "line_roll_angle"
@@ -3983,6 +3985,7 @@
3983
3985
  "dgs": [
3984
3986
  "snap_spin_turns",
3985
3987
  "spin_alpha",
3988
+ "peak_drop_pitch_rate",
3986
3989
  "drop_pitch_rate",
3987
3990
  "recovery_rate_delta",
3988
3991
  "end_track_y",
@@ -4885,6 +4888,7 @@
4885
4888
  },
4886
4889
  "dgs": [
4887
4890
  "snap_spin_turns",
4891
+ "peak_break_pitch_rate",
4888
4892
  "break_pitch_rate",
4889
4893
  "snap_alpha",
4890
4894
  "recovery_rate_delta",
@@ -1564,6 +1564,8 @@
1564
1564
  "length": "line_length"
1565
1565
  },
1566
1566
  "dgs": [
1567
+ "initial_track_y_after_speedup",
1568
+ "initial_track_z_after_speedup",
1567
1569
  "track_y_after_speedup",
1568
1570
  "track_z_after_speedup",
1569
1571
  "line_roll_angle"
@@ -2704,6 +2706,7 @@
2704
2706
  "dgs": [
2705
2707
  "snap_spin_turns",
2706
2708
  "spin_alpha",
2709
+ "peak_drop_pitch_rate",
2707
2710
  "drop_pitch_rate",
2708
2711
  "recovery_rate_delta",
2709
2712
  "end_track_y",
@@ -2700,6 +2700,7 @@
2700
2700
  "dgs": [
2701
2701
  "snap_spin_turns",
2702
2702
  "spin_alpha",
2703
+ "peak_drop_pitch_rate",
2703
2704
  "drop_pitch_rate",
2704
2705
  "recovery_rate_delta",
2705
2706
  "end_track_y",
@@ -51,7 +51,7 @@ class SchedDef(Collection):
51
51
  def load(name: Union[str,ScheduleInfo]) -> Self:
52
52
  sinfo = ScheduleInfo.from_str(name) if isinstance(name, str) else name
53
53
 
54
- return SchedDef.from_dict(get_json_resource(f"{str(sinfo).lower()}_schedule"))
54
+ return SchedDef.from_dict(get_json_resource(f"{str(sinfo).lower()}_schedule.json"))
55
55
 
56
56
 
57
57
  def plot(self):
@@ -48,9 +48,6 @@ class Line(Element):
48
48
  speed=abs(flown.vel).mean()
49
49
  )
50
50
 
51
- @staticmethod
52
- def from_roll(speed: float, rate: float, angle: float) -> Line:
53
- return Line(speed, rate * angle * speed, angle )
54
51
 
55
52
  def copy_direction(self, other) -> Line:
56
53
  return self.set_parms(roll=abs(self.roll) * np.sign(other.roll))
@@ -1,9 +1,9 @@
1
1
  from .exponential import Exponential, free
2
2
  from .criteria import Criteria
3
- from .intra.single import Single, Limit
4
- from .intra.peak import Peak
3
+ from .intra.single import Single, Limit, Threshold
4
+ from .intra.peak import Peak, Trough
5
5
  from .intra.continuous import Continuous, ContinuousValue
6
- from .intra.bounded import MaxBound, MinBound, InsideBound, OutsideBound, Bounded
6
+ from .intra.bounded import Bounded
7
7
  from .inter.comparison import Comparison
8
8
  from .inter.combination import Combination
9
9
 
@@ -39,10 +39,12 @@ class Criteria:
39
39
 
40
40
  def to_py(self):
41
41
  _so = f"{self.__class__.__name__}(Exponential({self.lookup.factor},{self.lookup.exponent}, {self.lookup.limit} )"
42
- if hasattr(self, 'bound'):
43
- _so = f"{_so}, {self.bound}"
44
- if hasattr(self, 'cutoff'):
45
- _so = f"{_so}, {self.cutoff}"
42
+ if hasattr(self, 'min_bound'):
43
+ _so = f"{_so}, min_bound={self.min_bound}"
44
+ if hasattr(self, 'min_bound'):
45
+ _so = f"{_so}, max_bound={self.max_bound}"
46
+ if hasattr(self, 'limit'):
47
+ _so = f"{_so}, limit={self.limit}"
46
48
  return _so + ')'
47
49
 
48
50
 
@@ -13,6 +13,10 @@ class Exponential:
13
13
  val = self.factor * value**self.exponent
14
14
  return np.minimum(val, self.limit) if self.limit and limits else val
15
15
 
16
+ @property
17
+ def error_limit(self):
18
+ return (self.limit / self.factor) ** (1 / self.exponent)
19
+
16
20
  @staticmethod
17
21
  def linear(factor: float):
18
22
  return Exponential(factor, 1)
@@ -0,0 +1,84 @@
1
+ from flightanalysis.scoring.criteria import (
2
+ Single,
3
+ Limit,
4
+ Threshold,
5
+ Peak, Trough,
6
+ Exponential,
7
+ Continuous,
8
+ ContinuousValue,
9
+ Bounded,
10
+ Comparison,
11
+ free,
12
+ )
13
+ import numpy as np
14
+
15
+
16
+ class F3AIntra:
17
+ angle = Single(Exponential.fit_points(np.radians([30, 90]), [2, 6], 6))
18
+ end_track = Single(Exponential.fit_points(np.radians([30, 90]), [2, 6], 6))
19
+ end_roll = Single(Exponential.fit_points(np.radians([30, 90]), [1, 6], 6))
20
+ track = Continuous(Exponential.fit_points(np.radians([30, 90]), [1.75, 6], 6))
21
+ roll = Continuous(Exponential.fit_points(np.radians([30, 90]), [1.25, 6], 6))
22
+ radius = Continuous(Exponential.fit_points([1.5, 3], [0.5, 1], 1))
23
+ speed = ContinuousValue(Exponential.fit_points([5, 15], [0.03, 0.09], 0.5))
24
+ roll_rate = Continuous(Exponential.fit_points([1, 3], [0.02, 0.06], 0.5))
25
+ autorotation_rate = Continuous(Exponential.fit_points([1, 3], [0.02, 0.06], 0.5))
26
+ stallturn_speed = Limit(Exponential.fit_points([2, 4], [0.05, 0.1], 4), 4)
27
+ stallturn_width = Peak(Exponential.fit_points([2, 5], [0.25, 1.25], 6), 2)
28
+ break_pitch_rate = Bounded(Exponential(10, 1, 0.1), 0.6, -0.6)
29
+ peak_break_pitch_rate = Trough(Exponential(10, 1, 6), limit=0.6)
30
+
31
+ autorotation_alpha = Bounded(
32
+ Exponential(20, 1, 6), np.radians(7.5), -np.radians(7.5)
33
+ )
34
+ pos_autorotation_alpha = Bounded(Exponential(20, 1, 6), np.radians(7.5))
35
+ neg_autorotation_alpha = Bounded(Exponential(20, 1, 6), None, -np.radians(7.5))
36
+ drop_pitch_rate = Bounded(Exponential(10, 1, 0.1), 0.2)
37
+ peak_drop_pitch_rate = Trough(Exponential(10, 1, 6), 0.2)
38
+ recovery_roll_rate = Bounded(Exponential(1, 1, 0.01), None, 0)
39
+ box = Bounded(Exponential(10 / np.radians(7.5), 1), -np.radians(60), np.radians(60))
40
+ depth = Bounded(Exponential.fit_points([20, 40], [0.5, 1]), None, 170)
41
+
42
+
43
+ class F3AInter:
44
+ radius = Comparison(Exponential.fit_points([1, 2], [1, 2], 2))
45
+ speed = Comparison(free)
46
+ roll_rate = Comparison(Exponential.fit_points([1, 2], [0.25, 0.5], 1))
47
+ length = Comparison(Exponential.fit_points([1, 2], [1, 2], 2))
48
+ free = Comparison(free)
49
+
50
+
51
+ class F3A:
52
+ inter = F3AInter
53
+ intra = F3AIntra
54
+
55
+
56
+ def plot_lookup(lu, v0=0, v1=10):
57
+ import plotly.express as px
58
+
59
+ x = np.linspace(v0, v1, 30)
60
+ px.line(x=x, y=lu(x)).show()
61
+
62
+
63
+ def plot_all(crits):
64
+ from plotly.subplots import make_subplots
65
+ import plotly.graph_objects as go
66
+
67
+ crits = {k: getattr(crits, k) for k in dir(crits) if not k.startswith("__")}
68
+ # names = [f'{k}_{cr}' for k, crit in crits.items() for cr in crit.keys()]
69
+
70
+ nplots = len(crits)
71
+ ncols = 7
72
+ fig = make_subplots(
73
+ int(np.ceil(nplots / ncols)), ncols, subplot_titles=list(crits.keys())
74
+ )
75
+
76
+ for i, crit in enumerate(crits.values()):
77
+ fig.add_trace(
78
+ crit.lookup.trace(showlegend=False), row=1 + i // ncols, col=1 + i % ncols
79
+ )
80
+ fig.show()
81
+
82
+
83
+ if __name__ == "__main__":
84
+ plot_all(F3AIntra)
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+ import numpy as np
3
+ import numpy.typing as npt
4
+ from .. import Criteria
5
+ from dataclasses import dataclass
6
+
7
+
8
+ @dataclass
9
+ class Bounded(Criteria):
10
+ """The bounded criteria downgrades for regions outside of bounds.
11
+ A single downgrade is applied for each group of values outside the bounds.
12
+ The ids correspond to the middle value in each group.
13
+ The downgrade is the average distance from the bound multiplied by the ratio
14
+ of the group width to the total width and by the average visibility of the group.
15
+ """
16
+
17
+ min_bound: float = None # values below the min bound will be downgraded
18
+ max_bound: float = None # values above the max bound will be downgraded
19
+
20
+ def __call__(self, vs: npt.NDArray, limits=True):
21
+ """each downgrade corresponds to a group of values outside the bounds, ids
22
+ correspond to the last value in each case"""
23
+ # sample = self.prepare(vs)
24
+
25
+ groups = np.concatenate([[0], np.diff(vs != 0).cumsum()])
26
+ dgids = np.append(
27
+ np.arange(len(groups))[1:][np.diff(groups).astype(bool)], len(groups) - 1
28
+ )
29
+
30
+ errors = np.array(
31
+ [
32
+ np.mean(vs[groups == grp]) * len(vs[groups == grp]) / len(vs)
33
+ for grp in set(groups)
34
+ ]
35
+ )
36
+ dgs = self.lookup(np.abs(errors), limits)
37
+
38
+ return errors[dgs>0], dgs[dgs>0], dgids[dgs>0]
39
+
40
+ def prepare(self, data: npt.NDArray):
41
+ """prepare the sample for"""
42
+ oarr = np.zeros_like(data)
43
+ # below_min = np.maximum(self.min_bound - data, 0) if self.min_bound is not None else np.zeros_like(data)
44
+ # above_max = np.maximum(data - self.max_bound, 0) if self.max_bound is not None else np.zeros_like(data)
45
+
46
+ if self.min_bound is None and self.max_bound is None:
47
+ raise Exception("Bounds not set.")
48
+ elif (
49
+ self.min_bound is not None
50
+ and self.max_bound is not None
51
+ and self.min_bound >= self.max_bound
52
+ ): # Downgrade values inside the bound.:
53
+ midbound = (self.max_bound + self.min_bound) / 2
54
+ b1fail = (data > midbound) & (data < self.min_bound)
55
+ b0fail = (data <= midbound) & (data > self.max_bound)
56
+ oarr[b1fail] = self.max_bound - data[b1fail]
57
+ oarr[b0fail] = data[b0fail] - self.max_bound
58
+ else:
59
+ if self.min_bound is not None: # downgrade below the min bound
60
+ oarr[data < self.min_bound] = (
61
+ self.min_bound - data[data < self.min_bound]
62
+ )
63
+
64
+ if self.max_bound is not None: # downgrade above the max bound
65
+ oarr[data > self.max_bound] = (
66
+ data[data > self.max_bound] - self.max_bound
67
+ )
68
+
69
+ return oarr
@@ -13,8 +13,6 @@ class Continuous(Criteria):
13
13
  treats each separate increase (peak - trough) as a new error.
14
14
  """
15
15
 
16
- cutoff: int = 4
17
-
18
16
  @staticmethod
19
17
  def get_peak_locs(arr, rev=False):
20
18
  increasing = np.sign(np.diff(np.abs(arr))) > 0
@@ -68,7 +66,7 @@ class ContinuousValue(Continuous):
68
66
  def mistakes(data, peaks, troughs):
69
67
  '''All changes are downgraded (peaks and troughs)'''
70
68
  values = data[peaks + troughs]
71
- return values[:-1] - values[1:]
69
+ return values[1:] - values[:-1]
72
70
 
73
71
 
74
72
  @staticmethod
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+ import numpy as np
3
+ import numpy.typing as npt
4
+ from dataclasses import dataclass
5
+ from .. import Criteria
6
+
7
+
8
+
9
+ @dataclass
10
+ class Peak(Criteria):
11
+ limit: float=0
12
+ """Downgrade the largest absolute value based on its distance above the limit."""
13
+ def __call__(self, vs: npt.NDArray, limits: bool=True) -> npt.NDArray:
14
+ idx = np.argmax(vs)
15
+ errors = np.array([vs[idx]])
16
+ if errors[0] == 0:
17
+ return np.array([]), np.array([]), np.array([], dtype=int)
18
+ else:
19
+ return errors, self.lookup(errors, limits), np.array([idx])
20
+
21
+ def prepare(self, vs):
22
+ return np.maximum(np.abs(vs) - self.limit, 0)
23
+
24
+
25
+ @dataclass
26
+ class Trough(Criteria):
27
+ limit: float=0
28
+ """Downgrade the largest absolute value based on its distance below the limit."""
29
+ def __call__(self, vs: npt.NDArray, limits: bool=True) -> npt.NDArray:
30
+ idx = np.argmin(vs)
31
+ errors = np.array([vs[idx]])
32
+ if errors[0] == 0:
33
+ return np.array([]), np.array([]), np.array([], dtype=int)
34
+ else:
35
+ return errors, self.lookup(errors, limits), np.array([idx])
36
+
37
+ def prepare(self, vs):
38
+ return np.maximum(self.limit - np.abs(vs), 0)
@@ -16,11 +16,22 @@ class Single(Criteria):
16
16
 
17
17
  @dataclass
18
18
  class Limit(Criteria):
19
- """Downgrade the largest value above a threshold"""
19
+ """Downgrade based on the distance above a limit"""
20
20
  limit: float = 0
21
- def __call__(self, vs: npt.NDArray, limits: bool=True) -> np.Any:
22
- errors = np.maximum(np.abs(vs) - self.limit, 0)
21
+ def __call__(self, vs: npt.NDArray, limits: bool=True) -> npt.NDArray:
22
+ idx = np.arange(len(vs))
23
+ return vs, self.lookup(vs, limits), idx
24
+
25
+ def prepare(self, vs):
26
+ return np.maximum(np.abs(vs) - self.limit, 0)
27
+
28
+ @dataclass
29
+ class Threshold(Criteria):
30
+ """downgrade based on the distance below the limit"""
31
+ limit: float = 0
32
+ def __call__(self, vs: npt.NDArray, limits: bool=False) -> npt.NDArray:
23
33
  idx = np.arange(len(vs))
24
- return errors, self.lookup(errors, limits), idx
34
+ return vs, self.lookup(vs, limits), idx
25
35
 
26
-
36
+ def prepare(self, vs):
37
+ return np.maximum(self.limit - np.abs(vs), 0)
@@ -53,7 +53,7 @@ class DownGrade:
53
53
  def __call__(self, fl, tp, limits=True) -> Result:
54
54
  measurement: Measurement = self.measure(fl, tp)
55
55
 
56
- sample = visibility(self.criteria.prepare(measurement.value), measurement.visibility, self.criteria.lookup.limit)
56
+ sample = visibility(self.criteria.prepare(measurement.value), measurement.visibility, self.criteria.lookup.error_limit)
57
57
 
58
58
  for sm in self.smoothers:
59
59
  sample = sm(sample)
@@ -12,41 +12,47 @@ dgs = DownGrades([
12
12
  dg("end_track_z", "track_z", Measurement.track_z, None, sels.last(), F3A.intra.end_track),
13
13
  dg("end_roll_angle", "roll", Measurement.roll_angle, None, sels.last(), F3A.intra.end_roll),
14
14
 
15
- dg("speed", "speed", Measurement.speed_value, None, None, F3A.intra.speed),
15
+ dg("speed", "speed", Measurement.speed_value, sms.lowpass(cutoff=0.5, order=5), None, F3A.intra.speed),
16
16
  dg("line_track_y", "track_y", Measurement.track_y, sms.lowpass(cutoff=2, order=5), None, F3A.intra.track),
17
17
  dg("line_track_z", "track_z", Measurement.track_z, sms.lowpass(cutoff=2, order=5), None, F3A.intra.track),
18
18
  dg("line_roll_angle", "roll", Measurement.roll_angle, sms.lowpass(cutoff=1, order=5), None, F3A.intra.roll),
19
19
  dg("roll_rate", "roll_rate", Measurement.roll_rate, sms.lowpass(cutoff=2, order=5), None, F3A.intra.roll_rate),
20
+
20
21
  dg("loop_curvature", "curvature", Measurement.curvature_proj, sms.lowpass(cutoff=0.5, order=5), None, F3A.intra.radius),
21
22
  dg("loop_track_y", "track_y", Measurement.track_proj_vel, sms.lowpass(cutoff=2, order=5), None, F3A.intra.track),
22
23
  dg("loop_track_z", "track_z", Measurement.track_proj_ang, sms.lowpass(cutoff=2, order=5), sels.last(), F3A.intra.end_track),
23
24
  dg("loop_roll_angle", "roll", Measurement.roll_angle_p, sms.lowpass(cutoff=1, order=5), None, F3A.intra.roll),
24
25
  dg("rolling_loop_roll_angle", "roll", Measurement.roll_angle_p, None, sels.last(), F3A.intra.roll),
26
+
25
27
  dg("stallturn_width", "width", Measurement.stallturn_width, None, None, F3A.intra.stallturn_width),
26
- dg("stallturn_speed", "speed", lambda fl, tp: Measurement.speed_value(fl, tp, g.PZ()), None, sels.first_and_last(), F3A.intra.stallturn_speed),
28
+ dg("stallturn_speed", "speed", Measurement.vertical_speed, None, sels.first_and_last(), F3A.intra.stallturn_speed),
27
29
  dg("stallturn_roll_angle", "roll", Measurement.roll_angle_z, None, None, F3A.intra.roll),
28
30
 
29
31
  dg("snap_spin_turns", "roll", Measurement.roll_angle_y, None, sels.last(), F3A.intra.end_roll),# correct number of turns performed
30
- dg("spin_alpha", "alpha", Measurement.alpha, None, sels.before_recovery(rot=np.pi/4), F3A.intra.autorotation_alpha),#alpha > 7.5 until last 45 degrees of turn
32
+ dg("spin_alpha", "alpha", Measurement.spin_alpha, None, sels.before_recovery(rot=np.pi/4), F3A.intra.pos_autorotation_alpha),#alpha > 7.5 until last 45 degrees of turn
31
33
  dg("drop_pitch_rate", "pitch", Measurement.pitch_down_rate, None, sels.autorot_break(rot=np.radians(15)), F3A.intra.drop_pitch_rate ),#pitch down rate > 0.3 until 15 degree of turn
32
- dg("recovery_rate_delta", "recovery", Measurement.delta_p, None, sels.autorot_recovery(rot=np.pi/24), F3A.intra.recovery_roll_rate ),#roll rate reducing in last 45 degrees of turn
34
+ dg("peak_drop_pitch_rate", "peak_pitch", Measurement.pitch_down_rate, None, sels.autorot_break(rot=np.radians(15)), F3A.intra.peak_drop_pitch_rate ),#pitch down rate > 0.3 until 15 degree of turn
33
35
 
36
+ dg("recovery_rate_delta", "recovery", Measurement.delta_p, None, sels.autorot_recovery(rot=np.pi/24), F3A.intra.recovery_roll_rate ),#roll rate reducing in last 45 degrees of turn
34
37
 
35
38
  dg("break_pitch_rate", "break", Measurement.pitch_rate, None, sels.autorot_break(rot=np.pi/4), F3A.intra.break_pitch_rate ),
39
+ dg("peak_break_pitch_rate", "peak_break", Measurement.pitch_rate, None, sels.autorot_break(rot=np.pi/4), F3A.intra.peak_break_pitch_rate ),
36
40
  dg("snap_alpha", "alpha", Measurement.alpha, None, sels.autorotation(brot=np.pi/4, rrot=np.pi/2), F3A.intra.autorotation_alpha),#alpha > 7.5
37
41
 
38
- dg("track_y_before_slowdown", "track_y", Measurement.track_y, sms.lowpass(cutoff=4, order=5), sels.before_slowdown(sp=5), F3A.intra.track),
39
- dg("track_z_before_slowdown", "track_z", Measurement.track_z, sms.lowpass(cutoff=4, order=5), sels.before_slowdown(sp=5), F3A.intra.track),
40
- dg("pitch_after_slowdown", "pitch", Measurement.pitch_attitude, None, sels.after_slowdown(sp=5), F3A.intra.track),
41
- dg("yaw_after_slowdown", "yaw", Measurement.yaw_attitude, None, sels.after_slowdown(sp=5), F3A.intra.track),
42
+ dg("track_y_before_slowdown", "track_y", Measurement.track_y, sms.lowpass(cutoff=4, order=5), sels.before_slowdown(sp=13), F3A.intra.track),
43
+ dg("track_z_before_slowdown", "track_z", Measurement.track_z, sms.lowpass(cutoff=4, order=5), sels.before_slowdown(sp=13), F3A.intra.track),
44
+ dg("pitch_after_slowdown", "pitch", Measurement.pitch_attitude, None, sels.after_slowdown(sp=13), F3A.intra.track),
45
+ dg("yaw_after_slowdown", "yaw", Measurement.yaw_attitude, None, sels.after_slowdown(sp=13), F3A.intra.track),
42
46
 
43
- dg("track_y_after_speedup", "track_y", Measurement.track_y, sms.lowpass(cutoff=4, order=5), None, F3A.intra.track),
44
- dg("track_z_after_speedup", "track_z", Measurement.track_z, sms.lowpass(cutoff=4, order=5), None, F3A.intra.track),
45
- dg("pitch_before_speedup", "pitch", Measurement.pitch_attitude, None, sels.first(), F3A.intra.end_track),
47
+ dg("track_y_after_speedup", "track_y", Measurement.track_y, sms.lowpass(cutoff=4, order=5), sels.after_speedup(sp=13), F3A.intra.track),
48
+ dg("track_z_after_speedup", "track_z", Measurement.track_z, sms.lowpass(cutoff=4, order=5), sels.after_speedup(sp=13), F3A.intra.track),
49
+ dg("initial_track_y_after_speedup", "itrack_y", Measurement.track_y, sms.lowpass(cutoff=4, order=5), [sels.after_speedup(sp=13), sels.first()], F3A.intra.end_track),
50
+ dg("initial_track_z_after_speedup", "itrack_z", Measurement.track_z, sms.lowpass(cutoff=4, order=5), [sels.after_speedup(sp=13), sels.first()], F3A.intra.end_track),
46
51
 
47
- dg("end_yaw", "yaw", Measurement.yaw_attitude, None, sels.last(), F3A.intra.end_track),
48
52
 
53
+ dg("pitch_before_speedup", "pitch", Measurement.pitch_attitude, None, sels.first(), F3A.intra.end_track),
49
54
 
55
+ dg("end_yaw", "yaw", Measurement.yaw_attitude, None, sels.last(), F3A.intra.end_track),
50
56
  ])
51
57
 
52
58
 
@@ -57,13 +63,13 @@ class DGGrps:
57
63
  roll = DownGrades([dgs.speed, dgs.line_track_y, dgs.line_track_z, dgs.roll_rate, dgs.end_roll_angle])
58
64
  loop = DownGrades([dgs.speed, dgs.loop_curvature, dgs.loop_track_y, dgs.loop_track_z, dgs.loop_roll_angle])
59
65
  rolling_loop = DownGrades([dgs.speed, dgs.loop_curvature, dgs.loop_track_y, dgs.loop_track_z, dgs.roll_rate, dgs.end_roll_angle])
60
- snap = DownGrades([dgs.snap_spin_turns, dgs.break_pitch_rate, dgs.snap_alpha, dgs.recovery_rate_delta, dgs.end_track_y, dgs.end_track_z])
61
- first_snap = DownGrades([dgs.snap_spin_turns, dgs.break_pitch_rate, dgs.snap_alpha, dgs.recovery_rate_delta])
66
+ snap = DownGrades([dgs.snap_spin_turns, dgs.peak_break_pitch_rate, dgs.break_pitch_rate, dgs.snap_alpha, dgs.recovery_rate_delta, dgs.end_track_y, dgs.end_track_z])
67
+ first_snap = DownGrades([dgs.snap_spin_turns, dgs.peak_break_pitch_rate, dgs.break_pitch_rate, dgs.snap_alpha, dgs.recovery_rate_delta])
62
68
  rebound_snap = DownGrades([dgs.snap_spin_turns, dgs.snap_alpha, dgs.recovery_rate_delta, dgs.end_track_y, dgs.end_track_z])
63
- spin = DownGrades([dgs.snap_spin_turns, dgs.spin_alpha, dgs.drop_pitch_rate, dgs.recovery_rate_delta, dgs.end_track_y, dgs.end_track_z])
69
+ spin = DownGrades([dgs.snap_spin_turns, dgs.spin_alpha, dgs.peak_drop_pitch_rate, dgs.drop_pitch_rate, dgs.recovery_rate_delta, dgs.end_track_y, dgs.end_track_z])
64
70
  stallturn = DownGrades([dgs.stallturn_width, dgs.stallturn_speed, dgs.stallturn_roll_angle, dgs.end_yaw])
65
71
  st_line_before = DownGrades([dgs.track_y_before_slowdown, dgs.track_z_before_slowdown, dgs.line_roll_angle, dgs.pitch_after_slowdown, dgs.yaw_after_slowdown])
66
- st_line_after = DownGrades([dgs.track_y_after_speedup, dgs.track_z_after_speedup, dgs.line_roll_angle])
72
+ st_line_after = DownGrades([dgs.initial_track_y_after_speedup, dgs.initial_track_z_after_speedup, dgs.track_y_after_speedup, dgs.track_z_after_speedup, dgs.line_roll_angle])
67
73
  sp_line_before = DownGrades([dgs.track_y_before_slowdown, dgs.line_track_z, dgs.line_roll_angle, dgs.yaw_after_slowdown])
68
74
  sp_line_after = DownGrades([dgs.line_track_y, dgs.line_track_z, dgs.line_roll_angle])
69
75