trajectopy 4.4.0__tar.gz → 5.0.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.
Files changed (246) hide show
  1. {trajectopy-4.4.0 → trajectopy-5.0.1}/.gitattributes +9 -0
  2. trajectopy-5.0.1/.github/workflows/ci.yml +46 -0
  3. trajectopy-5.0.1/.pre-commit-config.yaml +23 -0
  4. {trajectopy-4.4.0 → trajectopy-5.0.1}/PKG-INFO +15 -17
  5. {trajectopy-4.4.0 → trajectopy-5.0.1}/README.md +8 -8
  6. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_scripts/align.py +3 -6
  7. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_scripts/alignment.py +3 -6
  8. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_scripts/ate.py +4 -16
  9. trajectopy-5.0.1/example_scripts/deviation_plots.py +36 -0
  10. trajectopy-5.0.1/example_scripts/rpe.py +20 -0
  11. trajectopy-5.0.1/example_scripts/trajectory_plot.py +18 -0
  12. {trajectopy-4.4.0 → trajectopy-5.0.1}/pyproject.toml +34 -6
  13. {trajectopy-4.4.0 → trajectopy-5.0.1}/requirements.txt +1738 -1935
  14. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_alignment.py +3 -3
  15. trajectopy-5.0.1/test/test_architecture.py +62 -0
  16. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_comparison.py +6 -6
  17. trajectopy-5.0.1/test/test_context_menus.py +121 -0
  18. trajectopy-5.0.1/test/test_gui_smoke.py +288 -0
  19. trajectopy-5.0.1/test/test_inplace_contract.py +119 -0
  20. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_io.py +21 -1
  21. trajectopy-5.0.1/test/test_kml.py +397 -0
  22. trajectopy-5.0.1/test/test_manual_alignment.py +347 -0
  23. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_merging.py +2 -2
  24. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_processing_edge_cases.py +1 -1
  25. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_processing_errors.py +7 -2
  26. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_readers_edge_cases.py +1 -1
  27. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_readers_errors.py +2 -2
  28. trajectopy-5.0.1/test/test_regressions.py +60 -0
  29. trajectopy-5.0.1/test/test_settings_serialization.py +75 -0
  30. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_trajectory.py +2 -2
  31. trajectopy-5.0.1/test/test_visualization.py +150 -0
  32. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/util.py +4 -4
  33. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/__init__.py +26 -16
  34. trajectopy-5.0.1/trajectopy/__version__.py +1 -0
  35. trajectopy-5.0.1/trajectopy/cli/main.py +47 -0
  36. {trajectopy-4.4.0/trajectopy/processing/lib/alignment → trajectopy-5.0.1/trajectopy/core}/parameters.py +16 -95
  37. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/core/positions.py +40 -40
  38. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/core/settings.py +114 -256
  39. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/core/trajectory.py +47 -95
  40. trajectopy-5.0.1/trajectopy/gui/__init__.py +1 -0
  41. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/app.py +11 -17
  42. trajectopy-5.0.1/trajectopy/gui/managers/__init__.py +0 -0
  43. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/managers/file_manager.py +15 -21
  44. trajectopy-5.0.1/trajectopy/gui/managers/plot_manager.py +100 -0
  45. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/managers/requests.py +27 -28
  46. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/managers/session_manager.py +6 -6
  47. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/managers/trajectory_manager.py +113 -200
  48. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/managers/ui_manager.py +58 -63
  49. trajectopy-5.0.1/trajectopy/gui/models/__init__.py +0 -0
  50. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/entries.py +41 -19
  51. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/property_model.py +8 -7
  52. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/result_model.py +14 -15
  53. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/selection.py +1 -1
  54. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/table_model.py +23 -24
  55. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/models/trajectory_model.py +18 -28
  56. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/themes.py +80 -41
  57. trajectopy-5.0.1/trajectopy/gui/utils.py +86 -0
  58. trajectopy-5.0.1/trajectopy/gui/views/__init__.py +0 -0
  59. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/about_window.py +2 -3
  60. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/alignment_edit_window.py +1 -4
  61. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/dof_organizer.py +1 -3
  62. trajectopy-5.0.1/trajectopy/gui/views/entry_table_view.py +95 -0
  63. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/json_settings_view.py +61 -55
  64. trajectopy-5.0.1/trajectopy/gui/views/kml_dialog.py +219 -0
  65. trajectopy-5.0.1/trajectopy/gui/views/main_window.py +471 -0
  66. trajectopy-5.0.1/trajectopy/gui/views/manual_alignment_window.py +1105 -0
  67. trajectopy-5.0.1/trajectopy/gui/views/menu_helpers.py +123 -0
  68. trajectopy-5.0.1/trajectopy/gui/views/playback_window.py +294 -0
  69. trajectopy-5.0.1/trajectopy/gui/views/preview_plot.py +137 -0
  70. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/progress_window.py +1 -2
  71. trajectopy-5.0.1/trajectopy/gui/views/properties_panel.py +72 -0
  72. trajectopy-5.0.1/trajectopy/gui/views/result_context_menu.py +134 -0
  73. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/result_selection_window.py +1 -2
  74. trajectopy-5.0.1/trajectopy/gui/views/result_table_view.py +44 -0
  75. trajectopy-5.0.1/trajectopy/gui/views/trajectory_context_menu.py +384 -0
  76. trajectopy-5.0.1/trajectopy/gui/views/trajectory_table_view.py +58 -0
  77. trajectopy-5.0.1/trajectopy/gui/worker.py +68 -0
  78. trajectopy-5.0.1/trajectopy/io/__init__.py +47 -0
  79. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.1/trajectopy/io}/ascii.py +17 -206
  80. trajectopy-5.0.1/trajectopy/io/header.py +206 -0
  81. trajectopy-5.0.1/trajectopy/io/kml.py +447 -0
  82. trajectopy-5.0.1/trajectopy/io/results_io.py +204 -0
  83. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.1/trajectopy/io}/rosbag.py +3 -55
  84. trajectopy-5.0.1/trajectopy/io/trajectory_io.py +92 -0
  85. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/alignment.py +27 -19
  86. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/approximation.py +29 -4
  87. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/evaluation.py +45 -4
  88. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/__init__.py +1 -1
  89. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/data.py +25 -59
  90. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/direct.py +12 -9
  91. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/egrad_interface.py +1 -4
  92. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/estimation.py +8 -13
  93. trajectopy-5.0.1/trajectopy/processing/lib/alignment/parameters.py +10 -0
  94. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/approximation/cubic_approximation.py +1 -15
  95. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/approximation/voxelizer.py +0 -16
  96. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/matching.py +7 -5
  97. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/merging.py +7 -5
  98. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/sorting.py +22 -5
  99. trajectopy-5.0.1/trajectopy/readers/__init__.py +1 -0
  100. trajectopy-5.0.1/trajectopy/readers/ascii.py +12 -0
  101. trajectopy-5.0.1/trajectopy/readers/rosbag.py +3 -0
  102. trajectopy-5.0.1/trajectopy/readers/rosmsg.py +3 -0
  103. trajectopy-5.0.1/trajectopy/readers/utils.py +3 -0
  104. trajectopy-5.0.1/trajectopy/results/alignment_result.py +57 -0
  105. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/results/ate_result.py +36 -51
  106. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/results/rpe_result.py +13 -45
  107. trajectopy-5.0.1/trajectopy/utils/__init__.py +5 -0
  108. trajectopy-5.0.1/trajectopy/utils/colors.py +63 -0
  109. trajectopy-5.0.1/trajectopy/utils/common.py +63 -0
  110. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/utils/definitions.py +0 -2
  111. trajectopy-5.0.1/trajectopy/utils/formatting.py +144 -0
  112. trajectopy-5.0.1/trajectopy/utils/geometry.py +191 -0
  113. trajectopy-5.0.1/trajectopy/utils/linalg.py +71 -0
  114. trajectopy-5.0.1/trajectopy/utils/numeric.py +102 -0
  115. trajectopy-5.0.1/trajectopy/utils/resources.py +21 -0
  116. trajectopy-5.0.1/trajectopy/visualization/__init__.py +79 -0
  117. trajectopy-5.0.1/trajectopy/visualization/_svg_export.py +62 -0
  118. trajectopy-5.0.1/trajectopy/visualization/axes.py +112 -0
  119. trajectopy-5.0.1/trajectopy/visualization/figure.py +263 -0
  120. trajectopy-5.0.1/trajectopy/visualization/plots.py +709 -0
  121. trajectopy-5.0.1/trajectopy/visualization/style.py +98 -0
  122. trajectopy-5.0.1/trajectopy-docs/docs/api/core/parameters.md +3 -0
  123. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/index.md +9 -4
  124. trajectopy-5.0.1/trajectopy-docs/docs/api/io/kml.md +3 -0
  125. trajectopy-5.0.1/trajectopy-docs/docs/api/io/results_io.md +3 -0
  126. trajectopy-5.0.1/trajectopy-docs/docs/api/io/trajectory_io.md +3 -0
  127. trajectopy-5.0.1/trajectopy-docs/docs/api/visualization/display.md +3 -0
  128. trajectopy-5.0.1/trajectopy-docs/docs/api/visualization/figures.md +3 -0
  129. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/file_formats.md +2 -2
  130. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/index.md +16 -21
  131. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/settings.md +29 -156
  132. trajectopy-5.0.1/trajectopy-docs/docs/user_guide.md +270 -0
  133. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/mkdocs.yml +7 -4
  134. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy.spec +6 -10
  135. {trajectopy-4.4.0 → trajectopy-5.0.1}/uv.lock +2471 -2872
  136. trajectopy-4.4.0/.pre-commit-config.yaml +0 -35
  137. trajectopy-4.4.0/example_data/default.mplstyle +0 -42
  138. trajectopy-4.4.0/example_data/matplotlib_settings.json +0 -19
  139. trajectopy-4.4.0/example_data/report_settings.json +0 -56
  140. trajectopy-4.4.0/example_scripts/mpl_plot.py +0 -42
  141. trajectopy-4.4.0/example_scripts/multi_report.py +0 -32
  142. trajectopy-4.4.0/example_scripts/rpe.py +0 -32
  143. trajectopy-4.4.0/example_scripts/single_report.py +0 -28
  144. trajectopy-4.4.0/example_scripts/trajectory_plot.py +0 -22
  145. trajectopy-4.4.0/trajectopy/__version__.py +0 -1
  146. trajectopy-4.4.0/trajectopy/cli/main.py +0 -72
  147. trajectopy-4.4.0/trajectopy/gui/__init__.py +0 -1
  148. trajectopy-4.4.0/trajectopy/gui/managers/__init__.py +0 -1
  149. trajectopy-4.4.0/trajectopy/gui/managers/plot_manager.py +0 -194
  150. trajectopy-4.4.0/trajectopy/gui/models/__init__.py +0 -1
  151. trajectopy-4.4.0/trajectopy/gui/utils.py +0 -151
  152. trajectopy-4.4.0/trajectopy/gui/views/__init__.py +0 -1
  153. trajectopy-4.4.0/trajectopy/gui/views/main_window.py +0 -689
  154. trajectopy-4.4.0/trajectopy/gui/views/manual_alignment_window.py +0 -566
  155. trajectopy-4.4.0/trajectopy/gui/views/mpl_plot_tabs.py +0 -432
  156. trajectopy-4.4.0/trajectopy/gui/views/playback_window.py +0 -379
  157. trajectopy-4.4.0/trajectopy/gui/views/properties_window.py +0 -101
  158. trajectopy-4.4.0/trajectopy/gui/views/result_context_menu.py +0 -184
  159. trajectopy-4.4.0/trajectopy/gui/views/result_table_view.py +0 -170
  160. trajectopy-4.4.0/trajectopy/gui/views/trajectory_context_menu.py +0 -459
  161. trajectopy-4.4.0/trajectopy/gui/views/trajectory_table_view.py +0 -185
  162. trajectopy-4.4.0/trajectopy/readers/__init__.py +0 -3
  163. trajectopy-4.4.0/trajectopy/results/alignment_result.py +0 -85
  164. trajectopy-4.4.0/trajectopy/utils/__init__.py +0 -4
  165. trajectopy-4.4.0/trajectopy/utils/common.py +0 -587
  166. trajectopy-4.4.0/trajectopy/visualization/__init__.py +0 -8
  167. trajectopy-4.4.0/trajectopy/visualization/assets/icon.png +0 -0
  168. trajectopy-4.4.0/trajectopy/visualization/assets/style.css +0 -196
  169. trajectopy-4.4.0/trajectopy/visualization/default.mplstyle +0 -42
  170. trajectopy-4.4.0/trajectopy/visualization/mpl_plots.py +0 -1128
  171. trajectopy-4.4.0/trajectopy/visualization/plotly_plots.py +0 -421
  172. trajectopy-4.4.0/trajectopy/visualization/plotly_reports.py +0 -409
  173. trajectopy-4.4.0/trajectopy/visualization/report_data.py +0 -993
  174. trajectopy-4.4.0/trajectopy/visualization/templates/generic.html +0 -176
  175. trajectopy-4.4.0/trajectopy/visualization/templates/multi_template.html +0 -216
  176. trajectopy-4.4.0/trajectopy/visualization/templates/single_template.html +0 -251
  177. trajectopy-4.4.0/trajectopy-docs/docs/api/processing/parameters.md +0 -3
  178. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -3
  179. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -3
  180. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -3
  181. trajectopy-4.4.0/trajectopy-docs/docs/user_guide.md +0 -233
  182. {trajectopy-4.4.0 → trajectopy-5.0.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  183. {trajectopy-4.4.0 → trajectopy-5.0.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  184. {trajectopy-4.4.0 → trajectopy-5.0.1}/.gitignore +0 -0
  185. {trajectopy-4.4.0 → trajectopy-5.0.1}/.pylintrc +0 -0
  186. {trajectopy-4.4.0 → trajectopy-5.0.1}/CITATION.cff +0 -0
  187. {trajectopy-4.4.0 → trajectopy-5.0.1}/LICENSE +0 -0
  188. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_data/KITTI_ORB.traj +0 -0
  189. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_data/KITTI_SPTAM.traj +0 -0
  190. {trajectopy-4.4.0 → trajectopy-5.0.1}/example_data/KITTI_gt.traj +0 -0
  191. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/__init__.py +0 -0
  192. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/abs_dev.result +0 -0
  193. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/align_entry.result +0 -0
  194. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/generated_trajectory.traj +0 -0
  195. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/noisy_trajectory.traj +0 -0
  196. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/open_loop_trajectory.traj +0 -0
  197. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/rel_dev_meter.result +0 -0
  198. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/data/rel_dev_second.result +0 -0
  199. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_approximation.py +0 -0
  200. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_matching.py +0 -0
  201. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_pipeline.py +0 -0
  202. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_positions_rotations.py +0 -0
  203. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_settings.py +0 -0
  204. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_settings_edge_cases.py +0 -0
  205. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_settings_validation.py +0 -0
  206. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_sorting.py +0 -0
  207. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/test_trajectory_validation.py +0 -0
  208. {trajectopy-4.4.0 → trajectopy-5.0.1}/test/testdata.py +0 -0
  209. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/LICENSE +0 -0
  210. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/__main__.py +0 -0
  211. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/cli/__init__.py +0 -0
  212. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/core/__init__.py +0 -0
  213. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/core/rotations.py +0 -0
  214. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/exceptions.py +0 -0
  215. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  216. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/resources/icon-bg.ico +0 -0
  217. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/resources/icon-bg.png +0 -0
  218. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/resources/icon.png +0 -0
  219. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/gui/views/timeline_widget.py +0 -0
  220. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.1/trajectopy/io}/rosmsg.py +0 -0
  221. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.1/trajectopy/io}/utils.py +0 -0
  222. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/__init__.py +0 -0
  223. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/interpolation.py +0 -0
  224. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/__init__.py +0 -0
  225. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/alignment/equations.py +0 -0
  226. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  227. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  228. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/py.typed +0 -0
  229. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy/results/__init__.py +0 -0
  230. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/core/positions.md +0 -0
  231. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  232. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/core/settings.md +0 -0
  233. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  234. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  235. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  236. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  237. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  238. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  239. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  240. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  241. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  242. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  243. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  244. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/assets/icon.png +0 -0
  245. {trajectopy-4.4.0 → trajectopy-5.0.1}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  246. {trajectopy-4.4.0 → trajectopy-5.0.1}/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
1
  Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 4.4.0
3
+ Version: 5.0.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/
@@ -22,20 +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: pyqtgraph; extra == 'gui'
36
- Requires-Dist: pyside6; extra == 'gui'
37
- Requires-Dist: pyvista; extra == 'gui'
38
- Requires-Dist: pyvistaqt; extra == 'gui'
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'
39
37
  Description-Content-Type: text/markdown
40
38
 
41
39
  <div align="center">
@@ -43,7 +41,7 @@ Description-Content-Type: text/markdown
43
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>
44
42
  <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
45
43
  <a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
46
- <a href="https://github.com/psf/black"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
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>
47
45
  <br />
48
46
  <a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Windows-0078D6?st&logo=windows&logoColor=white" /></a>
49
47
  <a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
@@ -58,12 +56,6 @@ Description-Content-Type: text/markdown
58
56
  <img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/trajectopy_gif_low_quality.gif">
59
57
  </p>
60
58
 
61
- Using [Mapbox](https://www.mapbox.com/), you can visualize your trajectories on a map:
62
-
63
- <p align="center">
64
- <img style="border-radius: 10px;" src=".images/plot.png">
65
- </p>
66
-
67
59
  </div>
68
60
 
69
61
  ## Installation
@@ -74,6 +66,12 @@ Full version (with GUI):
74
66
  pip install "trajectopy[gui]"
75
67
  ```
76
68
 
69
+ Python package with plotting (no GUI):
70
+
71
+ ```bash
72
+ pip install "trajectopy[plot]"
73
+ ```
74
+
77
75
  Python package only:
78
76
 
79
77
  ```bash
@@ -92,7 +90,7 @@ Trajectopy offers a range of features, including:
92
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.
93
91
  - __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
94
92
  - __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
95
- - __Customizable Visualization__: Powered by [Plotly](https://plotly.com/) or [Matplotlib](https://matplotlib.org/), trajectopy offers a range of interactive plots that can be customized to your needs. ([Demo](https://htmlpreview.github.io/?https://github.com/gereon-t/trajectopy/blob/main/example_data/report.html))
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.
96
94
 
97
95
  ## Web Application (Docker)
98
96
 
@@ -3,7 +3,7 @@
3
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
4
  <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
5
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/psf/black"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-000000.svg"></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
7
  <br />
8
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
9
  <a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
@@ -18,12 +18,6 @@
18
18
  <img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/trajectopy_gif_low_quality.gif">
19
19
  </p>
20
20
 
21
- Using [Mapbox](https://www.mapbox.com/), you can visualize your trajectories on a map:
22
-
23
- <p align="center">
24
- <img style="border-radius: 10px;" src=".images/plot.png">
25
- </p>
26
-
27
21
  </div>
28
22
 
29
23
  ## Installation
@@ -34,6 +28,12 @@ Full version (with GUI):
34
28
  pip install "trajectopy[gui]"
35
29
  ```
36
30
 
31
+ Python package with plotting (no GUI):
32
+
33
+ ```bash
34
+ pip install "trajectopy[plot]"
35
+ ```
36
+
37
37
  Python package only:
38
38
 
39
39
  ```bash
@@ -52,7 +52,7 @@ Trajectopy offers a range of features, including:
52
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
53
  - __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
54
54
  - __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
55
- - __Customizable Visualization__: Powered by [Plotly](https://plotly.com/) or [Matplotlib](https://matplotlib.org/), trajectopy offers a range of interactive plots that can be customized to your needs. ([Demo](https://htmlpreview.github.io/?https://github.com/gereon-t/trajectopy/blob/main/example_data/report.html))
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
56
 
57
57
  ## Web Application (Docker)
58
58
 
@@ -1,7 +1,5 @@
1
- from matplotlib import pyplot as plt
2
-
3
1
  from trajectopy import Trajectory, align
4
- from trajectopy.visualization.mpl_plots import plot_positions
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 += " (Aligned)"
10
+ est_traj_aligned.name += " (aligned)"
13
11
 
14
- plot_positions(trajectories=[gt_traj, est_traj, est_traj_aligned])
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.visualization import plotly_reports
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
- report = plotly_reports.create_alignment_report(
25
- alignment_parameters=alignment_result.position_parameters,
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
- console.print(dict_to_table(ate_result.property_dict))
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
- gui = ["PySide6", "pyvista", "pyvistaqt", "pyqtgraph"]
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