isar 1.28.3__tar.gz → 1.29.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.28.3 → isar-1.29.0}/PKG-INFO +1 -1
  2. {isar-1.28.3 → isar-1.29.0}/requirements.txt +5 -5
  3. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/models/start_mission_definition.py +4 -4
  4. {isar-1.28.3 → isar-1.29.0}/src/isar/config/settings.py +3 -0
  5. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/uploader.py +103 -26
  6. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/PKG-INFO +1 -1
  7. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/inspection/inspection.py +19 -7
  8. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/mission/task.py +6 -8
  9. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/robot_interface.py +1 -29
  10. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/telemetry/payloads.py +17 -0
  11. {isar-1.28.3 → isar-1.29.0}/tests/isar/storage/test_uploader.py +7 -3
  12. {isar-1.28.3 → isar-1.29.0}/.dockerignore +0 -0
  13. {isar-1.28.3 → isar-1.29.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {isar-1.28.3 → isar-1.29.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  15. {isar-1.28.3 → isar-1.29.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  16. {isar-1.28.3 → isar-1.29.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {isar-1.28.3 → isar-1.29.0}/.github/release.yml +0 -0
  18. {isar-1.28.3 → isar-1.29.0}/.github/workflows/compile_requirements.yml +0 -0
  19. {isar-1.28.3 → isar-1.29.0}/.github/workflows/project_automations.yml +0 -0
  20. {isar-1.28.3 → isar-1.29.0}/.github/workflows/pythonpackage.yml +0 -0
  21. {isar-1.28.3 → isar-1.29.0}/.github/workflows/pythonpublish.yml +0 -0
  22. {isar-1.28.3 → isar-1.29.0}/.github/workflows/stale.yml +0 -0
  23. {isar-1.28.3 → isar-1.29.0}/.gitignore +0 -0
  24. {isar-1.28.3 → isar-1.29.0}/.pre-commit-config.yaml +0 -0
  25. {isar-1.28.3 → isar-1.29.0}/LICENSE +0 -0
  26. {isar-1.28.3 → isar-1.29.0}/README.md +0 -0
  27. {isar-1.28.3 → isar-1.29.0}/SECURITY.md +0 -0
  28. {isar-1.28.3 → isar-1.29.0}/docs/Makefile +0 -0
  29. {isar-1.28.3 → isar-1.29.0}/docs/full_state_machine_diagram.png +0 -0
  30. {isar-1.28.3 → isar-1.29.0}/docs/make.bat +0 -0
  31. {isar-1.28.3 → isar-1.29.0}/docs/mission_state_machine_diagram.png +0 -0
  32. {isar-1.28.3 → isar-1.29.0}/docs/robot_status_state_machine_diagram.png +0 -0
  33. {isar-1.28.3 → isar-1.29.0}/docs/rst_processing.py +0 -0
  34. {isar-1.28.3 → isar-1.29.0}/docs/source/conf.py +0 -0
  35. {isar-1.28.3 → isar-1.29.0}/docs/source/index.rst +0 -0
  36. {isar-1.28.3 → isar-1.29.0}/docs/source/readme_link.md +0 -0
  37. {isar-1.28.3 → isar-1.29.0}/docs/update_state_diagram.py +0 -0
  38. {isar-1.28.3 → isar-1.29.0}/main.py +0 -0
  39. {isar-1.28.3 → isar-1.29.0}/pyproject.toml +0 -0
  40. {isar-1.28.3 → isar-1.29.0}/radixconfig.yml +0 -0
  41. {isar-1.28.3 → isar-1.29.0}/setup.cfg +0 -0
  42. {isar-1.28.3 → isar-1.29.0}/src/isar/__init__.py +0 -0
  43. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/__init__.py +0 -0
  44. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/api.py +0 -0
  45. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/models/__init__.py +0 -0
  46. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/models/models.py +0 -0
  47. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/robot_control/robot_controller.py +0 -0
  48. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/schedule/__init__.py +0 -0
  49. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  50. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/security/__init__.py +0 -0
  51. {isar-1.28.3 → isar-1.29.0}/src/isar/apis/security/authentication.py +0 -0
  52. {isar-1.28.3 → isar-1.29.0}/src/isar/config/__init__.py +0 -0
  53. {isar-1.28.3 → isar-1.29.0}/src/isar/config/certs/ca-cert.pem +0 -0
  54. {isar-1.28.3 → isar-1.29.0}/src/isar/config/configuration_error.py +0 -0
  55. {isar-1.28.3 → isar-1.29.0}/src/isar/config/keyvault/__init__.py +0 -0
  56. {isar-1.28.3 → isar-1.29.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
  57. {isar-1.28.3 → isar-1.29.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
  58. {isar-1.28.3 → isar-1.29.0}/src/isar/config/log.py +0 -0
  59. {isar-1.28.3 → isar-1.29.0}/src/isar/config/logging.conf +0 -0
  60. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  61. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  62. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/default_map.json +0 -0
  63. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/klab_b.json +0 -0
  64. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/klab_compressor.json +0 -0
  65. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
  66. {isar-1.28.3 → isar-1.29.0}/src/isar/config/maps/turtleworld.json +0 -0
  67. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  68. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  69. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  70. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  71. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_missions/__init__.py +0 -0
  72. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_missions/default.json +0 -0
  73. {isar-1.28.3 → isar-1.29.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  74. {isar-1.28.3 → isar-1.29.0}/src/isar/config/settings.env +0 -0
  75. {isar-1.28.3 → isar-1.29.0}/src/isar/mission_planner/__init__.py +0 -0
  76. {isar-1.28.3 → isar-1.29.0}/src/isar/mission_planner/local_planner.py +0 -0
  77. {isar-1.28.3 → isar-1.29.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  78. {isar-1.28.3 → isar-1.29.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  79. {isar-1.28.3 → isar-1.29.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
  80. {isar-1.28.3 → isar-1.29.0}/src/isar/models/__init__.py +0 -0
  81. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/__init__.py +0 -0
  82. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/message.py +0 -0
  83. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/__init__.py +0 -0
  84. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/events.py +0 -0
  85. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/queue_io.py +0 -0
  86. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  87. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/queue_utils.py +0 -0
  88. {isar-1.28.3 → isar-1.29.0}/src/isar/models/communication/queues/status_queue.py +0 -0
  89. {isar-1.28.3 → isar-1.29.0}/src/isar/models/mission_metadata/__init__.py +0 -0
  90. {isar-1.28.3 → isar-1.29.0}/src/isar/modules.py +0 -0
  91. {isar-1.28.3 → isar-1.29.0}/src/isar/robot/robot.py +0 -0
  92. {isar-1.28.3 → isar-1.29.0}/src/isar/robot/robot_start_mission.py +0 -0
  93. {isar-1.28.3 → isar-1.29.0}/src/isar/robot/robot_status.py +0 -0
  94. {isar-1.28.3 → isar-1.29.0}/src/isar/robot/robot_stop_mission.py +0 -0
  95. {isar-1.28.3 → isar-1.29.0}/src/isar/robot/robot_task_status.py +0 -0
  96. {isar-1.28.3 → isar-1.29.0}/src/isar/script.py +0 -0
  97. {isar-1.28.3 → isar-1.29.0}/src/isar/services/__init__.py +0 -0
  98. {isar-1.28.3 → isar-1.29.0}/src/isar/services/auth/__init__.py +0 -0
  99. {isar-1.28.3 → isar-1.29.0}/src/isar/services/auth/azure_credentials.py +0 -0
  100. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/__init__.py +0 -0
  101. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  102. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  103. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  104. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  105. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/request_handler.py +0 -0
  106. {isar-1.28.3 → isar-1.29.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
  107. {isar-1.28.3 → isar-1.29.0}/src/isar/services/utilities/__init__.py +0 -0
  108. {isar-1.28.3 → isar-1.29.0}/src/isar/services/utilities/queue_utilities.py +0 -0
  109. {isar-1.28.3 → isar-1.29.0}/src/isar/services/utilities/robot_utilities.py +0 -0
  110. {isar-1.28.3 → isar-1.29.0}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  111. {isar-1.28.3 → isar-1.29.0}/src/isar/services/utilities/threaded_request.py +0 -0
  112. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/__init__.py +0 -0
  113. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/state_machine.py +0 -0
  114. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/__init__.py +0 -0
  115. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/await_next_mission.py +0 -0
  116. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  117. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/home.py +0 -0
  118. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/monitor.py +0 -0
  119. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/offline.py +0 -0
  120. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/paused.py +0 -0
  121. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/returning_home.py +0 -0
  122. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/robot_standing_still.py +0 -0
  123. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/stopping.py +0 -0
  124. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states/unknown_status.py +0 -0
  125. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/states_enum.py +0 -0
  126. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  127. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  128. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/pause.py +0 -0
  129. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/resume.py +0 -0
  130. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  131. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  132. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
  133. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/stop.py +0 -0
  134. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  135. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/mission.py +0 -0
  136. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/return_home.py +0 -0
  137. {isar-1.28.3 → isar-1.29.0}/src/isar/state_machine/transitions/robot_status.py +0 -0
  138. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/__init__.py +0 -0
  139. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/blob_storage.py +0 -0
  140. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/local_storage.py +0 -0
  141. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/slimm_storage.py +0 -0
  142. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/storage_interface.py +0 -0
  143. {isar-1.28.3 → isar-1.29.0}/src/isar/storage/utilities.py +0 -0
  144. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/SOURCES.txt +0 -0
  145. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/dependency_links.txt +0 -0
  146. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/entry_points.txt +0 -0
  147. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/requires.txt +0 -0
  148. {isar-1.28.3 → isar-1.29.0}/src/isar.egg-info/top_level.txt +0 -0
  149. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/__init__.py +0 -0
  150. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/__init__.py +0 -0
  151. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
  152. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  153. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/initialize/__init__.py +0 -0
  154. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/inspection/__init__.py +0 -0
  155. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/mission/__init__.py +0 -0
  156. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/mission/mission.py +0 -0
  157. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/mission/status.py +0 -0
  158. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/robots/__init__.py +0 -0
  159. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/robots/battery_state.py +0 -0
  160. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/robots/media.py +0 -0
  161. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/models/robots/robot_model.py +0 -0
  162. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/telemetry/__init__.py +0 -0
  163. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  164. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/test_robot_interface.py +0 -0
  165. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/utilities/__init__.py +0 -0
  166. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/utilities/json_service.py +0 -0
  167. {isar-1.28.3 → isar-1.29.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  168. {isar-1.28.3 → isar-1.29.0}/tests/__init__.py +0 -0
  169. {isar-1.28.3 → isar-1.29.0}/tests/conftest.py +0 -0
  170. {isar-1.28.3 → isar-1.29.0}/tests/integration/__init__.py +0 -0
  171. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/__init__.py +0 -0
  172. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/config/__init__.py +0 -0
  173. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  174. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  175. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  176. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
  177. {isar-1.28.3 → isar-1.29.0}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  178. {isar-1.28.3 → isar-1.29.0}/tests/isar/__init__.py +0 -0
  179. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/__init__.py +0 -0
  180. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/models/__init__.py +0 -0
  181. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/models/example_mission_definition.json +0 -0
  182. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  183. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/scheduler/__init__.py +0 -0
  184. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  185. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/security/__init__.py +0 -0
  186. {isar-1.28.3 → isar-1.29.0}/tests/isar/apis/security/test_authentication.py +0 -0
  187. {isar-1.28.3 → isar-1.29.0}/tests/isar/mission/__init__.py +0 -0
  188. {isar-1.28.3 → isar-1.29.0}/tests/isar/mission/test_mission.py +0 -0
  189. {isar-1.28.3 → isar-1.29.0}/tests/isar/models/__init__.py +0 -0
  190. {isar-1.28.3 → isar-1.29.0}/tests/isar/models/communication/__init__.py +0 -0
  191. {isar-1.28.3 → isar-1.29.0}/tests/isar/models/communication/test_queues.py +0 -0
  192. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/__init__.py +0 -0
  193. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/readers/__init__.py +0 -0
  194. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/readers/test_mission_reader.py +0 -0
  195. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/service_connections/__init__.py +0 -0
  196. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  197. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  198. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/utilities/__init__.py +0 -0
  199. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  200. {isar-1.28.3 → isar-1.29.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  201. {isar-1.28.3 → isar-1.29.0}/tests/isar/state_machine/__init__.py +0 -0
  202. {isar-1.28.3 → isar-1.29.0}/tests/isar/state_machine/states/__init__.py +0 -0
  203. {isar-1.28.3 → isar-1.29.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
  204. {isar-1.28.3 → isar-1.29.0}/tests/isar/state_machine/test_state_machine.py +0 -0
  205. {isar-1.28.3 → isar-1.29.0}/tests/isar/storage/test_blob_storage.py +0 -0
  206. {isar-1.28.3 → isar-1.29.0}/tests/mocks/__init__.py +0 -0
  207. {isar-1.28.3 → isar-1.29.0}/tests/mocks/blob_storage.py +0 -0
  208. {isar-1.28.3 → isar-1.29.0}/tests/mocks/mission_definition.py +0 -0
  209. {isar-1.28.3 → isar-1.29.0}/tests/mocks/mqtt_client.py +0 -0
  210. {isar-1.28.3 → isar-1.29.0}/tests/mocks/pose.py +0 -0
  211. {isar-1.28.3 → isar-1.29.0}/tests/mocks/request.py +0 -0
  212. {isar-1.28.3 → isar-1.29.0}/tests/mocks/robot_interface.py +0 -0
  213. {isar-1.28.3 → isar-1.29.0}/tests/mocks/status.py +0 -0
  214. {isar-1.28.3 → isar-1.29.0}/tests/mocks/task.py +0 -0
  215. {isar-1.28.3 → isar-1.29.0}/tests/mocks/token.py +0 -0
  216. {isar-1.28.3 → isar-1.29.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
  217. {isar-1.28.3 → isar-1.29.0}/tests/test_data/test_mission_not_working.json +0 -0
  218. {isar-1.28.3 → isar-1.29.0}/tests/test_data/test_mission_working.json +0 -0
  219. {isar-1.28.3 → isar-1.29.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  220. {isar-1.28.3 → isar-1.29.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.28.3
3
+ Version: 1.29.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,11 +39,11 @@ cffi==1.17.1
39
39
  # via cryptography
40
40
  charset-normalizer==3.4.2
41
41
  # via requests
42
- click==8.2.0
42
+ click==8.2.1
43
43
  # via
44
44
  # isar (pyproject.toml)
45
45
  # uvicorn
46
- cryptography==44.0.3
46
+ cryptography==45.0.2
47
47
  # via
48
48
  # azure-identity
49
49
  # azure-storage-blob
@@ -64,7 +64,7 @@ fastapi-azure-auth==5.1.1
64
64
  # via isar (pyproject.toml)
65
65
  google-api-core==2.24.2
66
66
  # via opencensus
67
- google-auth==2.40.1
67
+ google-auth==2.40.2
68
68
  # via google-api-core
69
69
  googleapis-common-protos==1.70.0
70
70
  # via google-api-core
@@ -91,7 +91,7 @@ msal==1.32.3
91
91
  # msal-extensions
92
92
  msal-extensions==1.3.1
93
93
  # via azure-identity
94
- numpy==2.2.5
94
+ numpy==2.2.6
95
95
  # via
96
96
  # alitra
97
97
  # isar (pyproject.toml)
@@ -184,7 +184,7 @@ typing-extensions==4.13.2
184
184
  # pydantic
185
185
  # pydantic-core
186
186
  # typing-inspection
187
- typing-inspection==0.4.0
187
+ typing-inspection==0.4.1
188
188
  # via
189
189
  # pydantic
190
190
  # pydantic-settings
@@ -12,7 +12,7 @@ from robot_interface.models.mission.task import (
12
12
  TASKS,
13
13
  RecordAudio,
14
14
  ReturnToHome,
15
- TakeGasMeasurement,
15
+ TakeCO2Measurement,
16
16
  TakeImage,
17
17
  TakeThermalImage,
18
18
  TakeThermalVideo,
@@ -28,7 +28,7 @@ class InspectionTypes(str, Enum):
28
28
  video = "Video"
29
29
  thermal_video = "ThermalVideo"
30
30
  audio = "Audio"
31
- gas_measurement = "GasMeasurement"
31
+ co2_measurement = "CO2Measurement"
32
32
 
33
33
 
34
34
  class TaskType(str, Enum):
@@ -148,8 +148,8 @@ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
148
148
  target=task_definition.inspection.inspection_target.to_alitra_position(),
149
149
  duration=inspection_definition.duration,
150
150
  )
151
- elif inspection_definition.type == InspectionTypes.gas_measurement:
152
- return TakeGasMeasurement(
151
+ elif inspection_definition.type == InspectionTypes.co2_measurement:
152
+ return TakeCO2Measurement(
153
153
  id=task_definition.id if task_definition.id else uuid4_string(),
154
154
  robot_pose=task_definition.pose.to_alitra_pose(),
155
155
  tag_id=task_definition.tag,
@@ -228,6 +228,9 @@ class Settings(BaseSettings):
228
228
  TOPIC_ISAR_INSPECTION_RESULT: str = Field(
229
229
  default="inspection_result", validate_default=True
230
230
  )
231
+ TOPIC_ISAR_INSPECTION_VALUE: str = Field(
232
+ default="inspection_value", validate_default=True
233
+ )
231
234
  TOPIC_ISAR_ROBOT_INFO: str = Field(default="robot_info", validate_default=True)
232
235
  TOPIC_ISAR_ROBOT_HEARTBEAT: str = Field(
233
236
  default="robot_heartbeat", validate_default=True
@@ -11,10 +11,17 @@ from dependency_injector.wiring import inject
11
11
  from isar.config.settings import settings
12
12
  from isar.models.communication.queues.events import Events
13
13
  from isar.storage.storage_interface import StorageException, StorageInterface
14
- from robot_interface.models.inspection.inspection import Inspection
14
+ from robot_interface.models.inspection.inspection import (
15
+ Inspection,
16
+ InspectionBlob,
17
+ InspectionValue,
18
+ )
15
19
  from robot_interface.models.mission.mission import Mission
16
20
  from robot_interface.telemetry.mqtt_client import MqttClientInterface
17
- from robot_interface.telemetry.payloads import InspectionResultPayload
21
+ from robot_interface.telemetry.payloads import (
22
+ InspectionResultPayload,
23
+ InspectionValuePayload,
24
+ )
18
25
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
19
26
 
20
27
 
@@ -22,6 +29,16 @@ from robot_interface.utilities.json_service import EnhancedJSONEncoder
22
29
  class UploaderQueueItem:
23
30
  inspection: Inspection
24
31
  mission: Mission
32
+
33
+
34
+ @dataclass
35
+ class ValueItem(UploaderQueueItem):
36
+ inspection: InspectionValue
37
+
38
+
39
+ @dataclass
40
+ class BlobItem(UploaderQueueItem):
41
+ inspection: InspectionBlob
25
42
  storage_handler: StorageInterface
26
43
  _retry_count: int
27
44
  _next_retry_time: datetime = datetime.now(timezone.utc)
@@ -100,56 +117,116 @@ class Uploader:
100
117
  )
101
118
  continue
102
119
 
103
- # If new item from thread queue, add one per handler to internal queue:
104
- for storage_handler in self.storage_handlers:
105
- new_item: UploaderQueueItem = UploaderQueueItem(
106
- inspection, mission, storage_handler, _retry_count=-1
107
- )
120
+ new_item: UploaderQueueItem
121
+ if isinstance(inspection, InspectionValue):
122
+ new_item = ValueItem(inspection, mission)
108
123
  self._internal_upload_queue.append(new_item)
124
+
125
+ elif isinstance(inspection, InspectionBlob):
126
+ # If new item from thread queue, add one per handler to internal queue:
127
+ for storage_handler in self.storage_handlers:
128
+ new_item = BlobItem(
129
+ inspection, mission, storage_handler, _retry_count=-1
130
+ )
131
+ self._internal_upload_queue.append(new_item)
132
+ else:
133
+ self.logger.warning(
134
+ f"Unable to add UploaderQueueItem as its type {type(inspection).__name__} is unsupported"
135
+ )
109
136
  except Empty:
110
137
  continue
111
138
 
112
- def _upload(self, upload_item: UploaderQueueItem) -> Union[str, dict]:
139
+ def _upload(self, item: BlobItem) -> Union[str, dict]:
113
140
  inspection_path: Union[str, dict] = ""
114
141
  try:
115
- inspection_path = upload_item.storage_handler.store(
116
- inspection=upload_item.inspection, mission=upload_item.mission
142
+ inspection_path = item.storage_handler.store(
143
+ inspection=item.inspection, mission=item.mission
117
144
  )
118
145
  self.logger.info(
119
- f"Storage handler: {type(upload_item.storage_handler).__name__} "
120
- f"uploaded inspection {str(upload_item.inspection.id)[:8]}"
146
+ f"Storage handler: {type(item.storage_handler).__name__} "
147
+ f"uploaded inspection {str(item.inspection.id)[:8]}"
121
148
  )
122
- self._internal_upload_queue.remove(upload_item)
149
+ self._internal_upload_queue.remove(item)
123
150
  except StorageException:
124
- if upload_item.get_retry_count() < self.max_retry_attempts:
125
- upload_item.increment_retry(self.max_wait_time)
151
+ if item.get_retry_count() < self.max_retry_attempts:
152
+ item.increment_retry(self.max_wait_time)
126
153
  self.logger.warning(
127
- f"Storage handler: {type(upload_item.storage_handler).__name__} "
154
+ f"Storage handler: {type(item.storage_handler).__name__} "
128
155
  f"failed to upload inspection: "
129
- f"{str(upload_item.inspection.id)[:8]}. "
130
- f"Retrying in {upload_item.seconds_until_retry()}s."
156
+ f"{str(item.inspection.id)[:8]}. "
157
+ f"Retrying in {item.seconds_until_retry()}s."
131
158
  )
132
159
  else:
133
- self._internal_upload_queue.remove(upload_item)
134
160
  self.logger.error(
135
- f"Storage handler: {type(upload_item.storage_handler).__name__} "
161
+ f"Storage handler: {type(item.storage_handler).__name__} "
136
162
  f"exceeded max retries to upload inspection: "
137
- f"{str(upload_item.inspection.id)[:8]}. Aborting upload."
163
+ f"{str(item.inspection.id)[:8]}. Aborting upload."
138
164
  )
165
+ self._internal_upload_queue.remove(item)
139
166
  return inspection_path
140
167
 
141
168
  def _process_upload_queue(self) -> None:
169
+ def should_upload(_item):
170
+ if isinstance(_item, ValueItem):
171
+ return True
172
+ if _item.is_ready_for_upload():
173
+ return True
174
+ return False
175
+
142
176
  ready_items: List[UploaderQueueItem] = [
143
- item for item in self._internal_upload_queue if item.is_ready_for_upload()
177
+ item for item in self._internal_upload_queue if should_upload(item)
144
178
  ]
145
179
  for item in ready_items:
146
- inspection_path = self._upload(item)
147
- self._publish_inspection_result(
148
- inspection=item.inspection, inspection_path=inspection_path
180
+ if isinstance(item, ValueItem):
181
+ self._publish_inspection_value(item.inspection)
182
+ self.logger.info(
183
+ f"Published value for inspection {str(item.inspection.id)[:8]}"
184
+ )
185
+ self._internal_upload_queue.remove(item)
186
+ elif isinstance(item, BlobItem):
187
+ inspection_path = self._upload(item)
188
+ self._publish_inspection_result(
189
+ inspection=item.inspection, inspection_path=inspection_path
190
+ )
191
+ else:
192
+ self.logger.warning(
193
+ f"Unable to process upload item as its type {type(item).__name__} is not supported"
194
+ )
195
+
196
+ def _publish_inspection_value(self, inspection: InspectionValue) -> None:
197
+ if not self.mqtt_publisher:
198
+ return
199
+
200
+ if not isinstance(inspection, InspectionValue):
201
+ logging.warning(
202
+ f"Excpected type InspectionValue but got {type(inspection).__name__} instead"
149
203
  )
204
+ return
205
+
206
+ payload: InspectionValuePayload = InspectionValuePayload(
207
+ isar_id=settings.ISAR_ID,
208
+ robot_name=settings.ROBOT_NAME,
209
+ inspection_id=inspection.id,
210
+ installation_code=settings.PLANT_SHORT_NAME,
211
+ tag_id=inspection.metadata.tag_id,
212
+ inspection_type=type(inspection).__name__,
213
+ inspection_description=inspection.metadata.inspection_description,
214
+ value=inspection.value,
215
+ unit=inspection.unit,
216
+ x=inspection.metadata.pose.position.x,
217
+ y=inspection.metadata.pose.position.y,
218
+ z=inspection.metadata.pose.position.z,
219
+ timestamp=inspection.metadata.start_time,
220
+ )
221
+ self.mqtt_publisher.publish(
222
+ topic=settings.TOPIC_ISAR_INSPECTION_VALUE,
223
+ payload=json.dumps(payload, cls=EnhancedJSONEncoder),
224
+ qos=1,
225
+ retain=True,
226
+ )
150
227
 
151
228
  def _publish_inspection_result(
152
- self, inspection: Inspection, inspection_path: Union[str, dict]
229
+ self, inspection: InspectionBlob, inspection_path: Union[str, dict]
153
230
  ) -> None:
154
231
  """Publishes the reference of the inspection result to the MQTT Broker
155
232
  along with the analysis type
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.28.3
3
+ Version: 1.29.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
@@ -49,14 +49,22 @@ class GasMeasurementMetadata(InspectionMetadata):
49
49
  class Inspection(BaseModel):
50
50
  metadata: InspectionMetadata
51
51
  id: str = Field(frozen=True)
52
- data: Optional[bytes] = Field(default=None, frozen=True)
53
52
 
54
53
  @staticmethod
55
54
  def get_metadata_type() -> Type[InspectionMetadata]:
56
55
  return InspectionMetadata
57
56
 
58
57
 
59
- class Image(Inspection):
58
+ class InspectionValue(Inspection):
59
+ value: float = Field(frozen=True)
60
+ unit: str = Field(frozen=True)
61
+
62
+
63
+ class InspectionBlob(Inspection):
64
+ data: Optional[bytes] = Field(default=None, frozen=True)
65
+
66
+
67
+ class Image(InspectionBlob):
60
68
  metadata: ImageMetadata
61
69
 
62
70
  @staticmethod
@@ -64,7 +72,7 @@ class Image(Inspection):
64
72
  return ImageMetadata
65
73
 
66
74
 
67
- class ThermalImage(Inspection):
75
+ class ThermalImage(InspectionBlob):
68
76
  metadata: ThermalImageMetadata
69
77
 
70
78
  @staticmethod
@@ -72,7 +80,7 @@ class ThermalImage(Inspection):
72
80
  return ThermalImageMetadata
73
81
 
74
82
 
75
- class Video(Inspection):
83
+ class Video(InspectionBlob):
76
84
  metadata: VideoMetadata
77
85
 
78
86
  @staticmethod
@@ -80,7 +88,7 @@ class Video(Inspection):
80
88
  return VideoMetadata
81
89
 
82
90
 
83
- class ThermalVideo(Inspection):
91
+ class ThermalVideo(InspectionBlob):
84
92
  metadata: ThermalVideoMetadata
85
93
 
86
94
  @staticmethod
@@ -88,7 +96,7 @@ class ThermalVideo(Inspection):
88
96
  return ThermalVideoMetadata
89
97
 
90
98
 
91
- class Audio(Inspection):
99
+ class Audio(InspectionBlob):
92
100
  metadata: AudioMetadata
93
101
 
94
102
  @staticmethod
@@ -96,9 +104,13 @@ class Audio(Inspection):
96
104
  return AudioMetadata
97
105
 
98
106
 
99
- class GasMeasurement(Inspection):
107
+ class GasMeasurement(InspectionValue):
100
108
  metadata: GasMeasurementMetadata
101
109
 
102
110
  @staticmethod
103
111
  def get_metadata_type() -> Type[InspectionMetadata]:
104
112
  return GasMeasurementMetadata
113
+
114
+
115
+ class CO2Measurement(GasMeasurement):
116
+ pass
@@ -7,7 +7,7 @@ from pydantic import BaseModel, Field
7
7
  from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
8
8
  from robot_interface.models.inspection.inspection import (
9
9
  Audio,
10
- GasMeasurement,
10
+ CO2Measurement,
11
11
  Image,
12
12
  Inspection,
13
13
  ThermalImage,
@@ -25,7 +25,7 @@ class TaskTypes(str, Enum):
25
25
  TakeThermalImage = "take_thermal_image"
26
26
  TakeVideo = "take_video"
27
27
  TakeThermalVideo = "take_thermal_video"
28
- TakeGasMeasurement = "take_gas_measurement"
28
+ TakeCO2Measurement = "take_co2_measurement"
29
29
  RecordAudio = "record_audio"
30
30
 
31
31
 
@@ -160,18 +160,16 @@ class RecordAudio(InspectionTask):
160
160
  return Audio
161
161
 
162
162
 
163
- class TakeGasMeasurement(InspectionTask):
163
+ class TakeCO2Measurement(InspectionTask):
164
164
  """
165
165
  Task which causes the robot to take a CO2 measurement at its position.
166
-
167
- Duration of audio is given in seconds.
168
166
  """
169
167
 
170
- type: Literal[TaskTypes.TakeGasMeasurement] = TaskTypes.TakeGasMeasurement
168
+ type: Literal[TaskTypes.TakeCO2Measurement] = TaskTypes.TakeCO2Measurement
171
169
 
172
170
  @staticmethod
173
171
  def get_inspection_type() -> Type[Inspection]:
174
- return GasMeasurement
172
+ return CO2Measurement
175
173
 
176
174
 
177
175
  TASKS = Union[
@@ -181,6 +179,6 @@ TASKS = Union[
181
179
  TakeThermalImage,
182
180
  TakeVideo,
183
181
  TakeThermalVideo,
184
- TakeGasMeasurement,
182
+ TakeCO2Measurement,
185
183
  RecordAudio,
186
184
  ]
@@ -6,7 +6,7 @@ from typing import Callable, List, Optional
6
6
  from robot_interface.models.inspection.inspection import Inspection
7
7
  from robot_interface.models.mission.mission import Mission
8
8
  from robot_interface.models.mission.status import RobotStatus, TaskStatus
9
- from robot_interface.models.mission.task import InspectionTask, Task
9
+ from robot_interface.models.mission.task import InspectionTask
10
10
  from robot_interface.models.robots.media import MediaConfig
11
11
 
12
12
 
@@ -37,34 +37,6 @@ class RobotInterface(metaclass=ABCMeta):
37
37
  """
38
38
  raise NotImplementedError
39
39
 
40
- @abstractmethod
41
- def initiate_task(self, task: Task) -> None:
42
- """Send a task to the robot and initiate the execution of the task
43
-
44
- Parameters
45
- ----------
46
- task : Task
47
- The task that should be initiated on the robot.
48
-
49
- Returns
50
- -------
51
- None
52
-
53
- Raises
54
- ------
55
- RobotInfeasibleTaskException
56
- If the task input is infeasible and the task fails to be scheduled in
57
- a way that means attempting to schedule again is not necessary
58
- RobotException
59
- Will catch all RobotExceptions not previously listed and retry scheduling
60
- of the task until the number of allowed retries is exceeded before the task
61
- will be marked as failed and the mission cancelled
62
- NotImplementedError
63
- If there is a mismatch between the implemented tasks and listed capabilities
64
-
65
- """
66
- raise NotImplementedError
67
-
68
40
  @abstractmethod
69
41
  def task_status(self, task_id: str) -> TaskStatus:
70
42
  """Gets the status of the currently active task on robot.
@@ -115,3 +115,20 @@ class InspectionResultPayload:
115
115
  inspection_type: Optional[str]
116
116
  inspection_description: Optional[str]
117
117
  timestamp: datetime
118
+
119
+
120
+ @dataclass
121
+ class InspectionValuePayload:
122
+ isar_id: str
123
+ robot_name: str
124
+ inspection_id: str
125
+ installation_code: str
126
+ tag_id: Optional[str]
127
+ inspection_type: Optional[str]
128
+ inspection_description: Optional[str]
129
+ value: float
130
+ unit: str
131
+ x: float
132
+ y: float
133
+ z: float
134
+ timestamp: datetime
@@ -6,7 +6,11 @@ from alitra import Frame, Orientation, Pose, Position
6
6
 
7
7
  from isar.modules import ApplicationContainer
8
8
  from isar.storage.uploader import Uploader
9
- from robot_interface.models.inspection.inspection import ImageMetadata, Inspection
9
+ from robot_interface.models.inspection.inspection import (
10
+ ImageMetadata,
11
+ Inspection,
12
+ InspectionBlob,
13
+ )
10
14
  from robot_interface.models.mission.mission import Mission
11
15
  from robot_interface.models.mission.task import TakeImage
12
16
  from tests.isar.state_machine.test_state_machine import UploaderThreadMock
@@ -33,7 +37,7 @@ def test_should_upload_from_queue(
33
37
  mission: Mission = Mission(name="Dummy misson", tasks=[take_image_task])
34
38
 
35
39
  assert isinstance(mission.tasks[0], TakeImage)
36
- inspection = Inspection(
40
+ inspection = InspectionBlob(
37
41
  metadata=ARBITRARY_IMAGE_METADATA, id=mission.tasks[0].inspection_id
38
42
  )
39
43
 
@@ -57,7 +61,7 @@ def test_should_retry_failed_upload_from_queue(
57
61
  uploader_thread.start()
58
62
 
59
63
  INSPECTION_ID = "123-456"
60
- inspection = Inspection(metadata=ARBITRARY_IMAGE_METADATA, id=INSPECTION_ID)
64
+ inspection = InspectionBlob(metadata=ARBITRARY_IMAGE_METADATA, id=INSPECTION_ID)
61
65
  mission: Mission = Mission(name="Dummy Mission")
62
66
 
63
67
  message: Tuple[Inspection, Mission] = (
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