isar 1.25.9__tar.gz → 1.26.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 (221) hide show
  1. {isar-1.25.9 → isar-1.26.0}/.github/workflows/pythonpackage.yml +6 -1
  2. {isar-1.25.9 → isar-1.26.0}/.github/workflows/stale.yml +0 -4
  3. {isar-1.25.9 → isar-1.26.0}/PKG-INFO +2 -3
  4. {isar-1.25.9 → isar-1.26.0}/README.md +0 -2
  5. isar-1.26.0/docs/state_machine_diagram.png +0 -0
  6. {isar-1.25.9 → isar-1.26.0}/pyproject.toml +1 -0
  7. {isar-1.25.9 → isar-1.26.0}/requirements.txt +19 -19
  8. isar-1.26.0/src/isar/apis/models/start_mission_definition.py +176 -0
  9. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/robot_control/robot_controller.py +5 -4
  10. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/schedule/scheduling_controller.py +4 -32
  11. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/security/authentication.py +2 -2
  12. {isar-1.25.9 → isar-1.26.0}/src/isar/config/settings.env +1 -3
  13. {isar-1.25.9 → isar-1.26.0}/src/isar/config/settings.py +5 -5
  14. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/message.py +0 -4
  15. isar-1.26.0/src/isar/models/communication/queues/queue_utils.py +27 -0
  16. isar-1.26.0/src/isar/models/communication/queues/queues.py +37 -0
  17. isar-1.26.0/src/isar/robot/robot.py +91 -0
  18. isar-1.26.0/src/isar/robot/robot_start_mission.py +73 -0
  19. isar-1.26.0/src/isar/robot/robot_status.py +46 -0
  20. isar-1.26.0/src/isar/robot/robot_task_status.py +92 -0
  21. {isar-1.25.9 → isar-1.26.0}/src/isar/script.py +7 -0
  22. {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/scheduling_utilities.py +15 -26
  23. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/state_machine.py +94 -183
  24. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/blocked_protective_stop.py +7 -19
  25. isar-1.26.0/src/isar/state_machine/states/idle.py +61 -0
  26. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/monitor.py +43 -90
  27. isar-1.26.0/src/isar/state_machine/states/offline.py +38 -0
  28. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/paused.py +1 -1
  29. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states_enum.py +0 -2
  30. isar-1.26.0/src/isar/state_machine/transitions/fail_mission.py +13 -0
  31. isar-1.26.0/src/isar/state_machine/transitions/finish_mission.py +39 -0
  32. isar-1.26.0/src/isar/state_machine/transitions/pause.py +24 -0
  33. isar-1.26.0/src/isar/state_machine/transitions/resume.py +27 -0
  34. isar-1.26.0/src/isar/state_machine/transitions/start_mission.py +73 -0
  35. isar-1.26.0/src/isar/state_machine/transitions/stop.py +33 -0
  36. isar-1.26.0/src/isar/state_machine/transitions/utils.py +10 -0
  37. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/slimm_storage.py +2 -2
  38. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/PKG-INFO +2 -3
  39. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/SOURCES.txt +12 -2
  40. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/requires.txt +1 -0
  41. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/mqtt_client.py +0 -1
  42. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/payloads.py +3 -3
  43. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/json_service.py +1 -1
  44. {isar-1.25.9 → isar-1.26.0}/tests/conftest.py +1 -7
  45. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -2
  46. isar-1.26.0/tests/isar/apis/security/test_authentication.py +32 -0
  47. {isar-1.25.9 → isar-1.26.0}/tests/isar/models/communication/test_queues.py +10 -10
  48. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/test_scheduling_utilities.py +2 -2
  49. {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/test_state_machine.py +92 -59
  50. {isar-1.25.9 → isar-1.26.0}/tests/mocks/robot_interface.py +25 -11
  51. isar-1.25.9/docs/state_machine_diagram.png +0 -0
  52. isar-1.25.9/src/isar/apis/models/start_mission_definition.py +0 -229
  53. isar-1.25.9/src/isar/models/communication/queues/queues.py +0 -19
  54. isar-1.25.9/src/isar/state_machine/states/idle.py +0 -103
  55. isar-1.25.9/src/isar/state_machine/states/initialize.py +0 -70
  56. isar-1.25.9/src/isar/state_machine/states/initiate.py +0 -111
  57. isar-1.25.9/src/isar/state_machine/states/offline.py +0 -63
  58. isar-1.25.9/tests/isar/apis/security/test_authentication.py +0 -53
  59. {isar-1.25.9 → isar-1.26.0}/.dockerignore +0 -0
  60. {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  61. {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  62. {isar-1.25.9 → isar-1.26.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  63. {isar-1.25.9 → isar-1.26.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  64. {isar-1.25.9 → isar-1.26.0}/.github/release.yml +0 -0
  65. {isar-1.25.9 → isar-1.26.0}/.github/workflows/compile_requirements.yml +0 -0
  66. {isar-1.25.9 → isar-1.26.0}/.github/workflows/project_automations.yml +0 -0
  67. {isar-1.25.9 → isar-1.26.0}/.github/workflows/publish_isar_base_image.yml +0 -0
  68. {isar-1.25.9 → isar-1.26.0}/.github/workflows/pythonpublish.yml +0 -0
  69. {isar-1.25.9 → isar-1.26.0}/.gitignore +0 -0
  70. {isar-1.25.9 → isar-1.26.0}/.pre-commit-config.yaml +0 -0
  71. {isar-1.25.9 → isar-1.26.0}/Dockerfile +0 -0
  72. {isar-1.25.9 → isar-1.26.0}/LICENSE +0 -0
  73. {isar-1.25.9 → isar-1.26.0}/SECURITY.md +0 -0
  74. {isar-1.25.9 → isar-1.26.0}/docker-compose-turtlebot.yml +0 -0
  75. {isar-1.25.9 → isar-1.26.0}/docker-compose.yml +0 -0
  76. {isar-1.25.9 → isar-1.26.0}/docs/Makefile +0 -0
  77. {isar-1.25.9 → isar-1.26.0}/docs/make.bat +0 -0
  78. {isar-1.25.9 → isar-1.26.0}/docs/rst_processing.py +0 -0
  79. {isar-1.25.9 → isar-1.26.0}/docs/source/conf.py +0 -0
  80. {isar-1.25.9 → isar-1.26.0}/docs/source/index.rst +0 -0
  81. {isar-1.25.9 → isar-1.26.0}/docs/source/readme_link.md +0 -0
  82. {isar-1.25.9 → isar-1.26.0}/main.py +0 -0
  83. {isar-1.25.9 → isar-1.26.0}/radixconfig.yml +0 -0
  84. {isar-1.25.9 → isar-1.26.0}/setup.cfg +0 -0
  85. {isar-1.25.9 → isar-1.26.0}/src/isar/__init__.py +0 -0
  86. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/__init__.py +0 -0
  87. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/api.py +0 -0
  88. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/models/__init__.py +0 -0
  89. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/models/models.py +0 -0
  90. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/schedule/__init__.py +0 -0
  91. {isar-1.25.9 → isar-1.26.0}/src/isar/apis/security/__init__.py +0 -0
  92. {isar-1.25.9 → isar-1.26.0}/src/isar/config/__init__.py +0 -0
  93. {isar-1.25.9 → isar-1.26.0}/src/isar/config/certs/ca-cert.pem +0 -0
  94. {isar-1.25.9 → isar-1.26.0}/src/isar/config/configuration_error.py +0 -0
  95. {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/__init__.py +0 -0
  96. {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
  97. {isar-1.25.9 → isar-1.26.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
  98. {isar-1.25.9 → isar-1.26.0}/src/isar/config/log.py +0 -0
  99. {isar-1.25.9 → isar-1.26.0}/src/isar/config/logging.conf +0 -0
  100. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  101. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  102. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/default_map.json +0 -0
  103. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_b.json +0 -0
  104. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_compressor.json +0 -0
  105. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
  106. {isar-1.25.9 → isar-1.26.0}/src/isar/config/maps/turtleworld.json +0 -0
  107. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  108. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  109. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  110. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  111. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/__init__.py +0 -0
  112. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/default.json +0 -0
  113. {isar-1.25.9 → isar-1.26.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  114. {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/__init__.py +0 -0
  115. {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/local_planner.py +0 -0
  116. {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  117. {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  118. {isar-1.25.9 → isar-1.26.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
  119. {isar-1.25.9 → isar-1.26.0}/src/isar/models/__init__.py +0 -0
  120. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/__init__.py +0 -0
  121. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/__init__.py +0 -0
  122. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/queue_io.py +0 -0
  123. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  124. {isar-1.25.9 → isar-1.26.0}/src/isar/models/communication/queues/status_queue.py +0 -0
  125. {isar-1.25.9 → isar-1.26.0}/src/isar/models/mission_metadata/__init__.py +0 -0
  126. {isar-1.25.9 → isar-1.26.0}/src/isar/modules.py +0 -0
  127. {isar-1.25.9 → isar-1.26.0}/src/isar/services/__init__.py +0 -0
  128. {isar-1.25.9 → isar-1.26.0}/src/isar/services/auth/__init__.py +0 -0
  129. {isar-1.25.9 → isar-1.26.0}/src/isar/services/auth/azure_credentials.py +0 -0
  130. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/__init__.py +0 -0
  131. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  132. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  133. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  134. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  135. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/request_handler.py +0 -0
  136. {isar-1.25.9 → isar-1.26.0}/src/isar/services/service_connections/stid/__init__.py +0 -0
  137. {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/__init__.py +0 -0
  138. {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/queue_utilities.py +0 -0
  139. {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/robot_utilities.py +0 -0
  140. {isar-1.25.9 → isar-1.26.0}/src/isar/services/utilities/threaded_request.py +0 -0
  141. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/__init__.py +0 -0
  142. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/__init__.py +0 -0
  143. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/off.py +0 -0
  144. {isar-1.25.9 → isar-1.26.0}/src/isar/state_machine/states/stop.py +0 -0
  145. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/__init__.py +0 -0
  146. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/blob_storage.py +0 -0
  147. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/local_storage.py +0 -0
  148. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/storage_interface.py +0 -0
  149. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/uploader.py +0 -0
  150. {isar-1.25.9 → isar-1.26.0}/src/isar/storage/utilities.py +0 -0
  151. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/dependency_links.txt +0 -0
  152. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/entry_points.txt +0 -0
  153. {isar-1.25.9 → isar-1.26.0}/src/isar.egg-info/top_level.txt +0 -0
  154. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/__init__.py +0 -0
  155. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/__init__.py +0 -0
  156. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
  157. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  158. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/initialize/__init__.py +0 -0
  159. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/inspection/__init__.py +0 -0
  160. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/inspection/inspection.py +0 -0
  161. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/__init__.py +0 -0
  162. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/mission.py +0 -0
  163. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/status.py +0 -0
  164. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/mission/task.py +1 -1
  165. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/__init__.py +0 -0
  166. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/battery_state.py +0 -0
  167. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/media.py +0 -0
  168. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/models/robots/robot_model.py +0 -0
  169. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/robot_interface.py +0 -0
  170. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/telemetry/__init__.py +0 -0
  171. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/test_robot_interface.py +0 -0
  172. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/__init__.py +0 -0
  173. {isar-1.25.9 → isar-1.26.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  174. {isar-1.25.9 → isar-1.26.0}/tests/__init__.py +0 -0
  175. {isar-1.25.9 → isar-1.26.0}/tests/integration/__init__.py +0 -0
  176. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/__init__.py +0 -0
  177. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/__init__.py +0 -0
  178. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  179. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  180. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  181. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
  182. {isar-1.25.9 → isar-1.26.0}/tests/integration/turtlebot/test_successful_mission.py +1 -1
  183. {isar-1.25.9 → isar-1.26.0}/tests/isar/__init__.py +0 -0
  184. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/__init__.py +0 -0
  185. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/__init__.py +0 -0
  186. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/example_mission_definition.json +0 -0
  187. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  188. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/scheduler/__init__.py +0 -0
  189. {isar-1.25.9 → isar-1.26.0}/tests/isar/apis/security/__init__.py +0 -0
  190. {isar-1.25.9 → isar-1.26.0}/tests/isar/mission/__init__.py +0 -0
  191. {isar-1.25.9 → isar-1.26.0}/tests/isar/mission/test_mission.py +0 -0
  192. {isar-1.25.9 → isar-1.26.0}/tests/isar/models/__init__.py +0 -0
  193. {isar-1.25.9 → isar-1.26.0}/tests/isar/models/communication/__init__.py +0 -0
  194. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/__init__.py +0 -0
  195. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/readers/__init__.py +0 -0
  196. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/readers/test_mission_reader.py +0 -0
  197. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/__init__.py +0 -0
  198. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  199. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  200. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/__init__.py +0 -0
  201. {isar-1.25.9 → isar-1.26.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  202. {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/__init__.py +0 -0
  203. {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/states/__init__.py +0 -0
  204. {isar-1.25.9 → isar-1.26.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
  205. {isar-1.25.9 → isar-1.26.0}/tests/isar/storage/test_blob_storage.py +0 -0
  206. {isar-1.25.9 → isar-1.26.0}/tests/isar/storage/test_uploader.py +0 -0
  207. {isar-1.25.9 → isar-1.26.0}/tests/mocks/__init__.py +0 -0
  208. {isar-1.25.9 → isar-1.26.0}/tests/mocks/blob_storage.py +0 -0
  209. {isar-1.25.9 → isar-1.26.0}/tests/mocks/mission_definition.py +0 -0
  210. {isar-1.25.9 → isar-1.26.0}/tests/mocks/mqtt_client.py +0 -0
  211. {isar-1.25.9 → isar-1.26.0}/tests/mocks/pose.py +0 -0
  212. {isar-1.25.9 → isar-1.26.0}/tests/mocks/request.py +0 -0
  213. {isar-1.25.9 → isar-1.26.0}/tests/mocks/status.py +0 -0
  214. {isar-1.25.9 → isar-1.26.0}/tests/mocks/task.py +0 -0
  215. {isar-1.25.9 → isar-1.26.0}/tests/mocks/token.py +0 -0
  216. {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
  217. {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_not_working.json +0 -0
  218. {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_working.json +0 -0
  219. {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  220. {isar-1.25.9 → isar-1.26.0}/tests/test_data/test_thermal_image_mission.json +0 -0
  221. {isar-1.25.9 → isar-1.26.0}/tests/test_modules.py +0 -0
@@ -7,6 +7,7 @@ on:
7
7
  pull_request:
8
8
  branches:
9
9
  - main
10
+ - update-dependencies
10
11
 
11
12
  jobs:
12
13
  build:
@@ -48,9 +49,13 @@ jobs:
48
49
  run: |
49
50
  black --check .
50
51
 
52
+ - name: Run isort
53
+ run: |
54
+ isort --check .
55
+
51
56
  - name: Run mypy
52
57
  run: |
53
- mypy --disable-error-code=import-untyped .
58
+ mypy --disable-error-code=import-untyped --check-untyped-defs .
54
59
 
55
60
  - name: Run ruff
56
61
  run: |
@@ -22,11 +22,7 @@ jobs:
22
22
  uses: actions/stale@v9
23
23
  with:
24
24
  repo-token: ${{ secrets.STALE_ISSUE_TOKEN }}
25
- stale-issue-message: "This issue has automatically been marked as stale as there has been no activity for 60 days."
26
- stale-pr-message: "This pull request has automatically been marked as stale as there has been no activity for 30 days."
27
25
  stale-issue-label: "stale"
28
26
  stale-pr-label: "stale"
29
- close-issue-message: "This issue has been closed automatically due to a lack of activity."
30
- close-pr-message: "This pull request has been closed automatically due to a lack of activity."
31
27
  days-before-pr-stale: 30
32
28
  days-before-close: -1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: isar
3
- Version: 1.25.9
3
+ Version: 1.26.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
@@ -127,6 +127,7 @@ Requires-Dist: transitions
127
127
  Requires-Dist: uvicorn
128
128
  Provides-Extra: dev
129
129
  Requires-Dist: black; extra == "dev"
130
+ Requires-Dist: isort; extra == "dev"
130
131
  Requires-Dist: mypy; extra == "dev"
131
132
  Requires-Dist: pip-tools; extra == "dev"
132
133
  Requires-Dist: pre-commit; extra == "dev"
@@ -350,8 +351,6 @@ In general the states
350
351
 
351
352
  ```
352
353
  States.Off,
353
- States.Initialize,
354
- States.Initiate,
355
354
  States.Stop,
356
355
  States.Monitor,
357
356
  States.Paused,
@@ -211,8 +211,6 @@ In general the states
211
211
 
212
212
  ```
213
213
  States.Off,
214
- States.Initialize,
215
- States.Initiate,
216
214
  States.Stop,
217
215
  States.Monitor,
218
216
  States.Paused,
@@ -60,6 +60,7 @@ repository = "https://github.com/equinor/isar.git"
60
60
  [project.optional-dependencies]
61
61
  dev = [
62
62
  "black",
63
+ "isort",
63
64
  "mypy",
64
65
  "pip-tools",
65
66
  "pre-commit",
@@ -18,19 +18,19 @@ azure-core==1.32.0
18
18
  # azure-keyvault-secrets
19
19
  # azure-storage-blob
20
20
  # opencensus-ext-azure
21
- azure-identity==1.19.0
21
+ azure-identity==1.20.0
22
22
  # via
23
23
  # isar (pyproject.toml)
24
24
  # opencensus-ext-azure
25
25
  azure-keyvault-secrets==4.9.0
26
26
  # via isar (pyproject.toml)
27
- azure-storage-blob==12.24.0
27
+ azure-storage-blob==12.24.1
28
28
  # via isar (pyproject.toml)
29
29
  backoff==2.2.1
30
30
  # via isar (pyproject.toml)
31
- cachetools==5.5.0
31
+ cachetools==5.5.2
32
32
  # via google-auth
33
- certifi==2024.12.14
33
+ certifi==2025.1.31
34
34
  # via
35
35
  # httpcore
36
36
  # httpx
@@ -43,28 +43,28 @@ click==8.1.8
43
43
  # via
44
44
  # isar (pyproject.toml)
45
45
  # uvicorn
46
- cryptography==44.0.0
46
+ cryptography==44.0.1
47
47
  # via
48
48
  # azure-identity
49
49
  # azure-storage-blob
50
50
  # fastapi-azure-auth
51
51
  # msal
52
52
  # pyjwt
53
- dacite==1.8.1
53
+ dacite==1.9.2
54
54
  # via
55
55
  # alitra
56
56
  # isar (pyproject.toml)
57
- fastapi==0.115.6
57
+ fastapi==0.115.8
58
58
  # via
59
59
  # fastapi-azure-auth
60
60
  # isar (pyproject.toml)
61
- fastapi-azure-auth==5.0.1
61
+ fastapi-azure-auth==5.1.0
62
62
  # via isar (pyproject.toml)
63
- google-api-core==2.24.0
63
+ google-api-core==2.24.1
64
64
  # via opencensus
65
- google-auth==2.37.0
65
+ google-auth==2.38.0
66
66
  # via google-api-core
67
- googleapis-common-protos==1.66.0
67
+ googleapis-common-protos==1.68.0
68
68
  # via google-api-core
69
69
  h11==0.14.0
70
70
  # via
@@ -91,7 +91,7 @@ msal==1.31.1
91
91
  # msal-extensions
92
92
  msal-extensions==1.2.0
93
93
  # via azure-identity
94
- numpy==2.2.1
94
+ numpy==2.2.3
95
95
  # via
96
96
  # alitra
97
97
  # isar (pyproject.toml)
@@ -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.25.0
116
+ proto-plus==1.26.0
117
117
  # via google-api-core
118
118
  protobuf==5.29.3
119
119
  # via
120
120
  # google-api-core
121
121
  # googleapis-common-protos
122
122
  # proto-plus
123
- psutil==6.1.1
123
+ psutil==7.0.0
124
124
  # via opencensus-ext-azure
125
125
  pyasn1==0.6.1
126
126
  # via
@@ -130,14 +130,14 @@ pyasn1-modules==0.4.1
130
130
  # via google-auth
131
131
  pycparser==2.22
132
132
  # via cffi
133
- pydantic==2.10.5
133
+ pydantic==2.10.6
134
134
  # via
135
135
  # fastapi
136
136
  # isar (pyproject.toml)
137
137
  # pydantic-settings
138
138
  pydantic-core==2.27.2
139
139
  # via pydantic
140
- pydantic-settings==2.7.1
140
+ pydantic-settings==2.8.0
141
141
  # via isar (pyproject.toml)
142
142
  pyjwt[crypto]==2.10.1
143
143
  # via
@@ -163,7 +163,7 @@ requests-toolbelt==1.0.0
163
163
  # via isar (pyproject.toml)
164
164
  rsa==4.9
165
165
  # via google-auth
166
- scipy==1.15.1
166
+ scipy==1.15.2
167
167
  # via alitra
168
168
  six==1.17.0
169
169
  # via
@@ -172,7 +172,7 @@ six==1.17.0
172
172
  # transitions
173
173
  sniffio==1.3.1
174
174
  # via anyio
175
- starlette==0.41.3
175
+ starlette==0.45.3
176
176
  # via fastapi
177
177
  transitions==0.9.2
178
178
  # via isar (pyproject.toml)
@@ -190,5 +190,5 @@ urllib3==2.3.0
190
190
  # via requests
191
191
  uvicorn==0.34.0
192
192
  # via isar (pyproject.toml)
193
- wrapt==1.17.1
193
+ wrapt==1.17.2
194
194
  # via opencensus-ext-requests
@@ -0,0 +1,176 @@
1
+ import time
2
+ from enum import Enum
3
+ from typing import List, Optional
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from isar.apis.models.models import InputPose, InputPosition
8
+ from isar.config.settings import settings
9
+ from isar.mission_planner.mission_planner_interface import MissionPlannerError
10
+ from robot_interface.models.mission.mission import Mission
11
+ from robot_interface.models.mission.task import (
12
+ TASKS,
13
+ RecordAudio,
14
+ ReturnToHome,
15
+ TakeGasMeasurement,
16
+ TakeImage,
17
+ TakeThermalImage,
18
+ TakeThermalVideo,
19
+ TakeVideo,
20
+ ZoomDescription,
21
+ )
22
+ from robot_interface.utilities.uuid_string_factory import uuid4_string
23
+
24
+
25
+ class InspectionTypes(str, Enum):
26
+ image = "Image"
27
+ thermal_image = "ThermalImage"
28
+ video = "Video"
29
+ thermal_video = "ThermalVideo"
30
+ audio = "Audio"
31
+ gas_measurement = "GasMeasurement"
32
+
33
+
34
+ class TaskType(str, Enum):
35
+ Inspection = "inspection"
36
+ ReturnToHome = "return_to_home"
37
+
38
+
39
+ class StartMissionInspectionDefinition(BaseModel):
40
+ type: InspectionTypes = Field(default=InspectionTypes.image)
41
+ inspection_target: InputPosition
42
+ analysis_type: Optional[str] = None
43
+ duration: Optional[float] = None
44
+ metadata: Optional[dict] = None
45
+
46
+
47
+ class StartMissionTaskDefinition(BaseModel):
48
+ id: Optional[str] = None
49
+ type: TaskType = Field(default=TaskType.Inspection)
50
+ pose: InputPose
51
+ inspection: Optional[StartMissionInspectionDefinition] = None
52
+ tag: Optional[str] = None
53
+ zoom: Optional[ZoomDescription] = None
54
+
55
+
56
+ class StartMissionDefinition(BaseModel):
57
+ tasks: List[StartMissionTaskDefinition]
58
+ name: Optional[str] = None
59
+ start_pose: Optional[InputPose] = None
60
+
61
+
62
+ def to_isar_mission(
63
+ start_mission_definition: StartMissionDefinition,
64
+ return_pose: Optional[InputPose] = None,
65
+ ) -> Mission:
66
+ isar_tasks: List[TASKS] = []
67
+
68
+ for task_definition in start_mission_definition.tasks:
69
+ task: TASKS = to_isar_task(task_definition)
70
+ isar_tasks.append(task)
71
+
72
+ if return_pose:
73
+ isar_tasks.append(ReturnToHome(pose=return_pose.to_alitra_pose()))
74
+
75
+ if not isar_tasks:
76
+ raise MissionPlannerError("Mission does not contain any valid tasks")
77
+
78
+ isar_mission_name: str = (
79
+ start_mission_definition.name
80
+ if start_mission_definition.name
81
+ else _build_mission_name()
82
+ )
83
+
84
+ start_pose = None
85
+ if start_mission_definition.start_pose:
86
+ start_pose = start_mission_definition.start_pose.to_alitra_pose()
87
+
88
+ return Mission(
89
+ tasks=isar_tasks,
90
+ name=isar_mission_name,
91
+ start_pose=start_pose,
92
+ )
93
+
94
+
95
+ def to_isar_task(task_definition: StartMissionTaskDefinition) -> TASKS:
96
+ if task_definition.type == TaskType.Inspection:
97
+ return to_inspection_task(task_definition)
98
+ elif task_definition.type == TaskType.ReturnToHome:
99
+ return create_return_to_home_task(task_definition)
100
+ else:
101
+ raise MissionPlannerError(
102
+ f"Failed to create task: '{task_definition.type}' is not a valid"
103
+ )
104
+
105
+
106
+ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
107
+ inspection_definition = task_definition.inspection
108
+
109
+ if inspection_definition.type == InspectionTypes.image:
110
+ return TakeImage(
111
+ id=task_definition.id if task_definition.id else uuid4_string(),
112
+ robot_pose=task_definition.pose.to_alitra_pose(),
113
+ tag_id=task_definition.tag,
114
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
115
+ metadata=task_definition.inspection.metadata,
116
+ zoom=task_definition.zoom,
117
+ )
118
+ elif inspection_definition.type == InspectionTypes.video:
119
+ return TakeVideo(
120
+ id=task_definition.id if task_definition.id else uuid4_string(),
121
+ robot_pose=task_definition.pose.to_alitra_pose(),
122
+ tag_id=task_definition.tag,
123
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
124
+ duration=inspection_definition.duration,
125
+ metadata=task_definition.inspection.metadata,
126
+ zoom=task_definition.zoom,
127
+ )
128
+ elif inspection_definition.type == InspectionTypes.thermal_image:
129
+ return TakeThermalImage(
130
+ id=task_definition.id if task_definition.id else uuid4_string(),
131
+ robot_pose=task_definition.pose.to_alitra_pose(),
132
+ tag_id=task_definition.tag,
133
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
134
+ metadata=task_definition.inspection.metadata,
135
+ zoom=task_definition.zoom,
136
+ )
137
+ elif inspection_definition.type == InspectionTypes.thermal_video:
138
+ return TakeThermalVideo(
139
+ id=task_definition.id if task_definition.id else uuid4_string(),
140
+ robot_pose=task_definition.pose.to_alitra_pose(),
141
+ tag_id=task_definition.tag,
142
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
143
+ duration=inspection_definition.duration,
144
+ metadata=task_definition.inspection.metadata,
145
+ zoom=task_definition.zoom,
146
+ )
147
+ elif inspection_definition.type == InspectionTypes.audio:
148
+ return RecordAudio(
149
+ id=task_definition.id if task_definition.id else uuid4_string(),
150
+ robot_pose=task_definition.pose.to_alitra_pose(),
151
+ tag_id=task_definition.tag,
152
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
153
+ duration=inspection_definition.duration,
154
+ metadata=task_definition.inspection.metadata,
155
+ )
156
+ elif inspection_definition.type == InspectionTypes.gas_measurement:
157
+ return TakeGasMeasurement(
158
+ id=task_definition.id if task_definition.id else uuid4_string(),
159
+ robot_pose=task_definition.pose.to_alitra_pose(),
160
+ tag_id=task_definition.tag,
161
+ metadata=task_definition.inspection.metadata,
162
+ )
163
+ else:
164
+ raise ValueError(
165
+ f"Inspection type '{inspection_definition.type}' not supported"
166
+ )
167
+
168
+
169
+ def create_return_to_home_task(
170
+ task_definition: StartMissionTaskDefinition,
171
+ ) -> ReturnToHome:
172
+ return ReturnToHome(pose=task_definition.pose.to_alitra_pose())
173
+
174
+
175
+ def _build_mission_name() -> str:
176
+ return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
@@ -1,11 +1,12 @@
1
1
  import logging
2
2
 
3
+ from fastapi import HTTPException
3
4
  from injector import inject
4
5
 
5
6
  from isar.apis.models.models import RobotInfoResponse
6
7
  from isar.config.settings import robot_settings, settings
7
8
  from isar.services.utilities.robot_utilities import RobotUtilities
8
- from fastapi import HTTPException
9
+ from robot_interface.models.robots.media import MediaConfig
9
10
 
10
11
 
11
12
  class RobotController:
@@ -17,8 +18,8 @@ class RobotController:
17
18
  self.robot_utilities: RobotUtilities = robot_utilities
18
19
  self.logger = logging.getLogger("api")
19
20
 
20
- def generate_media_config(self):
21
- media_config = self.robot_utilities.generate_media_config()
21
+ def generate_media_config(self) -> MediaConfig:
22
+ media_config: MediaConfig = self.robot_utilities.generate_media_config()
22
23
  if media_config is None:
23
24
  raise HTTPException(
24
25
  status_code=204,
@@ -26,7 +27,7 @@ class RobotController:
26
27
  )
27
28
  return media_config
28
29
 
29
- def get_info(self):
30
+ def get_info(self) -> RobotInfoResponse:
30
31
  return RobotInfoResponse(
31
32
  robot_package=settings.ROBOT_PACKAGE,
32
33
  isar_id=settings.ISAR_ID,
@@ -8,9 +8,9 @@ from injector import inject
8
8
 
9
9
  from isar.apis.models.models import (
10
10
  ControlMissionResponse,
11
- TaskResponse,
12
11
  InputPose,
13
12
  StartMissionResponse,
13
+ TaskResponse,
14
14
  )
15
15
  from isar.apis.models.start_mission_definition import (
16
16
  StartMissionDefinition,
@@ -45,12 +45,6 @@ class SchedulingController:
45
45
  title="Mission ID",
46
46
  description="ID-number for predefined mission",
47
47
  ),
48
- initial_pose: Optional[InputPose] = Body(
49
- default=None,
50
- description="The starting point of the mission. Used for initial "
51
- "localization of robot",
52
- embed=True,
53
- ),
54
48
  return_pose: Optional[InputPose] = Body(
55
49
  default=None,
56
50
  description="End pose of the mission. The robot return to the specified "
@@ -72,15 +66,9 @@ class SchedulingController:
72
66
  mission=mission, robot_capabilities=robot_settings.CAPABILITIES
73
67
  )
74
68
 
75
- initial_pose_alitra: Optional[Pose] = (
76
- initial_pose.to_alitra_pose() if initial_pose else None
77
- )
78
-
79
69
  self.logger.info(f"Starting mission with ISAR Mission ID: '{mission.id}'")
80
70
 
81
- self.scheduling_utilities.start_mission(
82
- mission=mission, initial_pose=initial_pose_alitra
83
- )
71
+ self.scheduling_utilities.start_mission(mission=mission)
84
72
 
85
73
  return self._api_response(mission)
86
74
 
@@ -92,12 +80,6 @@ class SchedulingController:
92
80
  title="Mission Definition",
93
81
  description="Description of the mission in json format",
94
82
  ),
95
- initial_pose: Optional[InputPose] = Body(
96
- default=None,
97
- description="The starting point of the mission. Used for initial "
98
- "localization of robot",
99
- embed=True,
100
- ),
101
83
  return_pose: Optional[InputPose] = Body(
102
84
  default=None,
103
85
  description="End pose of the mission. The robot return to the specified "
@@ -135,14 +117,8 @@ class SchedulingController:
135
117
  mission=mission, robot_capabilities=robot_settings.CAPABILITIES
136
118
  )
137
119
 
138
- initial_pose_alitra: Optional[Pose] = (
139
- initial_pose.to_alitra_pose() if initial_pose else None
140
- )
141
-
142
120
  self.logger.info(f"Starting mission: {mission.id}")
143
- self.scheduling_utilities.start_mission(
144
- mission=mission, initial_pose=initial_pose_alitra
145
- )
121
+ self.scheduling_utilities.start_mission(mission=mission)
146
122
  return self._api_response(mission)
147
123
 
148
124
  def pause_mission(self) -> ControlMissionResponse:
@@ -152,7 +128,6 @@ class SchedulingController:
152
128
 
153
129
  if state not in [
154
130
  States.Monitor,
155
- States.Initiate,
156
131
  ]:
157
132
  error_message = (
158
133
  f"Conflict - Pause command received in invalid state - State: {state}"
@@ -245,10 +220,7 @@ class SchedulingController:
245
220
  self.logger.info(
246
221
  f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
247
222
  )
248
- self.scheduling_utilities.start_mission(
249
- mission=mission,
250
- initial_pose=None,
251
- )
223
+ self.scheduling_utilities.start_mission(mission=mission)
252
224
  return self._api_response(mission)
253
225
 
254
226
  def _api_response(self, mission: Mission) -> StartMissionResponse:
@@ -50,7 +50,7 @@ class Authenticator:
50
50
  enabled_string = "enabled" if self.authentication_enabled else "disabled"
51
51
  self.logger.info(f"API authentication is {enabled_string}")
52
52
 
53
- def should_authenticate(self):
53
+ def should_authenticate(self) -> bool:
54
54
  return self.authentication_enabled
55
55
 
56
56
  def get_scheme(self):
@@ -58,7 +58,7 @@ class Authenticator:
58
58
  return validate_has_role
59
59
  return NoSecurity
60
60
 
61
- async def load_config(self):
61
+ async def load_config(self) -> None:
62
62
  """
63
63
  Load OpenID config on startup.
64
64
  """
@@ -1,7 +1,5 @@
1
1
  ISAR_ROBOT_PACKAGE = isar_robot
2
2
 
3
- ISAR_RUN_MISSION_BY_TASK = true
4
-
5
3
  ISAR_STORAGE_LOCAL_ENABLED = true
6
4
  ISAR_STORAGE_BLOB_ENABLED = false
7
5
  ISAR_STORAGE_SLIMM_ENABLED = false
@@ -12,7 +10,7 @@ ISAR_LOG_HANDLER_APPLICATION_INSIGHTS_ENABLED = false
12
10
  ISAR_MQTT_ENABLED = true
13
11
  ISAR_MQTT_SSL_ENABLED = true
14
12
 
15
- ISAR_AUTHENTICATION_ENABLED = false
13
+ ISAR_AUTHENTICATION_ENABLED = true
16
14
 
17
15
  ISAR_PLANT_SHORT_NAME = HUA
18
16
 
@@ -62,7 +62,7 @@ class Settings(BaseSettings):
62
62
  REQUEST_STATUS_COMMUNICATION_RECONNECT_DELAY: float = Field(default=10)
63
63
 
64
64
  # Number of attempts to stop the robot before giving up
65
- STOP_ROBOT_ATTEMPTS_LIMIT: int = Field(default=10)
65
+ STOP_ROBOT_ATTEMPTS_LIMIT: int = Field(default=3)
66
66
 
67
67
  # Number of attempts to stop the robot before giving up
68
68
  UPLOAD_FAILURE_ATTEMPTS_LIMIT: int = Field(default=10)
@@ -111,7 +111,7 @@ class Settings(BaseSettings):
111
111
  # Enabling this requires certain resources available for OAuth2 authentication
112
112
  # Currently supported authentication is Azure AD
113
113
  # (https://github.com/Intility/fastapi-azure-auth)
114
- AUTHENTICATION_ENABLED: bool = Field(default=False)
114
+ AUTHENTICATION_ENABLED: bool = Field(default=True)
115
115
 
116
116
  # Tenant ID for the Azure tenant with your Azure Active Directory application
117
117
  AZURE_TENANT_ID: str = Field(default="3aa4a235-b6e2-48d5-9195-7fcf05b459b0")
@@ -169,13 +169,13 @@ class Settings(BaseSettings):
169
169
  # submitted with the results once they have been uploaded.
170
170
 
171
171
  # Four digit code indicating facility
172
- PLANT_CODE: str = Field(default="1320")
172
+ PLANT_CODE: str = Field(default="1210")
173
173
 
174
174
  # Name of the facility the robot is operating in
175
- PLANT_NAME: str = Field(default="Kårstø")
175
+ PLANT_NAME: str = Field(default="Huldra")
176
176
 
177
177
  # Shortname of the facility the robot is operating in
178
- PLANT_SHORT_NAME: str = Field(default="KAA")
178
+ PLANT_SHORT_NAME: str = Field(default="HUA")
179
179
 
180
180
  # Country the robot is operating in
181
181
  COUNTRY: str = Field(default="Norway")
@@ -1,7 +1,4 @@
1
1
  from dataclasses import dataclass
2
- from typing import Optional
3
-
4
- from alitra import Pose
5
2
 
6
3
  from robot_interface.models.mission.mission import Mission
7
4
 
@@ -9,4 +6,3 @@ from robot_interface.models.mission.mission import Mission
9
6
  @dataclass
10
7
  class StartMissionMessage:
11
8
  mission: Mission
12
- initial_pose: Optional[Pose]
@@ -0,0 +1,27 @@
1
+ import queue
2
+ from typing import Any
3
+
4
+ from isar.models.communication.queues.queue_io import QueueIO
5
+ from isar.models.communication.queues.status_queue import StatusQueue
6
+
7
+
8
+ def trigger_event(queueio: QueueIO, data: Any = None) -> None:
9
+ queueio.input.put(data if data is not None else True)
10
+
11
+
12
+ def check_shared_state(queueio: StatusQueue) -> Any:
13
+ try:
14
+ return queueio.check()
15
+ except queue.Empty:
16
+ return None
17
+
18
+
19
+ def update_shared_state(queueio: StatusQueue, data: Any = None) -> None:
20
+ queueio.update(data if data is not None else True)
21
+
22
+
23
+ def check_for_event(queueio: QueueIO) -> Any:
24
+ try:
25
+ return queueio.input.get(block=False)
26
+ except queue.Empty:
27
+ return None
@@ -0,0 +1,37 @@
1
+ from queue import Queue
2
+
3
+ from isar.config.settings import settings
4
+ from isar.models.communication.queues.queue_io import QueueIO
5
+ from isar.models.communication.queues.status_queue import StatusQueue
6
+
7
+
8
+ class Queues:
9
+ def __init__(self) -> None:
10
+ self.api_start_mission: QueueIO = QueueIO(input_size=1, output_size=1)
11
+ self.api_stop_mission: QueueIO = QueueIO(input_size=1, output_size=1)
12
+ self.api_pause_mission: QueueIO = QueueIO(input_size=1, output_size=1)
13
+ self.api_resume_mission: QueueIO = QueueIO(input_size=1, output_size=1)
14
+
15
+ self.state_machine_start_mission: QueueIO = QueueIO(input_size=1, output_size=1)
16
+ self.state_machine_stop_mission: QueueIO = QueueIO(input_size=1, output_size=1)
17
+ self.state_machine_pause_mission: QueueIO = QueueIO(input_size=1, output_size=1)
18
+ self.state_machine_task_status_request: QueueIO = QueueIO(
19
+ input_size=1, output_size=1
20
+ )
21
+ self.state_machine_robot_status_request: QueueIO = QueueIO(
22
+ input_size=1, output_size=1
23
+ )
24
+ self.state_machine_current_task: StatusQueue = StatusQueue()
25
+
26
+ self.robot_task_status: QueueIO = QueueIO(input_size=1, output_size=1)
27
+ self.robot_task_status_failed: QueueIO = QueueIO(input_size=1, output_size=1)
28
+ self.robot_mission_started: QueueIO = QueueIO(input_size=1, output_size=1)
29
+ self.robot_mission_failed: QueueIO = QueueIO(input_size=1, output_size=1)
30
+ self.robot_status_changed: QueueIO = QueueIO(input_size=1, output_size=1)
31
+
32
+ self.upload_queue: Queue = Queue(maxsize=10)
33
+ self.state: StatusQueue = StatusQueue()
34
+ self.robot_status: StatusQueue = StatusQueue()
35
+
36
+ if settings.MQTT_ENABLED:
37
+ self.mqtt_queue: Queue = Queue()