trajectopy 5.0.2__tar.gz → 5.1.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 (216) hide show
  1. {trajectopy-5.0.2 → trajectopy-5.1.1}/PKG-INFO +22 -24
  2. {trajectopy-5.0.2 → trajectopy-5.1.1}/README.md +21 -23
  3. {trajectopy-5.0.2 → trajectopy-5.1.1}/installer/trajectopy.iss +10 -1
  4. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_fast_reading.py +30 -0
  5. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_gui_smoke.py +588 -403
  6. trajectopy-5.1.1/test/test_project.py +157 -0
  7. trajectopy-5.1.1/trajectopy/__version__.py +1 -0
  8. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/cli/main.py +4 -3
  9. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/trajectory.py +1 -1
  10. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/app.py +1 -1
  11. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/file_manager.py +1 -49
  12. trajectopy-5.1.1/trajectopy/gui/managers/project_manager.py +104 -0
  13. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/requests.py +8 -25
  14. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/ui_manager.py +2 -40
  15. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/entries.py +12 -1
  16. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/result_model.py +0 -30
  17. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/trajectory_model.py +0 -37
  18. trajectopy-5.1.1/trajectopy/gui/project.py +220 -0
  19. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/entry_table_view.py +6 -1
  20. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/json_settings_view.py +4 -1
  21. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/main_window.py +315 -97
  22. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/preview_plot.py +37 -30
  23. trajectopy-5.1.1/trajectopy/gui/views/preview_plot_3d.py +159 -0
  24. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/ascii.py +10 -9
  25. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/ate_result.py +2 -1
  26. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/index.md +1 -0
  27. trajectopy-5.1.1/trajectopy-docs/docs/api/io/rosbag.md +3 -0
  28. trajectopy-5.1.1/trajectopy-docs/docs/file_formats.md +205 -0
  29. trajectopy-5.1.1/trajectopy-docs/docs/index.md +150 -0
  30. trajectopy-5.1.1/trajectopy-docs/docs/settings.md +202 -0
  31. trajectopy-5.1.1/trajectopy-docs/docs/user_guide.md +388 -0
  32. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/mkdocs.yml +1 -0
  33. trajectopy-5.0.2/trajectopy/__version__.py +0 -1
  34. trajectopy-5.0.2/trajectopy/gui/managers/session_manager.py +0 -99
  35. trajectopy-5.0.2/trajectopy-docs/docs/file_formats.md +0 -178
  36. trajectopy-5.0.2/trajectopy-docs/docs/index.md +0 -145
  37. trajectopy-5.0.2/trajectopy-docs/docs/settings.md +0 -183
  38. trajectopy-5.0.2/trajectopy-docs/docs/user_guide.md +0 -270
  39. {trajectopy-5.0.2 → trajectopy-5.1.1}/.gitattributes +0 -0
  40. {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  41. {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  42. {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/workflows/ci.yml +0 -0
  43. {trajectopy-5.0.2 → trajectopy-5.1.1}/.github/workflows/release.yml +0 -0
  44. {trajectopy-5.0.2 → trajectopy-5.1.1}/.gitignore +0 -0
  45. {trajectopy-5.0.2 → trajectopy-5.1.1}/.pre-commit-config.yaml +0 -0
  46. {trajectopy-5.0.2 → trajectopy-5.1.1}/.pylintrc +0 -0
  47. {trajectopy-5.0.2 → trajectopy-5.1.1}/CITATION.cff +0 -0
  48. {trajectopy-5.0.2 → trajectopy-5.1.1}/LICENSE +0 -0
  49. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_ORB.traj +0 -0
  50. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_SPTAM.traj +0 -0
  51. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_data/KITTI_gt.traj +0 -0
  52. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/align.py +0 -0
  53. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/alignment.py +0 -0
  54. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/ate.py +0 -0
  55. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/deviation_plots.py +0 -0
  56. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/rpe.py +0 -0
  57. {trajectopy-5.0.2 → trajectopy-5.1.1}/example_scripts/trajectory_plot.py +0 -0
  58. {trajectopy-5.0.2 → trajectopy-5.1.1}/pyproject.toml +0 -0
  59. {trajectopy-5.0.2 → trajectopy-5.1.1}/requirements.txt +0 -0
  60. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/__init__.py +0 -0
  61. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/abs_dev.result +0 -0
  62. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/align_entry.result +0 -0
  63. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/generated_trajectory.traj +0 -0
  64. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/noisy_trajectory.traj +0 -0
  65. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/open_loop_trajectory.traj +0 -0
  66. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/rel_dev_meter.result +0 -0
  67. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/data/rel_dev_second.result +0 -0
  68. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_alignment.py +0 -0
  69. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_approximation.py +0 -0
  70. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_architecture.py +0 -0
  71. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_comparison.py +0 -0
  72. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_context_menus.py +0 -0
  73. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_gui_models.py +0 -0
  74. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_inplace_contract.py +0 -0
  75. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_io.py +0 -0
  76. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_kml.py +0 -0
  77. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_manual_alignment.py +0 -0
  78. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_matching.py +0 -0
  79. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_merging.py +0 -0
  80. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_pipeline.py +0 -0
  81. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_positions_rotations.py +0 -0
  82. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_processing_edge_cases.py +0 -0
  83. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_processing_errors.py +0 -0
  84. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_readers_edge_cases.py +0 -0
  85. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_readers_errors.py +0 -0
  86. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_regressions.py +0 -0
  87. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings.py +0 -0
  88. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_edge_cases.py +0 -0
  89. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_serialization.py +0 -0
  90. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_settings_validation.py +0 -0
  91. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_sorting.py +0 -0
  92. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_trajectory.py +0 -0
  93. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_trajectory_validation.py +0 -0
  94. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_update_check.py +0 -0
  95. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/test_visualization.py +0 -0
  96. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/testdata.py +0 -0
  97. {trajectopy-5.0.2 → trajectopy-5.1.1}/test/util.py +0 -0
  98. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/LICENSE +0 -0
  99. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/__init__.py +0 -0
  100. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/__main__.py +0 -0
  101. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/cli/__init__.py +0 -0
  102. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/__init__.py +0 -0
  103. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/parameters.py +0 -0
  104. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/positions.py +0 -0
  105. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/rotations.py +0 -0
  106. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/core/settings.py +0 -0
  107. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/exceptions.py +0 -0
  108. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/__init__.py +0 -0
  109. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/__init__.py +0 -0
  110. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/plot_manager.py +0 -0
  111. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/managers/trajectory_manager.py +0 -0
  112. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/__init__.py +0 -0
  113. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/property_model.py +0 -0
  114. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/selection.py +0 -0
  115. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/models/table_model.py +0 -0
  116. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  117. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon-bg.ico +0 -0
  118. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon-bg.png +0 -0
  119. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/resources/icon.png +0 -0
  120. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/themes.py +0 -0
  121. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/update_check.py +0 -0
  122. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/utils.py +0 -0
  123. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/__init__.py +0 -0
  124. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/about_window.py +0 -0
  125. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/alignment_edit_window.py +0 -0
  126. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/dof_organizer.py +0 -0
  127. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/kml_dialog.py +0 -0
  128. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/manual_alignment_window.py +0 -0
  129. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/menu_helpers.py +0 -0
  130. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/playback_window.py +0 -0
  131. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/progress_window.py +0 -0
  132. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/properties_panel.py +0 -0
  133. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_context_menu.py +0 -0
  134. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_selection_window.py +0 -0
  135. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/result_table_view.py +0 -0
  136. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/timeline_widget.py +0 -0
  137. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/trajectory_context_menu.py +0 -0
  138. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/views/trajectory_table_view.py +0 -0
  139. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/gui/worker.py +0 -0
  140. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/__init__.py +0 -0
  141. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/header.py +0 -0
  142. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/kml.py +0 -0
  143. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/results_io.py +0 -0
  144. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/rosbag.py +0 -0
  145. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/rosmsg.py +0 -0
  146. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/trajectory_io.py +0 -0
  147. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/io/utils.py +0 -0
  148. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/__init__.py +0 -0
  149. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/alignment.py +0 -0
  150. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/approximation.py +0 -0
  151. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/evaluation.py +0 -0
  152. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/interpolation.py +0 -0
  153. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/__init__.py +0 -0
  154. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  155. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/data.py +0 -0
  156. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/direct.py +0 -0
  157. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  158. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/equations.py +0 -0
  159. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  160. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  161. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  162. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  163. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  164. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  165. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/matching.py +0 -0
  166. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/merging.py +0 -0
  167. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/processing/sorting.py +0 -0
  168. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/py.typed +0 -0
  169. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/__init__.py +0 -0
  170. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/ascii.py +0 -0
  171. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/rosbag.py +0 -0
  172. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/rosmsg.py +0 -0
  173. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/readers/utils.py +0 -0
  174. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/__init__.py +0 -0
  175. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/alignment_result.py +0 -0
  176. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/results/rpe_result.py +0 -0
  177. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/__init__.py +0 -0
  178. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/colors.py +0 -0
  179. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/common.py +0 -0
  180. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/definitions.py +0 -0
  181. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/formatting.py +0 -0
  182. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/geometry.py +0 -0
  183. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/linalg.py +0 -0
  184. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/numeric.py +0 -0
  185. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/utils/resources.py +0 -0
  186. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/__init__.py +0 -0
  187. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/_svg_export.py +0 -0
  188. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/axes.py +0 -0
  189. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/figure.py +0 -0
  190. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/plots.py +0 -0
  191. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy/visualization/style.py +0 -0
  192. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/parameters.md +0 -0
  193. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/positions.md +0 -0
  194. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  195. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/settings.md +0 -0
  196. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  197. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/kml.md +0 -0
  198. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/results_io.md +0 -0
  199. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/io/trajectory_io.md +0 -0
  200. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  201. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  202. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  203. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  204. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  205. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  206. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  207. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  208. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  209. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  210. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/visualization/display.md +0 -0
  211. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/api/visualization/figures.md +0 -0
  212. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/assets/icon.png +0 -0
  213. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  214. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  215. {trajectopy-5.0.2 → trajectopy-5.1.1}/trajectopy.spec +0 -0
  216. {trajectopy-5.0.2 → trajectopy-5.1.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: trajectopy
3
- Version: 5.0.2
3
+ Version: 5.1.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/
@@ -62,44 +62,42 @@ Description-Content-Type: text/markdown
62
62
 
63
63
  ## Installation
64
64
 
65
- Windows app: download `Trajectopy-<version>-setup.exe` from the [latest release](https://github.com/gereon-t/trajectopy/releases/latest) and run it. No Python installation or administrator rights are needed; `.traj` files can then be opened by double-click, and the app reports new versions (Help → Check for Updates).
65
+ **Windows app**: download `Trajectopy-<version>-setup.exe` from the [latest release](https://github.com/gereon-t/trajectopy/releases/latest) and run it. No Python installation or administrator rights are needed; `.traj` files can then be opened by double-click, and the app reports new versions (Help → Check for Updates).
66
66
 
67
- Full version (with GUI):
67
+ **Python package** (Python 3.10 or newer):
68
68
 
69
- ```bash
70
- pip install "trajectopy[gui]"
71
- ```
72
-
73
- Python package with plotting (no GUI):
69
+ | Command | Contents |
70
+ | --- | --- |
71
+ | `pip install "trajectopy[gui]"` | Python package and GUI (recommended) |
72
+ | `pip install "trajectopy[plot]"` | Python package with plotting, without the GUI |
73
+ | `pip install trajectopy` | Python package only |
74
74
 
75
- ```bash
76
- pip install "trajectopy[plot]"
77
- ```
75
+ Loading large trajectory files (millions of poses) is several times faster with the `fast` extra, which can be combined with the others: `pip install "trajectopy[gui,fast]"`.
78
76
 
79
- Python package only:
77
+ ## Quick Start
80
78
 
81
- ```bash
82
- pip install trajectopy
83
- ```
79
+ ```python
80
+ import trajectopy as tpy
84
81
 
85
- Loading large trajectory files (millions of poses) is several times faster with the `fast` extra, which can be combined with the others:
82
+ reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
83
+ estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
86
84
 
87
- ```bash
88
- pip install "trajectopy[gui,fast]"
85
+ ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
86
+ print(f"Position ATE: {ate_result.pos_ate:.3f} m")
89
87
  ```
90
88
 
89
+ Or start the GUI with `trajectopy` (or from the Start menu), drop trajectory files onto it, right-click the ground truth → *Set as Reference*, then right-click another trajectory → *Compare with Reference*.
90
+
91
91
  ## Documentation
92
92
 
93
93
  <a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
94
94
 
95
95
  ## Key Features
96
96
 
97
- Trajectopy offers a range of features, including:
98
-
99
- - __Interactive GUI__: A user-friendly interface that enables seamless interaction with your trajectory data, making it easy to visualize, align, and compare trajectories.
100
- - __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.
101
- - __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
102
- - __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
97
+ - __Interactive GUI__: Load, plot, align and compare trajectories without writing code. Every action explains itself in the context menus, and trajectories can be aligned interactively if an automatic alignment is not possible.
98
+ - __Alignment__: A spatio-temporal least squares alignment that can be tailored to the application: similarity transformation, leverarm and time shift, each of them optional.
99
+ - __Comparison__: Absolute and relative trajectory error (__ATE and RPE__), computed with various pose-matching methods.
100
+ - __Data Import/Export__: ASCII files with configurable columns, time formats and coordinate systems (any EPSG code), and ROS bags.
103
101
  - __Fast, Interactive Visualization__: Powered by [pyqtgraph](https://www.pyqtgraph.org/), the same plots are available in the GUI and in Python scripts, stay fluid for large trajectories, and can be exported to PNG, JPG or SVG. Georeferenced trajectories and ATE results can be exported to Google Earth, colored by speed, height or deviations, on the terrain or at their own heights, with playback.
104
102
 
105
103
  ## Web Application (Docker)
@@ -22,44 +22,42 @@
22
22
 
23
23
  ## Installation
24
24
 
25
- Windows app: download `Trajectopy-<version>-setup.exe` from the [latest release](https://github.com/gereon-t/trajectopy/releases/latest) and run it. No Python installation or administrator rights are needed; `.traj` files can then be opened by double-click, and the app reports new versions (Help → Check for Updates).
25
+ **Windows app**: download `Trajectopy-<version>-setup.exe` from the [latest release](https://github.com/gereon-t/trajectopy/releases/latest) and run it. No Python installation or administrator rights are needed; `.traj` files can then be opened by double-click, and the app reports new versions (Help → Check for Updates).
26
26
 
27
- Full version (with GUI):
27
+ **Python package** (Python 3.10 or newer):
28
28
 
29
- ```bash
30
- pip install "trajectopy[gui]"
31
- ```
32
-
33
- Python package with plotting (no GUI):
29
+ | Command | Contents |
30
+ | --- | --- |
31
+ | `pip install "trajectopy[gui]"` | Python package and GUI (recommended) |
32
+ | `pip install "trajectopy[plot]"` | Python package with plotting, without the GUI |
33
+ | `pip install trajectopy` | Python package only |
34
34
 
35
- ```bash
36
- pip install "trajectopy[plot]"
37
- ```
35
+ Loading large trajectory files (millions of poses) is several times faster with the `fast` extra, which can be combined with the others: `pip install "trajectopy[gui,fast]"`.
38
36
 
39
- Python package only:
37
+ ## Quick Start
40
38
 
41
- ```bash
42
- pip install trajectopy
43
- ```
39
+ ```python
40
+ import trajectopy as tpy
44
41
 
45
- Loading large trajectory files (millions of poses) is several times faster with the `fast` extra, which can be combined with the others:
42
+ reference = tpy.Trajectory.from_file("./example_data/KITTI_gt.traj")
43
+ estimate = tpy.Trajectory.from_file("./example_data/KITTI_ORB.traj")
46
44
 
47
- ```bash
48
- pip install "trajectopy[gui,fast]"
45
+ ate_result = tpy.ate(trajectory=estimate, other=reference) # aligns the estimate first
46
+ print(f"Position ATE: {ate_result.pos_ate:.3f} m")
49
47
  ```
50
48
 
49
+ Or start the GUI with `trajectopy` (or from the Start menu), drop trajectory files onto it, right-click the ground truth → *Set as Reference*, then right-click another trajectory → *Compare with Reference*.
50
+
51
51
  ## Documentation
52
52
 
53
53
  <a href="https://gereon-t.github.io/trajectopy/" target="_blank">https://gereon-t.github.io/trajectopy/</a>
54
54
 
55
55
  ## Key Features
56
56
 
57
- Trajectopy offers a range of features, including:
58
-
59
- - __Interactive GUI__: A user-friendly interface that enables seamless interaction with your trajectory data, making it easy to visualize, align, and compare trajectories.
60
- - __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.
61
- - __Comparison__: Absolute and relative trajectory comparison metrics (__ATE and RPE__) that can be computed using various pose-matching methods.
62
- - __Data Import/Export__: Support for importing and exporting data, ensuring compatibility with your existing workflows.
57
+ - __Interactive GUI__: Load, plot, align and compare trajectories without writing code. Every action explains itself in the context menus, and trajectories can be aligned interactively if an automatic alignment is not possible.
58
+ - __Alignment__: A spatio-temporal least squares alignment that can be tailored to the application: similarity transformation, leverarm and time shift, each of them optional.
59
+ - __Comparison__: Absolute and relative trajectory error (__ATE and RPE__), computed with various pose-matching methods.
60
+ - __Data Import/Export__: ASCII files with configurable columns, time formats and coordinate systems (any EPSG code), and ROS bags.
63
61
  - __Fast, Interactive Visualization__: Powered by [pyqtgraph](https://www.pyqtgraph.org/), the same plots are available in the GUI and in Python scripts, stay fluid for large trajectories, and can be exported to PNG, JPG or SVG. Georeferenced trajectories and ATE results can be exported to Google Earth, colored by speed, height or deviations, on the terrain or at their own heights, with playback.
64
62
 
65
63
  ## Web Application (Docker)
@@ -6,7 +6,8 @@
6
6
  ; The installer is written to dist\Trajectopy-<version>-setup.exe.
7
7
  ;
8
8
  ; It installs for the current user without administrator rights (or for all users, if chosen in the
9
- ; dialog), adds a Start menu entry and, optionally, a desktop icon and the .traj file association.
9
+ ; dialog), adds a Start menu entry and, optionally, a desktop icon and the .traj and .tpy (project) file
10
+ ; associations.
10
11
  ; Installing a newer version over an existing one updates it in place.
11
12
 
12
13
  #define AppName "Trajectopy"
@@ -51,6 +52,7 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
51
52
  [Tasks]
52
53
  Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
53
54
  Name: "associate"; Description: "Open .traj files with {#AppName}"; GroupDescription: "File associations:"
55
+ Name: "associateproject"; Description: "Open {#AppName} projects (.tpy)"; GroupDescription: "File associations:"
54
56
 
55
57
  [InstallDelete]
56
58
  ; an update replaces the bundled libraries completely, so that no files of the previous version remain
@@ -72,6 +74,13 @@ Root: HKA; Subkey: "Software\Classes\Trajectopy.traj"; ValueType: string; ValueN
72
74
  Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: associate
73
75
  Root: HKA; Subkey: "Software\Classes\Trajectopy.traj\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: associate
74
76
  Root: HKA; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".traj"; ValueData: ""; Flags: uninsdeletekey; Tasks: associate
77
+ ; .tpy project files: created by Trajectopy only, so it is always their default program
78
+ Root: HKA; Subkey: "Software\Classes\.tpy"; ValueType: string; ValueName: ""; ValueData: "Trajectopy.tpy"; Flags: uninsdeletevalue; Tasks: associateproject
79
+ Root: HKA; Subkey: "Software\Classes\.tpy\OpenWithProgids"; ValueType: string; ValueName: "Trajectopy.tpy"; ValueData: ""; Flags: uninsdeletevalue; Tasks: associateproject
80
+ Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy"; ValueType: string; ValueName: ""; ValueData: "Trajectopy Project"; Flags: uninsdeletekey; Tasks: associateproject
81
+ Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: associateproject
82
+ Root: HKA; Subkey: "Software\Classes\Trajectopy.tpy\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: associateproject
83
+ Root: HKA; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".tpy"; ValueData: ""; Flags: uninsdeletekey; Tasks: associateproject
75
84
 
76
85
  [Run]
77
86
  Filename: "{app}\{#AppExe}"; Description: "{cm:LaunchProgram,{#AppName}}"; Flags: nowait postinstall skipifsilent
@@ -119,6 +119,36 @@ class TestReadTrajectory(unittest.TestCase):
119
119
  self._assert_same_as_general_reader(text)
120
120
 
121
121
 
122
+ class TestDatetimeTimeSystems(unittest.TestCase):
123
+ TEMPLATE = (
124
+ "#fields t,px,py,pz\n#time_format datetime\n{header}"
125
+ "2024-01-01 12:00:00.000,0,0,0\n2024-01-01 12:00:00.100,1,0,0\n"
126
+ )
127
+ UTC_2024 = 1704110400.0 # 2024-01-01 12:00:00 UTC
128
+
129
+ def _timestamps(self, header: str) -> np.ndarray:
130
+ with tempfile.TemporaryDirectory() as directory:
131
+ filename = os.path.join(directory, "trajectory.traj")
132
+ with open(filename, "w", encoding="utf-8") as file:
133
+ file.write(self.TEMPLATE.format(header=header))
134
+ return read_trajectory(filename).timestamps
135
+
136
+ def test_utc(self):
137
+ for header_lines in ("", "#datetime_timezone UTC\n"):
138
+ np.testing.assert_allclose(self._timestamps(header_lines), [self.UTC_2024, self.UTC_2024 + 0.1])
139
+
140
+ def test_gps_time_subtracts_the_leap_seconds(self):
141
+ np.testing.assert_allclose(
142
+ self._timestamps("#datetime_timezone GPS\n"), [self.UTC_2024 - 18, self.UTC_2024 - 18 + 0.1]
143
+ )
144
+
145
+ def test_other_time_zones_are_read_as_utc_with_a_warning(self):
146
+ with self.assertLogs(ascii.logger, level="WARNING") as logs:
147
+ timestamps = self._timestamps("#datetime_timezone Europe/Berlin\n")
148
+ np.testing.assert_allclose(timestamps, [self.UTC_2024, self.UTC_2024 + 0.1])
149
+ self.assertTrue(any("Europe/Berlin" in message for message in logs.output))
150
+
151
+
122
152
  class TestFastExtraHint(unittest.TestCase):
123
153
  FILE = "test/data/generated_trajectory.traj"
124
154