isar 1.27.2__tar.gz → 1.28.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.

Potentially problematic release.


This version of isar might be problematic. Click here for more details.

Files changed (220) hide show
  1. {isar-1.27.2 → isar-1.28.0}/PKG-INFO +1 -1
  2. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/models/start_mission_definition.py +7 -8
  3. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/schedule/scheduling_controller.py +56 -24
  4. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -2
  5. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_mission_definition/default_mission.json +1 -5
  6. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +4 -11
  7. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/slimm_storage.py +6 -10
  8. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/uploader.py +4 -2
  9. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/utilities.py +9 -10
  10. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/PKG-INFO +1 -1
  11. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/inspection/inspection.py +1 -2
  12. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/mission/task.py +1 -1
  13. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/telemetry/payloads.py +3 -1
  14. {isar-1.27.2 → isar-1.28.0}/.dockerignore +0 -0
  15. {isar-1.27.2 → isar-1.28.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {isar-1.27.2 → isar-1.28.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  17. {isar-1.27.2 → isar-1.28.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  18. {isar-1.27.2 → isar-1.28.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  19. {isar-1.27.2 → isar-1.28.0}/.github/release.yml +0 -0
  20. {isar-1.27.2 → isar-1.28.0}/.github/workflows/compile_requirements.yml +0 -0
  21. {isar-1.27.2 → isar-1.28.0}/.github/workflows/project_automations.yml +0 -0
  22. {isar-1.27.2 → isar-1.28.0}/.github/workflows/pythonpackage.yml +0 -0
  23. {isar-1.27.2 → isar-1.28.0}/.github/workflows/pythonpublish.yml +0 -0
  24. {isar-1.27.2 → isar-1.28.0}/.github/workflows/stale.yml +0 -0
  25. {isar-1.27.2 → isar-1.28.0}/.gitignore +0 -0
  26. {isar-1.27.2 → isar-1.28.0}/.pre-commit-config.yaml +0 -0
  27. {isar-1.27.2 → isar-1.28.0}/LICENSE +0 -0
  28. {isar-1.27.2 → isar-1.28.0}/README.md +0 -0
  29. {isar-1.27.2 → isar-1.28.0}/SECURITY.md +0 -0
  30. {isar-1.27.2 → isar-1.28.0}/docs/Makefile +0 -0
  31. {isar-1.27.2 → isar-1.28.0}/docs/full_state_machine_diagram.png +0 -0
  32. {isar-1.27.2 → isar-1.28.0}/docs/make.bat +0 -0
  33. {isar-1.27.2 → isar-1.28.0}/docs/mission_state_machine_diagram.png +0 -0
  34. {isar-1.27.2 → isar-1.28.0}/docs/robot_status_state_machine_diagram.png +0 -0
  35. {isar-1.27.2 → isar-1.28.0}/docs/rst_processing.py +0 -0
  36. {isar-1.27.2 → isar-1.28.0}/docs/source/conf.py +0 -0
  37. {isar-1.27.2 → isar-1.28.0}/docs/source/index.rst +0 -0
  38. {isar-1.27.2 → isar-1.28.0}/docs/source/readme_link.md +0 -0
  39. {isar-1.27.2 → isar-1.28.0}/docs/update_state_diagram.py +0 -0
  40. {isar-1.27.2 → isar-1.28.0}/main.py +0 -0
  41. {isar-1.27.2 → isar-1.28.0}/pyproject.toml +0 -0
  42. {isar-1.27.2 → isar-1.28.0}/radixconfig.yml +0 -0
  43. {isar-1.27.2 → isar-1.28.0}/requirements.txt +0 -0
  44. {isar-1.27.2 → isar-1.28.0}/setup.cfg +0 -0
  45. {isar-1.27.2 → isar-1.28.0}/src/isar/__init__.py +0 -0
  46. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/__init__.py +0 -0
  47. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/api.py +0 -0
  48. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/models/__init__.py +0 -0
  49. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/models/models.py +0 -0
  50. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/robot_control/robot_controller.py +0 -0
  51. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/schedule/__init__.py +0 -0
  52. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/security/__init__.py +0 -0
  53. {isar-1.27.2 → isar-1.28.0}/src/isar/apis/security/authentication.py +0 -0
  54. {isar-1.27.2 → isar-1.28.0}/src/isar/config/__init__.py +0 -0
  55. {isar-1.27.2 → isar-1.28.0}/src/isar/config/certs/ca-cert.pem +0 -0
  56. {isar-1.27.2 → isar-1.28.0}/src/isar/config/configuration_error.py +0 -0
  57. {isar-1.27.2 → isar-1.28.0}/src/isar/config/keyvault/__init__.py +0 -0
  58. {isar-1.27.2 → isar-1.28.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
  59. {isar-1.27.2 → isar-1.28.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
  60. {isar-1.27.2 → isar-1.28.0}/src/isar/config/log.py +0 -0
  61. {isar-1.27.2 → isar-1.28.0}/src/isar/config/logging.conf +0 -0
  62. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  63. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  64. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/default_map.json +0 -0
  65. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/klab_b.json +0 -0
  66. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/klab_compressor.json +0 -0
  67. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
  68. {isar-1.27.2 → isar-1.28.0}/src/isar/config/maps/turtleworld.json +0 -0
  69. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  70. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_missions/__init__.py +0 -0
  71. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_missions/default.json +0 -0
  72. {isar-1.27.2 → isar-1.28.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  73. {isar-1.27.2 → isar-1.28.0}/src/isar/config/settings.env +0 -0
  74. {isar-1.27.2 → isar-1.28.0}/src/isar/config/settings.py +0 -0
  75. {isar-1.27.2 → isar-1.28.0}/src/isar/mission_planner/__init__.py +0 -0
  76. {isar-1.27.2 → isar-1.28.0}/src/isar/mission_planner/local_planner.py +0 -0
  77. {isar-1.27.2 → isar-1.28.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  78. {isar-1.27.2 → isar-1.28.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  79. {isar-1.27.2 → isar-1.28.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
  80. {isar-1.27.2 → isar-1.28.0}/src/isar/models/__init__.py +0 -0
  81. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/__init__.py +0 -0
  82. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/message.py +0 -0
  83. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/__init__.py +0 -0
  84. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/events.py +0 -0
  85. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/queue_io.py +0 -0
  86. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  87. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/queue_utils.py +0 -0
  88. {isar-1.27.2 → isar-1.28.0}/src/isar/models/communication/queues/status_queue.py +0 -0
  89. {isar-1.27.2 → isar-1.28.0}/src/isar/models/mission_metadata/__init__.py +0 -0
  90. {isar-1.27.2 → isar-1.28.0}/src/isar/modules.py +0 -0
  91. {isar-1.27.2 → isar-1.28.0}/src/isar/robot/robot.py +0 -0
  92. {isar-1.27.2 → isar-1.28.0}/src/isar/robot/robot_start_mission.py +0 -0
  93. {isar-1.27.2 → isar-1.28.0}/src/isar/robot/robot_status.py +0 -0
  94. {isar-1.27.2 → isar-1.28.0}/src/isar/robot/robot_stop_mission.py +0 -0
  95. {isar-1.27.2 → isar-1.28.0}/src/isar/robot/robot_task_status.py +0 -0
  96. {isar-1.27.2 → isar-1.28.0}/src/isar/script.py +0 -0
  97. {isar-1.27.2 → isar-1.28.0}/src/isar/services/__init__.py +0 -0
  98. {isar-1.27.2 → isar-1.28.0}/src/isar/services/auth/__init__.py +0 -0
  99. {isar-1.27.2 → isar-1.28.0}/src/isar/services/auth/azure_credentials.py +0 -0
  100. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/__init__.py +0 -0
  101. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  102. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  103. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  104. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  105. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/request_handler.py +0 -0
  106. {isar-1.27.2 → isar-1.28.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
  107. {isar-1.27.2 → isar-1.28.0}/src/isar/services/utilities/__init__.py +0 -0
  108. {isar-1.27.2 → isar-1.28.0}/src/isar/services/utilities/queue_utilities.py +0 -0
  109. {isar-1.27.2 → isar-1.28.0}/src/isar/services/utilities/robot_utilities.py +0 -0
  110. {isar-1.27.2 → isar-1.28.0}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  111. {isar-1.27.2 → isar-1.28.0}/src/isar/services/utilities/threaded_request.py +0 -0
  112. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/__init__.py +0 -0
  113. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/state_machine.py +0 -0
  114. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/__init__.py +0 -0
  115. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/await_next_mission.py +0 -0
  116. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  117. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/home.py +0 -0
  118. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/monitor.py +0 -0
  119. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/offline.py +0 -0
  120. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/paused.py +0 -0
  121. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/returning_home.py +0 -0
  122. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/robot_standing_still.py +0 -0
  123. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/stopping.py +0 -0
  124. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states/unknown_status.py +0 -0
  125. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/states_enum.py +0 -0
  126. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  127. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  128. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/pause.py +0 -0
  129. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/resume.py +0 -0
  130. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  131. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  132. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
  133. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/stop.py +0 -0
  134. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  135. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/mission.py +0 -0
  136. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/return_home.py +0 -0
  137. {isar-1.27.2 → isar-1.28.0}/src/isar/state_machine/transitions/robot_status.py +0 -0
  138. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/__init__.py +0 -0
  139. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/blob_storage.py +0 -0
  140. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/local_storage.py +0 -0
  141. {isar-1.27.2 → isar-1.28.0}/src/isar/storage/storage_interface.py +0 -0
  142. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/SOURCES.txt +0 -0
  143. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/dependency_links.txt +0 -0
  144. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/entry_points.txt +0 -0
  145. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/requires.txt +0 -0
  146. {isar-1.27.2 → isar-1.28.0}/src/isar.egg-info/top_level.txt +0 -0
  147. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/__init__.py +0 -0
  148. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/__init__.py +0 -0
  149. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
  150. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  151. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/initialize/__init__.py +0 -0
  152. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/inspection/__init__.py +0 -0
  153. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/mission/__init__.py +0 -0
  154. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/mission/mission.py +0 -0
  155. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/mission/status.py +0 -0
  156. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/robots/__init__.py +0 -0
  157. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/robots/battery_state.py +0 -0
  158. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/robots/media.py +0 -0
  159. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/models/robots/robot_model.py +0 -0
  160. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/robot_interface.py +0 -0
  161. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/telemetry/__init__.py +0 -0
  162. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  163. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/test_robot_interface.py +0 -0
  164. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/utilities/__init__.py +0 -0
  165. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/utilities/json_service.py +0 -0
  166. {isar-1.27.2 → isar-1.28.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  167. {isar-1.27.2 → isar-1.28.0}/tests/__init__.py +0 -0
  168. {isar-1.27.2 → isar-1.28.0}/tests/conftest.py +0 -0
  169. {isar-1.27.2 → isar-1.28.0}/tests/integration/__init__.py +0 -0
  170. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/__init__.py +0 -0
  171. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/config/__init__.py +0 -0
  172. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  173. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  174. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  175. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
  176. {isar-1.27.2 → isar-1.28.0}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  177. {isar-1.27.2 → isar-1.28.0}/tests/isar/__init__.py +0 -0
  178. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/__init__.py +0 -0
  179. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/models/__init__.py +0 -0
  180. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/models/example_mission_definition.json +0 -0
  181. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  182. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/scheduler/__init__.py +0 -0
  183. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  184. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/security/__init__.py +0 -0
  185. {isar-1.27.2 → isar-1.28.0}/tests/isar/apis/security/test_authentication.py +0 -0
  186. {isar-1.27.2 → isar-1.28.0}/tests/isar/mission/__init__.py +0 -0
  187. {isar-1.27.2 → isar-1.28.0}/tests/isar/mission/test_mission.py +0 -0
  188. {isar-1.27.2 → isar-1.28.0}/tests/isar/models/__init__.py +0 -0
  189. {isar-1.27.2 → isar-1.28.0}/tests/isar/models/communication/__init__.py +0 -0
  190. {isar-1.27.2 → isar-1.28.0}/tests/isar/models/communication/test_queues.py +0 -0
  191. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/__init__.py +0 -0
  192. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/readers/__init__.py +0 -0
  193. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/readers/test_mission_reader.py +0 -0
  194. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/service_connections/__init__.py +0 -0
  195. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  196. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  197. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/utilities/__init__.py +0 -0
  198. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  199. {isar-1.27.2 → isar-1.28.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  200. {isar-1.27.2 → isar-1.28.0}/tests/isar/state_machine/__init__.py +0 -0
  201. {isar-1.27.2 → isar-1.28.0}/tests/isar/state_machine/states/__init__.py +0 -0
  202. {isar-1.27.2 → isar-1.28.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
  203. {isar-1.27.2 → isar-1.28.0}/tests/isar/state_machine/test_state_machine.py +0 -0
  204. {isar-1.27.2 → isar-1.28.0}/tests/isar/storage/test_blob_storage.py +0 -0
  205. {isar-1.27.2 → isar-1.28.0}/tests/isar/storage/test_uploader.py +0 -0
  206. {isar-1.27.2 → isar-1.28.0}/tests/mocks/__init__.py +0 -0
  207. {isar-1.27.2 → isar-1.28.0}/tests/mocks/blob_storage.py +0 -0
  208. {isar-1.27.2 → isar-1.28.0}/tests/mocks/mission_definition.py +0 -0
  209. {isar-1.27.2 → isar-1.28.0}/tests/mocks/mqtt_client.py +0 -0
  210. {isar-1.27.2 → isar-1.28.0}/tests/mocks/pose.py +0 -0
  211. {isar-1.27.2 → isar-1.28.0}/tests/mocks/request.py +0 -0
  212. {isar-1.27.2 → isar-1.28.0}/tests/mocks/robot_interface.py +0 -0
  213. {isar-1.27.2 → isar-1.28.0}/tests/mocks/status.py +0 -0
  214. {isar-1.27.2 → isar-1.28.0}/tests/mocks/task.py +0 -0
  215. {isar-1.27.2 → isar-1.28.0}/tests/mocks/token.py +0 -0
  216. {isar-1.27.2 → isar-1.28.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
  217. {isar-1.27.2 → isar-1.28.0}/tests/test_data/test_mission_not_working.json +0 -0
  218. {isar-1.27.2 → isar-1.28.0}/tests/test_data/test_mission_working.json +0 -0
  219. {isar-1.27.2 → isar-1.28.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  220. {isar-1.27.2 → isar-1.28.0}/tests/test_data/test_thermal_image_mission.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.27.2
3
+ Version: 1.28.0
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -39,9 +39,8 @@ class TaskType(str, Enum):
39
39
  class StartMissionInspectionDefinition(BaseModel):
40
40
  type: InspectionTypes = Field(default=InspectionTypes.image)
41
41
  inspection_target: InputPosition
42
- analysis_type: Optional[str] = None
42
+ inspection_description: Optional[str] = None
43
43
  duration: Optional[float] = None
44
- metadata: Optional[dict] = None
45
44
 
46
45
 
47
46
  class StartMissionTaskDefinition(BaseModel):
@@ -107,8 +106,8 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
107
106
  id=task_definition.id if task_definition.id else uuid4_string(),
108
107
  robot_pose=task_definition.pose.to_alitra_pose(),
109
108
  tag_id=task_definition.tag,
109
+ inspection_description=task_definition.inspection.inspection_description,
110
110
  target=task_definition.inspection.inspection_target.to_alitra_position(),
111
- metadata=task_definition.inspection.metadata,
112
111
  zoom=task_definition.zoom,
113
112
  )
114
113
  elif inspection_definition.type == InspectionTypes.video:
@@ -116,9 +115,9 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
116
115
  id=task_definition.id if task_definition.id else uuid4_string(),
117
116
  robot_pose=task_definition.pose.to_alitra_pose(),
118
117
  tag_id=task_definition.tag,
118
+ inspection_description=task_definition.inspection.inspection_description,
119
119
  target=task_definition.inspection.inspection_target.to_alitra_position(),
120
120
  duration=inspection_definition.duration,
121
- metadata=task_definition.inspection.metadata,
122
121
  zoom=task_definition.zoom,
123
122
  )
124
123
  elif inspection_definition.type == InspectionTypes.thermal_image:
@@ -126,8 +125,8 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
126
125
  id=task_definition.id if task_definition.id else uuid4_string(),
127
126
  robot_pose=task_definition.pose.to_alitra_pose(),
128
127
  tag_id=task_definition.tag,
128
+ inspection_description=task_definition.inspection.inspection_description,
129
129
  target=task_definition.inspection.inspection_target.to_alitra_position(),
130
- metadata=task_definition.inspection.metadata,
131
130
  zoom=task_definition.zoom,
132
131
  )
133
132
  elif inspection_definition.type == InspectionTypes.thermal_video:
@@ -135,9 +134,9 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
135
134
  id=task_definition.id if task_definition.id else uuid4_string(),
136
135
  robot_pose=task_definition.pose.to_alitra_pose(),
137
136
  tag_id=task_definition.tag,
137
+ inspection_description=task_definition.inspection.inspection_description,
138
138
  target=task_definition.inspection.inspection_target.to_alitra_position(),
139
139
  duration=inspection_definition.duration,
140
- metadata=task_definition.inspection.metadata,
141
140
  zoom=task_definition.zoom,
142
141
  )
143
142
  elif inspection_definition.type == InspectionTypes.audio:
@@ -145,16 +144,16 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
145
144
  id=task_definition.id if task_definition.id else uuid4_string(),
146
145
  robot_pose=task_definition.pose.to_alitra_pose(),
147
146
  tag_id=task_definition.tag,
147
+ inspection_description=task_definition.inspection.inspection_description,
148
148
  target=task_definition.inspection.inspection_target.to_alitra_position(),
149
149
  duration=inspection_definition.duration,
150
- metadata=task_definition.inspection.metadata,
151
150
  )
152
151
  elif inspection_definition.type == InspectionTypes.gas_measurement:
153
152
  return TakeGasMeasurement(
154
153
  id=task_definition.id if task_definition.id else uuid4_string(),
155
154
  robot_pose=task_definition.pose.to_alitra_pose(),
156
155
  tag_id=task_definition.tag,
157
- metadata=task_definition.inspection.metadata,
156
+ inspection_description=task_definition.inspection.inspection_description,
158
157
  )
159
158
  else:
160
159
  raise ValueError(
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from http import HTTPStatus
3
+ from threading import Lock
3
4
 
4
5
  from dependency_injector.wiring import inject
5
6
  from fastapi import Body, HTTPException, Path
@@ -29,6 +30,7 @@ class SchedulingController:
29
30
  ):
30
31
  self.scheduling_utilities: SchedulingUtilities = scheduling_utilities
31
32
  self.logger = logging.getLogger("api")
33
+ self.start_mission_lock: Lock = Lock()
32
34
 
33
35
  def start_mission_by_id(
34
36
  self,
@@ -67,46 +69,76 @@ class SchedulingController:
67
69
  self.logger.info("Received request to start new mission")
68
70
 
69
71
  if not mission_definition:
70
- error_message: str = (
72
+ error_message_no_mission_definition: str = (
71
73
  "Unprocessable entity - 'mission_definition' empty or invalid"
72
74
  )
73
- self.logger.error(error_message)
75
+ self.logger.error(error_message_no_mission_definition)
74
76
  raise HTTPException(
75
- status_code=HTTPStatus.UNPROCESSABLE_ENTITY, detail=error_message
77
+ status_code=HTTPStatus.UNPROCESSABLE_ENTITY,
78
+ detail=error_message_no_mission_definition,
76
79
  )
77
80
 
78
- state: States = self.scheduling_utilities.get_state()
79
- self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
81
+ if not self.start_mission_lock.acquire(blocking=False):
82
+ error_message_another_mission_starting: str = (
83
+ "Conflict - Another mission is currently being started"
84
+ )
85
+ self.logger.warning(error_message_another_mission_starting)
86
+ raise HTTPException(
87
+ status_code=HTTPStatus.CONFLICT,
88
+ detail=error_message_another_mission_starting,
89
+ )
80
90
 
81
91
  try:
82
- mission: Mission = to_isar_mission(
83
- start_mission_definition=mission_definition
92
+ state: States = self.scheduling_utilities.get_state()
93
+ self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(
94
+ state
84
95
  )
85
- except MissionPlannerError as e:
86
- error_message = f"Bad Request - Cannot create ISAR mission: {e}"
87
- self.logger.warning(error_message)
88
- raise HTTPException(
89
- status_code=HTTPStatus.BAD_REQUEST,
90
- detail=error_message,
96
+
97
+ try:
98
+ mission: Mission = to_isar_mission(
99
+ start_mission_definition=mission_definition
100
+ )
101
+ except MissionPlannerError as e:
102
+ error_message = f"Bad Request - Cannot create ISAR mission: {e}"
103
+ self.logger.warning(error_message)
104
+ raise HTTPException(
105
+ status_code=HTTPStatus.BAD_REQUEST,
106
+ detail=error_message,
107
+ )
108
+
109
+ self.scheduling_utilities.verify_robot_capable_of_mission(
110
+ mission=mission, robot_capabilities=robot_settings.CAPABILITIES
91
111
  )
92
112
 
93
- self.scheduling_utilities.verify_robot_capable_of_mission(
94
- mission=mission, robot_capabilities=robot_settings.CAPABILITIES
95
- )
113
+ self.logger.info("Starting mission: %s", mission.id)
114
+ self.scheduling_utilities.start_mission(mission=mission)
115
+ return self._api_response(mission)
96
116
 
97
- self.logger.info("Starting mission: %s", mission.id)
98
- self.scheduling_utilities.start_mission(mission=mission)
99
- return self._api_response(mission)
117
+ finally:
118
+ self.start_mission_lock.release()
100
119
 
101
120
  def return_home(self) -> None:
102
121
  self.logger.info("Received request to return home")
103
122
 
104
- state: States = self.scheduling_utilities.get_state()
105
- self.scheduling_utilities.verify_state_machine_ready_to_receive_return_home_mission(
106
- state
107
- )
123
+ if not self.start_mission_lock.acquire(blocking=False):
124
+ error_message_another_mission_starting: str = (
125
+ "Conflict - Another mission is currently being started"
126
+ )
127
+ self.logger.warning(error_message_another_mission_starting)
128
+ raise HTTPException(
129
+ status_code=HTTPStatus.CONFLICT,
130
+ detail=error_message_another_mission_starting,
131
+ )
132
+
133
+ try:
134
+ state: States = self.scheduling_utilities.get_state()
135
+ self.scheduling_utilities.verify_state_machine_ready_to_receive_return_home_mission(
136
+ state
137
+ )
108
138
 
109
- self.scheduling_utilities.return_home()
139
+ self.scheduling_utilities.return_home()
140
+ finally:
141
+ self.start_mission_lock.release()
110
142
 
111
143
  def pause_mission(self) -> ControlMissionResponse:
112
144
  self.logger.info("Received request to pause current mission")
@@ -28,7 +28,6 @@
28
28
  "z": 0.6145,
29
29
  "frame_name": "robot"
30
30
  },
31
- "analysis_types": "CarSeal, Rust",
32
31
  "metadata": {
33
32
  "zoom": "2x"
34
33
  }
@@ -41,7 +40,6 @@
41
40
  "z": 0.6145,
42
41
  "frame_name": "robot"
43
42
  },
44
- "analysis_types": "GasDetection",
45
43
  "duration": 10
46
44
  }
47
45
  ]
@@ -28,7 +28,6 @@
28
28
  "z": 0,
29
29
  "frame_name": "robot"
30
30
  },
31
- "analysis_types": "CarSeal, Rust",
32
31
  "metadata": {
33
32
  "zoom": "2x"
34
33
  }
@@ -41,8 +40,6 @@
41
40
  "z": 0,
42
41
  "frame_name": "robot"
43
42
  },
44
- "analysis_types": "GasDetection"
45
- ,
46
43
  "duration": 10
47
44
  }
48
45
  ]
@@ -72,8 +69,7 @@
72
69
  "y": 0,
73
70
  "z": 0,
74
71
  "frame_name": "robot"
75
- },
76
- "analysis_types": "ColdSpot,HotSpot"
72
+ }
77
73
  },
78
74
  {
79
75
  "type": "Video",
@@ -28,8 +28,6 @@
28
28
  "z": 0,
29
29
  "frame": "robot"
30
30
  },
31
- "analysis_types": "CarSeal, Rust"
32
- ,
33
31
  "metadata": {
34
32
  "zoom": "2x"
35
33
  }
@@ -41,8 +39,7 @@
41
39
  "y": 4.9,
42
40
  "z": 0,
43
41
  "frame": "robot"
44
- },
45
- "analysis_types": "GasDetection"
42
+ }
46
43
  }
47
44
  ]
