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.
- {trajectopy-4.2.4 → trajectopy-4.3.0}/PKG-INFO +1 -1
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/ate.py +2 -1
- trajectopy-4.3.0/trajectopy/__version__.py +1 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/settings.py +2 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/requests.py +0 -2
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/trajectory_manager.py +5 -78
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/json_settings_view.py +4 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/trajectory_context_menu.py +51 -283
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/data.py +1 -1
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/settings.md +6 -4
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/user_guide.md +2 -1
- trajectopy-4.2.4/trajectopy/__version__.py +0 -1
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.gitattributes +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.gitignore +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.pre-commit-config.yaml +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/.pylintrc +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/CITATION.cff +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/LICENSE +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/README.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/default.mplstyle +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/matplotlib_settings.json +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_data/report_settings.json +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/align.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/alignment.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/mpl_plot.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/multi_report.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/rpe.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/single_report.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/example_scripts/trajectory_plot.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/pyproject.toml +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/requirements.txt +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/abs_dev.result +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/align_entry.result +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/data/rel_dev_second.result +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_alignment.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_approximation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_comparison.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_io.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_matching.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_merging.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_pipeline.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_positions_rotations.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_processing_edge_cases.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_processing_errors.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_readers_edge_cases.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_readers_errors.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_settings_validation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_sorting.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_trajectory.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/test_trajectory_validation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/testdata.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/test/util.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/LICENSE +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/__main__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/cli/main.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/positions.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/rotations.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/core/trajectory.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/exceptions.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/app.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/file_manager.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/plot_manager.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/session_manager.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/managers/ui_manager.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/entries.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/property_model.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/result_model.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/selection.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/table_model.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/models/trajectory_model.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/themes.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/utils.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/about_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/alignment_edit_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/dof_organizer.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/main_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/mpl_plot_tabs.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/playback_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/progress_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/properties_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_context_menu.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_selection_window.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/result_table_view.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/gui/views/trajectory_table_view.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/alignment.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/approximation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/evaluation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/interpolation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/direct.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/estimation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/alignment/parameters.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/matching.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/merging.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/processing/sorting.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/py.typed +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/ascii.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/rosbag.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/rosmsg.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/readers/utils.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/alignment_result.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/ate_result.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/results/rpe_result.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/common.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/utils/definitions.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/__init__.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/assets/icon.png +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/assets/style.css +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/default.mplstyle +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/mpl_plots.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/plotly_plots.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/plotly_reports.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/report_data.py +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/generic.html +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/multi_template.html +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy/visualization/templates/single_template.html +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/index.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/parameters.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/file_formats.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/index.md +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy-docs/mkdocs.yml +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/trajectopy.spec +0 -0
- {trajectopy-4.2.4 → trajectopy-4.3.0}/uv.lock +0 -0
|
@@ -28,7 +28,8 @@ def main():
|
|
|
28
28
|
# default settings
|
|
29
29
|
processing_settings = ProcessingSettings()
|
|
30
30
|
|
|
31
|
-
|
|
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)
|
|
@@ -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.
|
|
33
|
+
self.evaluate_context_menu = QtWidgets.QMenu("Evaluate")
|
|
35
34
|
self.comparison_context_menu = QtWidgets.QMenu("Compare With Reference")
|
|
36
|
-
self.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
121
|
-
self.metrics_context()
|
|
128
|
+
self.process_context()
|
|
122
129
|
|
|
123
130
|
def edit_context(self) -> None:
|
|
124
|
-
"""
|
|
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
|
|
272
|
-
self.addMenu(self.
|
|
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.
|
|
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.
|
|
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.
|
|
316
|
+
self.process_context_menu.addAction(apply_alignment_action)
|
|
325
317
|
|
|
326
|
-
self.
|
|
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.
|
|
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
|
-
|
|
384
|
-
|
|
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
|
-
|
|
417
|
-
|
|
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
|
-
|
|
439
|
-
|
|
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
|
|
486
|
-
""
|
|
487
|
-
|
|
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
|
-
|
|
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
|
|
646
|
-
self.addMenu(self.
|
|
647
|
-
self.
|
|
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
|
-
|
|
650
|
-
|
|
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("
|
|
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.
|
|
670
|
-
self.
|
|
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
|
-
|
|
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
|
|