trajectopy 4.4.0__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.
Files changed (246) hide show
  1. {trajectopy-4.4.0 → trajectopy-5.0.0}/.gitattributes +9 -0
  2. trajectopy-5.0.0/.github/workflows/ci.yml +46 -0
  3. trajectopy-5.0.0/.pre-commit-config.yaml +23 -0
  4. {trajectopy-4.4.0 → trajectopy-5.0.0}/PKG-INFO +15 -17
  5. {trajectopy-4.4.0 → trajectopy-5.0.0}/README.md +75 -75
  6. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_scripts/align.py +3 -6
  7. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_scripts/alignment.py +3 -6
  8. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_scripts/ate.py +4 -16
  9. trajectopy-5.0.0/example_scripts/deviation_plots.py +36 -0
  10. trajectopy-5.0.0/example_scripts/rpe.py +20 -0
  11. trajectopy-5.0.0/example_scripts/trajectory_plot.py +18 -0
  12. {trajectopy-4.4.0 → trajectopy-5.0.0}/pyproject.toml +34 -6
  13. {trajectopy-4.4.0 → trajectopy-5.0.0}/requirements.txt +273 -470
  14. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_alignment.py +172 -172
  15. trajectopy-5.0.0/test/test_architecture.py +62 -0
  16. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_comparison.py +194 -194
  17. trajectopy-5.0.0/test/test_context_menus.py +121 -0
  18. trajectopy-5.0.0/test/test_gui_smoke.py +288 -0
  19. trajectopy-5.0.0/test/test_inplace_contract.py +119 -0
  20. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_io.py +21 -1
  21. trajectopy-5.0.0/test/test_kml.py +397 -0
  22. trajectopy-5.0.0/test/test_manual_alignment.py +347 -0
  23. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_merging.py +240 -240
  24. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_processing_edge_cases.py +121 -121
  25. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_processing_errors.py +53 -48
  26. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_readers_edge_cases.py +98 -98
  27. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_readers_errors.py +36 -36
  28. trajectopy-5.0.0/test/test_regressions.py +60 -0
  29. trajectopy-5.0.0/test/test_settings_serialization.py +75 -0
  30. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_trajectory.py +180 -180
  31. trajectopy-5.0.0/test/test_visualization.py +150 -0
  32. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/util.py +218 -218
  33. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/__init__.py +26 -16
  34. trajectopy-5.0.0/trajectopy/__version__.py +1 -0
  35. trajectopy-5.0.0/trajectopy/cli/main.py +47 -0
  36. {trajectopy-4.4.0/trajectopy/processing/lib/alignment → trajectopy-5.0.0/trajectopy/core}/parameters.py +16 -95
  37. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/core/positions.py +40 -40
  38. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/core/settings.py +114 -256
  39. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/core/trajectory.py +47 -95
  40. trajectopy-5.0.0/trajectopy/gui/__init__.py +1 -0
  41. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/app.py +11 -17
  42. trajectopy-5.0.0/trajectopy/gui/managers/__init__.py +0 -0
  43. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/managers/file_manager.py +15 -21
  44. trajectopy-5.0.0/trajectopy/gui/managers/plot_manager.py +102 -0
  45. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/managers/requests.py +27 -28
  46. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/managers/session_manager.py +99 -99
  47. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/managers/trajectory_manager.py +113 -200
  48. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/managers/ui_manager.py +58 -63
  49. trajectopy-5.0.0/trajectopy/gui/models/__init__.py +0 -0
  50. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/entries.py +41 -19
  51. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/property_model.py +8 -7
  52. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/result_model.py +14 -15
  53. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/selection.py +34 -34
  54. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/table_model.py +23 -24
  55. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/models/trajectory_model.py +18 -28
  56. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/themes.py +80 -41
  57. trajectopy-5.0.0/trajectopy/gui/utils.py +86 -0
  58. trajectopy-5.0.0/trajectopy/gui/views/__init__.py +0 -0
  59. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/about_window.py +2 -3
  60. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/alignment_edit_window.py +1 -4
  61. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/dof_organizer.py +1 -3
  62. trajectopy-5.0.0/trajectopy/gui/views/entry_table_view.py +95 -0
  63. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/json_settings_view.py +61 -55
  64. trajectopy-5.0.0/trajectopy/gui/views/kml_dialog.py +219 -0
  65. trajectopy-5.0.0/trajectopy/gui/views/main_window.py +471 -0
  66. trajectopy-5.0.0/trajectopy/gui/views/manual_alignment_window.py +1105 -0
  67. trajectopy-5.0.0/trajectopy/gui/views/menu_helpers.py +123 -0
  68. trajectopy-5.0.0/trajectopy/gui/views/playback_window.py +294 -0
  69. trajectopy-5.0.0/trajectopy/gui/views/preview_plot.py +137 -0
  70. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/progress_window.py +1 -2
  71. trajectopy-5.0.0/trajectopy/gui/views/properties_panel.py +72 -0
  72. trajectopy-5.0.0/trajectopy/gui/views/result_context_menu.py +134 -0
  73. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/result_selection_window.py +1 -2
  74. trajectopy-5.0.0/trajectopy/gui/views/result_table_view.py +44 -0
  75. trajectopy-5.0.0/trajectopy/gui/views/trajectory_context_menu.py +384 -0
  76. trajectopy-5.0.0/trajectopy/gui/views/trajectory_table_view.py +58 -0
  77. trajectopy-5.0.0/trajectopy/gui/worker.py +68 -0
  78. trajectopy-5.0.0/trajectopy/io/__init__.py +47 -0
  79. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/ascii.py +17 -206
  80. trajectopy-5.0.0/trajectopy/io/header.py +206 -0
  81. trajectopy-5.0.0/trajectopy/io/kml.py +447 -0
  82. trajectopy-5.0.0/trajectopy/io/results_io.py +204 -0
  83. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosbag.py +3 -55
  84. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosmsg.py +62 -62
  85. trajectopy-5.0.0/trajectopy/io/trajectory_io.py +92 -0
  86. {trajectopy-4.4.0/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/utils.py +34 -34
  87. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/alignment.py +27 -19
  88. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/approximation.py +29 -4
  89. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/evaluation.py +45 -4
  90. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/__init__.py +7 -7
  91. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/data.py +25 -59
  92. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/direct.py +12 -9
  93. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/egrad_interface.py +1 -4
  94. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/estimation.py +8 -13
  95. trajectopy-5.0.0/trajectopy/processing/lib/alignment/parameters.py +10 -0
  96. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +1 -15
  97. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -16
  98. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/matching.py +354 -352
  99. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/merging.py +7 -5
  100. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/sorting.py +22 -5
  101. trajectopy-5.0.0/trajectopy/readers/__init__.py +1 -0
  102. trajectopy-5.0.0/trajectopy/readers/ascii.py +12 -0
  103. trajectopy-5.0.0/trajectopy/readers/rosbag.py +3 -0
  104. trajectopy-5.0.0/trajectopy/readers/rosmsg.py +3 -0
  105. trajectopy-5.0.0/trajectopy/readers/utils.py +3 -0
  106. trajectopy-5.0.0/trajectopy/results/alignment_result.py +57 -0
  107. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/results/ate_result.py +36 -51
  108. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/results/rpe_result.py +13 -45
  109. trajectopy-5.0.0/trajectopy/utils/__init__.py +5 -0
  110. trajectopy-5.0.0/trajectopy/utils/colors.py +63 -0
  111. trajectopy-5.0.0/trajectopy/utils/common.py +63 -0
  112. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/utils/definitions.py +0 -2
  113. trajectopy-5.0.0/trajectopy/utils/formatting.py +144 -0
  114. trajectopy-5.0.0/trajectopy/utils/geometry.py +191 -0
  115. trajectopy-5.0.0/trajectopy/utils/linalg.py +71 -0
  116. trajectopy-5.0.0/trajectopy/utils/numeric.py +102 -0
  117. trajectopy-5.0.0/trajectopy/utils/resources.py +21 -0
  118. trajectopy-5.0.0/trajectopy/visualization/__init__.py +79 -0
  119. trajectopy-5.0.0/trajectopy/visualization/_svg_export.py +62 -0
  120. trajectopy-5.0.0/trajectopy/visualization/axes.py +112 -0
  121. trajectopy-5.0.0/trajectopy/visualization/figure.py +262 -0
  122. trajectopy-5.0.0/trajectopy/visualization/plots.py +709 -0
  123. trajectopy-5.0.0/trajectopy/visualization/style.py +98 -0
  124. trajectopy-5.0.0/trajectopy-docs/docs/api/core/parameters.md +3 -0
  125. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/index.md +9 -4
  126. trajectopy-5.0.0/trajectopy-docs/docs/api/io/kml.md +3 -0
  127. trajectopy-5.0.0/trajectopy-docs/docs/api/io/results_io.md +3 -0
  128. trajectopy-5.0.0/trajectopy-docs/docs/api/io/trajectory_io.md +3 -0
  129. trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/display.md +3 -0
  130. trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/figures.md +3 -0
  131. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/file_formats.md +2 -2
  132. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/index.md +130 -135
  133. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/settings.md +29 -156
  134. trajectopy-5.0.0/trajectopy-docs/docs/user_guide.md +270 -0
  135. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/mkdocs.yml +7 -4
  136. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy.spec +6 -10
  137. {trajectopy-4.4.0 → trajectopy-5.0.0}/uv.lock +382 -783
  138. trajectopy-4.4.0/.pre-commit-config.yaml +0 -35
  139. trajectopy-4.4.0/example_data/default.mplstyle +0 -42
  140. trajectopy-4.4.0/example_data/matplotlib_settings.json +0 -19
  141. trajectopy-4.4.0/example_data/report_settings.json +0 -56
  142. trajectopy-4.4.0/example_scripts/mpl_plot.py +0 -42
  143. trajectopy-4.4.0/example_scripts/multi_report.py +0 -32
  144. trajectopy-4.4.0/example_scripts/rpe.py +0 -32
  145. trajectopy-4.4.0/example_scripts/single_report.py +0 -28
  146. trajectopy-4.4.0/example_scripts/trajectory_plot.py +0 -22
  147. trajectopy-4.4.0/trajectopy/__version__.py +0 -1
  148. trajectopy-4.4.0/trajectopy/cli/main.py +0 -72
  149. trajectopy-4.4.0/trajectopy/gui/__init__.py +0 -1
  150. trajectopy-4.4.0/trajectopy/gui/managers/__init__.py +0 -1
  151. trajectopy-4.4.0/trajectopy/gui/managers/plot_manager.py +0 -194
  152. trajectopy-4.4.0/trajectopy/gui/models/__init__.py +0 -1
  153. trajectopy-4.4.0/trajectopy/gui/utils.py +0 -151
  154. trajectopy-4.4.0/trajectopy/gui/views/__init__.py +0 -1
  155. trajectopy-4.4.0/trajectopy/gui/views/main_window.py +0 -689
  156. trajectopy-4.4.0/trajectopy/gui/views/manual_alignment_window.py +0 -566
  157. trajectopy-4.4.0/trajectopy/gui/views/mpl_plot_tabs.py +0 -432
  158. trajectopy-4.4.0/trajectopy/gui/views/playback_window.py +0 -379
  159. trajectopy-4.4.0/trajectopy/gui/views/properties_window.py +0 -101
  160. trajectopy-4.4.0/trajectopy/gui/views/result_context_menu.py +0 -184
  161. trajectopy-4.4.0/trajectopy/gui/views/result_table_view.py +0 -170
  162. trajectopy-4.4.0/trajectopy/gui/views/trajectory_context_menu.py +0 -459
  163. trajectopy-4.4.0/trajectopy/gui/views/trajectory_table_view.py +0 -185
  164. trajectopy-4.4.0/trajectopy/readers/__init__.py +0 -3
  165. trajectopy-4.4.0/trajectopy/results/alignment_result.py +0 -85
  166. trajectopy-4.4.0/trajectopy/utils/__init__.py +0 -4
  167. trajectopy-4.4.0/trajectopy/utils/common.py +0 -587
  168. trajectopy-4.4.0/trajectopy/visualization/__init__.py +0 -8
  169. trajectopy-4.4.0/trajectopy/visualization/assets/icon.png +0 -0
  170. trajectopy-4.4.0/trajectopy/visualization/assets/style.css +0 -196
  171. trajectopy-4.4.0/trajectopy/visualization/default.mplstyle +0 -42
  172. trajectopy-4.4.0/trajectopy/visualization/mpl_plots.py +0 -1128
  173. trajectopy-4.4.0/trajectopy/visualization/plotly_plots.py +0 -421
  174. trajectopy-4.4.0/trajectopy/visualization/plotly_reports.py +0 -409
  175. trajectopy-4.4.0/trajectopy/visualization/report_data.py +0 -993
  176. trajectopy-4.4.0/trajectopy/visualization/templates/generic.html +0 -176
  177. trajectopy-4.4.0/trajectopy/visualization/templates/multi_template.html +0 -216
  178. trajectopy-4.4.0/trajectopy/visualization/templates/single_template.html +0 -251
  179. trajectopy-4.4.0/trajectopy-docs/docs/api/processing/parameters.md +0 -3
  180. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -3
  181. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -3
  182. trajectopy-4.4.0/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -3
  183. trajectopy-4.4.0/trajectopy-docs/docs/user_guide.md +0 -233
  184. {trajectopy-4.4.0 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  185. {trajectopy-4.4.0 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  186. {trajectopy-4.4.0 → trajectopy-5.0.0}/.gitignore +0 -0
  187. {trajectopy-4.4.0 → trajectopy-5.0.0}/.pylintrc +0 -0
  188. {trajectopy-4.4.0 → trajectopy-5.0.0}/CITATION.cff +0 -0
  189. {trajectopy-4.4.0 → trajectopy-5.0.0}/LICENSE +0 -0
  190. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_data/KITTI_ORB.traj +0 -0
  191. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_data/KITTI_SPTAM.traj +0 -0
  192. {trajectopy-4.4.0 → trajectopy-5.0.0}/example_data/KITTI_gt.traj +0 -0
  193. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/__init__.py +0 -0
  194. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/abs_dev.result +0 -0
  195. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/align_entry.result +0 -0
  196. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/generated_trajectory.traj +0 -0
  197. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/noisy_trajectory.traj +0 -0
  198. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/open_loop_trajectory.traj +0 -0
  199. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/rel_dev_meter.result +0 -0
  200. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/data/rel_dev_second.result +0 -0
  201. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_approximation.py +0 -0
  202. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_matching.py +0 -0
  203. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_pipeline.py +0 -0
  204. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_positions_rotations.py +0 -0
  205. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_settings.py +0 -0
  206. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_settings_edge_cases.py +0 -0
  207. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_settings_validation.py +0 -0
  208. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_sorting.py +0 -0
  209. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/test_trajectory_validation.py +0 -0
  210. {trajectopy-4.4.0 → trajectopy-5.0.0}/test/testdata.py +0 -0
  211. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/LICENSE +0 -0
  212. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/__main__.py +0 -0
  213. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/cli/__init__.py +0 -0
  214. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/core/__init__.py +0 -0
  215. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/core/rotations.py +0 -0
  216. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/exceptions.py +0 -0
  217. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  218. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
  219. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.png +0 -0
  220. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/resources/icon.png +0 -0
  221. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/gui/views/timeline_widget.py +0 -0
  222. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/__init__.py +0 -0
  223. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/interpolation.py +0 -0
  224. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/__init__.py +0 -0
  225. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
  226. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  227. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  228. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/py.typed +0 -0
  229. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy/results/__init__.py +0 -0
  230. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
  231. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  232. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
  233. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  234. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  235. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  236. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  237. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  238. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  239. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  240. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  241. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  242. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  243. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  244. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/assets/icon.png +0 -0
  245. {trajectopy-4.4.0 → trajectopy-5.0.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  246. {trajectopy-4.4.0 → 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
1
  Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 4.4.0
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,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
 
@@ -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/psf/black"><img alt="Code style: black" src="https://img.shields.io/badge/code%20style-black-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
- 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
- </div>
28
-
29
- ## Installation
30
-
31
- Full version (with GUI):
32
-
33
- ```bash
34
- pip install "trajectopy[gui]"
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
- - __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))
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.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