48
45
  },
@@ -72,9 +69,7 @@
72
69
  "y": 5.2,
73
70
  "z": 0,
74
71
  "frame": "robot"
75
- },
76
- "analysis_types": "ColdSpot, HotSpot"
77
-
72
+ }
78
73
  }
79
74
  ]
80
75
  },
@@ -104,8 +99,7 @@
104
99
  "y": 5.2,
105
100
  "z": 0,
106
101
  "frame": "robot"
107
- },
108
- "analysis_types": "ColdSpot, HotSpot"
102
+ }
109
103
  },
110
104
  {
111
105
  "type": "ThermalImage",
@@ -114,8 +108,7 @@
114
108
  "y": 1.9,
115
109
  "z": 0,
116
110
  "frame": "robot"
117
- },
118
- "analysis_types": "ColdSpot, HotSpot"
111
+ }
119
112
  }
120
113
  ]
121
114
  }
@@ -125,13 +125,11 @@ class SlimmStorage(StorageInterface):
125
125
  "ImageMetadata.CameraOrientation2": str(array_of_orientation[1]),
126
126
  "ImageMetadata.CameraOrientation3": str(array_of_orientation[2]),
127
127
  "ImageMetadata.CameraOrientation4": str(array_of_orientation[3]),
128
- "ImageMetadata.AnalysisMethods": (
129
- inspection.metadata.additional["analysis_type"]
130
- if inspection.metadata.additional
131
- and inspection.metadata.additional["analysis_type"]
128
+ "ImageMetadata.Description": (
129
+ inspection.metadata.inspection_description
130
+ if inspection.metadata.inspection_description
132
131
  else "N/A"
133
132
  ),
134
- "ImageMetadata.Description": str(inspection.metadata.additional),
135
133
  "ImageMetadata.FunctionalLocation": (
136
134
  inspection.metadata.tag_id # noqa: E501
137
135
  if inspection.metadata.tag_id
@@ -175,13 +173,11 @@ class SlimmStorage(StorageInterface):
175
173
  "VideoMetadata.CameraOrientation2": str(array_of_orientation[1]),
176
174
  "VideoMetadata.CameraOrientation3": str(array_of_orientation[2]),
177
175
  "VideoMetadata.CameraOrientation4": str(array_of_orientation[3]),
178
- "VideoMetadata.AnalysisMethods": (
179
- inspection.metadata.additional["analysis_type"]
180
- if inspection.metadata.additional
181
- and inspection.metadata.additional["analysis_type"]
176
+ "VideoMetadata.Description": (
177
+ inspection.metadata.inspection_description
178
+ if inspection.metadata.inspection_description
182
179
  else "N/A"
183
180
  ),
184
- "VideoMetadata.Description": str(inspection.metadata.additional),
185
181
  "VideoMetadata.FunctionalLocation": (
186
182
  inspection.metadata.tag_id # noqa: E501
187
183
  if inspection.metadata.tag_id
@@ -163,8 +163,10 @@ class Uploader:
163
163
  inspection_id=inspection.id,
164
164
  inspection_path=inspection_path,
165
165
  installation_code=settings.PLANT_SHORT_NAME,
166
- analysis_to_be_run=inspection.metadata.analysis_type,
167
- timestamp=datetime.now(timezone.utc),
166
+ tag_id=inspection.metadata.tag_id,
167
+ inspection_type=type(inspection).__name__,
168
+ inspection_description=inspection.metadata.inspection_description,
169
+ timestamp=inspection.metadata.start_time,
168
170
  )
169
171
  self.mqtt_publisher.publish(
170
172
  topic=settings.TOPIC_ISAR_INSPECTION_RESULT,
@@ -1,5 +1,4 @@
1
1
  import json
2
- import time
3
2
  from datetime import datetime, timezone
4
3
  from pathlib import Path
5
4
  from typing import Tuple
@@ -41,11 +40,7 @@ def construct_metadata_file(
41
40
  "plant_name": settings.PLANT_NAME,
42
41
  "isar_id": settings.ISAR_ID,
43
42
  "robot_name": settings.ROBOT_NAME,
44
- "analysis_type": (
45
- inspection.metadata.additional["analysis_type"]
46
- if inspection.metadata.additional
47
- else "N/A"
48
- ),
43
+ "inspection_description": inspection.metadata.inspection_description,
49
44
  },
50
45
  "data": [
51
46
  {
@@ -71,12 +66,16 @@ def construct_metadata_file(
71
66
 
72
67
 
73
68
  def get_filename(inspection: Inspection) -> str:
74
- inspection_type: str = type(inspection).__name__
69
+ utc_time: str = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
75
70
  tag: str = inspection.metadata.tag_id if inspection.metadata.tag_id else "no-tag"
76
- epoch_time: int = int(time.time())
77
- return f"{tag}__{inspection_type}__{epoch_time}"
71
+ inspection_type: str = type(inspection).__name__
72
+ inspection_description: str = inspection.metadata.inspection_description.replace(
73
+ " ", "-"
74
+ )
75
+ return f"{tag}__{inspection_type}__{inspection_description}__{utc_time}"
78
76
 
79
77
 
80
78
  def get_foldername(mission: Mission) -> str:
79
+ utc_date: str = datetime.now(timezone.utc).strftime("%Y-%m-%d")
81
80
  mission_name: str = mission.name.replace(" ", "-")
82
- return f"{datetime.now(timezone.utc).date()}__{settings.PLANT_SHORT_NAME}__{mission_name}__{mission.id}"
81
+ return f"{utc_date}__{settings.PLANT_SHORT_NAME}__{mission_name}__{mission.id}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.27.2
3
+ Version: 1.28.0
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -12,9 +12,8 @@ class InspectionMetadata(ABC):
12
12
  start_time: datetime
13
13
  pose: Pose
14
14
  file_type: str
15
- analysis_type: Optional[str] = field(default=None, init=False)
16
15
  tag_id: Optional[str] = field(default=None, init=False)
17
- additional: Optional[dict] = field(default_factory=dict, init=False)
16
+ inspection_description: Optional[str] = field(default=None, init=False)
18
17
 
19
18
 
20
19
  @dataclass
@@ -61,7 +61,7 @@ class InspectionTask(Task):
61
61
 
62
62
  inspection_id: str = Field(default_factory=uuid4_string, frozen=True)
63
63
  robot_pose: Pose = Field(default=None, init=True)
64
- metadata: Optional[dict] = Field(default_factory=dict)
64
+ inspection_description: Optional[str] = Field(default=None)
65
65
  zoom: Optional[ZoomDescription] = Field(default=None)
66
66
 
67
67
  @staticmethod
@@ -111,5 +111,7 @@ class InspectionResultPayload:
111
111
  inspection_id: str
112
112
  inspection_path: Union[str, dict]
113
113
  installation_code: str
114
- analysis_to_be_run: Optional[str]
114
+ tag_id: Optional[str]
115
+ inspection_type: Optional[str]
116
+ inspection_description: Optional[str]
115
117
  timestamp: datetime
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes