trajectopy 5.1.2__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.4/.github/workflows/release.yml +118 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/PKG-INFO +5 -2
- {trajectopy-5.1.2 → trajectopy-5.1.4}/README.md +84 -81
- {trajectopy-5.1.2 → trajectopy-5.1.4}/requirements.txt +1738 -1738
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_alignment.py +192 -172
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_sorting.py +59 -1
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_visualization.py +71 -0
- trajectopy-5.1.4/trajectopy/__version__.py +1 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/settings.py +4 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/plot_manager.py +1 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/json_settings_view.py +1 -1
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/estimation.py +6 -3
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/sorting.py +100 -45
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/figure.py +60 -7
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/plots.py +80 -5
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/style.py +16 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/index.md +4 -1
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/settings.md +2 -1
- trajectopy-5.1.4/trajectopy.spec +108 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/uv.lock +2597 -2597
- trajectopy-5.1.2/.github/workflows/release.yml +0 -61
- trajectopy-5.1.2/trajectopy/__version__.py +0 -1
- trajectopy-5.1.2/trajectopy.spec +0 -78
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.gitattributes +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.github/workflows/ci.yml +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.gitignore +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.pre-commit-config.yaml +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/.pylintrc +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/CITATION.cff +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/LICENSE +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/align.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/alignment.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/ate.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/deviation_plots.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/rpe.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/example_scripts/trajectory_plot.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/installer/trajectopy.iss +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/pyproject.toml +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/abs_dev.result +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/align_entry.result +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/data/rel_dev_second.result +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_approximation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_architecture.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_comparison.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_context_menus.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_fast_reading.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_gui_models.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_gui_smoke.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_inplace_contract.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_io.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_kml.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_manual_alignment.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_matching.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_merging.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_pipeline.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_positions_rotations.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_processing_edge_cases.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_processing_errors.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_project.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_readers_edge_cases.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_readers_errors.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_regressions.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_settings.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_settings_serialization.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_settings_validation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_trajectory.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_trajectory_validation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/test_update_check.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/testdata.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/test/util.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/LICENSE +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/__main__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/cli/main.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/parameters.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/positions.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/rotations.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/core/trajectory.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/exceptions.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/app.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/file_manager.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/project_manager.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/requests.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/trajectory_manager.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/managers/ui_manager.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/entries.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/property_model.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/result_model.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/selection.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/table_model.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/models/trajectory_model.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/project.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/themes.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/update_check.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/utils.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/about_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/alignment_edit_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/dof_organizer.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/entry_table_view.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/kml_dialog.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/main_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/manual_alignment_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/menu_helpers.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/playback_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/preview_plot_3d.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/progress_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/properties_panel.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/result_context_menu.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/result_selection_window.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/result_table_view.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/views/trajectory_table_view.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/gui/worker.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/ascii.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/header.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/kml.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/results_io.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/rosbag.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/rosmsg.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/trajectory_io.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/io/utils.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/alignment.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/approximation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/evaluation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/interpolation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/data.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/direct.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/alignment/parameters.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/matching.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/processing/merging.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/py.typed +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/readers/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/readers/ascii.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/readers/rosbag.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/readers/rosmsg.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/readers/utils.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/results/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/results/alignment_result.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/results/ate_result.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/results/rpe_result.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/colors.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/common.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/definitions.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/formatting.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/geometry.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/linalg.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/numeric.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/utils/resources.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/__init__.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/_svg_export.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy/visualization/axes.py +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/parameters.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/index.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/kml.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/results_io.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/rosbag.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/display.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/file_formats.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/docs/user_guide.md +0 -0
- {trajectopy-5.1.2 → trajectopy-5.1.4}/trajectopy-docs/mkdocs.yml +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Pushing a version tag (e.g. v5.1.0, matching trajectopy/__version__.py) builds the app for Windows (installer),
|
|
4
|
+
# macOS (.dmg, Apple Silicon) and Linux (.tar.gz, x86-64) and attaches them to the GitHub release of that tag
|
|
5
|
+
# (created with generated notes if it does not exist yet). The update check of installed apps then finds the new
|
|
6
|
+
# version.
|
|
7
|
+
# Running the workflow manually only builds the packages and keeps them as workflow artifacts.
|
|
8
|
+
#
|
|
9
|
+
# PyInstaller cannot cross-compile, so each package is built on a runner of its platform. The Linux build runs on
|
|
10
|
+
# the oldest supported Ubuntu, since the app only runs on systems with the same or a newer glibc. The macOS app is
|
|
11
|
+
# not signed with a Developer ID: on first start, users have to open it with right-click → Open.
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
push:
|
|
15
|
+
tags: ["v*"]
|
|
16
|
+
workflow_dispatch:
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: write
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build:
|
|
23
|
+
strategy:
|
|
24
|
+
fail-fast: false
|
|
25
|
+
matrix:
|
|
26
|
+
include:
|
|
27
|
+
- os: windows-latest
|
|
28
|
+
app: dist/Trajectopy/Trajectopy.exe
|
|
29
|
+
- os: macos-latest
|
|
30
|
+
app: dist/Trajectopy.app/Contents/MacOS/Trajectopy
|
|
31
|
+
- os: ubuntu-22.04
|
|
32
|
+
app: dist/Trajectopy/Trajectopy
|
|
33
|
+
runs-on: ${{ matrix.os }}
|
|
34
|
+
defaults:
|
|
35
|
+
run:
|
|
36
|
+
shell: bash
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
- uses: astral-sh/setup-uv@v6
|
|
40
|
+
with:
|
|
41
|
+
python-version: "3.13"
|
|
42
|
+
# Qt's libraries for X11 and OpenGL: pyqtgraph cannot be imported without them, so PyInstaller would miss
|
|
43
|
+
# its submodules, and the ones not part of a typical desktop installation are bundled with the app
|
|
44
|
+
- if: runner.os == 'Linux'
|
|
45
|
+
run: |
|
|
46
|
+
sudo apt-get update
|
|
47
|
+
sudo apt-get install -y libegl1 libgl1 libfontconfig1 libdbus-1-3 libxkbcommon-x11-0 libxcb-cursor0 \
|
|
48
|
+
libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-shape0 libxcb-util1 libxcb-xkb1
|
|
49
|
+
- run: uv sync --group dev --extra gui
|
|
50
|
+
|
|
51
|
+
- name: Read version
|
|
52
|
+
id: version
|
|
53
|
+
run: |
|
|
54
|
+
version=$(uv run python -c "from trajectopy.__version__ import __version__; print(__version__)")
|
|
55
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
56
|
+
if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" != "v$version" ]]; then
|
|
57
|
+
echo "::error::Tag $GITHUB_REF_NAME does not match the package version $version"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
- name: Build the app
|
|
62
|
+
run: uv run pyinstaller --noconfirm trajectopy.spec
|
|
63
|
+
env:
|
|
64
|
+
# PyInstaller imports the packages to analyse them; Qt must not need a display for that (Linux CI)
|
|
65
|
+
QT_QPA_PLATFORM: offscreen
|
|
66
|
+
|
|
67
|
+
- name: Check that the app starts
|
|
68
|
+
run: ${{ matrix.app }} --version
|
|
69
|
+
|
|
70
|
+
- name: Build the Windows installer
|
|
71
|
+
if: runner.os == 'Windows'
|
|
72
|
+
shell: pwsh
|
|
73
|
+
run: |
|
|
74
|
+
$iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
|
|
75
|
+
if (-not (Test-Path $iscc)) { choco install innosetup --no-progress -y }
|
|
76
|
+
& $iscc "/DAppVersion=${{ steps.version.outputs.version }}" installer\trajectopy.iss
|
|
77
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
78
|
+
"PACKAGE=dist/Trajectopy-${{ steps.version.outputs.version }}-setup.exe" >> $env:GITHUB_ENV
|
|
79
|
+
|
|
80
|
+
- name: Build the macOS disk image
|
|
81
|
+
if: runner.os == 'macOS'
|
|
82
|
+
run: |
|
|
83
|
+
package="dist/Trajectopy-${{ steps.version.outputs.version }}-macos-arm64.dmg"
|
|
84
|
+
# the image shows the app next to a link to /Applications, to install it by dragging
|
|
85
|
+
mkdir dmg
|
|
86
|
+
cp -R dist/Trajectopy.app dmg/
|
|
87
|
+
ln -s /Applications dmg/Applications
|
|
88
|
+
hdiutil create -volname Trajectopy -srcfolder dmg -format UDZO -ov "$package"
|
|
89
|
+
echo "PACKAGE=$package" >> "$GITHUB_ENV"
|
|
90
|
+
|
|
91
|
+
- name: Build the Linux archive
|
|
92
|
+
if: runner.os == 'Linux'
|
|
93
|
+
run: |
|
|
94
|
+
package="dist/Trajectopy-${{ steps.version.outputs.version }}-linux-x86_64.tar.gz"
|
|
95
|
+
tar -czf "$package" -C dist Trajectopy
|
|
96
|
+
echo "PACKAGE=$package" >> "$GITHUB_ENV"
|
|
97
|
+
|
|
98
|
+
- uses: actions/upload-artifact@v4
|
|
99
|
+
with:
|
|
100
|
+
name: Trajectopy-${{ steps.version.outputs.version }}-${{ runner.os }}
|
|
101
|
+
path: ${{ env.PACKAGE }}
|
|
102
|
+
|
|
103
|
+
release:
|
|
104
|
+
# one job attaches all packages, so that the build jobs do not race to create the release
|
|
105
|
+
if: github.ref_type == 'tag'
|
|
106
|
+
needs: build
|
|
107
|
+
runs-on: ubuntu-latest
|
|
108
|
+
steps:
|
|
109
|
+
- uses: actions/download-artifact@v4
|
|
110
|
+
with:
|
|
111
|
+
path: dist
|
|
112
|
+
merge-multiple: true
|
|
113
|
+
|
|
114
|
+
- name: Attach the packages to the release
|
|
115
|
+
uses: softprops/action-gh-release@v2
|
|
116
|
+
with:
|
|
117
|
+
files: dist/*
|
|
118
|
+
generate_release_notes: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: trajectopy
|
|
3
|
-
Version: 5.1.
|
|
3
|
+
Version: 5.1.4
|
|
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/
|
|
@@ -55,7 +55,10 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
<h4>Trajectopy is a Python package with an optional graphical user interface for empirical trajectory evaluation. </h4>
|
|
56
56
|
|
|
57
57
|
<p align="center">
|
|
58
|
-
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/
|
|
58
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/gui_ate.png" alt="Trajectopy GUI showing the ATE of a trajectory in the 3D preview">
|
|
59
|
+
<br />
|
|
60
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/plot_ate.png" width="49%" alt="ATE plot over time">
|
|
61
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/plot_ate_map.png" width="49%" alt="ATE map plot">
|
|
59
62
|
</p>
|
|
60
63
|
|
|
61
64
|
</div>
|
|
@@ -1,81 +1,84 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<h1>Trajectopy - Trajectory Evaluation in Python</h1>
|
|
3
|
-
<a href="https://github.com/gereon-t/trajectopy/releases"><img src="https://img.shields.io/github/v/release/gereon-t/trajectopy?label=version" /></a>
|
|
4
|
-
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
|
|
5
|
-
<a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
|
|
6
|
-
<a href="https://github.com/astral-sh/ruff"><img alt="Code style: ruff" src="https://img.shields.io/badge/code%20style-ruff-000000.svg"></a>
|
|
7
|
-
<br />
|
|
8
|
-
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Windows-0078D6?st&logo=windows&logoColor=white" /></a>
|
|
9
|
-
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
|
|
10
|
-
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/mac%20os-000000?&logo=apple&logoColor=white" /></a>
|
|
11
|
-
<div>
|
|
12
|
-
<img src=".images/uni_bonn.svg" height="50" />
|
|
13
|
-
<img src=".images/igg.gif" height="50" />
|
|
14
|
-
</div>
|
|
15
|
-
<h4>Trajectopy is a Python package with an optional graphical user interface for empirical trajectory evaluation. </h4>
|
|
16
|
-
|
|
17
|
-
<p align="center">
|
|
18
|
-
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>Trajectopy - Trajectory Evaluation in Python</h1>
|
|
3
|
+
<a href="https://github.com/gereon-t/trajectopy/releases"><img src="https://img.shields.io/github/v/release/gereon-t/trajectopy?label=version" /></a>
|
|
4
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
|
|
5
|
+
<a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
|
|
6
|
+
<a href="https://github.com/astral-sh/ruff"><img alt="Code style: ruff" src="https://img.shields.io/badge/code%20style-ruff-000000.svg"></a>
|
|
7
|
+
<br />
|
|
8
|
+
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Windows-0078D6?st&logo=windows&logoColor=white" /></a>
|
|
9
|
+
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
|
|
10
|
+
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/mac%20os-000000?&logo=apple&logoColor=white" /></a>
|
|
11
|
+
<div>
|
|
12
|
+
<img src=".images/uni_bonn.svg" height="50" />
|
|
13
|
+
<img src=".images/igg.gif" height="50" />
|
|
14
|
+
</div>
|
|
15
|
+
<h4>Trajectopy is a Python package with an optional graphical user interface for empirical trajectory evaluation. </h4>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/gui_ate.png" alt="Trajectopy GUI showing the ATE of a trajectory in the 3D preview">
|
|
19
|
+
<br />
|
|
20
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/plot_ate.png" width="49%" alt="ATE plot over time">
|
|
21
|
+
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/plot_ate_map.png" width="49%" alt="ATE map plot">
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
**Windows app**: download `Trajectopy-<version>-setup.exe` from the [latest release](https://github.com/gereon-t/trajectopy/releases/latest) and run it. No Python installation or administrator rights are needed; `.traj` files can then be opened by double-click, and the app reports new versions (Help → Check for Updates).
|
|
29
|
+
|
|
30
|
+
**Python package** (Python 3.10 or newer):
|
|
31
|
+
|
|
32
|
+
| Command | Contents |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `pip install "trajectopy[gui]"` | Python package and GUI (recommended) |
|
|
35
|
+
| `pip install "trajectopy[plot]"` | Python package with plotting, without the GUI |
|
|
36
|
+
| `pip install trajectopy` | Python package only |
|
|
37
|
+
|
|
38
|
+
Loading large trajectory files (millions of poses) is several times faster with the `fast` extra, which can be combined with the others: `pip install "trajectopy[gui,fast]"`.
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
import trajectopy as tpy
|
|
44
|
+
|
|
45
|
+
reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
46
|
+
estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
47
|
+
|
|
48
|
+
ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
|
|
49
|
+
print(f"Position ATE: {ate_result.pos_ate:.3f} m")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Or start the GUI with `trajectopy` (or from the Start menu), drop trajectory files onto it, right-click the ground truth → *Set as Reference*, then right-click another trajectory → *Compare with Reference*.
|
|
53
|
+
|
|
54
|
+
## Documentation
|
|
55
|
+
|
|
56
|
+
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
57
|
+
|
|
58
|
+
## Key Features
|
|
59
|
+
|
|
60
|
+
- __Interactive GUI__: Load, plot, align and compare trajectories without writing code. Every action explains itself in the context menus, and trajectories can be aligned interactively if an automatic alignment is not possible.
|
|
61
|
+
- __Alignment__: A spatio-temporal least squares alignment that can be tailored to the application: similarity transformation, leverarm and time shift, each of them optional.
|
|
62
|
+
- __Comparison__: Absolute and relative trajectory error (__ATE and RPE__), computed with various pose-matching methods.
|
|
63
|
+
- __Data Import/Export__: ASCII files with configurable columns, time formats and coordinate systems (any EPSG code), and ROS bags.
|
|
64
|
+
- __Fast, Interactive Visualization__: Powered by [pyqtgraph](https://www.pyqtgraph.org/), the same plots are available in the GUI and in Python scripts, stay fluid for large trajectories, and can be exported to PNG, JPG or SVG. Georeferenced trajectories and ATE results can be exported to Google Earth, colored by speed, height or deviations, on the terrain or at their own heights, with playback.
|
|
65
|
+
|
|
66
|
+
## Web Application (Docker)
|
|
67
|
+
|
|
68
|
+
A simple web application is available at [gereon-t/trajectopy-web](https://github.com/gereon-t/trajectopy-web) that allows you to use the core functionality of Trajectopy using Docker.
|
|
69
|
+
|
|
70
|
+
## Citation
|
|
71
|
+
|
|
72
|
+
If you use this library for any academic work, please cite our original [paper](https://www.degruyter.com/document/doi/10.1515/jag-2024-0040/html).
|
|
73
|
+
|
|
74
|
+
```bibtex
|
|
75
|
+
@article{Tombrink2024,
|
|
76
|
+
url = {https://doi.org/10.1515/jag-2024-0040},
|
|
77
|
+
title = {Spatio-temporal trajectory alignment for trajectory evaluation},
|
|
78
|
+
author = {Gereon Tombrink and Ansgar Dreier and Lasse Klingbeil and Heiner Kuhlmann},
|
|
79
|
+
journal = {Journal of Applied Geodesy},
|
|
80
|
+
doi = {doi:10.1515/jag-2024-0040},
|
|
81
|
+
year = {2024},
|
|
82
|
+
codeurl = {https://github.com/gereon-t/trajectopy},
|
|
83
|
+
}
|
|
84
|
+
```
|