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.
Files changed (212) hide show
  1. {trajectopy-5.0.1 → trajectopy-5.0.3}/.gitattributes +9 -9
  2. {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/workflows/ci.yml +2 -1
  3. trajectopy-5.0.3/.github/workflows/release.yml +61 -0
  4. {trajectopy-5.0.1 → trajectopy-5.0.3}/.pre-commit-config.yaml +23 -23
  5. {trajectopy-5.0.1 → trajectopy-5.0.3}/PKG-INFO +26 -18
  6. {trajectopy-5.0.1 → trajectopy-5.0.3}/README.md +23 -17
  7. trajectopy-5.0.3/installer/trajectopy.iss +77 -0
  8. {trajectopy-5.0.1 → trajectopy-5.0.3}/pyproject.toml +2 -0
  9. {trajectopy-5.0.1 → trajectopy-5.0.3}/requirements.txt +1738 -1738
  10. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_alignment.py +172 -172
  11. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_architecture.py +62 -62
  12. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_comparison.py +194 -194
  13. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_context_menus.py +3 -2
  14. trajectopy-5.0.3/test/test_fast_reading.py +178 -0
  15. trajectopy-5.0.3/test/test_gui_models.py +141 -0
  16. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_gui_smoke.py +116 -1
  17. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_inplace_contract.py +119 -119
  18. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_merging.py +240 -240
  19. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_processing_edge_cases.py +121 -121
  20. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_processing_errors.py +53 -53
  21. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_readers_edge_cases.py +98 -98
  22. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_readers_errors.py +36 -36
  23. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_trajectory.py +180 -180
  24. trajectopy-5.0.3/test/test_update_check.py +100 -0
  25. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_visualization.py +30 -0
  26. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/util.py +218 -218
  27. trajectopy-5.0.3/trajectopy/__version__.py +1 -0
  28. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/cli/main.py +8 -2
  29. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/rotations.py +52 -2
  30. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/trajectory.py +1 -1
  31. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/__init__.py +1 -1
  32. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/app.py +7 -3
  33. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/plot_manager.py +2 -1
  34. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/requests.py +7 -1
  35. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/session_manager.py +99 -99
  36. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/ui_manager.py +48 -28
  37. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/entries.py +1 -1
  38. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/result_model.py +4 -7
  39. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/selection.py +34 -34
  40. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/table_model.py +39 -12
  41. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/trajectory_model.py +7 -12
  42. trajectopy-5.0.3/trajectopy/gui/update_check.py +114 -0
  43. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/utils.py +14 -24
  44. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/alignment_edit_window.py +2 -0
  45. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/dof_organizer.py +2 -0
  46. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/json_settings_view.py +10 -10
  47. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/kml_dialog.py +219 -219
  48. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/main_window.py +151 -11
  49. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/manual_alignment_window.py +9 -4
  50. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/properties_panel.py +1 -1
  51. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_context_menu.py +2 -2
  52. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_selection_window.py +2 -0
  53. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/trajectory_context_menu.py +1 -1
  54. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/trajectory_table_view.py +58 -58
  55. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/worker.py +5 -0
  56. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/ascii.py +86 -12
  57. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/header.py +67 -4
  58. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/results_io.py +204 -204
  59. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/rosmsg.py +62 -62
  60. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/trajectory_io.py +1 -1
  61. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/utils.py +34 -34
  62. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/__init__.py +7 -7
  63. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/parameters.py +10 -10
  64. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/matching.py +354 -354
  65. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/__init__.py +1 -1
  66. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/ascii.py +12 -12
  67. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/rosbag.py +3 -3
  68. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/rosmsg.py +3 -3
  69. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/readers/utils.py +3 -3
  70. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/ate_result.py +2 -1
  71. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/__init__.py +5 -5
  72. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/common.py +63 -63
  73. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/geometry.py +191 -191
  74. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/__init__.py +79 -79
  75. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/plots.py +64 -5
  76. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/parameters.md +3 -3
  77. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/index.md +1 -0
  78. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/kml.md +3 -3
  79. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/results_io.md +3 -3
  80. trajectopy-5.0.3/trajectopy-docs/docs/api/io/rosbag.md +3 -0
  81. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/io/trajectory_io.md +3 -3
  82. trajectopy-5.0.3/trajectopy-docs/docs/file_formats.md +204 -0
  83. trajectopy-5.0.3/trajectopy-docs/docs/index.md +149 -0
  84. trajectopy-5.0.3/trajectopy-docs/docs/settings.md +201 -0
  85. trajectopy-5.0.3/trajectopy-docs/docs/user_guide.md +379 -0
  86. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/mkdocs.yml +1 -0
  87. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy.spec +30 -5
  88. {trajectopy-5.0.1 → trajectopy-5.0.3}/uv.lock +2597 -2471
  89. trajectopy-5.0.1/trajectopy/__version__.py +0 -1
  90. trajectopy-5.0.1/trajectopy-docs/docs/file_formats.md +0 -178
  91. trajectopy-5.0.1/trajectopy-docs/docs/index.md +0 -130
  92. trajectopy-5.0.1/trajectopy-docs/docs/settings.md +0 -183
  93. trajectopy-5.0.1/trajectopy-docs/docs/user_guide.md +0 -270
  94. {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  95. {trajectopy-5.0.1 → trajectopy-5.0.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  96. {trajectopy-5.0.1 → trajectopy-5.0.3}/.gitignore +0 -0
  97. {trajectopy-5.0.1 → trajectopy-5.0.3}/.pylintrc +0 -0
  98. {trajectopy-5.0.1 → trajectopy-5.0.3}/CITATION.cff +0 -0
  99. {trajectopy-5.0.1 → trajectopy-5.0.3}/LICENSE +0 -0
  100. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_ORB.traj +0 -0
  101. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_SPTAM.traj +0 -0
  102. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_data/KITTI_gt.traj +0 -0
  103. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/align.py +0 -0
  104. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/alignment.py +0 -0
  105. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/ate.py +0 -0
  106. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/deviation_plots.py +0 -0
  107. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/rpe.py +0 -0
  108. {trajectopy-5.0.1 → trajectopy-5.0.3}/example_scripts/trajectory_plot.py +0 -0
  109. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/__init__.py +0 -0
  110. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/abs_dev.result +0 -0
  111. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/align_entry.result +0 -0
  112. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/generated_trajectory.traj +0 -0
  113. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/noisy_trajectory.traj +0 -0
  114. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/open_loop_trajectory.traj +0 -0
  115. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/rel_dev_meter.result +0 -0
  116. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/data/rel_dev_second.result +0 -0
  117. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_approximation.py +0 -0
  118. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_io.py +0 -0
  119. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_kml.py +0 -0
  120. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_manual_alignment.py +0 -0
  121. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_matching.py +0 -0
  122. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_pipeline.py +0 -0
  123. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_positions_rotations.py +0 -0
  124. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_regressions.py +0 -0
  125. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings.py +0 -0
  126. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_edge_cases.py +0 -0
  127. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_serialization.py +0 -0
  128. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_settings_validation.py +0 -0
  129. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_sorting.py +0 -0
  130. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/test_trajectory_validation.py +0 -0
  131. {trajectopy-5.0.1 → trajectopy-5.0.3}/test/testdata.py +0 -0
  132. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/LICENSE +0 -0
  133. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/__init__.py +0 -0
  134. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/__main__.py +0 -0
  135. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/cli/__init__.py +0 -0
  136. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/__init__.py +0 -0
  137. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/parameters.py +0 -0
  138. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/positions.py +0 -0
  139. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/core/settings.py +0 -0
  140. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/exceptions.py +0 -0
  141. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/__init__.py +0 -0
  142. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/file_manager.py +0 -0
  143. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/managers/trajectory_manager.py +0 -0
  144. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/__init__.py +0 -0
  145. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/models/property_model.py +0 -0
  146. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  147. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon-bg.ico +0 -0
  148. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon-bg.png +0 -0
  149. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/resources/icon.png +0 -0
  150. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/themes.py +0 -0
  151. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/__init__.py +0 -0
  152. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/about_window.py +0 -0
  153. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/entry_table_view.py +0 -0
  154. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/menu_helpers.py +0 -0
  155. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/playback_window.py +0 -0
  156. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/preview_plot.py +0 -0
  157. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/progress_window.py +0 -0
  158. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/result_table_view.py +0 -0
  159. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/gui/views/timeline_widget.py +0 -0
  160. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/__init__.py +0 -0
  161. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/kml.py +0 -0
  162. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/io/rosbag.py +0 -0
  163. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/__init__.py +0 -0
  164. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/alignment.py +0 -0
  165. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/approximation.py +0 -0
  166. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/evaluation.py +0 -0
  167. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/interpolation.py +0 -0
  168. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/__init__.py +0 -0
  169. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/data.py +0 -0
  170. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/direct.py +0 -0
  171. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  172. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/equations.py +0 -0
  173. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  174. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  175. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  176. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  177. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  178. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/merging.py +0 -0
  179. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/processing/sorting.py +0 -0
  180. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/py.typed +0 -0
  181. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/__init__.py +0 -0
  182. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/alignment_result.py +0 -0
  183. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/results/rpe_result.py +0 -0
  184. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/colors.py +0 -0
  185. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/definitions.py +0 -0
  186. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/formatting.py +0 -0
  187. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/linalg.py +0 -0
  188. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/numeric.py +0 -0
  189. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/utils/resources.py +0 -0
  190. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/_svg_export.py +0 -0
  191. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/axes.py +0 -0
  192. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/figure.py +0 -0
  193. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy/visualization/style.py +0 -0
  194. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/positions.md +0 -0
  195. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  196. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/settings.md +0 -0
  197. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  198. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  199. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  200. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  201. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  202. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  203. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  204. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  205. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  206. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  207. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  208. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/visualization/display.md +0 -0
  209. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
  210. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/assets/icon.png +0 -0
  211. {trajectopy-5.0.1 → trajectopy-5.0.3}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  212. {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
- - run: uv sync --group dev --extra gui
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.1
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
- Full version (with GUI):
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
- ```bash
66
- pip install "trajectopy[gui]"
67
- ```
67
+ **Python package** (Python 3.10 or newer):
68
68
 
69
- Python package with plotting (no GUI):
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
- ```bash
72
- pip install "trajectopy[plot]"
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
- Python package only:
79
+ ```python
80
+ import trajectopy as tpy
76
81
 
77
- ```bash
78
- pip install trajectopy
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
- Trajectopy offers a range of features, including:
88
-
89
- - __Interactive GUI__: A user-friendly interface that enables seamless interaction with your trajectory data, making it easy to visualize, align, and compare trajectories.
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.
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
- Full version (with GUI):
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
- ```bash
28
- pip install "trajectopy[gui]"
29
- ```
27
+ **Python package** (Python 3.10 or newer):
30
28
 
31
- Python package with plotting (no GUI):
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
- ```bash
34
- pip install "trajectopy[plot]"
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
- Python package only:
39
+ ```python
40
+ import trajectopy as tpy
38
41
 
39
- ```bash
40
- pip install trajectopy
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
- 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.
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/"