trajectopy 4.3.3__tar.gz → 5.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. {trajectopy-4.3.3 → 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.3.3 → trajectopy-5.0.0}/PKG-INFO +16 -17
  5. {trajectopy-4.3.3 → trajectopy-5.0.0}/README.md +75 -75
  6. {trajectopy-4.3.3 → trajectopy-5.0.0}/example_scripts/align.py +3 -6
  7. {trajectopy-4.3.3 → trajectopy-5.0.0}/example_scripts/alignment.py +3 -6
  8. {trajectopy-4.3.3 → 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.3.3 → trajectopy-5.0.0}/pyproject.toml +34 -6
  13. {trajectopy-4.3.3 → trajectopy-5.0.0}/requirements.txt +1738 -1885
  14. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_alignment.py +172 -122
  15. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_approximation.py +8 -16
  16. trajectopy-5.0.0/test/test_architecture.py +62 -0
  17. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_comparison.py +194 -194
  18. trajectopy-5.0.0/test/test_context_menus.py +121 -0
  19. trajectopy-5.0.0/test/test_gui_smoke.py +288 -0
  20. trajectopy-5.0.0/test/test_inplace_contract.py +119 -0
  21. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_io.py +21 -1
  22. trajectopy-5.0.0/test/test_kml.py +397 -0
  23. trajectopy-5.0.0/test/test_manual_alignment.py +347 -0
  24. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_matching.py +2 -2
  25. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_merging.py +240 -240
  26. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_processing_edge_cases.py +121 -121
  27. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_processing_errors.py +53 -48
  28. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_readers_edge_cases.py +98 -98
  29. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_readers_errors.py +36 -36
  30. trajectopy-5.0.0/test/test_regressions.py +60 -0
  31. trajectopy-5.0.0/test/test_settings_serialization.py +75 -0
  32. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_sorting.py +4 -6
  33. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_trajectory.py +180 -180
  34. trajectopy-5.0.0/test/test_visualization.py +150 -0
  35. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/util.py +218 -218
  36. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/__init__.py +34 -19
  37. trajectopy-5.0.0/trajectopy/__version__.py +1 -0
  38. trajectopy-5.0.0/trajectopy/cli/main.py +47 -0
  39. {trajectopy-4.3.3/trajectopy/processing/lib/alignment → trajectopy-5.0.0/trajectopy/core}/parameters.py +16 -95
  40. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/positions.py +40 -40
  41. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/settings.py +160 -253
  42. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/trajectory.py +63 -111
  43. trajectopy-5.0.0/trajectopy/gui/__init__.py +1 -0
  44. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/app.py +11 -17
  45. trajectopy-5.0.0/trajectopy/gui/managers/__init__.py +0 -0
  46. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/file_manager.py +15 -21
  47. trajectopy-5.0.0/trajectopy/gui/managers/plot_manager.py +102 -0
  48. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/requests.py +28 -25
  49. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/session_manager.py +99 -99
  50. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/trajectory_manager.py +121 -199
  51. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/managers/ui_manager.py +86 -57
  52. trajectopy-5.0.0/trajectopy/gui/models/__init__.py +0 -0
  53. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/entries.py +41 -19
  54. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/property_model.py +8 -7
  55. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/result_model.py +14 -15
  56. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/selection.py +34 -34
  57. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/table_model.py +23 -24
  58. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/models/trajectory_model.py +18 -28
  59. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/themes.py +80 -41
  60. trajectopy-5.0.0/trajectopy/gui/utils.py +86 -0
  61. trajectopy-5.0.0/trajectopy/gui/views/__init__.py +0 -0
  62. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/about_window.py +2 -3
  63. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/alignment_edit_window.py +1 -4
  64. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/dof_organizer.py +1 -3
  65. trajectopy-5.0.0/trajectopy/gui/views/entry_table_view.py +95 -0
  66. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/json_settings_view.py +63 -43
  67. trajectopy-5.0.0/trajectopy/gui/views/kml_dialog.py +219 -0
  68. trajectopy-5.0.0/trajectopy/gui/views/main_window.py +471 -0
  69. trajectopy-5.0.0/trajectopy/gui/views/manual_alignment_window.py +1105 -0
  70. trajectopy-5.0.0/trajectopy/gui/views/menu_helpers.py +123 -0
  71. trajectopy-5.0.0/trajectopy/gui/views/playback_window.py +294 -0
  72. trajectopy-5.0.0/trajectopy/gui/views/preview_plot.py +137 -0
  73. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/progress_window.py +1 -2
  74. trajectopy-5.0.0/trajectopy/gui/views/properties_panel.py +72 -0
  75. trajectopy-5.0.0/trajectopy/gui/views/result_context_menu.py +134 -0
  76. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/result_selection_window.py +1 -2
  77. trajectopy-5.0.0/trajectopy/gui/views/result_table_view.py +44 -0
  78. trajectopy-5.0.0/trajectopy/gui/views/trajectory_context_menu.py +384 -0
  79. trajectopy-5.0.0/trajectopy/gui/views/trajectory_table_view.py +58 -0
  80. trajectopy-5.0.0/trajectopy/gui/worker.py +68 -0
  81. trajectopy-5.0.0/trajectopy/io/__init__.py +47 -0
  82. {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/ascii.py +17 -206
  83. trajectopy-5.0.0/trajectopy/io/header.py +206 -0
  84. trajectopy-5.0.0/trajectopy/io/kml.py +447 -0
  85. trajectopy-5.0.0/trajectopy/io/results_io.py +204 -0
  86. {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosbag.py +13 -40
  87. {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/rosmsg.py +62 -62
  88. trajectopy-5.0.0/trajectopy/io/trajectory_io.py +92 -0
  89. {trajectopy-4.3.3/trajectopy/readers → trajectopy-5.0.0/trajectopy/io}/utils.py +34 -34
  90. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/alignment.py +66 -21
  91. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/approximation.py +99 -15
  92. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/evaluation.py +45 -4
  93. trajectopy-5.0.0/trajectopy/processing/interpolation.py +174 -0
  94. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/__init__.py +7 -7
  95. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/data.py +25 -59
  96. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/direct.py +12 -9
  97. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/egrad_interface.py +1 -4
  98. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/estimation.py +31 -15
  99. trajectopy-5.0.0/trajectopy/processing/lib/alignment/parameters.py +10 -0
  100. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +1 -15
  101. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -16
  102. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/matching.py +354 -347
  103. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/merging.py +7 -5
  104. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/sorting.py +26 -8
  105. trajectopy-5.0.0/trajectopy/readers/__init__.py +1 -0
  106. trajectopy-5.0.0/trajectopy/readers/ascii.py +12 -0
  107. trajectopy-5.0.0/trajectopy/readers/rosbag.py +3 -0
  108. trajectopy-5.0.0/trajectopy/readers/rosmsg.py +3 -0
  109. trajectopy-5.0.0/trajectopy/readers/utils.py +3 -0
  110. trajectopy-5.0.0/trajectopy/results/alignment_result.py +57 -0
  111. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/ate_result.py +36 -51
  112. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/rpe_result.py +13 -45
  113. trajectopy-5.0.0/trajectopy/utils/__init__.py +5 -0
  114. trajectopy-5.0.0/trajectopy/utils/colors.py +63 -0
  115. trajectopy-5.0.0/trajectopy/utils/common.py +63 -0
  116. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/utils/definitions.py +0 -2
  117. trajectopy-5.0.0/trajectopy/utils/formatting.py +144 -0
  118. trajectopy-5.0.0/trajectopy/utils/geometry.py +191 -0
  119. trajectopy-5.0.0/trajectopy/utils/linalg.py +71 -0
  120. trajectopy-5.0.0/trajectopy/utils/numeric.py +102 -0
  121. trajectopy-5.0.0/trajectopy/utils/resources.py +21 -0
  122. trajectopy-5.0.0/trajectopy/visualization/__init__.py +79 -0
  123. trajectopy-5.0.0/trajectopy/visualization/_svg_export.py +62 -0
  124. trajectopy-5.0.0/trajectopy/visualization/axes.py +112 -0
  125. trajectopy-5.0.0/trajectopy/visualization/figure.py +262 -0
  126. trajectopy-5.0.0/trajectopy/visualization/plots.py +709 -0
  127. trajectopy-5.0.0/trajectopy/visualization/style.py +98 -0
  128. trajectopy-5.0.0/trajectopy-docs/docs/api/core/parameters.md +3 -0
  129. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/index.md +9 -4
  130. trajectopy-5.0.0/trajectopy-docs/docs/api/io/kml.md +3 -0
  131. trajectopy-5.0.0/trajectopy-docs/docs/api/io/results_io.md +3 -0
  132. trajectopy-5.0.0/trajectopy-docs/docs/api/io/trajectory_io.md +3 -0
  133. trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/display.md +3 -0
  134. trajectopy-5.0.0/trajectopy-docs/docs/api/visualization/figures.md +3 -0
  135. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/file_formats.md +2 -2
  136. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/index.md +130 -135
  137. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/settings.md +29 -156
  138. trajectopy-5.0.0/trajectopy-docs/docs/user_guide.md +270 -0
  139. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/mkdocs.yml +7 -4
  140. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy.spec +6 -10
  141. {trajectopy-4.3.3 → trajectopy-5.0.0}/uv.lock +2471 -2857
  142. trajectopy-4.3.3/.pre-commit-config.yaml +0 -35
  143. trajectopy-4.3.3/example_data/default.mplstyle +0 -42
  144. trajectopy-4.3.3/example_data/matplotlib_settings.json +0 -19
  145. trajectopy-4.3.3/example_data/report_settings.json +0 -56
  146. trajectopy-4.3.3/example_scripts/mpl_plot.py +0 -42
  147. trajectopy-4.3.3/example_scripts/multi_report.py +0 -32
  148. trajectopy-4.3.3/example_scripts/rpe.py +0 -32
  149. trajectopy-4.3.3/example_scripts/single_report.py +0 -28
  150. trajectopy-4.3.3/example_scripts/trajectory_plot.py +0 -22
  151. trajectopy-4.3.3/trajectopy/__version__.py +0 -1
  152. trajectopy-4.3.3/trajectopy/cli/main.py +0 -72
  153. trajectopy-4.3.3/trajectopy/gui/__init__.py +0 -1
  154. trajectopy-4.3.3/trajectopy/gui/managers/__init__.py +0 -1
  155. trajectopy-4.3.3/trajectopy/gui/managers/plot_manager.py +0 -194
  156. trajectopy-4.3.3/trajectopy/gui/models/__init__.py +0 -1
  157. trajectopy-4.3.3/trajectopy/gui/utils.py +0 -151
  158. trajectopy-4.3.3/trajectopy/gui/views/__init__.py +0 -1
  159. trajectopy-4.3.3/trajectopy/gui/views/main_window.py +0 -689
  160. trajectopy-4.3.3/trajectopy/gui/views/mpl_plot_tabs.py +0 -432
  161. trajectopy-4.3.3/trajectopy/gui/views/playback_window.py +0 -379
  162. trajectopy-4.3.3/trajectopy/gui/views/properties_window.py +0 -101
  163. trajectopy-4.3.3/trajectopy/gui/views/result_context_menu.py +0 -184
  164. trajectopy-4.3.3/trajectopy/gui/views/result_table_view.py +0 -170
  165. trajectopy-4.3.3/trajectopy/gui/views/trajectory_context_menu.py +0 -448
  166. trajectopy-4.3.3/trajectopy/gui/views/trajectory_table_view.py +0 -185
  167. trajectopy-4.3.3/trajectopy/processing/interpolation.py +0 -137
  168. trajectopy-4.3.3/trajectopy/readers/__init__.py +0 -3
  169. trajectopy-4.3.3/trajectopy/results/alignment_result.py +0 -85
  170. trajectopy-4.3.3/trajectopy/utils/__init__.py +0 -4
  171. trajectopy-4.3.3/trajectopy/utils/common.py +0 -587
  172. trajectopy-4.3.3/trajectopy/visualization/__init__.py +0 -8
  173. trajectopy-4.3.3/trajectopy/visualization/assets/icon.png +0 -0
  174. trajectopy-4.3.3/trajectopy/visualization/assets/style.css +0 -196
  175. trajectopy-4.3.3/trajectopy/visualization/default.mplstyle +0 -42
  176. trajectopy-4.3.3/trajectopy/visualization/mpl_plots.py +0 -1128
  177. trajectopy-4.3.3/trajectopy/visualization/plotly_plots.py +0 -421
  178. trajectopy-4.3.3/trajectopy/visualization/plotly_reports.py +0 -409
  179. trajectopy-4.3.3/trajectopy/visualization/report_data.py +0 -993
  180. trajectopy-4.3.3/trajectopy/visualization/templates/generic.html +0 -176
  181. trajectopy-4.3.3/trajectopy/visualization/templates/multi_template.html +0 -216
  182. trajectopy-4.3.3/trajectopy/visualization/templates/single_template.html +0 -251
  183. trajectopy-4.3.3/trajectopy-docs/docs/api/processing/parameters.md +0 -3
  184. trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -3
  185. trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -3
  186. trajectopy-4.3.3/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -3
  187. trajectopy-4.3.3/trajectopy-docs/docs/user_guide.md +0 -233
  188. {trajectopy-4.3.3 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  189. {trajectopy-4.3.3 → trajectopy-5.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  190. {trajectopy-4.3.3 → trajectopy-5.0.0}/.gitignore +0 -0
  191. {trajectopy-4.3.3 → trajectopy-5.0.0}/.pylintrc +0 -0
  192. {trajectopy-4.3.3 → trajectopy-5.0.0}/CITATION.cff +0 -0
  193. {trajectopy-4.3.3 → trajectopy-5.0.0}/LICENSE +0 -0
  194. {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_ORB.traj +0 -0
  195. {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_SPTAM.traj +0 -0
  196. {trajectopy-4.3.3 → trajectopy-5.0.0}/example_data/KITTI_gt.traj +0 -0
  197. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/__init__.py +0 -0
  198. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/abs_dev.result +0 -0
  199. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/align_entry.result +0 -0
  200. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/generated_trajectory.traj +0 -0
  201. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/noisy_trajectory.traj +0 -0
  202. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/open_loop_trajectory.traj +0 -0
  203. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/rel_dev_meter.result +0 -0
  204. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/data/rel_dev_second.result +0 -0
  205. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_pipeline.py +0 -0
  206. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_positions_rotations.py +0 -0
  207. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings.py +0 -0
  208. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings_edge_cases.py +0 -0
  209. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_settings_validation.py +0 -0
  210. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/test_trajectory_validation.py +0 -0
  211. {trajectopy-4.3.3 → trajectopy-5.0.0}/test/testdata.py +0 -0
  212. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/LICENSE +0 -0
  213. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/__main__.py +0 -0
  214. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/cli/__init__.py +0 -0
  215. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/__init__.py +0 -0
  216. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/core/rotations.py +0 -0
  217. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/exceptions.py +0 -0
  218. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  219. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
  220. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon-bg.png +0 -0
  221. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/resources/icon.png +0 -0
  222. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/gui/views/timeline_widget.py +0 -0
  223. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/__init__.py +0 -0
  224. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/__init__.py +0 -0
  225. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
  226. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  227. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  228. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/py.typed +0 -0
  229. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy/results/__init__.py +0 -0
  230. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
  231. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  232. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
  233. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  234. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  235. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  236. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  237. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  238. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  239. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  240. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  241. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  242. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  243. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  244. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/assets/icon.png +0 -0
  245. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  246. {trajectopy-4.3.3 → trajectopy-5.0.0}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
@@ -1,3 +1,12 @@
1
1
  trajectopy/core/report/templates/*.html linguist-generated
2
2
  trajectopy/core/report/assets/*.css linguist-generated
3
3
  example_data/*.html linguist-generated
4
+
5
+ # Never convert line endings in binary files
6
+ *.png binary
7
+ *.ico binary
8
+ *.gif binary
9
+ *.jpg binary
10
+ *.jpeg binary
11
+ *.pdf binary
12
+ *.bag binary
@@ -0,0 +1,46 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ lint:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: astral-sh/setup-uv@v6
14
+ - run: uv sync --group dev --extra gui # GUI packages provide the type information for trajectopy.gui
15
+ - run: uv run ruff check trajectopy test example_scripts
16
+ - run: uv run ruff format --check trajectopy test example_scripts
17
+ - run: uv run mypy
18
+
19
+ test:
20
+ runs-on: ${{ matrix.os }}
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os: [ubuntu-latest, windows-latest]
25
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
26
+ env:
27
+ # plots and the GUI are tested without a display
28
+ QT_QPA_PLATFORM: offscreen
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+ - uses: astral-sh/setup-uv@v6
32
+ with:
33
+ python-version: ${{ matrix.python-version }}
34
+ - if: runner.os == 'Linux'
35
+ run: sudo apt-get update && sudo apt-get install -y libegl1 libgl1 libxkbcommon0 libfontconfig1 libdbus-1-3
36
+ - run: uv sync --group dev --extra gui
37
+ - run: uv run pytest -q --cov=trajectopy --cov-report=term
38
+
39
+ core-only:
40
+ # the package must work without the optional plotting/GUI dependencies
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ - uses: astral-sh/setup-uv@v6
45
+ - run: uv sync --group dev
46
+ - run: uv run pytest -q
@@ -0,0 +1,23 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.14.0
4
+ hooks:
5
+ - id: ruff-check
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/astral-sh/uv-pre-commit
10
+ rev: 0.7.6
11
+ hooks:
12
+ - id: uv-lock
13
+ - id: uv-export
14
+
15
+ - repo: local
16
+ hooks:
17
+ - id: pytest
18
+ name: Run unit tests
19
+ entry: uv run pytest -q
20
+ language: system
21
+ pass_filenames: false
22
+ stages: [pre-commit]
23
+ always_run: true
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 4.3.3
3
+ Version: 5.0.0
4
4
  Summary: Trajectory Evaluation in Python
5
5
  Project-URL: Homepage, https://gereon-t.github.io/trajectopy/
6
6
  Project-URL: Documentation, https://gereon-t.github.io/trajectopy/
@@ -22,19 +22,18 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
22
22
  Classifier: Topic :: Scientific/Engineering
23
23
  Requires-Python: >=3.10
24
24
  Requires-Dist: autograd>=1.8.0
25
- Requires-Dist: jinja2>=3.1.6
26
- Requires-Dist: matplotlib>=3.9.4
27
25
  Requires-Dist: numpy>=2.0.2
28
26
  Requires-Dist: pandas>=2.2.3
29
- Requires-Dist: plotly>=6.1.0
30
27
  Requires-Dist: pyproj>=3.6.1
31
- Requires-Dist: rich>=14.0.0
32
28
  Requires-Dist: rosbags>=0.9.23
33
29
  Requires-Dist: scipy>=1.13.1
34
30
  Provides-Extra: gui
35
- Requires-Dist: pyside6; extra == 'gui'
36
- Requires-Dist: pyvista; extra == 'gui'
37
- 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'
38
37
  Description-Content-Type: text/markdown
39
38
 
40
39
  <div align="center">
@@ -42,7 +41,7 @@ Description-Content-Type: text/markdown
42
41
  <a href="https://github.com/gereon-t/trajectopy/releases"><img src="https://img.shields.io/github/v/release/gereon-t/trajectopy?label=version" /></a>
43
42
  <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
44
43
  <a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
45
- <a href="https://github.com/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>
46
45
  <br />
47
46
  <a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Windows-0078D6?st&logo=windows&logoColor=white" /></a>
48
47
  <a href="https://github.com/gereon-t/trajectopy"><img src="https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black" /></a>
@@ -57,12 +56,6 @@ Description-Content-Type: text/markdown
57
56
  <img style="border-radius: 10px;" src="https://raw.githubusercontent.com/gereon-t/trajectopy/main/.images/trajectopy_gif_low_quality.gif">
58
57
  </p>
59
58
 
60
- Using [Mapbox](https://www.mapbox.com/), you can visualize your trajectories on a map:
61
-
62
- <p align="center">
63
- <img style="border-radius: 10px;" src=".images/plot.png">
64
- </p>
65
-
66
59
  </div>
67
60
 
68
61
  ## Installation
@@ -73,6 +66,12 @@ Full version (with GUI):
73
66
  pip install "trajectopy[gui]"
74
67
  ```
75
68
 
69
+ Python package with plotting (no GUI):
70
+
71
+ ```bash
72
+ pip install "trajectopy[plot]"
73
+ ```
74
+
76
75
  Python package only:
77
76
 
78
77
  ```bash
@@ -91,7 +90,7 @@ Trajectopy offers a range of features, including:
91
90
  - __Alignment__: An advanced trajectory alignment algorithm that can be tailored to the specific application and supports a similarity transformation, a leverarm and a time shift estimation.
92
91
  - __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
93
92
  - __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
94
- - __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.
95
94
 
96
95
  ## Web Application (Docker)
97
96
 
@@ -1,75 +1,75 @@
1
- <div align="center">
2
- <h1>Trajectopy - Trajectory Evaluation in Python</h1>
3
- <a href="https://github.com/gereon-t/trajectopy/releases"><img src="https://img.shields.io/github/v/release/gereon-t/trajectopy?label=version" /></a>
4
- <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" /></a>
5
- <a href="https://github.com/gereon-t/trajectopy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gereon-t/trajectopy" /></a>
6
- <a href="https://github.com/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"]
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