trajectopy 5.1.3__tar.gz → 5.1.4__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-5.1.3 → trajectopy-5.1.4}/PKG-INFO +1 -1
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_visualization.py +23 -0
- trajectopy-5.1.4/trajectopy/__version__.py +1 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/sorting.py +2 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/figure.py +1 -1
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/plots.py +35 -5
- trajectopy-5.1.3/trajectopy/__version__.py +0 -1
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.gitattributes +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/workflows/ci.yml +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.github/workflows/release.yml +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.gitignore +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.pre-commit-config.yaml +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/.pylintrc +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/CITATION.cff +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/LICENSE +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/README.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/align.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/alignment.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/ate.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/deviation_plots.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/rpe.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/example_scripts/trajectory_plot.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/installer/trajectopy.iss +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/pyproject.toml +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/requirements.txt +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/abs_dev.result +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/align_entry.result +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/data/rel_dev_second.result +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_alignment.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_approximation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_architecture.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_comparison.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_context_menus.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_fast_reading.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_gui_models.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_gui_smoke.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_inplace_contract.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_io.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_kml.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_manual_alignment.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_matching.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_merging.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_pipeline.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_positions_rotations.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_processing_edge_cases.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_processing_errors.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_project.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_readers_edge_cases.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_readers_errors.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_regressions.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_serialization.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_settings_validation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_sorting.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_trajectory.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_trajectory_validation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/test_update_check.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/testdata.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/test/util.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/LICENSE +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/__main__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/cli/main.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/parameters.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/positions.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/rotations.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/settings.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/core/trajectory.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/exceptions.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/app.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/file_manager.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/plot_manager.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/project_manager.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/requests.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/trajectory_manager.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/managers/ui_manager.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/entries.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/property_model.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/result_model.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/selection.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/table_model.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/models/trajectory_model.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/project.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/themes.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/update_check.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/utils.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/about_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/alignment_edit_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/dof_organizer.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/entry_table_view.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/json_settings_view.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/kml_dialog.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/main_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/manual_alignment_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/menu_helpers.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/playback_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot_3d.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/progress_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/properties_panel.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_context_menu.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_selection_window.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/result_table_view.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_table_view.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/gui/worker.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/ascii.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/header.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/kml.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/results_io.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/rosbag.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/rosmsg.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/trajectory_io.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/io/utils.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/alignment.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/approximation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/evaluation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/interpolation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/data.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/direct.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/estimation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/parameters.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/matching.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/merging.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/py.typed +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/ascii.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/rosbag.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/rosmsg.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/readers/utils.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/alignment_result.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/ate_result.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/results/rpe_result.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/colors.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/common.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/definitions.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/formatting.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/geometry.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/linalg.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/numeric.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/utils/resources.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/__init__.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/_svg_export.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/axes.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/visualization/style.py +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/parameters.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/index.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/kml.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/results_io.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/rosbag.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/display.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/file_formats.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/index.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/settings.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/docs/user_guide.md +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy-docs/mkdocs.yml +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy.spec +0 -0
- {trajectopy-5.1.3 → trajectopy-5.1.4}/uv.lock +0 -0
|
@@ -176,6 +176,29 @@ class TestVisualization(unittest.TestCase):
|
|
|
176
176
|
self.assertNotIsInstance(viewport(window), QtOpenGLWidgets.QOpenGLWidget)
|
|
177
177
|
window.close()
|
|
178
178
|
|
|
179
|
+
def test_legend_toggles_series_in_all_subplots(self):
|
|
180
|
+
figures = [
|
|
181
|
+
vis.xyz_figure([generated_trajectory, noisy_trajectory]),
|
|
182
|
+
vis.rpy_figure([generated_trajectory, noisy_trajectory]),
|
|
183
|
+
vis.ate_figure([self.ate_result]),
|
|
184
|
+
*vis.rpe_figures([self.rpe_result]),
|
|
185
|
+
]
|
|
186
|
+
for figure in figures:
|
|
187
|
+
with self.subTest(figure=figure.title):
|
|
188
|
+
widget = figure.create_widget()
|
|
189
|
+
plots = [item for item in widget.graphics.ci.items if isinstance(item, pg.PlotItem)]
|
|
190
|
+
self.assertGreater(len(plots), 1)
|
|
191
|
+
sample, _ = plots[0].legend.items[0]
|
|
192
|
+
sample.item.setVisible(False) # what a click on the legend sample does
|
|
193
|
+
hidden = [item for plot in plots for item in plot.items if not item.isVisible()]
|
|
194
|
+
curves = [item for item in hidden if isinstance(item, pg.PlotDataItem)]
|
|
195
|
+
self.assertEqual([curve.name() for curve in curves], [sample.item.name()] * len(plots))
|
|
196
|
+
error_bars = [item for plot in plots for item in plot.items if isinstance(item, pg.ErrorBarItem)]
|
|
197
|
+
self.assertEqual(
|
|
198
|
+
sum(isinstance(item, pg.ErrorBarItem) for item in hidden), len(error_bars) and len(plots)
|
|
199
|
+
)
|
|
200
|
+
widget.deleteLater()
|
|
201
|
+
|
|
179
202
|
def test_grid_is_opaque_and_behind_the_data(self):
|
|
180
203
|
from trajectopy.visualization import style
|
|
181
204
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "5.1.4"
|
|
@@ -320,6 +320,8 @@ def _edge_matrix(xyz: np.ndarray, edges: np.ndarray) -> csr_array:
|
|
|
320
320
|
weights = np.linalg.norm(xyz[second] - xyz[first], axis=1)
|
|
321
321
|
# scipy treats zero weights as missing edges, which would disconnect duplicate points
|
|
322
322
|
weights = np.maximum(weights, _MIN_EDGE_WEIGHT)
|
|
323
|
+
# scipy < 1.16 keeps 64-bit indices, which its csgraph routines (minimum_spanning_tree) do not accept
|
|
324
|
+
first, second = first.astype(np.int32), second.astype(np.int32)
|
|
323
325
|
return csr_array((weights, (first, second)), shape=(num_points, num_points))
|
|
324
326
|
|
|
325
327
|
|
|
@@ -58,7 +58,7 @@ def _use_opengl(graphics: pg.GraphicsLayoutWidget) -> None:
|
|
|
58
58
|
graphics.useOpenGL(True)
|
|
59
59
|
surface_format = QtGui.QSurfaceFormat.defaultFormat()
|
|
60
60
|
surface_format.setSamples(OPENGL_SAMPLES)
|
|
61
|
-
graphics.viewport().setFormat(surface_format)
|
|
61
|
+
graphics.viewport().setFormat(surface_format)
|
|
62
62
|
# Partial updates are clipped with the stencil buffer, which leaves holes in wide lines; repainting
|
|
63
63
|
# everything is cheap on the GPU (and what Qt recommends for OpenGL viewports).
|
|
64
64
|
graphics.setViewportUpdateMode(QtWidgets.QGraphicsView.ViewportUpdateMode.FullViewportUpdate)
|
|
@@ -57,8 +57,14 @@ def _opaque_pen(pen: QtGui.QPen, background: QtGui.QColor) -> QtGui.QPen:
|
|
|
57
57
|
alpha = color.alphaF()
|
|
58
58
|
if alpha >= 1.0:
|
|
59
59
|
return pen
|
|
60
|
+
|
|
61
|
+
def mix(channel: float, base: float) -> float:
|
|
62
|
+
return alpha * channel + (1 - alpha) * base
|
|
63
|
+
|
|
60
64
|
blended = QtGui.QColor.fromRgbF(
|
|
61
|
-
|
|
65
|
+
mix(color.redF(), background.redF()),
|
|
66
|
+
mix(color.greenF(), background.greenF()),
|
|
67
|
+
mix(color.blueF(), background.blueF()),
|
|
62
68
|
)
|
|
63
69
|
opaque = QtGui.QPen(pen)
|
|
64
70
|
opaque.setColor(blended)
|
|
@@ -135,6 +141,24 @@ def _line(plot: pg.PlotItem, x: np.ndarray, y: np.ndarray, index: int, name: str
|
|
|
135
141
|
return plot.plot(x, y, pen=style.pen(index, settings.line_width), name=name, antialias=style.antialias(len(x)))
|
|
136
142
|
|
|
137
143
|
|
|
144
|
+
def _link_visibility(plots: Sequence[pg.PlotItem]) -> None:
|
|
145
|
+
"""Shows and hides the curves of the other plots along with the same-named curves of the first plot, whose
|
|
146
|
+
legend toggles them. The other plots need not have a legend: curves are added to a legend only if there is one.
|
|
147
|
+
"""
|
|
148
|
+
followers: dict[str, list[pg.PlotDataItem]] = {}
|
|
149
|
+
for plot in plots[1:]:
|
|
150
|
+
for item in plot.listDataItems():
|
|
151
|
+
if item.name() is not None:
|
|
152
|
+
followers.setdefault(item.name(), []).append(item)
|
|
153
|
+
for item in plots[0].listDataItems():
|
|
154
|
+
for follower in followers.get(item.name(), []) if item.name() is not None else []:
|
|
155
|
+
_follow_visibility(follower, item)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _follow_visibility(follower: pg.GraphicsObject, leader: pg.GraphicsObject) -> None:
|
|
159
|
+
leader.visibleChanged.connect(lambda: follower.setVisible(leader.isVisible()))
|
|
160
|
+
|
|
161
|
+
|
|
138
162
|
def _link_x(plots: Sequence[pg.PlotItem]) -> None:
|
|
139
163
|
"""Shares the x range of stacked plots; the first plot (which shows all data) determines the auto range.
|
|
140
164
|
|
|
@@ -373,6 +397,7 @@ def xyz_figure(trajectories: Sequence[Trajectory], settings: PlotSettings | None
|
|
|
373
397
|
_line(plot, axis.values(trajectory), trajectory.xyz[:, dim], index, trajectory.name, settings)
|
|
374
398
|
plots.append(plot)
|
|
375
399
|
_link_x(plots)
|
|
400
|
+
_link_visibility(plots)
|
|
376
401
|
|
|
377
402
|
return Figure("XYZ", render)
|
|
378
403
|
|
|
@@ -403,6 +428,7 @@ def rpy_figure(trajectories: Sequence[Trajectory], settings: PlotSettings | None
|
|
|
403
428
|
_line(plot, axis.values(trajectory), rpy[id(trajectory)][:, dim], index, trajectory.name, settings)
|
|
404
429
|
plots.append(plot)
|
|
405
430
|
_link_x(plots)
|
|
431
|
+
_link_visibility(plots)
|
|
406
432
|
|
|
407
433
|
return Figure("RPY", render)
|
|
408
434
|
|
|
@@ -473,8 +499,9 @@ def ate_figure(ate_results: Sequence[ATEResult], settings: PlotSettings | None =
|
|
|
473
499
|
x = axis.values(result.trajectory)
|
|
474
500
|
_line(position_plot, x, result.pos_dev_comb * settings.unit_multiplier, index, result.name, settings)
|
|
475
501
|
if with_rotation and result.has_orientation:
|
|
476
|
-
_line(plots[1], x, np.rad2deg(result.rot_dev_comb), index,
|
|
502
|
+
_line(plots[1], x, np.rad2deg(result.rot_dev_comb), index, result.name, settings)
|
|
477
503
|
_link_x(plots)
|
|
504
|
+
_link_visibility(plots)
|
|
478
505
|
|
|
479
506
|
return Figure("ATE", render)
|
|
480
507
|
|
|
@@ -683,10 +710,11 @@ def rpe_figures(rpe_results: Sequence[RPEResult], settings: PlotSettings | None
|
|
|
683
710
|
(position_plot, np.asarray(result.pos_dev_mean), np.asarray(result.pos_std), result.name)
|
|
684
711
|
]
|
|
685
712
|
if with_rotation and result.has_rot_dev:
|
|
686
|
-
series.append((plots[1], np.rad2deg(result.rot_dev_mean), np.rad2deg(result.rot_std),
|
|
713
|
+
series.append((plots[1], np.rad2deg(result.rot_dev_mean), np.rad2deg(result.rot_std), result.name))
|
|
687
714
|
for plot, mean, std, name in series:
|
|
688
|
-
|
|
689
|
-
plot.
|
|
715
|
+
error_bars = pg.ErrorBarItem(x=x, y=mean, height=2 * std, beam=0, pen=style.pen(index, 1.0))
|
|
716
|
+
plot.addItem(error_bars)
|
|
717
|
+
curve = plot.plot(
|
|
690
718
|
x,
|
|
691
719
|
mean,
|
|
692
720
|
pen=style.pen(index, settings.line_width),
|
|
@@ -697,9 +725,11 @@ def rpe_figures(rpe_results: Sequence[RPEResult], settings: PlotSettings | None
|
|
|
697
725
|
name=name,
|
|
698
726
|
antialias=True,
|
|
699
727
|
)
|
|
728
|
+
_follow_visibility(error_bars, curve)
|
|
700
729
|
for plot in plots:
|
|
701
730
|
plot.setClipToView(False)
|
|
702
731
|
_link_x(plots)
|
|
732
|
+
_link_visibility(plots)
|
|
703
733
|
|
|
704
734
|
figures.append(Figure(title, render))
|
|
705
735
|
return figures
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "5.1.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/egrad_interface.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/cubic_approximation.py
RENAMED
|
File without changes
|
{trajectopy-5.1.3 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/line_approximation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|