trajectopy 5.0.1__tar.gz → 5.0.3__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.0.1 → trajectopy-5.0.3}/.gitattributes +9 -9
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/workflows/ci.yml +2 -1
- trajectopy-5.0.3/.github/workflows/release.yml +61 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.pre-commit-config.yaml +23 -23
- {trajectopy-5.0.1 → trajectopy-5.0.3}/PKG-INFO +26 -18
- {trajectopy-5.0.1 → trajectopy-5.0.3}/README.md +23 -17
- trajectopy-5.0.3/installer/trajectopy.iss +77 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/pyproject.toml +2 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/requirements.txt +1738 -1738
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_alignment.py +172 -172
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_architecture.py +62 -62
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_comparison.py +194 -194
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_context_menus.py +3 -2
- trajectopy-5.0.3/test/test_fast_reading.py +178 -0
- trajectopy-5.0.3/test/test_gui_models.py +141 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_gui_smoke.py +116 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_inplace_contract.py +119 -119
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_merging.py +240 -240
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_processing_edge_cases.py +121 -121
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_processing_errors.py +53 -53
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_readers_edge_cases.py +98 -98
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_readers_errors.py +36 -36
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_trajectory.py +180 -180
- trajectopy-5.0.3/test/test_update_check.py +100 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_visualization.py +30 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/util.py +218 -218
- trajectopy-5.0.3/trajectopy/__version__.py +1 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/cli/main.py +8 -2
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/rotations.py +52 -2
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/trajectory.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/__init__.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/app.py +7 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/plot_manager.py +2 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/requests.py +7 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/session_manager.py +99 -99
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/ui_manager.py +48 -28
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/entries.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/result_model.py +4 -7
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/selection.py +34 -34
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/table_model.py +39 -12
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/trajectory_model.py +7 -12
- trajectopy-5.0.3/trajectopy/gui/update_check.py +114 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/utils.py +14 -24
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/alignment_edit_window.py +2 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/dof_organizer.py +2 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/json_settings_view.py +10 -10
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/kml_dialog.py +219 -219
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/main_window.py +151 -11
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/manual_alignment_window.py +9 -4
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/properties_panel.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_context_menu.py +2 -2
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_selection_window.py +2 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/trajectory_context_menu.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/trajectory_table_view.py +58 -58
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/worker.py +5 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/ascii.py +86 -12
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/header.py +67 -4
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/results_io.py +204 -204
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/rosmsg.py +62 -62
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/trajectory_io.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/utils.py +34 -34
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/__init__.py +7 -7
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/parameters.py +10 -10
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/matching.py +354 -354
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/__init__.py +1 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/ascii.py +12 -12
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/rosbag.py +3 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/rosmsg.py +3 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/utils.py +3 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/ate_result.py +2 -1
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/__init__.py +5 -5
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/common.py +63 -63
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/geometry.py +191 -191
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/__init__.py +79 -79
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/plots.py +64 -5
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/parameters.md +3 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/index.md +1 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/kml.md +3 -3
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/results_io.md +3 -3
- trajectopy-5.0.3/trajectopy-docs/docs/api/io/rosbag.md +3 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/trajectory_io.md +3 -3
- trajectopy-5.0.3/trajectopy-docs/docs/file_formats.md +204 -0
- trajectopy-5.0.3/trajectopy-docs/docs/index.md +149 -0
- trajectopy-5.0.3/trajectopy-docs/docs/settings.md +201 -0
- trajectopy-5.0.3/trajectopy-docs/docs/user_guide.md +379 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/mkdocs.yml +1 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy.spec +30 -5
- {trajectopy-5.0.1 → trajectopy-5.0.3}/uv.lock +2597 -2471
- trajectopy-5.0.1/trajectopy/__version__.py +0 -1
- trajectopy-5.0.1/trajectopy-docs/docs/file_formats.md +0 -178
- trajectopy-5.0.1/trajectopy-docs/docs/index.md +0 -130
- trajectopy-5.0.1/trajectopy-docs/docs/settings.md +0 -183
- trajectopy-5.0.1/trajectopy-docs/docs/user_guide.md +0 -270
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.gitignore +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/.pylintrc +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/CITATION.cff +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/LICENSE +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/align.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/alignment.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/ate.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/deviation_plots.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/rpe.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/trajectory_plot.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/abs_dev.result +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/align_entry.result +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/rel_dev_second.result +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_approximation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_io.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_kml.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_manual_alignment.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_matching.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_pipeline.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_positions_rotations.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_regressions.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_serialization.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_validation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_sorting.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_trajectory_validation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/test/testdata.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/LICENSE +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/__main__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/parameters.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/positions.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/settings.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/exceptions.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/file_manager.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/trajectory_manager.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/property_model.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/themes.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/about_window.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/entry_table_view.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/menu_helpers.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/playback_window.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/preview_plot.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/progress_window.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_table_view.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/kml.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/rosbag.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/alignment.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/approximation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/evaluation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/interpolation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/data.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/direct.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/estimation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/merging.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/sorting.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/py.typed +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/__init__.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/alignment_result.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/rpe_result.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/colors.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/definitions.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/formatting.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/linalg.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/numeric.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/resources.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/_svg_export.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/axes.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/figure.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/style.py +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/visualization/display.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
trajectopy/core/report/templates/*.html linguist-generated
|
|
2
2
|
trajectopy/core/report/assets/*.css linguist-generated
|
|
3
3
|
example_data/*.html linguist-generated
|
|
4
|
-
|
|
5
|
-
# Never convert line endings in binary files
|
|
6
|
-
*.png binary
|
|
7
|
-
*.ico binary
|
|
8
|
-
*.gif binary
|
|
9
|
-
*.jpg binary
|
|
10
|
-
*.jpeg binary
|
|
11
|
-
*.pdf binary
|
|
12
|
-
*.bag binary
|
|
4
|
+
|
|
5
|
+
# Never convert line endings in binary files
|
|
6
|
+
*.png binary
|
|
7
|
+
*.ico binary
|
|
8
|
+
*.gif binary
|
|
9
|
+
*.jpg binary
|
|
10
|
+
*.jpeg binary
|
|
11
|
+
*.pdf binary
|
|
12
|
+
*.bag binary
|
|
@@ -33,7 +33,8 @@ jobs:
|
|
|
33
33
|
python-version: ${{ matrix.python-version }}
|
|
34
34
|
- if: runner.os == 'Linux'
|
|
35
35
|
run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
|
|
36
|
-
|
|
36
|
+
# with the optional pyarrow reader; the core-only job covers reading without it
|
|
37
|
+
- run: uv sync --group dev --extra gui --extra fast
|
|
37
38
|
- run: uv run pytest -q --cov=trajectopy --cov-report=term
|
|
38
39
|
|
|
39
40
|
core-only:
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Pushing a version tag (e.g. v5.1.0, matching trajectopy/__version__.py) builds the Windows installer and
|
|
4
|
+
# attaches it to the GitHub release of that tag (created with generated notes if it does not exist yet).
|
|
5
|
+
# The update check of installed apps then finds the new version.
|
|
6
|
+
# Running the workflow manually only builds the installer and keeps it as a workflow artifact.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
tags: ["v*"]
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: write
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
windows-installer:
|
|
18
|
+
runs-on: windows-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: astral-sh/setup-uv@v6
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.13"
|
|
24
|
+
- run: uv sync --group dev --extra gui
|
|
25
|
+
|
|
26
|
+
- name: Read version
|
|
27
|
+
id: version
|
|
28
|
+
shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
version=$(uv run python -c "from trajectopy.__version__ import __version__; print(__version__)")
|
|
31
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
32
|
+
if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" != "v$version" ]]; then
|
|
33
|
+
echo "::error::Tag $GITHUB_REF_NAME does not match the package version $version"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
- name: Build the app
|
|
38
|
+
run: uv run pyinstaller --noconfirm trajectopy.spec
|
|
39
|
+
|
|
40
|
+
- name: Check that the app starts
|
|
41
|
+
run: dist\Trajectopy\Trajectopy.exe --version
|
|
42
|
+
|
|
43
|
+
- name: Build the installer
|
|
44
|
+
shell: pwsh
|
|
45
|
+
run: |
|
|
46
|
+
$iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe"
|
|
47
|
+
if (-not (Test-Path $iscc)) { choco install innosetup --no-progress -y }
|
|
48
|
+
& $iscc "/DAppVersion=${{ steps.version.outputs.version }}" installer\trajectopy.iss
|
|
49
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
50
|
+
|
|
51
|
+
- uses: actions/upload-artifact@v4
|
|
52
|
+
with:
|
|
53
|
+
name: Trajectopy-${{ steps.version.outputs.version }}-setup
|
|
54
|
+
path: dist/Trajectopy-${{ steps.version.outputs.version }}-setup.exe
|
|
55
|
+
|
|
56
|
+
- name: Attach the installer to the release
|
|
57
|
+
if: github.ref_type == 'tag'
|
|
58
|
+
uses: softprops/action-gh-release@v2
|
|
59
|
+
with:
|
|
60
|
+
files: dist/Trajectopy-${{ steps.version.outputs.version }}-setup.exe
|
|
61
|
+
generate_release_notes: true
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
repos:
|
|
2
|
-
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
-
rev: v0.14.0
|
|
4
|
-
hooks:
|
|
5
|
-
- id: ruff-check
|
|
6
|
-
args: [--fix]
|
|
7
|
-
- id: ruff-format
|
|
8
|
-
|
|
9
|
-
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
10
|
-
rev: 0.7.6
|
|
11
|
-
hooks:
|
|
12
|
-
- id: uv-lock
|
|
13
|
-
- id: uv-export
|
|
14
|
-
|
|
15
|
-
- repo: local
|
|
16
|
-
hooks:
|
|
17
|
-
- id: pytest
|
|
18
|
-
name: Run unit tests
|
|
19
|
-
entry: uv run pytest -q
|
|
20
|
-
language: system
|
|
21
|
-
pass_filenames: false
|
|
22
|
-
stages: [pre-commit]
|
|
23
|
-
always_run: true
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.14.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff-check
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
10
|
+
rev: 0.7.6
|
|
11
|
+
hooks:
|
|
12
|
+
- id: uv-lock
|
|
13
|
+
- id: uv-export
|
|
14
|
+
|
|
15
|
+
- repo: local
|
|
16
|
+
hooks:
|
|
17
|
+
- id: pytest
|
|
18
|
+
name: Run unit tests
|
|
19
|
+
entry: uv run pytest -q
|
|
20
|
+
language: system
|
|
21
|
+
pass_filenames: false
|
|
22
|
+
stages: [pre-commit]
|
|
23
|
+
always_run: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: trajectopy
|
|
3
|
-
Version: 5.0.
|
|
3
|
+
Version: 5.0.3
|
|
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/
|
|
@@ -27,6 +27,8 @@ Requires-Dist: pandas>=2.2.3
|
|
|
27
27
|
Requires-Dist: pyproj>=3.6.1
|
|
28
28
|
Requires-Dist: rosbags>=0.9.23
|
|
29
29
|
Requires-Dist: scipy>=1.13.1
|
|
30
|
+
Provides-Extra: fast
|
|
31
|
+
Requires-Dist: pyarrow>=25.0.1; extra == 'fast'
|
|
30
32
|
Provides-Extra: gui
|
|
31
33
|
Requires-Dist: pyopengl>=3.1.7; extra == 'gui'
|
|
32
34
|
Requires-Dist: pyqtgraph>=0.13.7; extra == 'gui'
|
|
@@ -60,36 +62,42 @@ Description-Content-Type: text/markdown
|
|
|
60
62
|
|
|
61
63
|
## Installation
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
**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).
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
pip install "trajectopy[gui]"
|
|
67
|
-
```
|
|
67
|
+
**Python package** (Python 3.10 or newer):
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
| Command | Contents |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| `pip install "trajectopy[gui]"` | Python package and GUI (recommended) |
|
|
72
|
+
| `pip install "trajectopy[plot]"` | Python package with plotting, without the GUI |
|
|
73
|
+
| `pip install trajectopy` | Python package only |
|
|
70
74
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
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]"`.
|
|
76
|
+
|
|
77
|
+
## Quick Start
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
```python
|
|
80
|
+
import trajectopy as tpy
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
83
|
+
estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
84
|
+
|
|
85
|
+
ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
|
|
86
|
+
print(f"Position ATE: {ate_result.pos_ate:.3f} m")
|
|
79
87
|
```
|
|
80
88
|
|
|
89
|
+
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*.
|
|
90
|
+
|
|
81
91
|
## Documentation
|
|
82
92
|
|
|
83
93
|
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
84
94
|
|
|
85
95
|
## Key Features
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
- __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
|
|
92
|
-
- __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
|
|
97
|
+
- __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.
|
|
98
|
+
- __Alignment__: A spatio-temporal least squares alignment that can be tailored to the application: similarity transformation, leverarm and time shift, each of them optional.
|
|
99
|
+
- __Comparison__: Absolute and relative trajectory error (__ATE and RPE__), computed with various pose-matching methods.
|
|
100
|
+
- __Data Import/Export__: ASCII files with configurable columns, time formats and coordinate systems (any EPSG code), and ROS bags.
|
|
93
101
|
- __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.
|
|
94
102
|
|
|
95
103
|
## Web Application (Docker)
|
|
@@ -22,36 +22,42 @@
|
|
|
22
22
|
|
|
23
23
|
## Installation
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
**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).
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
pip install "trajectopy[gui]"
|
|
29
|
-
```
|
|
27
|
+
**Python package** (Python 3.10 or newer):
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
| Command | Contents |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `pip install "trajectopy[gui]"` | Python package and GUI (recommended) |
|
|
32
|
+
| `pip install "trajectopy[plot]"` | Python package with plotting, without the GUI |
|
|
33
|
+
| `pip install trajectopy` | Python package only |
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
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]"`.
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
```python
|
|
40
|
+
import trajectopy as tpy
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
43
|
+
estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
44
|
+
|
|
45
|
+
ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
|
|
46
|
+
print(f"Position ATE: {ate_result.pos_ate:.3f} m")
|
|
41
47
|
```
|
|
42
48
|
|
|
49
|
+
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*.
|
|
50
|
+
|
|
43
51
|
## Documentation
|
|
44
52
|
|
|
45
53
|
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
46
54
|
|
|
47
55
|
## Key Features
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
- __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
|
|
54
|
-
- __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
|
|
57
|
+
- __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.
|
|
58
|
+
- __Alignment__: A spatio-temporal least squares alignment that can be tailored to the application: similarity transformation, leverarm and time shift, each of them optional.
|
|
59
|
+
- __Comparison__: Absolute and relative trajectory error (__ATE and RPE__), computed with various pose-matching methods.
|
|
60
|
+
- __Data Import/Export__: ASCII files with configurable columns, time formats and coordinate systems (any EPSG code), and ROS bags.
|
|
55
61
|
- __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.
|
|
56
62
|
|
|
57
63
|
## Web Application (Docker)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
; Windows installer for Trajectopy (Inno Setup 6, https://jrsoftware.org/isinfo.php).
|
|
2
|
+
;
|
|
3
|
+
; Packages the one-folder PyInstaller build. Build it first, then compile this script:
|
|
4
|
+
; uv run pyinstaller --noconfirm trajectopy.spec
|
|
5
|
+
; iscc /DAppVersion=5.0.1 installer\trajectopy.iss
|
|
6
|
+
; The installer is written to dist\Trajectopy-<version>-setup.exe.
|
|
7
|
+
;
|
|
8
|
+
; It installs for the current user without administrator rights (or for all users, if chosen in the
|
|
9
|
+
; dialog), adds a Start menu entry and, optionally, a desktop icon and the .traj file association.
|
|
10
|
+
; Installing a newer version over an existing one updates it in place.
|
|
11
|
+
|
|
12
|
+
#define AppName "Trajectopy"
|
|
13
|
+
#define AppExe "Trajectopy.exe"
|
|
14
|
+
#ifndef AppVersion
|
|
15
|
+
#define AppVersion "0.0.0"
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
[Setup]
|
|
19
|
+
; never change the AppId: Windows identifies the installed application (and its updates) by it
|
|
20
|
+
AppId={{D3DF14CF-47F5-45DB-9C26-6F16E0A3170D}
|
|
21
|
+
AppName={#AppName}
|
|
22
|
+
AppVersion={#AppVersion}
|
|
23
|
+
AppVerName={#AppName} {#AppVersion}
|
|
24
|
+
AppPublisher=Gereon Tombrink
|
|
25
|
+
AppPublisherURL=https://github.com/gereon-t/trajectopy
|
|
26
|
+
AppSupportURL=https://github.com/gereon-t/trajectopy/issues
|
|
27
|
+
AppUpdatesURL=https://github.com/gereon-t/trajectopy/releases
|
|
28
|
+
DefaultDirName={autopf}\{#AppName}
|
|
29
|
+
DefaultGroupName={#AppName}
|
|
30
|
+
DisableProgramGroupPage=yes
|
|
31
|
+
PrivilegesRequired=lowest
|
|
32
|
+
PrivilegesRequiredOverridesAllowed=dialog
|
|
33
|
+
ArchitecturesAllowed=x64compatible
|
|
34
|
+
ArchitecturesInstallIn64BitMode=x64compatible
|
|
35
|
+
OutputDir=..\dist
|
|
36
|
+
OutputBaseFilename={#AppName}-{#AppVersion}-setup
|
|
37
|
+
SetupIconFile=..\trajectopy\gui\resources\icon-bg.ico
|
|
38
|
+
UninstallDisplayIcon={app}\{#AppExe}
|
|
39
|
+
UninstallDisplayName={#AppName}
|
|
40
|
+
LicenseFile=..\LICENSE
|
|
41
|
+
Compression=lzma2
|
|
42
|
+
SolidCompression=yes
|
|
43
|
+
WizardStyle=modern
|
|
44
|
+
ChangesAssociations=yes
|
|
45
|
+
; close a running Trajectopy before updating it
|
|
46
|
+
CloseApplications=yes
|
|
47
|
+
|
|
48
|
+
[Languages]
|
|
49
|
+
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
50
|
+
|
|
51
|
+
[Tasks]
|
|
52
|
+
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
|
53
|
+
Name: "associate"; Description: "Open .traj files with {#AppName}"; GroupDescription: "File associations:"
|
|
54
|
+
|
|
55
|
+
[InstallDelete]
|
|
56
|
+
; an update replaces the bundled libraries completely, so that no files of the previous version remain
|
|
57
|
+
Type: filesandordirs; Name: "{app}\_internal"
|
|
58
|
+
|
|
59
|
+
[Files]
|
|
60
|
+
Source: "..\dist\Trajectopy\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
|
61
|
+
|
|
62
|
+
[Icons]
|
|
63
|
+
Name: "{autoprograms}\{#AppName}"; Filename: "{app}\{#AppExe}"
|
|
64
|
+
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExe}"; Tasks: desktopicon
|
|
65
|
+
|
|
66
|
+
[Registry]
|
|
67
|
+
; .traj files: Trajectopy is the default program unless the user chose another one, and is always listed
|
|
68
|
+
; under "Open with". HKA is HKCU for a per-user and HKLM for an all-users installation.
|
|
69
|
+
Root: HKA; Subkey: "Software\Classes\.traj"; ValueType: string; ValueName: ""; ValueData: "Trajectopy.traj"; Flags: uninsdeletevalue; Tasks: associate
|
|
70
|
+
Root: HKA; Subkey: "Software\Classes\.traj\OpenWithProgids"; ValueType: string; ValueName: "Trajectopy.traj"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associate
|
|
71
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.traj"; ValueType: string; ValueName: ""; ValueData: "Trajectory File"; Flags: uninsdeletekey; Tasks: associate
|
|
72
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: associate
|
|
73
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: associate
|
|
74
|
+
Root: HKA; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".traj"; ValueData: ""; Flags: uninsdeletekey; Tasks: associate
|
|
75
|
+
|
|
76
|
+
[Run]
|
|
77
|
+
Filename: "{app}\{#AppExe}"; Description: "{cm:LaunchProgram,{#AppName}}"; Flags: nowait postinstall skipifsilent
|
|
@@ -60,6 +60,8 @@ dependencies = [
|
|
|
60
60
|
plot = ["PySide6-Essentials>=6.8", "pyqtgraph>=0.13.7"]
|
|
61
61
|
# The GUI additionally renders the 3D playback with OpenGL.
|
|
62
62
|
gui = ["trajectopy[plot]", "PyOpenGL>=3.1.7"]
|
|
63
|
+
# Several times faster reading of large trajectory files (multithreaded CSV parser).
|
|
64
|
+
fast = ["pyarrow>=25.0.1"]
|
|
63
65
|
|
|
64
66
|
[project.urls]
|
|
65
67
|
Homepage = "https://gereon-t.github.io/trajectopy/"
|