trajectopy 4.3.3__tar.gz → 5.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {trajectopy-4.3.3 → trajectopy-5.0.0}/.gitattributes +9 -0
- trajectopy-5.0.0/.github/workflows/ci.yml +46 -0
- trajectopy-5.0.0/.pre-commit-config.yaml +23 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/PKG-INFO +16 -17
- {trajectopy-4.3.3 → trajectopy-5.0.0}/README.md +75 -75
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_scripts/align.py +3 -6
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_scripts/alignment.py +3 -6
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_scripts/ate.py +4 -16
- trajectopy-5.0.0/example_scripts/deviation_plots.py +36 -0
- trajectopy-5.0.0/example_scripts/rpe.py +20 -0
- trajectopy-5.0.0/example_scripts/trajectory_plot.py +18 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/pyproject.toml +34 -6
- {trajectopy-4.3.3 → trajectopy-5.0.0}/requirements.txt +1738 -1885
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_alignment.py +172 -122
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_approximation.py +8 -16
- trajectopy-5.0.0/test/test_architecture.py +62 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_comparison.py +194 -194
- trajectopy-5.0.0/test/test_context_menus.py +121 -0
- trajectopy-5.0.0/test/test_gui_smoke.py +288 -0
- trajectopy-5.0.0/test/test_inplace_contract.py +119 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_io.py +21 -1
- trajectopy-5.0.0/test/test_kml.py +397 -0
- trajectopy-5.0.0/test/test_manual_alignment.py +347 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_matching.py +2 -2
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_merging.py +240 -240
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_processing_edge_cases.py +121 -121
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_processing_errors.py +53 -48
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_readers_edge_cases.py +98 -98
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_readers_errors.py +36 -36
- trajectopy-5.0.0/test/test_regressions.py +60 -0
- trajectopy-5.0.0/test/test_settings_serialization.py +75 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_sorting.py +4 -6
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_trajectory.py +180 -180
- trajectopy-5.0.0/test/test_visualization.py +150 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/util.py +218 -218
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/__init__.py +34 -19
- trajectopy-5.0.0/trajectopy/__version__.py +1 -0
- trajectopy-5.0.0/trajectopy/cli/main.py +47 -0
- {trajectopy-4.3.3/trajectopy/processing/lib/alignment → trajectopy-5.0.0/trajectopy/core}/parameters.py +16 -95
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/positions.py +40 -40
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/settings.py +160 -253
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/trajectory.py +63 -111
- trajectopy-5.0.0/trajectopy/gui/__init__.py +1 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/app.py +11 -17
- trajectopy-5.0.0/trajectopy/gui/managers/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/file_manager.py +15 -21
- trajectopy-5.0.0/trajectopy/gui/managers/plot_manager.py +102 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/requests.py +28 -25
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/session_manager.py +99 -99
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/trajectory_manager.py +121 -199
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/ui_manager.py +86 -57
- trajectopy-5.0.0/trajectopy/gui/models/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/entries.py +41 -19
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/property_model.py +8 -7
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/result_model.py +14 -15
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/selection.py +34 -34
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/table_model.py +23 -24
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/trajectory_model.py +18 -28
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/themes.py +80 -41
- trajectopy-5.0.0/trajectopy/gui/utils.py +86 -0
- trajectopy-5.0.0/trajectopy/gui/views/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/about_window.py +2 -3
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/alignment_edit_window.py +1 -4
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/dof_organizer.py +1 -3
- trajectopy-5.0.0/trajectopy/gui/views/entry_table_view.py +95 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/json_settings_view.py +63 -43
- trajectopy-5.0.0/trajectopy/gui/views/kml_dialog.py +219 -0
- trajectopy-5.0.0/trajectopy/gui/views/main_window.py +471 -0
- trajectopy-5.0.0/trajectopy/gui/views/manual_alignment_window.py +1105 -0
- trajectopy-5.0.0/trajectopy/gui/views/menu_helpers.py +123 -0
- trajectopy-5.0.0/trajectopy/gui/views/playback_window.py +294 -0
- trajectopy-5.0.0/trajectopy/gui/views/preview_plot.py +137 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/progress_window.py +1 -2
- trajectopy-5.0.0/trajectopy/gui/views/properties_panel.py +72 -0
- trajectopy-5.0.0/trajectopy/gui/views/result_context_menu.py +134 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/result_selection_window.py +1 -2
- trajectopy-5.0.0/trajectopy/gui/views/result_table_view.py +44 -0
- trajectopy-5.0.0/trajectopy/gui/views/trajectory_context_menu.py +384 -0
- trajectopy-5.0.0/trajectopy/gui/views/trajectory_table_view.py +58 -0
- trajectopy-5.0.0/trajectopy/gui/worker.py +68 -0
- trajectopy-5.0.0/trajectopy/io/__init__.py +47 -0
- {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/ascii.py +17 -206
- trajectopy-5.0.0/trajectopy/io/header.py +206 -0
- trajectopy-5.0.0/trajectopy/io/kml.py +447 -0
- trajectopy-5.0.0/trajectopy/io/results_io.py +204 -0
- {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosbag.py +13 -40
- {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosmsg.py +62 -62
- trajectopy-5.0.0/trajectopy/io/trajectory_io.py +92 -0
- {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/utils.py +34 -34
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/alignment.py +66 -21
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/approximation.py +99 -15
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/evaluation.py +45 -4
- trajectopy-5.0.0/trajectopy/processing/interpolation.py +174 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/__init__.py +7 -7
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/data.py +25 -59
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/direct.py +12 -9
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/egrad_interface.py +1 -4
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/estimation.py +31 -15
- trajectopy-5.0.0/trajectopy/processing/lib/alignment/parameters.py +10 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +1 -15
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -16
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/matching.py +354 -347
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/merging.py +7 -5
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/sorting.py +26 -8
- trajectopy-5.0.0/trajectopy/readers/__init__.py +1 -0
- trajectopy-5.0.0/trajectopy/readers/ascii.py +12 -0
- trajectopy-5.0.0/trajectopy/readers/rosbag.py +3 -0
- trajectopy-5.0.0/trajectopy/readers/rosmsg.py +3 -0
- trajectopy-5.0.0/trajectopy/readers/utils.py +3 -0
- trajectopy-5.0.0/trajectopy/results/alignment_result.py +57 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/ate_result.py +36 -51
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/rpe_result.py +13 -45
- trajectopy-5.0.0/trajectopy/utils/__init__.py +5 -0
- trajectopy-5.0.0/trajectopy/utils/colors.py +63 -0
- trajectopy-5.0.0/trajectopy/utils/common.py +63 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/utils/definitions.py +0 -2
- trajectopy-5.0.0/trajectopy/utils/formatting.py +144 -0
- trajectopy-5.0.0/trajectopy/utils/geometry.py +191 -0
- trajectopy-5.0.0/trajectopy/utils/linalg.py +71 -0
- trajectopy-5.0.0/trajectopy/utils/numeric.py +102 -0
- trajectopy-5.0.0/trajectopy/utils/resources.py +21 -0
- trajectopy-5.0.0/trajectopy/visualization/__init__.py +79 -0
- trajectopy-5.0.0/trajectopy/visualization/_svg_export.py +62 -0
- trajectopy-5.0.0/trajectopy/visualization/axes.py +112 -0
- trajectopy-5.0.0/trajectopy/visualization/figure.py +262 -0
- trajectopy-5.0.0/trajectopy/visualization/plots.py +709 -0
- trajectopy-5.0.0/trajectopy/visualization/style.py +98 -0
- trajectopy-5.0.0/trajectopy-docs/docs/api/core/parameters.md +3 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/index.md +9 -4
- trajectopy-5.0.0/trajectopy-docs/docs/api/io/kml.md +3 -0
- trajectopy-5.0.0/trajectopy-docs/docs/api/io/results_io.md +3 -0
- trajectopy-5.0.0/trajectopy-docs/docs/api/io/trajectory_io.md +3 -0
- trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/display.md +3 -0
- trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/figures.md +3 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/file_formats.md +2 -2
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/index.md +130 -135
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/settings.md +29 -156
- trajectopy-5.0.0/trajectopy-docs/docs/user_guide.md +270 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/mkdocs.yml +7 -4
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy.spec +6 -10
- {trajectopy-4.3.3 → trajectopy-5.0.0}/uv.lock +2471 -2857
- trajectopy-4.3.3/.pre-commit-config.yaml +0 -35
- trajectopy-4.3.3/example_data/default.mplstyle +0 -42
- trajectopy-4.3.3/example_data/matplotlib_settings.json +0 -19
- trajectopy-4.3.3/example_data/report_settings.json +0 -56
- trajectopy-4.3.3/example_scripts/mpl_plot.py +0 -42
- trajectopy-4.3.3/example_scripts/multi_report.py +0 -32
- trajectopy-4.3.3/example_scripts/rpe.py +0 -32
- trajectopy-4.3.3/example_scripts/single_report.py +0 -28
- trajectopy-4.3.3/example_scripts/trajectory_plot.py +0 -22
- trajectopy-4.3.3/trajectopy/__version__.py +0 -1
- trajectopy-4.3.3/trajectopy/cli/main.py +0 -72
- trajectopy-4.3.3/trajectopy/gui/__init__.py +0 -1
- trajectopy-4.3.3/trajectopy/gui/managers/__init__.py +0 -1
- trajectopy-4.3.3/trajectopy/gui/managers/plot_manager.py +0 -194
- trajectopy-4.3.3/trajectopy/gui/models/__init__.py +0 -1
- trajectopy-4.3.3/trajectopy/gui/utils.py +0 -151
- trajectopy-4.3.3/trajectopy/gui/views/__init__.py +0 -1
- trajectopy-4.3.3/trajectopy/gui/views/main_window.py +0 -689
- trajectopy-4.3.3/trajectopy/gui/views/mpl_plot_tabs.py +0 -432
- trajectopy-4.3.3/trajectopy/gui/views/playback_window.py +0 -379
- trajectopy-4.3.3/trajectopy/gui/views/properties_window.py +0 -101
- trajectopy-4.3.3/trajectopy/gui/views/result_context_menu.py +0 -184
- trajectopy-4.3.3/trajectopy/gui/views/result_table_view.py +0 -170
- trajectopy-4.3.3/trajectopy/gui/views/trajectory_context_menu.py +0 -448
- trajectopy-4.3.3/trajectopy/gui/views/trajectory_table_view.py +0 -185
- trajectopy-4.3.3/trajectopy/processing/interpolation.py +0 -137
- trajectopy-4.3.3/trajectopy/readers/__init__.py +0 -3
- trajectopy-4.3.3/trajectopy/results/alignment_result.py +0 -85
- trajectopy-4.3.3/trajectopy/utils/__init__.py +0 -4
- trajectopy-4.3.3/trajectopy/utils/common.py +0 -587
- trajectopy-4.3.3/trajectopy/visualization/__init__.py +0 -8
- trajectopy-4.3.3/trajectopy/visualization/assets/icon.png +0 -0
- trajectopy-4.3.3/trajectopy/visualization/assets/style.css +0 -196
- trajectopy-4.3.3/trajectopy/visualization/default.mplstyle +0 -42
- trajectopy-4.3.3/trajectopy/visualization/mpl_plots.py +0 -1128
- trajectopy-4.3.3/trajectopy/visualization/plotly_plots.py +0 -421
- trajectopy-4.3.3/trajectopy/visualization/plotly_reports.py +0 -409
- trajectopy-4.3.3/trajectopy/visualization/report_data.py +0 -993
- trajectopy-4.3.3/trajectopy/visualization/templates/generic.html +0 -176
- trajectopy-4.3.3/trajectopy/visualization/templates/multi_template.html +0 -216
- trajectopy-4.3.3/trajectopy/visualization/templates/single_template.html +0 -251
- trajectopy-4.3.3/trajectopy-docs/docs/api/processing/parameters.md +0 -3
- trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -3
- trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -3
- trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -3
- trajectopy-4.3.3/trajectopy-docs/docs/user_guide.md +0 -233
- {trajectopy-4.3.3 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/.gitignore +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/.pylintrc +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/CITATION.cff +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/LICENSE +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_ORB.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_SPTAM.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_gt.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/abs_dev.result +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/align_entry.result +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/generated_trajectory.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/noisy_trajectory.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/open_loop_trajectory.traj +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/rel_dev_meter.result +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/rel_dev_second.result +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_pipeline.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_positions_rotations.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings_edge_cases.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings_validation.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_trajectory_validation.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/test/testdata.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/LICENSE +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/__main__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/cli/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/rotations.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/exceptions.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.png +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon.png +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/timeline_widget.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/py.typed +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/__init__.py +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/assets/icon.png +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
- {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
|
@@ -1,3 +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
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
lint:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: astral-sh/setup-uv@v6
|
|
14
|
+
- run: uv sync --group dev --extra gui # GUI packages provide the type information for trajectopy.gui
|
|
15
|
+
- run: uv run ruff check trajectopy test example_scripts
|
|
16
|
+
- run: uv run ruff format --check trajectopy test example_scripts
|
|
17
|
+
- run: uv run mypy
|
|
18
|
+
|
|
19
|
+
test:
|
|
20
|
+
runs-on: ${{ matrix.os }}
|
|
21
|
+
strategy:
|
|
22
|
+
fail-fast: false
|
|
23
|
+
matrix:
|
|
24
|
+
os: [ubuntu-latest, windows-latest]
|
|
25
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
26
|
+
env:
|
|
27
|
+
# plots and the GUI are tested without a display
|
|
28
|
+
QT_QPA_PLATFORM: offscreen
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v4
|
|
31
|
+
- uses: astral-sh/setup-uv@v6
|
|
32
|
+
with:
|
|
33
|
+
python-version: ${{ matrix.python-version }}
|
|
34
|
+
- if: runner.os == 'Linux'
|
|
35
|
+
run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
|
|
36
|
+
- run: uv sync --group dev --extra gui
|
|
37
|
+
- run: uv run pytest -q --cov=trajectopy --cov-report=term
|
|
38
|
+
|
|
39
|
+
core-only:
|
|
40
|
+
# the package must work without the optional plotting/GUI dependencies
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v4
|
|
44
|
+
- uses: astral-sh/setup-uv@v6
|
|
45
|
+
- run: uv sync --group dev
|
|
46
|
+
- run: uv run pytest -q
|
|
@@ -0,0 +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,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: trajectopy
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.0
|
|
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/
|
|
@@ -22,19 +22,18 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
|
22
22
|
Classifier: Topic :: Scientific/Engineering
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Requires-Dist: autograd>=1.8.0
|
|
25
|
-
Requires-Dist: jinja2>=3.1.6
|
|
26
|
-
Requires-Dist: matplotlib>=3.9.4
|
|
27
25
|
Requires-Dist: numpy>=2.0.2
|
|
28
26
|
Requires-Dist: pandas>=2.2.3
|
|
29
|
-
Requires-Dist: plotly>=6.1.0
|
|
30
27
|
Requires-Dist: pyproj>=3.6.1
|
|
31
|
-
Requires-Dist: rich>=14.0.0
|
|
32
28
|
Requires-Dist: rosbags>=0.9.23
|
|
33
29
|
Requires-Dist: scipy>=1.13.1
|
|
34
30
|
Provides-Extra: gui
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
31
|
+
Requires-Dist: pyopengl>=3.1.7; extra == 'gui'
|
|
32
|
+
Requires-Dist: pyqtgraph>=0.13.7; extra == 'gui'
|
|
33
|
+
Requires-Dist: pyside6-essentials>=6.8; extra == 'gui'
|
|
34
|
+
Provides-Extra: plot
|
|
35
|
+
Requires-Dist: pyqtgraph>=0.13.7; extra == 'plot'
|
|
36
|
+
Requires-Dist: pyside6-essentials>=6.8; extra == 'plot'
|
|
38
37
|
Description-Content-Type: text/markdown
|
|
39
38
|
|
|
40
39
|
<div align="center">
|
|
@@ -42,7 +41,7 @@ Description-Content-Type: text/markdown
|
|
|
42
41
|
<a href="https://github.com/gereon-t/trajectopy/releases"><img src="https://img.shields.io/github/v/release/gereon-t/trajectopy?label=version" /></a>
|
|
43
42
|
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
|
|
44
43
|
<a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
|
|
45
|
-
<a href="https://github.com/
|
|
44
|
+
<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>
|
|
46
45
|
<br />
|
|
47
46
|
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Windows-0078D6?st&logo=windows&logoColor=white" /></a>
|
|
48
47
|
<a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
|
|
@@ -57,12 +56,6 @@ Description-Content-Type: text/markdown
|
|
|
57
56
|
<img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/trajectopy_gif_low_quality.gif">
|
|
58
57
|
</p>
|
|
59
58
|
|
|
60
|
-
Using [Mapbox](https://www.mapbox.com/), you can visualize your trajectories on a map:
|
|
61
|
-
|
|
62
|
-
<p align="center">
|
|
63
|
-
<img style="border-radius: 10px;" src=".images/plot.png">
|
|
64
|
-
</p>
|
|
65
|
-
|
|
66
59
|
</div>
|
|
67
60
|
|
|
68
61
|
## Installation
|
|
@@ -73,6 +66,12 @@ Full version (with GUI):
|
|
|
73
66
|
pip install "trajectopy[gui]"
|
|
74
67
|
```
|
|
75
68
|
|
|
69
|
+
Python package with plotting (no GUI):
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
pip install "trajectopy[plot]"
|
|
73
|
+
```
|
|
74
|
+
|
|
76
75
|
Python package only:
|
|
77
76
|
|
|
78
77
|
```bash
|
|
@@ -91,7 +90,7 @@ Trajectopy offers a range of features, including:
|
|
|
91
90
|
- __Alignment__: An advanced trajectory alignment algorithm that can be tailored to the specific application and supports a similarity transformation, a leverarm and a time shift estimation.
|
|
92
91
|
- __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
|
|
93
92
|
- __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
|
|
94
|
-
-
|
|
93
|
+
- __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.
|
|
95
94
|
|
|
96
95
|
## Web Application (Docker)
|
|
97
96
|
|
|
@@ -1,75 +1,75 @@
|
|
|
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/
|
|
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/trajectopy_gif_low_quality.gif">
|
|
19
|
-
</p>
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
pip install "trajectopy[
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Python package only:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
pip install trajectopy
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Documentation
|
|
44
|
-
|
|
45
|
-
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
46
|
-
|
|
47
|
-
## Key Features
|
|
48
|
-
|
|
49
|
-
Trajectopy offers a range of features, including:
|
|
50
|
-
|
|
51
|
-
- __Interactive GUI__: A user-friendly interface that enables seamless interaction with your trajectory data, making it easy to visualize, align, and compare trajectories.
|
|
52
|
-
- __Alignment__: An advanced trajectory alignment algorithm that can be tailored to the specific application and supports a similarity transformation, a leverarm and a time shift estimation.
|
|
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.
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
## Web Application (Docker)
|
|
58
|
-
|
|
59
|
-
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.
|
|
60
|
-
|
|
61
|
-
## Citation
|
|
62
|
-
|
|
63
|
-
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).
|
|
64
|
-
|
|
65
|
-
```bibtex
|
|
66
|
-
@article{Tombrink2024,
|
|
67
|
-
url = {https://doi.org/10.1515/jag-2024-0040},
|
|
68
|
-
title = {Spatio-temporal trajectory alignment for trajectory evaluation},
|
|
69
|
-
author = {Gereon Tombrink and Ansgar Dreier and Lasse Klingbeil and Heiner Kuhlmann},
|
|
70
|
-
journal = {Journal of Applied Geodesy},
|
|
71
|
-
doi = {doi:10.1515/jag-2024-0040},
|
|
72
|
-
year = {2024},
|
|
73
|
-
codeurl = {https://github.com/gereon-t/trajectopy},
|
|
74
|
-
}
|
|
75
|
-
```
|
|
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/trajectopy_gif_low_quality.gif">
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
Full version (with GUI):
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install "trajectopy[gui]"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Python package with plotting (no GUI):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install "trajectopy[plot]"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Python package only:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install trajectopy
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Documentation
|
|
44
|
+
|
|
45
|
+
<a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
|
|
46
|
+
|
|
47
|
+
## Key Features
|
|
48
|
+
|
|
49
|
+
Trajectopy offers a range of features, including:
|
|
50
|
+
|
|
51
|
+
- __Interactive GUI__: A user-friendly interface that enables seamless interaction with your trajectory data, making it easy to visualize, align, and compare trajectories.
|
|
52
|
+
- __Alignment__: An advanced trajectory alignment algorithm that can be tailored to the specific application and supports a similarity transformation, a leverarm and a time shift estimation.
|
|
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.
|
|
55
|
+
- __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
|
+
|
|
57
|
+
## Web Application (Docker)
|
|
58
|
+
|
|
59
|
+
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.
|
|
60
|
+
|
|
61
|
+
## Citation
|
|
62
|
+
|
|
63
|
+
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).
|
|
64
|
+
|
|
65
|
+
```bibtex
|
|
66
|
+
@article{Tombrink2024,
|
|
67
|
+
url = {https://doi.org/10.1515/jag-2024-0040},
|
|
68
|
+
title = {Spatio-temporal trajectory alignment for trajectory evaluation},
|
|
69
|
+
author = {Gereon Tombrink and Ansgar Dreier and Lasse Klingbeil and Heiner Kuhlmann},
|
|
70
|
+
journal = {Journal of Applied Geodesy},
|
|
71
|
+
doi = {doi:10.1515/jag-2024-0040},
|
|
72
|
+
year = {2024},
|
|
73
|
+
codeurl = {https://github.com/gereon-t/trajectopy},
|
|
74
|
+
}
|
|
75
|
+
```
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
from matplotlib import pyplot as plt
|
|
2
|
-
|
|
3
1
|
from trajectopy import Trajectory, align
|
|
4
|
-
from trajectopy
|
|
2
|
+
from trajectopy import visualization as vis
|
|
5
3
|
|
|
6
4
|
|
|
7
5
|
def main():
|
|
@@ -9,10 +7,9 @@ def main():
|
|
|
9
7
|
est_traj = Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
10
8
|
|
|
11
9
|
est_traj_aligned = align(trajectory=est_traj, other=gt_traj, inplace=False)
|
|
12
|
-
est_traj_aligned.name += " (
|
|
10
|
+
est_traj_aligned.name += " (aligned)"
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
plt.show()
|
|
12
|
+
vis.show(vis.positions_figure([gt_traj, est_traj, est_traj_aligned]))
|
|
16
13
|
|
|
17
14
|
|
|
18
15
|
if __name__ == "__main__":
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
3
|
from trajectopy import ProcessingSettings, Trajectory, estimate_alignment
|
|
4
|
-
from trajectopy
|
|
4
|
+
from trajectopy import visualization as vis
|
|
5
5
|
|
|
6
6
|
logging.basicConfig(level=logging.INFO)
|
|
7
7
|
|
|
@@ -21,11 +21,8 @@ def main():
|
|
|
21
21
|
matching_settings=processing_settings.matching,
|
|
22
22
|
)
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
name=alignment_result.name,
|
|
27
|
-
)
|
|
28
|
-
plotly_reports.show_report(report_text=report, filepath="reports/report.html")
|
|
24
|
+
# covariance and correlation of the estimated parameters
|
|
25
|
+
vis.show(vis.alignment_figures(alignment_result.position_parameters), title=alignment_result.name)
|
|
29
26
|
|
|
30
27
|
|
|
31
28
|
if __name__ == "__main__":
|
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from rich.console import Console
|
|
4
|
-
from rich.table import Table
|
|
5
|
-
|
|
6
3
|
from trajectopy import ProcessingSettings, Trajectory, ate
|
|
7
4
|
|
|
8
5
|
logging.basicConfig(level=logging.INFO)
|
|
9
6
|
|
|
10
7
|
|
|
11
|
-
def dict_to_table(data: dict):
|
|
12
|
-
"""Converts a dictionary to a rich table."""
|
|
13
|
-
table_data = Table(title="ATE Results")
|
|
14
|
-
table_data.add_column("Property")
|
|
15
|
-
table_data.add_column("Value")
|
|
16
|
-
for key, value in data.items():
|
|
17
|
-
table_data.add_row(key, str(value))
|
|
18
|
-
return table_data
|
|
19
|
-
|
|
20
|
-
|
|
21
8
|
def main():
|
|
22
|
-
console = Console()
|
|
23
|
-
|
|
24
9
|
# Import
|
|
25
10
|
gt_traj = Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
26
11
|
est_traj = Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
@@ -30,7 +15,10 @@ def main():
|
|
|
30
15
|
|
|
31
16
|
# align = True is the default, but can be disabled if you want to evaluate the unaligned trajectories
|
|
32
17
|
ate_result = ate(other=gt_traj, trajectory=est_traj, processing_settings=processing_settings, align=True)
|
|
33
|
-
|
|
18
|
+
|
|
19
|
+
width = max(len(key) for key in ate_result.property_dict)
|
|
20
|
+
for key, value in ate_result.property_dict.items():
|
|
21
|
+
print(f"{key:<{width}} {value}")
|
|
34
22
|
|
|
35
23
|
|
|
36
24
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from trajectopy import PlotSettings, ProcessingSettings, Trajectory, ate, rpe
|
|
4
|
+
from trajectopy import visualization as vis
|
|
5
|
+
|
|
6
|
+
logging.basicConfig(level=logging.INFO)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def main():
|
|
10
|
+
gt_traj = Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
11
|
+
orb_traj = Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
12
|
+
sptam_traj = Trajectory.from_file("./example_data/KITTI_SPTAM.traj")
|
|
13
|
+
|
|
14
|
+
processing_settings = ProcessingSettings()
|
|
15
|
+
ate_results = [
|
|
16
|
+
ate(trajectory=orb_traj, other=gt_traj, processing_settings=processing_settings),
|
|
17
|
+
ate(trajectory=sptam_traj, other=gt_traj, processing_settings=processing_settings),
|
|
18
|
+
]
|
|
19
|
+
rpe_results = [
|
|
20
|
+
rpe(trajectory=orb_traj, other=gt_traj, processing_settings=processing_settings),
|
|
21
|
+
rpe(trajectory=sptam_traj, other=gt_traj, processing_settings=processing_settings),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
# The same figures work for one or several results.
|
|
25
|
+
plot_settings = PlotSettings(ate_unit_is_mm=False, directed_ate=True)
|
|
26
|
+
figures = vis.deviation_figures(ate_results, rpe_results, settings=plot_settings)
|
|
27
|
+
|
|
28
|
+
# Write every figure (and every variant, e.g. each color-coded quantity) to image files ...
|
|
29
|
+
vis.export_figures(figures, "plots", export_format="png")
|
|
30
|
+
|
|
31
|
+
# ... and/or explore them interactively.
|
|
32
|
+
vis.show(figures, title="KITTI Evaluation")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __name__ == "__main__":
|
|
36
|
+
main()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from trajectopy import ProcessingSettings, Trajectory, rpe
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def main():
|
|
5
|
+
# Import
|
|
6
|
+
gt_traj = Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
7
|
+
est_traj = Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
8
|
+
|
|
9
|
+
# default settings
|
|
10
|
+
processing_settings = ProcessingSettings()
|
|
11
|
+
|
|
12
|
+
rpe_result = rpe(other=gt_traj, trajectory=est_traj, processing_settings=processing_settings)
|
|
13
|
+
|
|
14
|
+
width = max(len(key) for key in rpe_result.property_dict)
|
|
15
|
+
for key, value in rpe_result.property_dict.items():
|
|
16
|
+
print(f"{key:<{width}} {value}")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if __name__ == "__main__":
|
|
20
|
+
main()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from trajectopy import Trajectory
|
|
4
|
+
from trajectopy import visualization as vis
|
|
5
|
+
|
|
6
|
+
logging.basicConfig(level=logging.INFO)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def main():
|
|
10
|
+
gt_traj = Trajectory.from_file("./example_data/KITTI_gt.traj")
|
|
11
|
+
est_traj = Trajectory.from_file("./example_data/KITTI_ORB.traj")
|
|
12
|
+
|
|
13
|
+
# positions, coordinates and orientations over time, and maps colored by velocity / height
|
|
14
|
+
vis.show(vis.trajectory_figures([gt_traj, est_traj]))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
main()
|
|
@@ -47,20 +47,19 @@ dynamic = ["version"]
|
|
|
47
47
|
readme = "README.md"
|
|
48
48
|
dependencies = [
|
|
49
49
|
"autograd>=1.8.0",
|
|
50
|
-
"jinja2>=3.1.6",
|
|
51
|
-
"matplotlib>=3.9.4",
|
|
52
50
|
"numpy>=2.0.2",
|
|
53
51
|
"pandas>=2.2.3",
|
|
54
|
-
"plotly>=6.1.0",
|
|
55
52
|
"pyproj>=3.6.1",
|
|
56
|
-
"rich>=14.0.0",
|
|
57
53
|
"rosbags>=0.9.23",
|
|
58
54
|
"scipy>=1.13.1",
|
|
59
55
|
]
|
|
60
56
|
|
|
61
57
|
|
|
62
58
|
[project.optional-dependencies]
|
|
63
|
-
|
|
59
|
+
# Plotting (trajectopy.visualization) is built on pyqtgraph and needs Qt.
|
|
60
|
+
plot = ["PySide6-Essentials>=6.8", "pyqtgraph>=0.13.7"]
|
|
61
|
+
# The GUI additionally renders the 3D playback with OpenGL.
|
|
62
|
+
gui = ["trajectopy[plot]", "PyOpenGL>=3.1.7"]
|
|
64
63
|
|
|
65
64
|
[project.urls]
|
|
66
65
|
Homepage = "https://gereon-t.github.io/trajectopy/"
|
|
@@ -73,7 +72,6 @@ trajectopy = "trajectopy.cli.main:main"
|
|
|
73
72
|
|
|
74
73
|
[dependency-groups]
|
|
75
74
|
dev = [
|
|
76
|
-
"black>=25.11.0",
|
|
77
75
|
"mkdocs-material>=9.6.14",
|
|
78
76
|
"mkdocstrings[python]>=0.24.0",
|
|
79
77
|
"pillow>=11.2.1",
|
|
@@ -81,4 +79,34 @@ dev = [
|
|
|
81
79
|
"pyinstaller>=6.13.0",
|
|
82
80
|
"pytest>=8.3.5",
|
|
83
81
|
"pytest-cov>=4.1.0",
|
|
82
|
+
"ruff>=0.14.0",
|
|
83
|
+
"mypy>=1.18.2",
|
|
84
|
+
"pandas-stubs>=2.2.3",
|
|
84
85
|
]
|
|
86
|
+
|
|
87
|
+
[tool.ruff]
|
|
88
|
+
line-length = 119
|
|
89
|
+
target-version = "py310"
|
|
90
|
+
extend-exclude = ["trajectopy-docs"]
|
|
91
|
+
|
|
92
|
+
[tool.ruff.lint]
|
|
93
|
+
select = ["E4", "E7", "E9", "F", "I", "UP", "B"]
|
|
94
|
+
ignore = [
|
|
95
|
+
"B905", # zip() without strict=: arrays are validated upstream
|
|
96
|
+
"E741", # single-letter names such as `l` are standard notation in the math code
|
|
97
|
+
"B024", # abstract base classes without abstract methods are used as markers
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
[tool.ruff.lint.per-file-ignores]
|
|
101
|
+
"trajectopy/gui/app.py" = ["E402"] # logging must be configured before the GUI modules are imported
|
|
102
|
+
"trajectopy/visualization/__init__.py" = ["F401"] # re-exports for type checkers; loaded lazily at runtime
|
|
103
|
+
|
|
104
|
+
[tool.pytest.ini_options]
|
|
105
|
+
testpaths = ["test"]
|
|
106
|
+
|
|
107
|
+
[tool.mypy]
|
|
108
|
+
files = ["trajectopy"]
|
|
109
|
+
python_version = "3.10"
|
|
110
|
+
ignore_missing_imports = true
|
|
111
|
+
check_untyped_defs = true
|
|
112
|
+
warn_unused_ignores = true
|