trajectopy 4.2.4__tar.gz → 4.3.0__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 (178) hide show
  1. {trajectopy-4.2.4 → trajectopy-4.3.0}/PKG-INFO +1 -1
  2. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/ate.py +2 -1
  3. trajectopy-4.3.0/trajectopy/__version__.py +1 -0
  4. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/settings.py +2 -0
  5. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/requests.py +0 -2
  6. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/trajectory_manager.py +5 -78
  7. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/json_settings_view.py +4 -0
  8. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/trajectory_context_menu.py +51 -283
  9. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/data.py +1 -1
  10. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/settings.md +6 -4
  11. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/user_guide.md +2 -1
  12. trajectopy-4.2.4/trajectopy/__version__.py +0 -1
  13. {trajectopy-4.2.4 → trajectopy-4.3.0}/.gitattributes +0 -0
  14. {trajectopy-4.2.4 → trajectopy-4.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {trajectopy-4.2.4 → trajectopy-4.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  16. {trajectopy-4.2.4 → trajectopy-4.3.0}/.gitignore +0 -0
  17. {trajectopy-4.2.4 → trajectopy-4.3.0}/.pre-commit-config.yaml +0 -0
  18. {trajectopy-4.2.4 → trajectopy-4.3.0}/.pylintrc +0 -0
  19. {trajectopy-4.2.4 → trajectopy-4.3.0}/CITATION.cff +0 -0
  20. {trajectopy-4.2.4 → trajectopy-4.3.0}/LICENSE +0 -0
  21. {trajectopy-4.2.4 → trajectopy-4.3.0}/README.md +0 -0
  22. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_ORB.traj +0 -0
  23. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_SPTAM.traj +0 -0
  24. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_gt.traj +0 -0
  25. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/default.mplstyle +0 -0
  26. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/matplotlib_settings.json +0 -0
  27. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/report_settings.json +0 -0
  28. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/align.py +0 -0
  29. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/alignment.py +0 -0
  30. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/mpl_plot.py +0 -0
  31. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/multi_report.py +0 -0
  32. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/rpe.py +0 -0
  33. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/single_report.py +0 -0
  34. {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/trajectory_plot.py +0 -0
  35. {trajectopy-4.2.4 → trajectopy-4.3.0}/pyproject.toml +0 -0
  36. {trajectopy-4.2.4 → trajectopy-4.3.0}/requirements.txt +0 -0
  37. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/__init__.py +0 -0
  38. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/abs_dev.result +0 -0
  39. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/align_entry.result +0 -0
  40. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/generated_trajectory.traj +0 -0
  41. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/noisy_trajectory.traj +0 -0
  42. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/open_loop_trajectory.traj +0 -0
  43. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/rel_dev_meter.result +0 -0
  44. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/rel_dev_second.result +0 -0
  45. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_alignment.py +0 -0
  46. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_approximation.py +0 -0
  47. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_comparison.py +0 -0
  48. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_io.py +0 -0
  49. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_matching.py +0 -0
  50. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_merging.py +0 -0
  51. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_pipeline.py +0 -0
  52. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_positions_rotations.py +0 -0
  53. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_processing_edge_cases.py +0 -0
  54. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_processing_errors.py +0 -0
  55. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_readers_edge_cases.py +0 -0
  56. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_readers_errors.py +0 -0
  57. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings.py +0 -0
  58. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings_edge_cases.py +0 -0
  59. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings_validation.py +0 -0
  60. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_sorting.py +0 -0
  61. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_trajectory.py +0 -0
  62. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_trajectory_validation.py +0 -0
  63. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/testdata.py +0 -0
  64. {trajectopy-4.2.4 → trajectopy-4.3.0}/test/util.py +0 -0
  65. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/LICENSE +0 -0
  66. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/__init__.py +0 -0
  67. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/__main__.py +0 -0
  68. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/cli/__init__.py +0 -0
  69. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/cli/main.py +0 -0
  70. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/__init__.py +0 -0
  71. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/positions.py +0 -0
  72. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/rotations.py +0 -0
  73. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/trajectory.py +0 -0
  74. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/exceptions.py +0 -0
  75. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/__init__.py +0 -0
  76. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/app.py +0 -0
  77. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/__init__.py +0 -0
  78. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/file_manager.py +0 -0
  79. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/plot_manager.py +0 -0
  80. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/session_manager.py +0 -0
  81. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/ui_manager.py +0 -0
  82. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/__init__.py +0 -0
  83. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/entries.py +0 -0
  84. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/property_model.py +0 -0
  85. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/result_model.py +0 -0
  86. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/selection.py +0 -0
  87. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/table_model.py +0 -0
  88. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/trajectory_model.py +0 -0
  89. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  90. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
  91. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon-bg.png +0 -0
  92. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon.png +0 -0
  93. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/themes.py +0 -0
  94. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/utils.py +0 -0
  95. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/__init__.py +0 -0
  96. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/about_window.py +0 -0
  97. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/alignment_edit_window.py +0 -0
  98. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/dof_organizer.py +0 -0
  99. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/main_window.py +0 -0
  100. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/mpl_plot_tabs.py +0 -0
  101. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/playback_window.py +0 -0
  102. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/progress_window.py +0 -0
  103. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/properties_window.py +0 -0
  104. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_context_menu.py +0 -0
  105. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_selection_window.py +0 -0
  106. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_table_view.py +0 -0
  107. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/timeline_widget.py +0 -0
  108. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/trajectory_table_view.py +0 -0
  109. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/__init__.py +0 -0
  110. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/alignment.py +0 -0
  111. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/approximation.py +0 -0
  112. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/evaluation.py +0 -0
  113. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/interpolation.py +0 -0
  114. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/__init__.py +0 -0
  115. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  116. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/direct.py +0 -0
  117. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  118. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
  119. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  120. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  121. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  122. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  123. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  124. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  125. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/matching.py +0 -0
  126. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/merging.py +0 -0
  127. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/sorting.py +0 -0
  128. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/py.typed +0 -0
  129. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/__init__.py +0 -0
  130. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/ascii.py +0 -0
  131. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/rosbag.py +0 -0
  132. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/rosmsg.py +0 -0
  133. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/utils.py +0 -0
  134. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/__init__.py +0 -0
  135. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/alignment_result.py +0 -0
  136. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/ate_result.py +0 -0
  137. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/rpe_result.py +0 -0
  138. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/__init__.py +0 -0
  139. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/common.py +0 -0
  140. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/definitions.py +0 -0
  141. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/__init__.py +0 -0
  142. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/assets/icon.png +0 -0
  143. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/assets/style.css +0 -0
  144. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/default.mplstyle +0 -0
  145. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/mpl_plots.py +0 -0
  146. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/plotly_plots.py +0 -0
  147. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/plotly_reports.py +0 -0
  148. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/report_data.py +0 -0
  149. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/generic.html +0 -0
  150. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/multi_template.html +0 -0
  151. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/single_template.html +0 -0
  152. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
  153. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  154. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
  155. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  156. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/index.md +0 -0
  157. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  158. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  159. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  160. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  161. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  162. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  163. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/parameters.md +0 -0
  164. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  165. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  166. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  167. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  168. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -0
  169. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -0
  170. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -0
  171. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/assets/icon.png +0 -0
  172. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/file_formats.md +0 -0
  173. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/index.md +0 -0
  174. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  175. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  176. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/mkdocs.yml +0 -0
  177. {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy.spec +0 -0
  178. {trajectopy-4.2.4 → trajectopy-4.3.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trajectopy
3
- Version: 4.2.4
3
+ Version: 4.3.0
4
4
  Summary: Trajectory Evaluation in Python
5
5
  Project-URL: Homepage, https://gereon-t.github.io/trajectopy/
6
6
  Project-URL: Documentation, https://gereon-t.github.io/trajectopy/
@@ -28,7 +28,8 @@ def main():
28
28
  # default settings
29
29
  processing_settings = ProcessingSettings()
30
30
 
31
- ate_result = ate(other=gt_traj, trajectory=est_traj, processing_settings=processing_settings)
31
+ # align = True is the default, but can be disabled if you want to evaluate the unaligned trajectories
32
+ ate_result = ate(other=gt_traj, trajectory=est_traj, processing_settings=processing_settings, align=True)
32
33
  console.print(dict_to_table(ate_result.property_dict))
33
34
 
34
35
 
@@ -0,0 +1 @@
1
+ __version__ = "4.3.0"
@@ -543,6 +543,7 @@ class AlignmentSettings(Settings):
543
543
  Combines preprocessing, estimation, and stochastic settings for trajectory alignment.
544
544
 
545
545
  Attributes:
546
+ enabled: Whether alignment is enabled.
546
547
  preprocessing: Preprocessing filter settings
547
548
  estimation_settings: Parameter estimation settings
548
549
  stochastics: Stochastic model (observation uncertainty) settings
@@ -552,6 +553,7 @@ class AlignmentSettings(Settings):
552
553
  Defaults to 1e-4.
553
554
  """
554
555
 
556
+ enabled: bool = True
555
557
  preprocessing: AlignmentPreprocessing = field(default_factory=AlignmentPreprocessing)
556
558
  estimation_settings: AlignmentEstimationSettings = field(default_factory=AlignmentEstimationSettings)
557
559
  stochastics: AlignmentStochastics = field(default_factory=AlignmentStochastics)
@@ -55,8 +55,6 @@ class SessionManagerRequestType(Enum):
55
55
 
56
56
  class TrajectoryManagerRequestType(Enum):
57
57
  SWITCH_SORTING = auto()
58
- COMPARE_ABS = auto()
59
- COMPARE_REL = auto()
60
58
  ALIGN = auto()
61
59
  ADAPT_FIRST_POSE = auto()
62
60
  APPLY_ALIGNMENT = auto()
@@ -48,15 +48,6 @@ class TrajectoryEntryPair:
48
48
  request: TrajectoryManagerRequest
49
49
  reference_entry: TrajectoryEntry | None = None
50
50
 
51
- def __post_init__(self) -> None:
52
- if self.request.type in [
53
- TrajectoryManagerRequestType.ATE,
54
- TrajectoryManagerRequestType.RPE,
55
- ]: # pipeline requests use matching setting from trajectory
56
- return
57
-
58
- self.entry.settings.matching.method = self.request.matching_method
59
-
60
51
 
61
52
  class TrajectoryManager(QObject):
62
53
  """
@@ -144,16 +135,6 @@ class TrajectoryManager(QObject):
144
135
  apply_to_reference=True,
145
136
  ),
146
137
  TrajectoryManagerRequestType.AVERAGE: self.operation_average_trajectories,
147
- TrajectoryManagerRequestType.COMPARE_ABS: lambda: self.handle_trajectory_operation(
148
- operation=self.operation_compare_abs,
149
- inplace=False,
150
- apply_to_reference=False,
151
- ),
152
- TrajectoryManagerRequestType.COMPARE_REL: lambda: self.handle_trajectory_operation(
153
- operation=self.operation_compare_rel,
154
- inplace=False,
155
- apply_to_reference=False,
156
- ),
157
138
  TrajectoryManagerRequestType.MERGE: self.operation_merge_trajectories,
158
139
  TrajectoryManagerRequestType.SORT: lambda: self.handle_trajectory_operation(
159
140
  operation=self.operation_sort, inplace=False, apply_to_reference=True
@@ -475,64 +456,6 @@ class TrajectoryManager(QObject):
475
456
 
476
457
  self.emit_add_trajectory_signal(new_trajectory_entry)
477
458
 
478
- @staticmethod
479
- def operation_compare_abs(entry_pair: TrajectoryEntryPair) -> tuple[ResultEntry]:
480
- """
481
- Compares the selected trajectory to the reference trajectory.
482
-
483
- Args:
484
- entry_pair (TrajectoryEntryPair): The pair of trajectories to compare.
485
-
486
- Returns:
487
- ResultEntry: The result of the comparison.
488
- """
489
- if (reference_entry := entry_pair.reference_entry) is None:
490
- raise ValueError("No reference trajectory selected.")
491
-
492
- traj_test, traj_ref = matching.match_trajectories(
493
- trajectory=entry_pair.entry.trajectory,
494
- other=reference_entry.trajectory,
495
- matching_settings=entry_pair.entry.settings.matching,
496
- )
497
-
498
- if len(traj_ref) != len(traj_test):
499
- raise ValueError("Something went wrong during matching.")
500
-
501
- comparison_result = evaluation._compare_trajectories_absolute(trajectory=traj_test, other=traj_ref)
502
-
503
- return (AbsoluteDeviationEntry(deviations=comparison_result),)
504
-
505
- @staticmethod
506
- def operation_compare_rel(entry_pair: TrajectoryEntryPair) -> tuple[ResultEntry]:
507
- """
508
- Compares the selected trajectory to the reference trajectory using relative comparison.
509
-
510
- Args:
511
- entry_pair (TrajectoryEntryPair): The pair of trajectories to compare.
512
-
513
- Returns:
514
- ResultEntry: The result of the comparison.
515
- """
516
- if (reference_entry := entry_pair.reference_entry) is None:
517
- raise ValueError("No reference trajectory selected.")
518
-
519
- traj_test, traj_ref = matching.match_trajectories(
520
- trajectory=entry_pair.entry.trajectory,
521
- other=reference_entry.trajectory,
522
- matching_settings=entry_pair.entry.settings.matching,
523
- )
524
-
525
- if len(traj_ref) != len(traj_test):
526
- raise ValueError("Something went wrong during matching.")
527
-
528
- comparison_result = evaluation._compare_trajectories_relative(
529
- trajectory=traj_test,
530
- other=traj_ref,
531
- relative_comparison_settings=entry_pair.entry.settings.relative_comparison,
532
- )
533
-
534
- return (RelativeDeviationEntry(deviations=comparison_result),)
535
-
536
459
  @staticmethod
537
460
  def operation_interpolate_to_grid(
538
461
  entry_pair: TrajectoryEntryPair,
@@ -824,7 +747,7 @@ class TrajectoryManager(QObject):
824
747
  entry_pair (TrajectoryEntryPair): The pair of trajectories to compare.
825
748
 
826
749
  Returns:
827
- ResultEntry: The result of the comparison.
750
+ ResultEntry: The result of the comparison and the alignment information.
828
751
  """
829
752
  if (reference_entry := entry_pair.reference_entry) is None:
830
753
  raise ValueError("No reference trajectory selected.")
@@ -834,8 +757,12 @@ class TrajectoryManager(QObject):
834
757
  other=reference_entry.trajectory,
835
758
  processing_settings=entry_pair.entry.settings,
836
759
  return_alignment=True,
760
+ align=entry_pair.entry.settings.alignment.enabled,
837
761
  )
838
762
 
763
+ if not entry_pair.entry.settings.alignment.enabled:
764
+ return (AbsoluteDeviationEntry(deviations=ate_result),)
765
+
839
766
  return (AbsoluteDeviationEntry(deviations=ate_result), AlignmentEntry(alignment_result=alignment_result))
840
767
 
841
768
  @staticmethod
@@ -214,6 +214,10 @@ class JSONViewer(QtWidgets.QMainWindow):
214
214
  group_label = QtWidgets.QLabel(self.scroll_area_widget_contents)
215
215
  group_label.setStyleSheet("color: #888888;")
216
216
 
217
+ if parent_name == "root":
218
+ # make first level keys more prominent
219
+ group_label.setStyleSheet("color: #888888; font-weight: bold; font-size: 14px;")
220
+
217
221
  group_label.setObjectName(f"label-{parent_name}-{key}")
218
222
  group_label.setText(_translate("MainWindow", format_key(key)))
219
223
  self.form_layout.setWidget(self.form_item_cnt, QtWidgets.QFormLayout.ItemRole.LabelRole, group_label)
@@ -3,7 +3,6 @@
3
3
  from PySide6 import QtCore, QtWidgets
4
4
  from PySide6.QtGui import QAction, QCursor
5
5
 
6
- from trajectopy.core.settings import MatchingMethod
7
6
  from trajectopy.gui.managers.requests import (
8
7
  PlotRequest,
9
8
  PlotRequestType,
@@ -31,17 +30,12 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
31
30
 
32
31
  def __init__(self, parent=None) -> None:
33
32
  super().__init__(parent)
34
- self.metrics_context_menu = QtWidgets.QMenu("Metrics")
33
+ self.evaluate_context_menu = QtWidgets.QMenu("Evaluate")
35
34
  self.comparison_context_menu = QtWidgets.QMenu("Compare With Reference")
36
- self.match_context_menu = QtWidgets.QMenu("Match With Reference")
37
- self.other_context_menu = QtWidgets.QMenu("Other")
35
+ self.other_context_menu = QtWidgets.QMenu("Utilities")
38
36
  self.view_context_menu = QtWidgets.QMenu("View")
39
37
  self.edit_context_menu = QtWidgets.QMenu("Edit")
40
- self.action_context_menu = QtWidgets.QMenu("Action")
41
- self.absolute_menu = QtWidgets.QMenu("Absolute", self)
42
- self.relative_menu = QtWidgets.QMenu("Relative", self)
43
- self.least_squares_menu = QtWidgets.QMenu("All Poses", self)
44
- self.align_first_pose_menu = QtWidgets.QMenu("First Pose", self)
38
+ self.process_context_menu = QtWidgets.QMenu("Process")
45
39
  self.align_with_reference_sub_menu = QtWidgets.QMenu("Align With Reference", self)
46
40
  self._selection: TrajectorySelection
47
41
 
@@ -67,17 +61,12 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
67
61
 
68
62
  def clear(self) -> None:
69
63
  super().clear()
70
- self.metrics_context_menu.clear()
64
+ self.evaluate_context_menu.clear()
71
65
  self.comparison_context_menu.clear()
72
- self.match_context_menu.clear()
73
66
  self.other_context_menu.clear()
74
67
  self.view_context_menu.clear()
75
68
  self.edit_context_menu.clear()
76
- self.action_context_menu.clear()
77
- self.absolute_menu.clear()
78
- self.relative_menu.clear()
79
- self.least_squares_menu.clear()
80
- self.align_first_pose_menu.clear()
69
+ self.process_context_menu.clear()
81
70
  self.align_with_reference_sub_menu.clear()
82
71
 
83
72
  def single_only_context(self) -> None:
@@ -116,12 +105,30 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
116
105
  def multi_context(self) -> None:
117
106
  """These options are shown for single and multiple trajectories"""
118
107
  self.view_context()
108
+
109
+ change_datum_action = QAction("Transform to EPSG", self)
110
+ change_datum_action.triggered.connect(
111
+ lambda: self.ui_request.emit(
112
+ UIRequest(
113
+ type=UIRequestType.EPSG_TRANSFORMATION,
114
+ trajectory_selection=self.get_selection(),
115
+ )
116
+ )
117
+ )
118
+ self.addAction(change_datum_action)
119
+
120
+ if self.get_selection().reference_is_set:
121
+ self.addSeparator()
122
+ self.evaluate_context()
123
+ self.addAction(self.match_action())
124
+ self.addMenu(self.align_context())
125
+
126
+ self.addSeparator()
119
127
  self.edit_context()
120
- self.action_context()
121
- self.metrics_context()
128
+ self.process_context()
122
129
 
123
130
  def edit_context(self) -> None:
124
- """Actions sub-context menu"""
131
+ """Edit sub-context menu"""
125
132
  single_selection = len(self.get_selection()) == 1
126
133
  self.addMenu(self.edit_context_menu)
127
134
 
@@ -268,23 +275,8 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
268
275
  )
269
276
  self.view_context_menu.addAction(playback_action)
270
277
 
271
- def action_context(self) -> None:
272
- self.addMenu(self.action_context_menu)
273
-
274
- self.action_context_menu.addMenu(self.align_context())
275
- self.action_context_menu.addMenu(self.compare_context())
276
- self.action_context_menu.addMenu(self.match_context())
277
-
278
- change_datum_action = QAction("Transform to EPSG", self)
279
- change_datum_action.triggered.connect(
280
- lambda: self.ui_request.emit(
281
- UIRequest(
282
- type=UIRequestType.EPSG_TRANSFORMATION,
283
- trajectory_selection=self.get_selection(),
284
- )
285
- )
286
- )
287
- self.action_context_menu.addAction(change_datum_action)
278
+ def process_context(self) -> None:
279
+ self.addMenu(self.process_context_menu)
288
280
 
289
281
  approximate_action = QAction("Approximate", self)
290
282
  approximate_action.triggered.connect(
@@ -295,7 +287,7 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
295
287
  )
296
288
  )
297
289
  )
298
- self.action_context_menu.addAction(approximate_action)
290
+ self.process_context_menu.addAction(approximate_action)
299
291
 
300
292
  interpolate_to_grid_action = QAction("Interpolate to Grid", self)
301
293
  interpolate_to_grid_action.triggered.connect(
@@ -306,7 +298,7 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
306
298
  )
307
299
  )
308
300
  )
309
- self.action_context_menu.addAction(interpolate_to_grid_action)
301
+ self.process_context_menu.addAction(interpolate_to_grid_action)
310
302
 
311
303
  apply_alignment_action = QAction("Apply Alignment", self)
312
304
  # -> ResultModelRequest(selection=selected_trajectories) -> ResultModel
@@ -321,9 +313,9 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
321
313
  )
322
314
  )
323
315
  )
324
- self.action_context_menu.addAction(apply_alignment_action)
316
+ self.process_context_menu.addAction(apply_alignment_action)
325
317
 
326
- self.action_context_menu.addMenu(self.other_context())
318
+ self.process_context_menu.addMenu(self.other_context())
327
319
 
328
320
  if not self.get_selection().reference_is_set:
329
321
  return
@@ -340,7 +332,7 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
340
332
  )
341
333
  )
342
334
  )
343
- self.action_context_menu.addAction(epsg_to_ref_action)
335
+ self.process_context_menu.addAction(epsg_to_ref_action)
344
336
 
345
337
  def other_context(self) -> QtWidgets.QMenu:
346
338
  sort_action = QAction("Sort Spatially", self)
@@ -380,274 +372,50 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
380
372
  def align_context(self) -> QtWidgets.QMenu:
381
373
  self.align_with_reference_sub_menu.setEnabled(self.get_selection().reference_is_set)
382
374
 
383
- align_interpolate_action = QAction("Match by Interpolation", self)
384
- align_interpolate_action.triggered.connect(
385
- lambda: self.trajectory_manager_request.emit(
386
- TrajectoryManagerRequest(
387
- type=TrajectoryManagerRequestType.ALIGN,
388
- selection=self.get_selection(),
389
- matching_method=MatchingMethod.INTERPOLATION,
390
- )
391
- ),
392
- )
393
-
394
- align_nearest_temporal_action = QAction("Match Nearest Temporal", self)
395
- align_nearest_temporal_action.triggered.connect(
396
- lambda: self.trajectory_manager_request.emit(
397
- TrajectoryManagerRequest(
398
- type=TrajectoryManagerRequestType.ALIGN,
399
- selection=self.get_selection(),
400
- matching_method=MatchingMethod.NEAREST_TEMPORAL,
401
- )
402
- ),
403
- )
404
-
405
- align_nearest_spatial_action = QAction("Match Nearest Spatial", self)
406
- align_nearest_spatial_action.triggered.connect(
375
+ align_all_poses_action = QAction("All Poses", self)
376
+ align_all_poses_action.triggered.connect(
407
377
  lambda: self.trajectory_manager_request.emit(
408
378
  TrajectoryManagerRequest(
409
379
  type=TrajectoryManagerRequestType.ALIGN,
410
380
  selection=self.get_selection(),
411
- matching_method=MatchingMethod.NEAREST_SPATIAL,
412
381
  )
413
382
  ),
414
383
  )
415
384
 
416
- align_nsi_action = QAction("Nearest Spatial Interpolated", self)
417
- align_nsi_action.triggered.connect(
418
- lambda: self.trajectory_manager_request.emit(
419
- TrajectoryManagerRequest(
420
- type=TrajectoryManagerRequestType.ALIGN,
421
- selection=self.get_selection(),
422
- matching_method=MatchingMethod.NEAREST_SPATIAL_INTERPOLATED,
423
- )
424
- ),
425
- )
426
-
427
- align_first_pose_interpolation_action = QAction("Match by Interpolation", self)
428
- align_first_pose_interpolation_action.triggered.connect(
385
+ align_first_pose_action = QAction("First Pose", self)
386
+ align_first_pose_action.triggered.connect(
429
387
  lambda: self.trajectory_manager_request.emit(
430
388
  TrajectoryManagerRequest(
431
389
  type=TrajectoryManagerRequestType.ADAPT_FIRST_POSE,
432
390
  selection=self.get_selection(),
433
- matching_method=MatchingMethod.INTERPOLATION,
434
391
  )
435
392
  ),
436
393
  )
437
394
 
438
- align_first_pose_nearest_temporal_action = QAction("Match Nearest Temporal", self)
439
- align_first_pose_nearest_temporal_action.triggered.connect(
440
- lambda: self.trajectory_manager_request.emit(
441
- TrajectoryManagerRequest(
442
- type=TrajectoryManagerRequestType.ADAPT_FIRST_POSE,
443
- selection=self.get_selection(),
444
- matching_method=MatchingMethod.NEAREST_TEMPORAL,
445
- )
446
- ),
447
- )
448
-
449
- align_first_pose_nearest_spatial_action = QAction("Match Nearest Spatial", self)
450
- align_first_pose_nearest_spatial_action.triggered.connect(
451
- lambda: self.trajectory_manager_request.emit(
452
- TrajectoryManagerRequest(
453
- type=TrajectoryManagerRequestType.ADAPT_FIRST_POSE,
454
- selection=self.get_selection(),
455
- matching_method=MatchingMethod.NEAREST_SPATIAL,
456
- )
457
- ),
458
- )
459
-
460
- align_first_pose_nsi_action = QAction("Nearest Spatial Interpolated", self)
461
- align_first_pose_nsi_action.triggered.connect(
462
- lambda: self.trajectory_manager_request.emit(
463
- TrajectoryManagerRequest(
464
- type=TrajectoryManagerRequestType.ADAPT_FIRST_POSE,
465
- selection=self.get_selection(),
466
- matching_method=MatchingMethod.NEAREST_SPATIAL_INTERPOLATED,
467
- )
468
- ),
469
- )
470
-
471
- self.least_squares_menu.addAction(align_interpolate_action)
472
- self.least_squares_menu.addAction(align_nearest_temporal_action)
473
- self.least_squares_menu.addAction(align_nearest_spatial_action)
474
- self.least_squares_menu.addAction(align_nsi_action)
475
- self.align_with_reference_sub_menu.addMenu(self.least_squares_menu)
476
-
477
- self.align_first_pose_menu.addAction(align_first_pose_interpolation_action)
478
- self.align_first_pose_menu.addAction(align_first_pose_nearest_temporal_action)
479
- self.align_first_pose_menu.addAction(align_first_pose_nearest_spatial_action)
480
- self.align_first_pose_menu.addAction(align_first_pose_nsi_action)
481
- self.align_with_reference_sub_menu.addMenu(self.align_first_pose_menu)
395
+ self.align_with_reference_sub_menu.addAction(align_all_poses_action)
396
+ self.align_with_reference_sub_menu.addAction(align_first_pose_action)
482
397
 
483
398
  return self.align_with_reference_sub_menu
484
399
 
485
- def compare_context(self) -> QtWidgets.QMenu:
486
- """Compare-Sub-Context menu"""
487
- self.comparison_context_menu.setEnabled(self.get_selection().reference_is_set)
488
-
489
- abs_nearest_spatial_action = QAction("Match Nearest Spatial", self)
490
- abs_nearest_spatial_action.triggered.connect(
491
- lambda: self.trajectory_manager_request.emit(
492
- TrajectoryManagerRequest(
493
- type=TrajectoryManagerRequestType.COMPARE_ABS,
494
- selection=self.get_selection(),
495
- matching_method=MatchingMethod.NEAREST_SPATIAL,
496
- )
497
- ),
498
- )
499
-
500
- abs_nearest_temporal_action = QAction("Match Nearest Temporal", self)
501
- abs_nearest_temporal_action.triggered.connect(
502
- lambda: self.trajectory_manager_request.emit(
503
- TrajectoryManagerRequest(
504
- type=TrajectoryManagerRequestType.COMPARE_ABS,
505
- selection=self.get_selection(),
506
- matching_method=MatchingMethod.NEAREST_TEMPORAL,
507
- )
508
- ),
509
- )
510
-
511
- abs_interpolation_action = QAction("Match by Interpolation", self)
512
- abs_interpolation_action.triggered.connect(
513
- lambda: self.trajectory_manager_request.emit(
514
- TrajectoryManagerRequest(
515
- type=TrajectoryManagerRequestType.COMPARE_ABS,
516
- selection=self.get_selection(),
517
- matching_method=MatchingMethod.INTERPOLATION,
518
- )
519
- ),
520
- )
521
-
522
- abs_nsi_action = QAction("Nearest Spatial Interpolated", self)
523
- abs_nsi_action.triggered.connect(
524
- lambda: self.trajectory_manager_request.emit(
525
- TrajectoryManagerRequest(
526
- type=TrajectoryManagerRequestType.COMPARE_ABS,
527
- selection=self.get_selection(),
528
- matching_method=MatchingMethod.NEAREST_SPATIAL_INTERPOLATED,
529
- )
530
- ),
531
- )
532
-
533
- rel_nearest_spatial_action = QAction("Match Nearest Spatial", self)
534
- rel_nearest_spatial_action.triggered.connect(
535
- lambda: self.trajectory_manager_request.emit(
536
- TrajectoryManagerRequest(
537
- type=TrajectoryManagerRequestType.COMPARE_REL,
538
- selection=self.get_selection(),
539
- matching_method=MatchingMethod.NEAREST_SPATIAL,
540
- )
541
- ),
542
- )
543
-
544
- rel_nearest_temporal_action = QAction("Match Nearest Temporal", self)
545
- rel_nearest_temporal_action.triggered.connect(
546
- lambda: self.trajectory_manager_request.emit(
547
- TrajectoryManagerRequest(
548
- type=TrajectoryManagerRequestType.COMPARE_REL,
549
- selection=self.get_selection(),
550
- matching_method=MatchingMethod.NEAREST_TEMPORAL,
551
- )
552
- ),
553
- )
554
-
555
- rel_interpolation_action = QAction("Match by Interpolation", self)
556
- rel_interpolation_action.triggered.connect(
557
- lambda: self.trajectory_manager_request.emit(
558
- TrajectoryManagerRequest(
559
- type=TrajectoryManagerRequestType.COMPARE_REL,
560
- selection=self.get_selection(),
561
- matching_method=MatchingMethod.INTERPOLATION,
562
- )
563
- ),
564
- )
565
-
566
- rel_nsi_action = QAction("Nearest Spatial Interpolated", self)
567
- rel_nsi_action.triggered.connect(
568
- lambda: self.trajectory_manager_request.emit(
569
- TrajectoryManagerRequest(
570
- type=TrajectoryManagerRequestType.COMPARE_REL,
571
- selection=self.get_selection(),
572
- matching_method=MatchingMethod.NEAREST_SPATIAL_INTERPOLATED,
573
- )
574
- ),
575
- )
576
-
577
- self.absolute_menu.addAction(abs_interpolation_action)
578
- self.absolute_menu.addAction(abs_nearest_temporal_action)
579
- self.absolute_menu.addAction(abs_nearest_spatial_action)
580
- self.absolute_menu.addAction(abs_nsi_action)
581
-
582
- self.relative_menu.addAction(rel_interpolation_action)
583
- self.relative_menu.addAction(rel_nearest_temporal_action)
584
- self.relative_menu.addAction(rel_nearest_spatial_action)
585
- self.relative_menu.addAction(rel_nsi_action)
586
-
587
- self.comparison_context_menu.addMenu(self.absolute_menu)
588
- self.comparison_context_menu.addMenu(self.relative_menu)
589
- return self.comparison_context_menu
590
-
591
- def match_context(self) -> QtWidgets.QMenu:
592
- self.match_context_menu.setEnabled(self.get_selection().reference_is_set)
593
-
594
- match_interpolation_action = QAction("Interpolation", self)
595
- match_interpolation_action.triggered.connect(
400
+ def match_action(self) -> QAction:
401
+ match_action = QAction("Match With Reference", self)
402
+ match_action.triggered.connect(
596
403
  lambda: self.trajectory_manager_request.emit(
597
404
  TrajectoryManagerRequest(
598
405
  type=TrajectoryManagerRequestType.MATCH,
599
406
  selection=self.get_selection(),
600
- matching_method=MatchingMethod.INTERPOLATION,
601
407
  )
602
408
  ),
603
409
  )
604
410
 
605
- match_nearest_temporal_action = QAction("Nearest Temporal", self)
606
- match_nearest_temporal_action.triggered.connect(
607
- lambda: self.trajectory_manager_request.emit(
608
- TrajectoryManagerRequest(
609
- type=TrajectoryManagerRequestType.MATCH,
610
- selection=self.get_selection(),
611
- matching_method=MatchingMethod.NEAREST_TEMPORAL,
612
- )
613
- ),
614
- )
615
-
616
- match_nearest_spatial_action = QAction("Nearest Spatial", self)
617
- match_nearest_spatial_action.triggered.connect(
618
- lambda: self.trajectory_manager_request.emit(
619
- TrajectoryManagerRequest(
620
- type=TrajectoryManagerRequestType.MATCH,
621
- selection=self.get_selection(),
622
- matching_method=MatchingMethod.NEAREST_SPATIAL,
623
- )
624
- ),
625
- )
626
-
627
- match_nsi_action = QAction("Nearest Spatial Interpolated", self)
628
- match_nsi_action.triggered.connect(
629
- lambda: self.trajectory_manager_request.emit(
630
- TrajectoryManagerRequest(
631
- type=TrajectoryManagerRequestType.MATCH,
632
- selection=self.get_selection(),
633
- matching_method=MatchingMethod.NEAREST_SPATIAL_INTERPOLATED,
634
- )
635
- ),
636
- )
637
-
638
- self.match_context_menu.addAction(match_interpolation_action)
639
- self.match_context_menu.addAction(match_nearest_temporal_action)
640
- self.match_context_menu.addAction(match_nearest_spatial_action)
641
- self.match_context_menu.addAction(match_nsi_action)
642
-
643
- return self.match_context_menu
411
+ return match_action
644
412
 
645
- def metrics_context(self) -> None:
646
- self.addMenu(self.metrics_context_menu)
647
- self.metrics_context_menu.setEnabled(self.get_selection().reference_is_set)
413
+ def evaluate_context(self) -> None:
414
+ self.addMenu(self.evaluate_context_menu)
415
+ self.evaluate_context_menu.setEnabled(self.get_selection().reference_is_set)
648
416
 
649
- ate_action = QAction("Compute ATE", self)
650
- ate_action.triggered.connect(
417
+ ate = QAction("ATE", self)
418
+ ate.triggered.connect(
651
419
  lambda: self.trajectory_manager_request.emit(
652
420
  TrajectoryManagerRequest(
653
421
  type=TrajectoryManagerRequestType.ATE,
@@ -656,7 +424,7 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
656
424
  ),
657
425
  )
658
426
 
659
- rpe_action = QAction("Compute RPE", self)
427
+ rpe_action = QAction("RPE", self)
660
428
  rpe_action.triggered.connect(
661
429
  lambda: self.trajectory_manager_request.emit(
662
430
  TrajectoryManagerRequest(
@@ -666,5 +434,5 @@ class TrajectoryContextMenu(QtWidgets.QMenu):
666
434
  ),
667
435
  )
668
436
 
669
- self.metrics_context_menu.addAction(ate_action)
670
- self.metrics_context_menu.addAction(rpe_action)
437
+ self.evaluate_context_menu.addAction(ate)
438
+ self.evaluate_context_menu.addAction(rpe_action)
@@ -114,7 +114,7 @@ class AlignmentData:
114
114
  "Z_TO": (5, 6),
115
115
  "XYZ_TO": (3, 6),
116
116
  "POSITIONS": (0, 6),
117
- "ROLL_PITCH": (6, 8) if self.alignment_settings.estimation_settings.leverarm_enabled else (None, None),
117
+ "ROLL_PITCH": ((6, 8) if self.alignment_settings.estimation_settings.leverarm_enabled else (None, None)),
118
118
  "YAW": (8, 9) if self.alignment_settings.estimation_settings.leverarm_enabled else (None, None),
119
119
  "RPY": (6, 9) if self.alignment_settings.estimation_settings.leverarm_enabled else (None, None),
120
120
  "SPEED": speed_indices,
@@ -12,13 +12,15 @@ The processing settings allow you to configure various processing steps that can
12
12
 
13
13
  ### Alignment Settings
14
14
 
15
- #### Preprocessing Settings
15
+ - `alignment_enabled` (boolean): Enable or disable trajectory alignment. If disabled, no alignment will be performed and the trajectories will be compared as-is. Default value is `True`.
16
+
17
+ #### Alignment Preprocessing Settings
16
18
 
17
19
  - `min_speed` (float): Only poses with a speed above this threshold are considered for alignment (meters/second).
18
20
  - `time_start` (float): Only poses with a timestamp above this threshold are considered for alignment. The timestamp is given in seconds and is relative to the first common timestamp of both matched trajectories.
19
21
  - `time_end` (float): Only poses with a timestamp below this threshold are considered for alignment. The timestamp is given in seconds and is relative to the first common timestamp of both matched trajectories.
20
22
 
21
- #### Estimation Settings
23
+ #### Alignment Estimation Settings
22
24
 
23
25
  - `translation_x` (boolean): Enable or disable x-translation of the similarity transformation.
24
26
  - `translation_y` (boolean): Enable or disable y-translation of the similarity transformation.
@@ -33,7 +35,7 @@ The processing settings allow you to configure various processing steps that can
33
35
  - `leverarm_z` (boolean): Enable or disable estimation of lever arm in the Z-axis.
34
36
  - `sensor_rotation` (boolean): Enable or disable computation of sensor rotation offsets. Independent of the least squares adjustment, constant offsets between the roll, pitch and yaw angles of both trajectories are computed.
35
37
 
36
- #### Stochastics Settings
38
+ #### Alignment Stochastics Settings
37
39
 
38
40
  - `std_xy_from` (float): Standard deviation of XY source position components in meters.
39
41
  - `std_z_from` (float): Standard deviation of Z source position component in meters.
@@ -45,7 +47,7 @@ The processing settings allow you to configure various processing steps that can
45
47
  - `error_probability` (float): Probability of error used for stochastic testing.
46
48
  - `variance_estimation` (boolean): Enable or disable the estimation of the variance factor for a-posteriori variance computation.
47
49
 
48
- #### Threshold Settings
50
+ #### Alignment Threshold Settings
49
51
 
50
52
  Usually, these settings can be left at their default values.
51
53