isar 1.23.2__tar.gz → 1.23.4__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 (204) hide show
  1. {isar-1.23.2 → isar-1.23.4}/PKG-INFO +1 -1
  2. {isar-1.23.2 → isar-1.23.4}/requirements.txt +14 -14
  3. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/api.py +1 -0
  4. {isar-1.23.2 → isar-1.23.4}/src/isar/config/settings.py +3 -0
  5. {isar-1.23.2 → isar-1.23.4}/src/isar/script.py +17 -1
  6. {isar-1.23.2 → isar-1.23.4}/src/isar/services/utilities/scheduling_utilities.py +1 -1
  7. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/monitor.py +12 -5
  8. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/PKG-INFO +1 -1
  9. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/exceptions/robot_exceptions.py +14 -1
  10. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/robot_interface.py +19 -1
  11. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/telemetry/mqtt_client.py +9 -3
  12. {isar-1.23.2 → isar-1.23.4}/tests/isar/state_machine/test_state_machine.py +4 -0
  13. {isar-1.23.2 → isar-1.23.4}/tests/mocks/robot_interface.py +6 -1
  14. {isar-1.23.2 → isar-1.23.4}/.dockerignore +0 -0
  15. {isar-1.23.2 → isar-1.23.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {isar-1.23.2 → isar-1.23.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  17. {isar-1.23.2 → isar-1.23.4}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  18. {isar-1.23.2 → isar-1.23.4}/.github/release.yml +0 -0
  19. {isar-1.23.2 → isar-1.23.4}/.github/workflows/compile_requirements.yml +0 -0
  20. {isar-1.23.2 → isar-1.23.4}/.github/workflows/project_automations.yml +0 -0
  21. {isar-1.23.2 → isar-1.23.4}/.github/workflows/publish_isar_base_image.yml +0 -0
  22. {isar-1.23.2 → isar-1.23.4}/.github/workflows/pythonpackage.yml +0 -0
  23. {isar-1.23.2 → isar-1.23.4}/.github/workflows/pythonpublish.yml +0 -0
  24. {isar-1.23.2 → isar-1.23.4}/.github/workflows/stale.yml +0 -0
  25. {isar-1.23.2 → isar-1.23.4}/.gitignore +0 -0
  26. {isar-1.23.2 → isar-1.23.4}/.pre-commit-config.yaml +0 -0
  27. {isar-1.23.2 → isar-1.23.4}/Dockerfile +0 -0
  28. {isar-1.23.2 → isar-1.23.4}/LICENSE +0 -0
  29. {isar-1.23.2 → isar-1.23.4}/README.md +0 -0
  30. {isar-1.23.2 → isar-1.23.4}/SECURITY.md +0 -0
  31. {isar-1.23.2 → isar-1.23.4}/docker-compose-turtlebot.yml +0 -0
  32. {isar-1.23.2 → isar-1.23.4}/docker-compose.yml +0 -0
  33. {isar-1.23.2 → isar-1.23.4}/docs/Makefile +0 -0
  34. {isar-1.23.2 → isar-1.23.4}/docs/make.bat +0 -0
  35. {isar-1.23.2 → isar-1.23.4}/docs/rst_processing.py +0 -0
  36. {isar-1.23.2 → isar-1.23.4}/docs/source/conf.py +0 -0
  37. {isar-1.23.2 → isar-1.23.4}/docs/source/index.rst +0 -0
  38. {isar-1.23.2 → isar-1.23.4}/docs/source/readme_link.md +0 -0
  39. {isar-1.23.2 → isar-1.23.4}/docs/state_machine_diagram.png +0 -0
  40. {isar-1.23.2 → isar-1.23.4}/main.py +0 -0
  41. {isar-1.23.2 → isar-1.23.4}/pyproject.toml +0 -0
  42. {isar-1.23.2 → isar-1.23.4}/radixconfig.yml +0 -0
  43. {isar-1.23.2 → isar-1.23.4}/setup.cfg +0 -0
  44. {isar-1.23.2 → isar-1.23.4}/src/isar/__init__.py +0 -0
  45. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/__init__.py +0 -0
  46. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/models/__init__.py +0 -0
  47. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/models/models.py +0 -0
  48. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/models/start_mission_definition.py +0 -0
  49. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/schedule/__init__.py +0 -0
  50. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  51. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/security/__init__.py +0 -0
  52. {isar-1.23.2 → isar-1.23.4}/src/isar/apis/security/authentication.py +0 -0
  53. {isar-1.23.2 → isar-1.23.4}/src/isar/config/__init__.py +0 -0
  54. {isar-1.23.2 → isar-1.23.4}/src/isar/config/certs/ca-cert.pem +0 -0
  55. {isar-1.23.2 → isar-1.23.4}/src/isar/config/configuration_error.py +0 -0
  56. {isar-1.23.2 → isar-1.23.4}/src/isar/config/keyvault/__init__.py +0 -0
  57. {isar-1.23.2 → isar-1.23.4}/src/isar/config/keyvault/keyvault_error.py +0 -0
  58. {isar-1.23.2 → isar-1.23.4}/src/isar/config/keyvault/keyvault_service.py +0 -0
  59. {isar-1.23.2 → isar-1.23.4}/src/isar/config/log.py +0 -0
  60. {isar-1.23.2 → isar-1.23.4}/src/isar/config/logging.conf +0 -0
  61. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  62. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  63. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/default_map.json +0 -0
  64. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/klab_b.json +0 -0
  65. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/klab_compressor.json +0 -0
  66. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/klab_turtlebot.json +0 -0
  67. {isar-1.23.2 → isar-1.23.4}/src/isar/config/maps/turtleworld.json +0 -0
  68. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  69. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  70. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  71. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  72. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_missions/__init__.py +0 -0
  73. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_missions/default.json +0 -0
  74. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  75. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_poses/__init__.py +0 -0
  76. {isar-1.23.2 → isar-1.23.4}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
  77. {isar-1.23.2 → isar-1.23.4}/src/isar/config/settings.env +0 -0
  78. {isar-1.23.2 → isar-1.23.4}/src/isar/mission_planner/__init__.py +0 -0
  79. {isar-1.23.2 → isar-1.23.4}/src/isar/mission_planner/local_planner.py +0 -0
  80. {isar-1.23.2 → isar-1.23.4}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  81. {isar-1.23.2 → isar-1.23.4}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  82. {isar-1.23.2 → isar-1.23.4}/src/isar/mission_planner/task_selector_interface.py +0 -0
  83. {isar-1.23.2 → isar-1.23.4}/src/isar/models/__init__.py +0 -0
  84. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/__init__.py +0 -0
  85. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/message.py +0 -0
  86. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/queues/__init__.py +0 -0
  87. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/queues/queue_io.py +0 -0
  88. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  89. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/queues/queues.py +0 -0
  90. {isar-1.23.2 → isar-1.23.4}/src/isar/models/communication/queues/status_queue.py +0 -0
  91. {isar-1.23.2 → isar-1.23.4}/src/isar/models/mission_metadata/__init__.py +0 -0
  92. {isar-1.23.2 → isar-1.23.4}/src/isar/modules.py +0 -0
  93. {isar-1.23.2 → isar-1.23.4}/src/isar/services/__init__.py +0 -0
  94. {isar-1.23.2 → isar-1.23.4}/src/isar/services/auth/__init__.py +0 -0
  95. {isar-1.23.2 → isar-1.23.4}/src/isar/services/auth/azure_credentials.py +0 -0
  96. {isar-1.23.2 → isar-1.23.4}/src/isar/services/readers/__init__.py +0 -0
  97. {isar-1.23.2 → isar-1.23.4}/src/isar/services/readers/base_reader.py +0 -0
  98. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/__init__.py +0 -0
  99. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  100. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  101. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  102. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  103. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/request_handler.py +0 -0
  104. {isar-1.23.2 → isar-1.23.4}/src/isar/services/service_connections/stid/__init__.py +0 -0
  105. {isar-1.23.2 → isar-1.23.4}/src/isar/services/utilities/__init__.py +0 -0
  106. {isar-1.23.2 → isar-1.23.4}/src/isar/services/utilities/queue_utilities.py +0 -0
  107. {isar-1.23.2 → isar-1.23.4}/src/isar/services/utilities/threaded_request.py +0 -0
  108. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/__init__.py +0 -0
  109. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/state_machine.py +0 -0
  110. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/__init__.py +0 -0
  111. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/idle.py +0 -0
  112. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/initialize.py +0 -0
  113. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/initiate.py +0 -0
  114. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/off.py +0 -0
  115. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/offline.py +0 -0
  116. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/paused.py +0 -0
  117. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states/stop.py +0 -0
  118. {isar-1.23.2 → isar-1.23.4}/src/isar/state_machine/states_enum.py +0 -0
  119. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/__init__.py +0 -0
  120. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/blob_storage.py +0 -0
  121. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/local_storage.py +0 -0
  122. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/slimm_storage.py +0 -0
  123. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/storage_interface.py +0 -0
  124. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/uploader.py +0 -0
  125. {isar-1.23.2 → isar-1.23.4}/src/isar/storage/utilities.py +0 -0
  126. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/SOURCES.txt +0 -0
  127. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/dependency_links.txt +0 -0
  128. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/entry_points.txt +0 -0
  129. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/requires.txt +0 -0
  130. {isar-1.23.2 → isar-1.23.4}/src/isar.egg-info/top_level.txt +0 -0
  131. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/__init__.py +0 -0
  132. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/__init__.py +0 -0
  133. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/exceptions/__init__.py +0 -0
  134. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/initialize/__init__.py +0 -0
  135. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  136. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/inspection/__init__.py +0 -0
  137. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/inspection/inspection.py +0 -0
  138. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/mission/__init__.py +0 -0
  139. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/mission/mission.py +0 -0
  140. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/mission/status.py +0 -0
  141. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/mission/task.py +0 -0
  142. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/robots/__init__.py +0 -0
  143. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/models/robots/robot_model.py +0 -0
  144. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/telemetry/__init__.py +0 -0
  145. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/telemetry/media_connection_type.py +0 -0
  146. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/telemetry/payloads.py +0 -0
  147. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/test_robot_interface.py +0 -0
  148. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/utilities/__init__.py +0 -0
  149. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/utilities/json_service.py +0 -0
  150. {isar-1.23.2 → isar-1.23.4}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  151. {isar-1.23.2 → isar-1.23.4}/tests/__init__.py +0 -0
  152. {isar-1.23.2 → isar-1.23.4}/tests/conftest.py +0 -0
  153. {isar-1.23.2 → isar-1.23.4}/tests/integration/__init__.py +0 -0
  154. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/__init__.py +0 -0
  155. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/config/__init__.py +0 -0
  156. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  157. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  158. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  159. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/config/missions/default.json +0 -0
  160. {isar-1.23.2 → isar-1.23.4}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  161. {isar-1.23.2 → isar-1.23.4}/tests/isar/__init__.py +0 -0
  162. {isar-1.23.2 → isar-1.23.4}/tests/isar/apis/__init__.py +0 -0
  163. {isar-1.23.2 → isar-1.23.4}/tests/isar/apis/scheduler/__init__.py +0 -0
  164. {isar-1.23.2 → isar-1.23.4}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  165. {isar-1.23.2 → isar-1.23.4}/tests/isar/apis/security/__init__.py +0 -0
  166. {isar-1.23.2 → isar-1.23.4}/tests/isar/apis/security/test_authentication.py +0 -0
  167. {isar-1.23.2 → isar-1.23.4}/tests/isar/mission/__init__.py +0 -0
  168. {isar-1.23.2 → isar-1.23.4}/tests/isar/mission/test_mission.py +0 -0
  169. {isar-1.23.2 → isar-1.23.4}/tests/isar/models/__init__.py +0 -0
  170. {isar-1.23.2 → isar-1.23.4}/tests/isar/models/communication/__init__.py +0 -0
  171. {isar-1.23.2 → isar-1.23.4}/tests/isar/models/communication/test_queues.py +0 -0
  172. {isar-1.23.2 → isar-1.23.4}/tests/isar/models/example_mission_definition.json +0 -0
  173. {isar-1.23.2 → isar-1.23.4}/tests/isar/models/test_start_mission_definition.py +0 -0
  174. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/__init__.py +0 -0
  175. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/readers/__init__.py +0 -0
  176. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/readers/test_base_reader.py +0 -0
  177. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/readers/test_mission_reader.py +0 -0
  178. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/service_connections/__init__.py +0 -0
  179. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  180. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  181. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/utilities/__init__.py +0 -0
  182. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  183. {isar-1.23.2 → isar-1.23.4}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  184. {isar-1.23.2 → isar-1.23.4}/tests/isar/state_machine/__init__.py +0 -0
  185. {isar-1.23.2 → isar-1.23.4}/tests/isar/state_machine/states/__init__.py +0 -0
  186. {isar-1.23.2 → isar-1.23.4}/tests/isar/state_machine/states/test_monitor.py +0 -0
  187. {isar-1.23.2 → isar-1.23.4}/tests/isar/storage/test_blob_storage.py +0 -0
  188. {isar-1.23.2 → isar-1.23.4}/tests/isar/storage/test_uploader.py +0 -0
  189. {isar-1.23.2 → isar-1.23.4}/tests/mocks/__init__.py +0 -0
  190. {isar-1.23.2 → isar-1.23.4}/tests/mocks/blob_storage.py +0 -0
  191. {isar-1.23.2 → isar-1.23.4}/tests/mocks/mission_definition.py +0 -0
  192. {isar-1.23.2 → isar-1.23.4}/tests/mocks/mqtt_client.py +0 -0
  193. {isar-1.23.2 → isar-1.23.4}/tests/mocks/pose.py +0 -0
  194. {isar-1.23.2 → isar-1.23.4}/tests/mocks/request.py +0 -0
  195. {isar-1.23.2 → isar-1.23.4}/tests/mocks/status.py +0 -0
  196. {isar-1.23.2 → isar-1.23.4}/tests/mocks/task.py +0 -0
  197. {isar-1.23.2 → isar-1.23.4}/tests/mocks/token.py +0 -0
  198. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_json_file.json +0 -0
  199. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_map_config/test_map_config.json +0 -0
  200. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_mission_not_working.json +0 -0
  201. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_mission_working.json +0 -0
  202. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  203. {isar-1.23.2 → isar-1.23.4}/tests/test_data/test_thermal_image_mission.json +0 -0
  204. {isar-1.23.2 → isar-1.23.4}/tests/test_modules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.23.2
3
+ Version: 1.23.4
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
@@ -8,7 +8,7 @@ alitra==1.1.3
8
8
  # via isar (pyproject.toml)
9
9
  annotated-types==0.7.0
10
10
  # via pydantic
11
- anyio==4.6.0
11
+ anyio==4.6.2.post1
12
12
  # via
13
13
  # httpx
14
14
  # starlette
@@ -18,11 +18,11 @@ azure-core==1.31.0
18
18
  # azure-keyvault-secrets
19
19
  # azure-storage-blob
20
20
  # opencensus-ext-azure
21
- azure-identity==1.18.0
21
+ azure-identity==1.19.0
22
22
  # via
23
23
  # isar (pyproject.toml)
24
24
  # opencensus-ext-azure
25
- azure-keyvault-secrets==4.8.0
25
+ azure-keyvault-secrets==4.9.0
26
26
  # via isar (pyproject.toml)
27
27
  azure-storage-blob==12.23.1
28
28
  # via isar (pyproject.toml)
@@ -37,13 +37,13 @@ certifi==2024.8.30
37
37
  # requests
38
38
  cffi==1.17.1
39
39
  # via cryptography
40
- charset-normalizer==3.3.2
40
+ charset-normalizer==3.4.0
41
41
  # via requests
42
42
  click==8.1.7
43
43
  # via
44
44
  # isar (pyproject.toml)
45
45
  # uvicorn
46
- cryptography==43.0.1
46
+ cryptography==43.0.3
47
47
  # via
48
48
  # azure-identity
49
49
  # azure-storage-blob
@@ -54,13 +54,13 @@ dacite==1.8.1
54
54
  # via
55
55
  # alitra
56
56
  # isar (pyproject.toml)
57
- fastapi==0.115.0
57
+ fastapi==0.115.4
58
58
  # via
59
59
  # fastapi-azure-auth
60
60
  # isar (pyproject.toml)
61
61
  fastapi-azure-auth==5.0.1
62
62
  # via isar (pyproject.toml)
63
- google-api-core==2.20.0
63
+ google-api-core==2.22.0
64
64
  # via opencensus
65
65
  google-auth==2.35.0
66
66
  # via google-api-core
@@ -81,7 +81,7 @@ idna==3.10
81
81
  # requests
82
82
  injector==0.22.0
83
83
  # via isar (pyproject.toml)
84
- isodate==0.7.0
84
+ isodate==0.7.2
85
85
  # via
86
86
  # azure-keyvault-secrets
87
87
  # azure-storage-blob
@@ -113,14 +113,14 @@ paho-mqtt==2.1.0
113
113
  # via isar (pyproject.toml)
114
114
  portalocker==2.10.1
115
115
  # via msal-extensions
116
- proto-plus==1.24.0
116
+ proto-plus==1.25.0
117
117
  # via google-api-core
118
- protobuf==5.28.2
118
+ protobuf==5.28.3
119
119
  # via
120
120
  # google-api-core
121
121
  # googleapis-common-protos
122
122
  # proto-plus
123
- psutil==6.0.0
123
+ psutil==6.1.0
124
124
  # via opencensus-ext-azure
125
125
  pyasn1==0.6.1
126
126
  # via
@@ -137,7 +137,7 @@ pydantic==2.9.2
137
137
  # pydantic-settings
138
138
  pydantic-core==2.23.4
139
139
  # via pydantic
140
- pydantic-settings==2.5.2
140
+ pydantic-settings==2.6.0
141
141
  # via isar (pyproject.toml)
142
142
  pyjwt[crypto]==2.9.0
143
143
  # via
@@ -174,7 +174,7 @@ sniffio==1.3.1
174
174
  # via
175
175
  # anyio
176
176
  # httpx
177
- starlette==0.38.6
177
+ starlette==0.41.2
178
178
  # via fastapi
179
179
  transitions==0.9.2
180
180
  # via isar (pyproject.toml)
@@ -189,7 +189,7 @@ typing-extensions==4.12.2
189
189
  # pydantic-core
190
190
  urllib3==2.2.3
191
191
  # via requests
192
- uvicorn==0.31.0
192
+ uvicorn==0.32.0
193
193
  # via isar (pyproject.toml)
194
194
  wrapt==1.16.0
195
195
  # via opencensus-ext-requests
@@ -232,6 +232,7 @@ class API:
232
232
  methods=["POST"],
233
233
  dependencies=[authentication_dependency],
234
234
  summary="Localize at the provided pose",
235
+ deprecated=True,
235
236
  responses={
236
237
  HTTPStatus.OK.value: {
237
238
  "description": "Localization succesfully started",
@@ -140,6 +140,9 @@ class Settings(BaseSettings):
140
140
  # Keyvault name
141
141
  KEYVAULT_NAME: str = Field(default="IsarDevKv")
142
142
 
143
+ # Determines whether inspections are uploaded asynchronously or get_inspections in robotinterface
144
+ UPLOAD_INSPECTIONS_ASYNC: bool = Field(default=False)
145
+
143
146
  # URL to storage account for Azure Blob Storage
144
147
  BLOB_STORAGE_ACCOUNT_URL: str = Field(
145
148
  default="https://eqrobotdevstorage.blob.core.windows.net"
@@ -2,7 +2,7 @@ import logging
2
2
  import time
3
3
  from logging import Logger
4
4
  from threading import Thread
5
- from typing import Any, List
5
+ from typing import Any, List, Tuple
6
6
 
7
7
  from injector import Injector
8
8
 
@@ -20,6 +20,8 @@ from isar.services.service_connections.mqtt.robot_heartbeat_publisher import (
20
20
  from isar.services.service_connections.mqtt.robot_info_publisher import (
21
21
  RobotInfoPublisher,
22
22
  )
23
+ from robot_interface.models.inspection.inspection import Inspection
24
+ from robot_interface.models.mission.mission import Mission
23
25
  from isar.state_machine.state_machine import StateMachine, main
24
26
  from isar.storage.uploader import Uploader
25
27
  from robot_interface.robot_interface import RobotInterface
@@ -69,6 +71,7 @@ def print_startup_info():
69
71
  print_setting("Using local storage", settings.STORAGE_LOCAL_ENABLED)
70
72
  print_setting("Using blob storage", settings.STORAGE_BLOB_ENABLED)
71
73
  print_setting("Using SLIMM storage", settings.STORAGE_SLIMM_ENABLED)
74
+ print_setting("Using async inspection uploading", settings.UPLOAD_INSPECTIONS_ASYNC)
72
75
  print_setting("Plant code", settings.PLANT_CODE)
73
76
  print_setting("Plant name", settings.PLANT_NAME)
74
77
  print_setting("Plant shortname", settings.PLANT_SHORT_NAME)
@@ -103,6 +106,18 @@ def start():
103
106
  target=uploader.run, name="ISAR Uploader", daemon=True
104
107
  )
105
108
  threads.append(uploader_thread)
109
+
110
+ if settings.UPLOAD_INSPECTIONS_ASYNC:
111
+
112
+ def inspections_callback(inspection: Inspection):
113
+ message: Tuple[Inspection, Mission] = (
114
+ inspection,
115
+ state_machine.current_mission,
116
+ )
117
+ state_machine.queues.upload_queue.put(message)
118
+
119
+ robot.register_inspection_callback(inspections_callback)
120
+
106
121
  if settings.MQTT_ENABLED:
107
122
  mqtt_client: MqttClient = MqttClient(mqtt_queue=queues.mqtt_queue)
108
123
 
@@ -137,6 +152,7 @@ def start():
137
152
  robot_name=settings.ROBOT_NAME,
138
153
  isar_id=settings.ISAR_ID,
139
154
  )
155
+
140
156
  if publishers:
141
157
  threads.extend(publishers)
142
158
 
@@ -128,7 +128,7 @@ class SchedulingUtilities:
128
128
  """
129
129
  is_state_machine_ready_to_receive_mission = state == States.Idle
130
130
  if not is_state_machine_ready_to_receive_mission:
131
- error_message = f"Conflict - Mission already in progress - State: {state}"
131
+ error_message = f"Conflict - Robot is not idle - State: {state}"
132
132
  self.logger.warning(error_message)
133
133
  raise HTTPException(status_code=HTTPStatus.CONFLICT, detail=error_message)
134
134
 
@@ -17,6 +17,7 @@ from robot_interface.models.exceptions.robot_exceptions import (
17
17
  RobotException,
18
18
  RobotRetrieveInspectionException,
19
19
  RobotTaskStatusException,
20
+ RobotCommunicationException,
20
21
  )
21
22
  from robot_interface.models.inspection.inspection import Inspection
22
23
  from robot_interface.models.mission.mission import Mission
@@ -75,8 +76,11 @@ class Monitor(State):
75
76
  time.sleep(self.state_machine.sleep_time)
76
77
  continue
77
78
 
78
- except RobotCommunicationTimeoutException as e:
79
- task_failed: bool = self._handle_communication_timeout(e)
79
+ except (
80
+ RobotCommunicationTimeoutException,
81
+ RobotCommunicationException,
82
+ ) as e:
83
+ task_failed: bool = self._handle_communication_retry(e)
80
84
  if task_failed:
81
85
  status = TaskStatus.Failed
82
86
  else:
@@ -111,7 +115,10 @@ class Monitor(State):
111
115
 
112
116
  self.state_machine.current_task.status = status
113
117
 
114
- if self._should_upload_inspections():
118
+ if (
119
+ not settings.UPLOAD_INSPECTIONS_ASYNC
120
+ and self._should_upload_inspections()
121
+ ):
115
122
  get_inspection_thread = ThreadedRequest(
116
123
  self._queue_inspections_for_upload
117
124
  )
@@ -207,8 +214,8 @@ class Monitor(State):
207
214
  )
208
215
  self.state_machine.current_task.error_message = error_message
209
216
 
210
- def _handle_communication_timeout(
211
- self, e: RobotCommunicationTimeoutException
217
+ def _handle_communication_retry(
218
+ self, e: Union[RobotCommunicationTimeoutException, RobotCommunicationException]
212
219
  ) -> bool:
213
220
  self.state_machine.current_mission.error_message = ErrorMessage(
214
221
  error_reason=e.error_reason, error_description=e.error_description
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.23.2
3
+ Version: 1.23.4
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
@@ -16,6 +16,7 @@ class ErrorReason(str, Enum):
16
16
  RobotRetrieveDataException: str = "robot_retrieve_data_exception"
17
17
  RobotRetrieveInspectionException: str = "robot_retrieve_inspection_exception"
18
18
  RobotTelemetryException: str = "robot_telemetry_exception"
19
+ RobotTelemetryPoseException: str = "robot_telemetry_pose_exception"
19
20
  RobotMapException: str = "robot_map_exception"
20
21
  RobotTransformException: str = "robot_transform_exception"
21
22
  RobotUnknownErrorException: str = "robot_unknown_error_exception"
@@ -42,7 +43,7 @@ class RobotException(Exception):
42
43
 
43
44
 
44
45
  # An exception which should be thrown by the robot package if it is unable to
45
- # communicate with the robot API.
46
+ # communicate with the robot API. ISAR will retry the request.
46
47
  class RobotCommunicationException(RobotException):
47
48
  def __init__(self, error_description: str) -> None:
48
49
  super().__init__(
@@ -189,6 +190,18 @@ class RobotTelemetryException(RobotException):
189
190
  pass
190
191
 
191
192
 
193
+ # An exception which should be thrown by the robot package if it is unable to retrieve
194
+ # telemetry pose data. It should be used exclusively by the telemetry pose publisher.
195
+ class RobotTelemetryPoseException(RobotException):
196
+ def __init__(self, error_description: str) -> None:
197
+ super().__init__(
198
+ error_reason=ErrorReason.RobotTelemetryPoseException,
199
+ error_description=error_description,
200
+ )
201
+
202
+ pass
203
+
204
+
192
205
  # An exception which should be thrown by the robot package if it is unable to load the
193
206
  # configuration for maps and transformations. This could be caused by faulty
194
207
  # configuration and this exception will cause ISAR to crash as further execution is not
@@ -1,7 +1,7 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
  from queue import Queue
3
3
  from threading import Thread
4
- from typing import List
4
+ from typing import Callable, List
5
5
 
6
6
  from robot_interface.models.initialize import InitializeParams
7
7
  from robot_interface.models.inspection.inspection import Inspection
@@ -180,6 +180,24 @@ class RobotInterface(metaclass=ABCMeta):
180
180
  """
181
181
  raise NotImplementedError
182
182
 
183
+ @abstractmethod
184
+ def register_inspection_callback(
185
+ self, callback_function: Callable[[Inspection], None]
186
+ ) -> None:
187
+ """Register a function which should be run when inspection data is received
188
+ asynchronously. This function should expect to receive an Inspection from.
189
+
190
+ Parameters
191
+ ----------
192
+ callback_function : Callable[[Inspection]
193
+
194
+ Returns
195
+ -------
196
+ None
197
+
198
+ """
199
+ raise NotImplementedError
200
+
183
201
  @abstractmethod
184
202
  def initialize(self, params: InitializeParams) -> None:
185
203
  """Initializes the robot. The initialization needed is robot dependent and the
@@ -5,7 +5,10 @@ from datetime import datetime, timezone
5
5
  from queue import Queue
6
6
  from typing import Callable, Tuple
7
7
 
8
- from robot_interface.models.exceptions.robot_exceptions import RobotTelemetryException
8
+ from robot_interface.models.exceptions.robot_exceptions import (
9
+ RobotTelemetryException,
10
+ RobotTelemetryPoseException,
11
+ )
9
12
  from robot_interface.telemetry.payloads import CloudHealthPayload
10
13
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
11
14
 
@@ -63,7 +66,7 @@ class MqttTelemetryPublisher(MqttClientInterface):
63
66
  self.retain: bool = retain
64
67
 
65
68
  def run(self, isar_id: str, robot_name: str) -> None:
66
- self.cloud_healt_topic: str = f"isar/{isar_id}/cloud_health"
69
+ self.cloud_health_topic: str = f"isar/{isar_id}/cloud_health"
67
70
  topic: str
68
71
  payload: str
69
72
 
@@ -71,12 +74,15 @@ class MqttTelemetryPublisher(MqttClientInterface):
71
74
  try:
72
75
  payload = self.telemetry_method(isar_id=isar_id, robot_name=robot_name)
73
76
  topic = self.topic
77
+ except RobotTelemetryPoseException:
78
+ time.sleep(self.interval)
79
+ continue
74
80
  except RobotTelemetryException:
75
81
  payload = json.dumps(
76
82
  CloudHealthPayload(isar_id, robot_name, datetime.now(timezone.utc)),
77
83
  cls=EnhancedJSONEncoder,
78
84
  )
79
- topic = self.cloud_healt_topic
85
+ topic = self.cloud_health_topic
80
86
 
81
87
  self.publish(topic=topic, payload=payload, qos=self.qos, retain=self.retain)
82
88
 
@@ -8,6 +8,8 @@ import pytest
8
8
  from injector import Injector
9
9
  from pytest_mock import MockerFixture
10
10
 
11
+ from isar.config.settings import settings
12
+
11
13
  from isar.mission_planner.local_planner import LocalPlanner
12
14
  from isar.models.communication.queues.queues import Queues
13
15
  from isar.services.utilities.scheduling_utilities import SchedulingUtilities
@@ -31,6 +33,7 @@ from tests.mocks.task import MockTask
31
33
 
32
34
  class StateMachineThread(object):
33
35
  def __init__(self, injector) -> None:
36
+ settings.UPLOAD_INSPECTIONS_ASYNC = False
34
37
  self.injector: Injector = injector
35
38
  self.state_machine: StateMachine = injector.get(StateMachine)
36
39
  self._thread: Thread = Thread(target=main, args=[self.state_machine])
@@ -42,6 +45,7 @@ class StateMachineThread(object):
42
45
 
43
46
  class UploaderThread(object):
44
47
  def __init__(self, injector) -> None:
48
+ settings.UPLOAD_INSPECTIONS_ASYNC = False
45
49
  self.injector: Injector = injector
46
50
  self.uploader: Uploader = Uploader(
47
51
  queues=self.injector.get(Queues),
@@ -2,7 +2,7 @@ from dataclasses import field
2
2
  from datetime import datetime
3
3
  from queue import Queue
4
4
  from threading import Thread
5
- from typing import List, Sequence
5
+ from typing import Callable, List, Sequence
6
6
 
7
7
  from alitra import Frame, Orientation, Pose, Position
8
8
 
@@ -62,6 +62,11 @@ class MockRobot(RobotInterface):
62
62
  image.data = b"Some binary image data"
63
63
  return image
64
64
 
65
+ def register_inspection_callback(
66
+ self, callback_function: Callable[[Inspection], None]
67
+ ) -> None:
68
+ return
69
+
65
70
  def initialize(self, params: InitializeParams) -> None:
66
71
  return
67
72
 
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
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