trajectopy 5.0.2__tar.gz → 5.1.1__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.2 → trajectopy-5.1.1}/PKG-INFO +22 -24
- {trajectopy-5.0.2 → trajectopy-5.1.1}/README.md +21 -23
- {trajectopy-5.0.2 → trajectopy-5.1.1}/installer/trajectopy.iss +10 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_fast_reading.py +30 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_gui_smoke.py +588 -403
- trajectopy-5.1.1/test/test_project.py +157 -0
- trajectopy-5.1.1/trajectopy/__version__.py +1 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/cli/main.py +4 -3
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/trajectory.py +1 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/app.py +1 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/file_manager.py +1 -49
- trajectopy-5.1.1/trajectopy/gui/managers/project_manager.py +104 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/requests.py +8 -25
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/ui_manager.py +2 -40
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/entries.py +12 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/result_model.py +0 -30
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/trajectory_model.py +0 -37
- trajectopy-5.1.1/trajectopy/gui/project.py +220 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/entry_table_view.py +6 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/json_settings_view.py +4 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/main_window.py +315 -97
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/preview_plot.py +37 -30
- trajectopy-5.1.1/trajectopy/gui/views/preview_plot_3d.py +159 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/ascii.py +10 -9
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/ate_result.py +2 -1
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/index.md +1 -0
- trajectopy-5.1.1/trajectopy-docs/docs/api/io/rosbag.md +3 -0
- trajectopy-5.1.1/trajectopy-docs/docs/file_formats.md +205 -0
- trajectopy-5.1.1/trajectopy-docs/docs/index.md +150 -0
- trajectopy-5.1.1/trajectopy-docs/docs/settings.md +202 -0
- trajectopy-5.1.1/trajectopy-docs/docs/user_guide.md +388 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/mkdocs.yml +1 -0
- trajectopy-5.0.2/trajectopy/__version__.py +0 -1
- trajectopy-5.0.2/trajectopy/gui/managers/session_manager.py +0 -99
- trajectopy-5.0.2/trajectopy-docs/docs/file_formats.md +0 -178
- trajectopy-5.0.2/trajectopy-docs/docs/index.md +0 -145
- trajectopy-5.0.2/trajectopy-docs/docs/settings.md +0 -183
- trajectopy-5.0.2/trajectopy-docs/docs/user_guide.md +0 -270
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.gitattributes +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/workflows/ci.yml +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/workflows/release.yml +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.gitignore +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.pre-commit-config.yaml +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/.pylintrc +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/CITATION.cff +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/LICENSE +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/align.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/alignment.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/ate.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/deviation_plots.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/rpe.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/trajectory_plot.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/pyproject.toml +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/requirements.txt +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/abs_dev.result +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/align_entry.result +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/rel_dev_second.result +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_alignment.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_approximation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_architecture.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_comparison.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_context_menus.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_gui_models.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_inplace_contract.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_io.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_kml.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_manual_alignment.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_matching.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_merging.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_pipeline.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_positions_rotations.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_processing_edge_cases.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_processing_errors.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_readers_edge_cases.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_readers_errors.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_regressions.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_serialization.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_validation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_sorting.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_trajectory.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_trajectory_validation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_update_check.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_visualization.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/testdata.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/test/util.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/LICENSE +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/__main__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/parameters.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/positions.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/rotations.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/settings.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/exceptions.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/plot_manager.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/trajectory_manager.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/property_model.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/selection.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/table_model.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/themes.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/update_check.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/utils.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/about_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/alignment_edit_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/dof_organizer.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/kml_dialog.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/manual_alignment_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/menu_helpers.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/playback_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/progress_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/properties_panel.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_context_menu.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_selection_window.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_table_view.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/trajectory_table_view.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/worker.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/header.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/kml.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/results_io.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/rosbag.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/rosmsg.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/trajectory_io.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/utils.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/alignment.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/approximation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/evaluation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/interpolation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/data.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/direct.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/estimation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/parameters.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/matching.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/merging.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/sorting.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/py.typed +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/ascii.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/rosbag.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/rosmsg.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/utils.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/alignment_result.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/rpe_result.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/colors.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/common.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/definitions.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/formatting.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/geometry.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/linalg.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/numeric.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/resources.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/__init__.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/_svg_export.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/axes.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/figure.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/plots.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/style.py +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/parameters.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/kml.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/results_io.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/visualization/display.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy.spec +0 -0
- {trajectopy-5.0.2 → trajectopy-5.1.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: trajectopy
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.1.1
|
|
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/
|
|
@@ -62,44 +62,42 @@ Description-Content-Type: text/markdown
|
|
|
62
62
|
|
|
63
63
|
## Installation
|
|
64
64
|
|
|
65
|
-
Windows app
|
|
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).
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
**Python package** (Python 3.10 or newer):
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Python package
|
|
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 |
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
pip install "trajectopy[plot]"
|
|
77
|
-
```
|
|
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]"`.
|
|
78
76
|
|
|
79
|
-
|
|
77
|
+
## Quick Start
|
|
80
78
|
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
```
|
|
79
|
+
```python
|
|
80
|
+
import trajectopy as tpy
|
|
84
81
|
|
|
85
|
-
|
|
82
|
+
reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
83
|
+
estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
86
84
|
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
|
|
86
|
+
print(f"Position ATE: {ate_result.pos_ate:.3f} m")
|
|
89
87
|
```
|
|
90
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
|
+
|
|
91
91
|
## Documentation
|
|
92
92
|
|
|
93
93
|
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
94
94
|
|
|
95
95
|
## Key Features
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
- __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
|
|
102
|
-
- __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.
|
|
103
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.
|
|
104
102
|
|
|
105
103
|
## Web Application (Docker)
|
|
@@ -22,44 +22,42 @@
|
|
|
22
22
|
|
|
23
23
|
## Installation
|
|
24
24
|
|
|
25
|
-
Windows app
|
|
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
|
-
|
|
27
|
+
**Python package** (Python 3.10 or newer):
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
Python package
|
|
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 |
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
pip install "trajectopy[plot]"
|
|
37
|
-
```
|
|
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]"`.
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
## Quick Start
|
|
40
38
|
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
```
|
|
39
|
+
```python
|
|
40
|
+
import trajectopy as tpy
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
43
|
+
estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
|
|
46
|
+
print(f"Position ATE: {ate_result.pos_ate:.3f} m")
|
|
49
47
|
```
|
|
50
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
|
+
|
|
51
51
|
## Documentation
|
|
52
52
|
|
|
53
53
|
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
54
54
|
|
|
55
55
|
## Key Features
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
- __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
|
|
62
|
-
- __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.
|
|
63
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.
|
|
64
62
|
|
|
65
63
|
## Web Application (Docker)
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
; The installer is written to dist\Trajectopy-<version>-setup.exe.
|
|
7
7
|
;
|
|
8
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
|
|
9
|
+
; dialog), adds a Start menu entry and, optionally, a desktop icon and the .traj and .tpy (project) file
|
|
10
|
+
; associations.
|
|
10
11
|
; Installing a newer version over an existing one updates it in place.
|
|
11
12
|
|
|
12
13
|
#define AppName "Trajectopy"
|
|
@@ -51,6 +52,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
|
51
52
|
[Tasks]
|
|
52
53
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
|
53
54
|
Name: "associate"; Description: "Open .traj files with {#AppName}"; GroupDescription: "File associations:"
|
|
55
|
+
Name: "associateproject"; Description: "Open {#AppName} projects (.tpy)"; GroupDescription: "File associations:"
|
|
54
56
|
|
|
55
57
|
[InstallDelete]
|
|
56
58
|
; an update replaces the bundled libraries completely, so that no files of the previous version remain
|
|
@@ -72,6 +74,13 @@ Root: HKA; Subkey: "Software\Classes\Trajectopy.traj"; ValueType: string; ValueN
|
|
|
72
74
|
Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: associate
|
|
73
75
|
Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: associate
|
|
74
76
|
Root: HKA; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".traj"; ValueData: ""; Flags: uninsdeletekey; Tasks: associate
|
|
77
|
+
; .tpy project files: created by Trajectopy only, so it is always their default program
|
|
78
|
+
Root: HKA; Subkey: "Software\Classes\.tpy"; ValueType: string; ValueName: ""; ValueData: "Trajectopy.tpy"; Flags: uninsdeletevalue; Tasks: associateproject
|
|
79
|
+
Root: HKA; Subkey: "Software\Classes\.tpy\OpenWithProgids"; ValueType: string; ValueName: "Trajectopy.tpy"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associateproject
|
|
80
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy"; ValueType: string; ValueName: ""; ValueData: "Trajectopy Project"; Flags: uninsdeletekey; Tasks: associateproject
|
|
81
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: associateproject
|
|
82
|
+
Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: associateproject
|
|
83
|
+
Root: HKA; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".tpy"; ValueData: ""; Flags: uninsdeletekey; Tasks: associateproject
|
|
75
84
|
|
|
76
85
|
[Run]
|
|
77
86
|
Filename: "{app}\{#AppExe}"; Description: "{cm:LaunchProgram,{#AppName}}"; Flags: nowait postinstall skipifsilent
|
|
@@ -119,6 +119,36 @@ class TestReadTrajectory(unittest.TestCase):
|
|
|
119
119
|
self._assert_same_as_general_reader(text)
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
class TestDatetimeTimeSystems(unittest.TestCase):
|
|
123
|
+
TEMPLATE = (
|
|
124
|
+
"#fields t,px,py,pz\n#time_format datetime\n{header}"
|
|
125
|
+
"2024-01-01 12:00:00.000,0,0,0\n2024-01-01 12:00:00.100,1,0,0\n"
|
|
126
|
+
)
|
|
127
|
+
UTC_2024 = 1704110400.0 # 2024-01-01 12:00:00 UTC
|
|
128
|
+
|
|
129
|
+
def _timestamps(self, header: str) -> np.ndarray:
|
|
130
|
+
with tempfile.TemporaryDirectory() as directory:
|
|
131
|
+
filename = os.path.join(directory, "trajectory.traj")
|
|
132
|
+
with open(filename, "w", encoding="utf-8") as file:
|
|
133
|
+
file.write(self.TEMPLATE.format(header=header))
|
|
134
|
+
return read_trajectory(filename).timestamps
|
|
135
|
+
|
|
136
|
+
def test_utc(self):
|
|
137
|
+
for header_lines in ("", "#datetime_timezone UTC\n"):
|
|
138
|
+
np.testing.assert_allclose(self._timestamps(header_lines), [self.UTC_2024, self.UTC_2024 + 0.1])
|
|
139
|
+
|
|
140
|
+
def test_gps_time_subtracts_the_leap_seconds(self):
|
|
141
|
+
np.testing.assert_allclose(
|
|
142
|
+
self._timestamps("#datetime_timezone GPS\n"), [self.UTC_2024 - 18, self.UTC_2024 - 18 + 0.1]
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def test_other_time_zones_are_read_as_utc_with_a_warning(self):
|
|
146
|
+
with self.assertLogs(ascii.logger, level="WARNING") as logs:
|
|
147
|
+
timestamps = self._timestamps("#datetime_timezone Europe/Berlin\n")
|
|
148
|
+
np.testing.assert_allclose(timestamps, [self.UTC_2024, self.UTC_2024 + 0.1])
|
|
149
|
+
self.assertTrue(any("Europe/Berlin" in message for message in logs.output))
|
|
150
|
+
|
|
151
|
+
|
|
122
152
|
class TestFastExtraHint(unittest.TestCase):
|
|
123
153
|
FILE = "test/data/generated_trajectory.traj"
|
|
124
154
|
|