isar 1.22.4__tar.gz → 1.23.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (216) hide show
  1. {isar-1.22.4 → isar-1.23.1}/PKG-INFO +1 -1
  2. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/api.py +1 -0
  3. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/models/models.py +2 -7
  4. isar-1.23.1/src/isar/apis/models/start_mission_definition.py +226 -0
  5. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/schedule/scheduling_controller.py +11 -20
  6. isar-1.23.1/src/isar/config/predefined_missions/default.json +74 -0
  7. isar-1.23.1/src/isar/config/predefined_missions/default_turtlebot.json +106 -0
  8. {isar-1.22.4 → isar-1.23.1}/src/isar/config/settings.env +1 -1
  9. {isar-1.22.4 → isar-1.23.1}/src/isar/config/settings.py +3 -3
  10. {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/local_planner.py +3 -0
  11. {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/sequential_task_selector.py +3 -3
  12. {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/task_selector_interface.py +4 -4
  13. {isar-1.22.4 → isar-1.23.1}/src/isar/script.py +1 -1
  14. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +1 -1
  15. {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/scheduling_utilities.py +3 -4
  16. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/state_machine.py +22 -98
  17. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/initialize.py +1 -1
  18. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/initiate.py +10 -10
  19. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/monitor.py +77 -100
  20. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/paused.py +1 -1
  21. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/stop.py +1 -1
  22. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/PKG-INFO +1 -1
  23. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/SOURCES.txt +0 -2
  24. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/exceptions/robot_exceptions.py +4 -4
  25. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/inspection/inspection.py +1 -1
  26. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/mission.py +2 -2
  27. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/status.py +0 -8
  28. isar-1.23.1/src/robot_interface/models/mission/task.py +197 -0
  29. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/robot_interface.py +29 -54
  30. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/test_successful_mission.py +4 -7
  31. {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/scheduler/test_scheduler_router.py +16 -45
  32. isar-1.23.1/tests/isar/mission/test_mission.py +134 -0
  33. isar-1.23.1/tests/isar/models/example_mission_definition.json +37 -0
  34. {isar-1.22.4 → isar-1.23.1}/tests/isar/models/test_start_mission_definition.py +11 -42
  35. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/test_base_reader.py +3 -7
  36. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/test_mission_reader.py +51 -50
  37. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/test_scheduling_utilities.py +2 -2
  38. {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/states/test_monitor.py +15 -20
  39. {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/test_state_machine.py +38 -39
  40. {isar-1.22.4 → isar-1.23.1}/tests/isar/storage/test_uploader.py +2 -2
  41. isar-1.23.1/tests/mocks/mission_definition.py +119 -0
  42. {isar-1.22.4 → isar-1.23.1}/tests/mocks/robot_interface.py +12 -12
  43. isar-1.23.1/tests/mocks/task.py +16 -0
  44. isar-1.23.1/tests/test_data/test_mission_working.json +93 -0
  45. isar-1.23.1/tests/test_data/test_thermal_image_mission.json +30 -0
  46. isar-1.22.4/src/isar/apis/models/start_mission_definition.py +0 -237
  47. isar-1.22.4/src/isar/config/predefined_missions/default.json +0 -92
  48. isar-1.22.4/src/isar/config/predefined_missions/default_turtlebot.json +0 -110
  49. isar-1.22.4/src/robot_interface/models/mission/step.py +0 -234
  50. isar-1.22.4/src/robot_interface/models/mission/task.py +0 -130
  51. isar-1.22.4/tests/isar/mission/test_mission.py +0 -171
  52. isar-1.22.4/tests/isar/models/example_mission_definition.json +0 -40
  53. isar-1.22.4/tests/mocks/mission_definition.py +0 -179
  54. isar-1.22.4/tests/mocks/step.py +0 -14
  55. isar-1.22.4/tests/mocks/task.py +0 -0
  56. isar-1.22.4/tests/test_data/test_mission_working.json +0 -115
  57. isar-1.22.4/tests/test_data/test_thermal_image_mission.json +0 -18
  58. {isar-1.22.4 → isar-1.23.1}/.dockerignore +0 -0
  59. {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  61. {isar-1.22.4 → isar-1.23.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  62. {isar-1.22.4 → isar-1.23.1}/.github/release.yml +0 -0
  63. {isar-1.22.4 → isar-1.23.1}/.github/workflows/compile_requirements.yml +0 -0
  64. {isar-1.22.4 → isar-1.23.1}/.github/workflows/project_automations.yml +0 -0
  65. {isar-1.22.4 → isar-1.23.1}/.github/workflows/publish_isar_base_image.yml +0 -0
  66. {isar-1.22.4 → isar-1.23.1}/.github/workflows/pythonpackage.yml +0 -0
  67. {isar-1.22.4 → isar-1.23.1}/.github/workflows/pythonpublish.yml +0 -0
  68. {isar-1.22.4 → isar-1.23.1}/.github/workflows/stale.yml +0 -0
  69. {isar-1.22.4 → isar-1.23.1}/.gitignore +0 -0
  70. {isar-1.22.4 → isar-1.23.1}/.pre-commit-config.yaml +0 -0
  71. {isar-1.22.4 → isar-1.23.1}/Dockerfile +0 -0
  72. {isar-1.22.4 → isar-1.23.1}/LICENSE +0 -0
  73. {isar-1.22.4 → isar-1.23.1}/README.md +0 -0
  74. {isar-1.22.4 → isar-1.23.1}/SECURITY.md +0 -0
  75. {isar-1.22.4 → isar-1.23.1}/docker-compose-turtlebot.yml +0 -0
  76. {isar-1.22.4 → isar-1.23.1}/docker-compose.yml +0 -0
  77. {isar-1.22.4 → isar-1.23.1}/docs/Makefile +0 -0
  78. {isar-1.22.4 → isar-1.23.1}/docs/make.bat +0 -0
  79. {isar-1.22.4 → isar-1.23.1}/docs/rst_processing.py +0 -0
  80. {isar-1.22.4 → isar-1.23.1}/docs/source/conf.py +0 -0
  81. {isar-1.22.4 → isar-1.23.1}/docs/source/index.rst +0 -0
  82. {isar-1.22.4 → isar-1.23.1}/docs/source/readme_link.md +0 -0
  83. {isar-1.22.4 → isar-1.23.1}/docs/state_machine_diagram.png +0 -0
  84. {isar-1.22.4 → isar-1.23.1}/main.py +0 -0
  85. {isar-1.22.4 → isar-1.23.1}/pyproject.toml +0 -0
  86. {isar-1.22.4 → isar-1.23.1}/radixconfig.yml +0 -0
  87. {isar-1.22.4 → isar-1.23.1}/requirements.txt +0 -0
  88. {isar-1.22.4 → isar-1.23.1}/setup.cfg +0 -0
  89. {isar-1.22.4 → isar-1.23.1}/src/isar/__init__.py +0 -0
  90. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/__init__.py +0 -0
  91. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/models/__init__.py +0 -0
  92. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/schedule/__init__.py +0 -0
  93. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/security/__init__.py +0 -0
  94. {isar-1.22.4 → isar-1.23.1}/src/isar/apis/security/authentication.py +0 -0
  95. {isar-1.22.4 → isar-1.23.1}/src/isar/config/__init__.py +0 -0
  96. {isar-1.22.4 → isar-1.23.1}/src/isar/config/certs/ca-cert.pem +0 -0
  97. {isar-1.22.4 → isar-1.23.1}/src/isar/config/configuration_error.py +0 -0
  98. {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/__init__.py +0 -0
  99. {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
  100. {isar-1.22.4 → isar-1.23.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
  101. {isar-1.22.4 → isar-1.23.1}/src/isar/config/log.py +0 -0
  102. {isar-1.22.4 → isar-1.23.1}/src/isar/config/logging.conf +0 -0
  103. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  104. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  105. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/default_map.json +0 -0
  106. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_b.json +0 -0
  107. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_compressor.json +0 -0
  108. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
  109. {isar-1.22.4 → isar-1.23.1}/src/isar/config/maps/turtleworld.json +0 -0
  110. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  111. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  112. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  113. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  114. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_missions/__init__.py +0 -0
  115. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_poses/__init__.py +0 -0
  116. {isar-1.22.4 → isar-1.23.1}/src/isar/config/predefined_poses/predefined_poses.py +0 -0
  117. {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/__init__.py +0 -0
  118. {isar-1.22.4 → isar-1.23.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  119. {isar-1.22.4 → isar-1.23.1}/src/isar/models/__init__.py +0 -0
  120. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/__init__.py +0 -0
  121. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/message.py +0 -0
  122. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/__init__.py +0 -0
  123. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queue_io.py +0 -0
  124. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  125. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/queues.py +0 -0
  126. {isar-1.22.4 → isar-1.23.1}/src/isar/models/communication/queues/status_queue.py +0 -0
  127. {isar-1.22.4 → isar-1.23.1}/src/isar/models/mission_metadata/__init__.py +0 -0
  128. {isar-1.22.4 → isar-1.23.1}/src/isar/modules.py +0 -0
  129. {isar-1.22.4 → isar-1.23.1}/src/isar/services/__init__.py +0 -0
  130. {isar-1.22.4 → isar-1.23.1}/src/isar/services/auth/__init__.py +0 -0
  131. {isar-1.22.4 → isar-1.23.1}/src/isar/services/auth/azure_credentials.py +0 -0
  132. {isar-1.22.4 → isar-1.23.1}/src/isar/services/readers/__init__.py +0 -0
  133. {isar-1.22.4 → isar-1.23.1}/src/isar/services/readers/base_reader.py +0 -0
  134. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/__init__.py +0 -0
  135. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  136. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  137. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  138. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/request_handler.py +0 -0
  139. {isar-1.22.4 → isar-1.23.1}/src/isar/services/service_connections/stid/__init__.py +0 -0
  140. {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/__init__.py +0 -0
  141. {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/queue_utilities.py +0 -0
  142. {isar-1.22.4 → isar-1.23.1}/src/isar/services/utilities/threaded_request.py +0 -0
  143. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/__init__.py +0 -0
  144. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/__init__.py +0 -0
  145. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/idle.py +0 -0
  146. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/off.py +0 -0
  147. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states/offline.py +0 -0
  148. {isar-1.22.4 → isar-1.23.1}/src/isar/state_machine/states_enum.py +0 -0
  149. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/__init__.py +0 -0
  150. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/blob_storage.py +0 -0
  151. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/local_storage.py +0 -0
  152. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/slimm_storage.py +0 -0
  153. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/storage_interface.py +0 -0
  154. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/uploader.py +0 -0
  155. {isar-1.22.4 → isar-1.23.1}/src/isar/storage/utilities.py +0 -0
  156. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/dependency_links.txt +0 -0
  157. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/entry_points.txt +0 -0
  158. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/requires.txt +0 -0
  159. {isar-1.22.4 → isar-1.23.1}/src/isar.egg-info/top_level.txt +0 -0
  160. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/__init__.py +0 -0
  161. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/__init__.py +0 -0
  162. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
  163. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/initialize/__init__.py +0 -0
  164. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  165. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/inspection/__init__.py +0 -0
  166. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/mission/__init__.py +0 -0
  167. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/robots/__init__.py +0 -0
  168. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/models/robots/robot_model.py +0 -0
  169. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/__init__.py +0 -0
  170. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/media_connection_type.py +0 -0
  171. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  172. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/telemetry/payloads.py +0 -0
  173. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/test_robot_interface.py +0 -0
  174. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/__init__.py +0 -0
  175. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/json_service.py +0 -0
  176. {isar-1.22.4 → isar-1.23.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  177. {isar-1.22.4 → isar-1.23.1}/tests/__init__.py +0 -0
  178. {isar-1.22.4 → isar-1.23.1}/tests/conftest.py +0 -0
  179. {isar-1.22.4 → isar-1.23.1}/tests/integration/__init__.py +0 -0
  180. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/__init__.py +0 -0
  181. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/__init__.py +0 -0
  182. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  183. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  184. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  185. {isar-1.22.4 → isar-1.23.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
  186. {isar-1.22.4 → isar-1.23.1}/tests/isar/__init__.py +0 -0
  187. {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/__init__.py +0 -0
  188. {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/scheduler/__init__.py +0 -0
  189. {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/security/__init__.py +0 -0
  190. {isar-1.22.4 → isar-1.23.1}/tests/isar/apis/security/test_authentication.py +0 -0
  191. {isar-1.22.4 → isar-1.23.1}/tests/isar/mission/__init__.py +0 -0
  192. {isar-1.22.4 → isar-1.23.1}/tests/isar/models/__init__.py +0 -0
  193. {isar-1.22.4 → isar-1.23.1}/tests/isar/models/communication/__init__.py +0 -0
  194. {isar-1.22.4 → isar-1.23.1}/tests/isar/models/communication/test_queues.py +0 -0
  195. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/__init__.py +0 -0
  196. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/readers/__init__.py +0 -0
  197. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/__init__.py +0 -0
  198. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  199. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  200. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/__init__.py +0 -0
  201. {isar-1.22.4 → isar-1.23.1}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  202. {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/__init__.py +0 -0
  203. {isar-1.22.4 → isar-1.23.1}/tests/isar/state_machine/states/__init__.py +0 -0
  204. {isar-1.22.4 → isar-1.23.1}/tests/isar/storage/test_blob_storage.py +0 -0
  205. {isar-1.22.4 → isar-1.23.1}/tests/mocks/__init__.py +0 -0
  206. {isar-1.22.4 → isar-1.23.1}/tests/mocks/blob_storage.py +0 -0
  207. {isar-1.22.4 → isar-1.23.1}/tests/mocks/mqtt_client.py +0 -0
  208. {isar-1.22.4 → isar-1.23.1}/tests/mocks/pose.py +0 -0
  209. {isar-1.22.4 → isar-1.23.1}/tests/mocks/request.py +0 -0
  210. {isar-1.22.4 → isar-1.23.1}/tests/mocks/status.py +0 -0
  211. {isar-1.22.4 → isar-1.23.1}/tests/mocks/token.py +0 -0
  212. {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_json_file.json +0 -0
  213. {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
  214. {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_mission_not_working.json +0 -0
  215. {isar-1.22.4 → isar-1.23.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  216. {isar-1.22.4 → isar-1.23.1}/tests/test_modules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.22.4
3
+ Version: 1.23.1
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
@@ -213,6 +213,7 @@ class API:
213
213
  methods=["POST"],
214
214
  dependencies=[authentication_dependency],
215
215
  summary="Drive to the provided pose",
216
+ deprecated=True,
216
217
  responses={
217
218
  HTTPStatus.OK.value: {
218
219
  "description": "Drive to succesfully started",
@@ -3,16 +3,13 @@ from typing import List, Optional
3
3
  from alitra import Frame, Orientation, Pose, Position
4
4
  from pydantic import BaseModel, Field
5
5
 
6
-
7
- class StepResponse(BaseModel):
8
- id: str
9
- type: str
6
+ from robot_interface.models.mission.task import TaskTypes
10
7
 
11
8
 
12
9
  class TaskResponse(BaseModel):
13
10
  id: str
14
11
  tag_id: Optional[str] = None
15
- steps: List[StepResponse]
12
+ type: TaskTypes
16
13
 
17
14
 
18
15
  class StartMissionResponse(BaseModel):
@@ -25,8 +22,6 @@ class ControlMissionResponse(BaseModel):
25
22
  mission_status: str
26
23
  task_id: str
27
24
  task_status: str
28
- step_id: str
29
- step_status: str
30
25
 
31
26
 
32
27
  class RobotInfoResponse(BaseModel):
@@ -0,0 +1,226 @@
1
+ import time
2
+ from enum import Enum
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ from alitra import Frame, Orientation, Pose, Position
6
+ from pydantic import BaseModel, Field
7
+
8
+ from isar.apis.models.models import InputPose, InputPosition
9
+ from isar.config.settings import settings
10
+ from isar.mission_planner.mission_planner_interface import MissionPlannerError
11
+ from robot_interface.models.inspection.inspection import Inspection, InspectionMetadata
12
+ from robot_interface.models.mission.mission import Mission
13
+ from robot_interface.models.mission.task import (
14
+ TASKS,
15
+ DockingProcedure,
16
+ Localize,
17
+ RecordAudio,
18
+ ReturnToHome,
19
+ TakeImage,
20
+ TakeThermalImage,
21
+ TakeThermalVideo,
22
+ TakeVideo,
23
+ )
24
+ from robot_interface.models.mission.task import Task
25
+
26
+
27
+ class InspectionTypes(str, Enum):
28
+ image: str = "Image"
29
+ thermal_image: str = "ThermalImage"
30
+ video: str = "Video"
31
+ thermal_video: str = "ThermalVideo"
32
+ audio: str = "Audio"
33
+
34
+
35
+ class TaskType(str, Enum):
36
+ Inspection: str = "inspection"
37
+ Localization: str = "localization"
38
+ ReturnToHome: str = "return_to_home"
39
+ Dock: str = "dock"
40
+
41
+
42
+ class StartMissionInspectionDefinition(BaseModel):
43
+ type: InspectionTypes = Field(default=InspectionTypes.image)
44
+ inspection_target: InputPosition
45
+ analysis_type: Optional[str] = None
46
+ duration: Optional[float] = None
47
+ metadata: Optional[dict] = None
48
+ id: Optional[str] = None
49
+
50
+
51
+ class StartMissionTaskDefinition(BaseModel):
52
+ type: TaskType = Field(default=TaskType.Inspection)
53
+ pose: InputPose
54
+ inspection: StartMissionInspectionDefinition
55
+ tag: Optional[str] = None
56
+ id: Optional[str] = None
57
+
58
+
59
+ class StartMissionDefinition(BaseModel):
60
+ tasks: List[StartMissionTaskDefinition]
61
+ id: Optional[str] = None
62
+ name: Optional[str] = None
63
+ start_pose: Optional[InputPose] = None
64
+ dock: Optional[bool] = None
65
+ undock: Optional[bool] = None
66
+
67
+
68
+ def to_isar_mission(start_mission_definition: StartMissionDefinition) -> Mission:
69
+ isar_tasks: List[TASKS] = []
70
+
71
+ for start_mission_task_definition in start_mission_definition.tasks:
72
+ task: TASKS = create_isar_task(start_mission_task_definition)
73
+ if start_mission_task_definition.id:
74
+ task.id = start_mission_task_definition.id
75
+ isar_tasks.append(task)
76
+
77
+ if not isar_tasks:
78
+ raise MissionPlannerError("Mission does not contain any valid tasks")
79
+
80
+ check_for_duplicate_ids(isar_tasks)
81
+
82
+ isar_mission: Mission = Mission(tasks=isar_tasks)
83
+
84
+ isar_mission.dock = start_mission_definition.dock
85
+ isar_mission.undock = start_mission_definition.undock
86
+
87
+ if start_mission_definition.name:
88
+ isar_mission.name = start_mission_definition.name
89
+ else:
90
+ isar_mission.name = _build_mission_name()
91
+
92
+ if start_mission_definition.id:
93
+ isar_mission.id = start_mission_definition.id
94
+
95
+ if start_mission_definition.start_pose:
96
+ input_pose: InputPose = start_mission_definition.start_pose
97
+ input_frame: Frame = Frame(name=input_pose.frame_name)
98
+ input_position: Position = Position(
99
+ input_pose.position.x,
100
+ input_pose.position.y,
101
+ input_pose.position.z,
102
+ input_frame,
103
+ )
104
+ input_orientation: Orientation = Orientation(
105
+ input_pose.orientation.x,
106
+ input_pose.orientation.y,
107
+ input_pose.orientation.z,
108
+ input_pose.orientation.w,
109
+ input_frame,
110
+ )
111
+ isar_mission.start_pose = Pose(
112
+ position=input_position, orientation=input_orientation, frame=input_frame
113
+ )
114
+
115
+ return isar_mission
116
+
117
+
118
+ def check_for_duplicate_ids(items: List[TASKS]):
119
+ duplicate_ids = get_duplicate_ids(items=items)
120
+ if len(duplicate_ids) > 0:
121
+ raise MissionPlannerError(
122
+ f"Failed to create as there were duplicate IDs which is not allowed "
123
+ f"({duplicate_ids})"
124
+ )
125
+
126
+
127
+ def create_isar_task(start_mission_task_definition) -> TASKS:
128
+
129
+ if start_mission_task_definition.type == TaskType.Inspection:
130
+ return create_inspection_task(start_mission_task_definition)
131
+ elif start_mission_task_definition.type == TaskType.Localization:
132
+ return create_localization_task(start_mission_task_definition)
133
+ elif start_mission_task_definition.type == TaskType.ReturnToHome:
134
+ return create_return_to_home_task(start_mission_task_definition)
135
+ elif start_mission_task_definition.type == TaskType.Dock:
136
+ return create_dock_task()
137
+ else:
138
+ raise MissionPlannerError(
139
+ f"Failed to create task: '{start_mission_task_definition.type}' is not a valid"
140
+ )
141
+
142
+
143
+ def create_inspection_task(
144
+ start_mission_task_definition: StartMissionTaskDefinition,
145
+ ) -> TASKS:
146
+
147
+ if start_mission_task_definition.inspection.type == InspectionTypes.image:
148
+ return TakeImage(
149
+ target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
150
+ tag_id=start_mission_task_definition.tag,
151
+ robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
152
+ metadata=start_mission_task_definition.inspection.metadata,
153
+ )
154
+ elif start_mission_task_definition.inspection.type == InspectionTypes.video:
155
+ return TakeVideo(
156
+ target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
157
+ duration=start_mission_task_definition.inspection.duration,
158
+ tag_id=start_mission_task_definition.tag,
159
+ robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
160
+ metadata=start_mission_task_definition.inspection.metadata,
161
+ )
162
+
163
+ elif start_mission_task_definition.inspection.type == InspectionTypes.thermal_image:
164
+ return TakeThermalImage(
165
+ target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
166
+ tag_id=start_mission_task_definition.tag,
167
+ robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
168
+ metadata=start_mission_task_definition.inspection.metadata,
169
+ )
170
+
171
+ elif start_mission_task_definition.inspection.type == InspectionTypes.thermal_video:
172
+ return TakeThermalVideo(
173
+ target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
174
+ duration=start_mission_task_definition.inspection.duration,
175
+ tag_id=start_mission_task_definition.tag,
176
+ robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
177
+ metadata=start_mission_task_definition.inspection.metadata,
178
+ )
179
+
180
+ elif start_mission_task_definition.inspection.type == InspectionTypes.audio:
181
+ return RecordAudio(
182
+ target=start_mission_task_definition.inspection.inspection_target.to_alitra_position(),
183
+ duration=start_mission_task_definition.inspection.duration,
184
+ tag_id=start_mission_task_definition.tag,
185
+ robot_pose=start_mission_task_definition.pose.to_alitra_pose(),
186
+ metadata=start_mission_task_definition.inspection.metadata,
187
+ )
188
+ else:
189
+ raise ValueError(
190
+ f"Inspection type '{start_mission_task_definition.inspection.type}' not supported"
191
+ )
192
+
193
+
194
+ def create_localization_task(
195
+ start_mission_task_definition: StartMissionTaskDefinition,
196
+ ) -> Localize:
197
+ return Localize(
198
+ localization_pose=start_mission_task_definition.pose.to_alitra_pose()
199
+ )
200
+
201
+
202
+ def create_return_to_home_task(
203
+ start_mission_task_definition: StartMissionTaskDefinition,
204
+ ) -> ReturnToHome:
205
+ return ReturnToHome(pose=start_mission_task_definition.pose.to_alitra_pose())
206
+
207
+
208
+ def create_dock_task() -> DockingProcedure:
209
+ return DockingProcedure(behavior="dock")
210
+
211
+
212
+ def get_duplicate_ids(items: List[TASKS]) -> List[str]:
213
+ unique_ids: List[str] = []
214
+ duplicate_ids: List[str] = []
215
+ for item in items:
216
+ id: str = item.id
217
+ if id not in unique_ids:
218
+ unique_ids.append(id)
219
+ else:
220
+ duplicate_ids.append(id)
221
+
222
+ return duplicate_ids
223
+
224
+
225
+ def _build_mission_name() -> str:
226
+ return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from http import HTTPStatus
3
- from typing import List, Optional
3
+ from typing import Optional
4
4
 
5
5
  from alitra import Pose
6
6
  from fastapi import Body, HTTPException, Path
@@ -21,8 +21,8 @@ from isar.mission_planner.mission_planner_interface import MissionPlannerError
21
21
  from isar.services.utilities.scheduling_utilities import SchedulingUtilities
22
22
  from isar.state_machine.states_enum import States
23
23
  from robot_interface.models.mission.mission import Mission
24
- from robot_interface.models.mission.step import (
25
- DriveToPose,
24
+ from robot_interface.models.mission.task import (
25
+ TASKS,
26
26
  Localize,
27
27
  MoveArm,
28
28
  ReturnToHome,
@@ -67,8 +67,7 @@ class SchedulingController:
67
67
  mission: Mission = self.scheduling_utilities.get_mission(mission_id)
68
68
  if return_pose:
69
69
  pose: Pose = return_pose.to_alitra_pose()
70
- step: DriveToPose = DriveToPose(pose=pose)
71
- mission.tasks.append(Task(steps=[step]))
70
+ mission.tasks.append(ReturnToHome(pose=pose))
72
71
 
73
72
  self.scheduling_utilities.verify_robot_capable_of_mission(
74
73
  mission=mission, robot_capabilities=robot_settings.CAPABILITIES
@@ -136,8 +135,7 @@ class SchedulingController:
136
135
  )
137
136
  if return_pose:
138
137
  pose: Pose = return_pose.to_alitra_pose()
139
- step: DriveToPose = DriveToPose(pose=pose)
140
- mission.tasks.append(Task(steps=[step]))
138
+ mission.tasks.append(ReturnToHome(pose=pose))
141
139
 
142
140
  initial_pose_alitra: Optional[Pose] = (
143
141
  initial_pose.to_alitra_pose() if initial_pose else None
@@ -211,7 +209,7 @@ class SchedulingController:
211
209
  target_pose: InputPose = Body(
212
210
  default=None,
213
211
  title="Target Pose",
214
- description="The target pose for the drive_to step",
212
+ description="The target pose for the drive_to task",
215
213
  ),
216
214
  ) -> StartMissionResponse:
217
215
  self.logger.info("Received request to start new drive-to mission")
@@ -221,8 +219,7 @@ class SchedulingController:
221
219
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
222
220
 
223
221
  pose: Pose = target_pose.to_alitra_pose()
224
- step: DriveToPose = DriveToPose(pose=pose)
225
- mission: Mission = Mission(tasks=[Task(steps=[step])])
222
+ mission: Mission = Mission(tasks=[ReturnToHome(pose=pose)])
226
223
 
227
224
  self.logger.info(
228
225
  f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
@@ -246,8 +243,7 @@ class SchedulingController:
246
243
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
247
244
 
248
245
  pose: Pose = localization_pose.to_alitra_pose()
249
- step: Localize = Localize(localization_pose=pose)
250
- mission: Mission = Mission(tasks=[Task(steps=[step])])
246
+ mission: Mission = Mission(tasks=[Localize(localization_pose=pose)])
251
247
 
252
248
  self.logger.info(
253
249
  f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
@@ -294,8 +290,7 @@ class SchedulingController:
294
290
 
295
291
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
296
292
 
297
- step: MoveArm = MoveArm(arm_pose=arm_pose_literal)
298
- mission: Mission = Mission(tasks=[Task(steps=[step])])
293
+ mission: Mission = Mission(tasks=[MoveArm(arm_pose=arm_pose_literal)])
299
294
 
300
295
  self.logger.info(
301
296
  f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
@@ -322,9 +317,5 @@ class SchedulingController:
322
317
  tasks=[self._task_api_response(task) for task in mission.tasks],
323
318
  )
324
319
 
325
- def _task_api_response(self, task: Task) -> TaskResponse:
326
- steps: List[dict] = []
327
- for step in task.steps:
328
- steps.append({"id": step.id, "type": step.__class__.__name__})
329
-
330
- return TaskResponse(id=task.id, tag_id=task.tag_id, steps=steps)
320
+ def _task_api_response(self, task: TASKS) -> TaskResponse:
321
+ return TaskResponse(id=task.id, tag_id=task.tag_id, type=task.type)
@@ -0,0 +1,74 @@
1
+ {
2
+ "id": "1",
3
+ "tasks": [
4
+ {
5
+ "type": "take_image",
6
+ "robot_pose": {
7
+ "position": {
8
+ "x": -2,
9
+ "y": -2,
10
+ "z": 0,
11
+ "frame": "asset"
12
+ },
13
+ "orientation": {
14
+ "x": 0,
15
+ "y": 0,
16
+ "z": 0.4794255,
17
+ "w": 0.8775826,
18
+ "frame": "asset"
19
+ },
20
+ "frame": "asset"
21
+ },
22
+ "target": {
23
+ "x": 2,
24
+ "y": 2,
25
+ "z": 0,
26
+ "frame": "robot"
27
+ }
28
+ },
29
+ {
30
+ "type": "take_thermal_image",
31
+ "robot_pose": {
32
+ "position": {
33
+ "x": -2,
34
+ "y": 2,
35
+ "z": 0,
36
+ "frame": "asset"
37
+ },
38
+ "orientation": {
39
+ "x": 0,
40
+ "y": 0,
41
+ "z": 0.4794255,
42
+ "w": 0.8775826,
43
+ "frame": "asset"
44
+ },
45
+ "frame": "asset"
46
+ },
47
+ "target": {
48
+ "x": 2,
49
+ "y": 2,
50
+ "z": 0,
51
+ "frame": "robot"
52
+ }
53
+ },
54
+ {
55
+ "type": "return_to_home",
56
+ "pose": {
57
+ "position": {
58
+ "x": 2,
59
+ "y": 2,
60
+ "z": 0,
61
+ "frame": "asset"
62
+ },
63
+ "orientation": {
64
+ "x": 0,
65
+ "y": 0,
66
+ "z": 0.4794255,
67
+ "w": 0.8775826,
68
+ "frame": "asset"
69
+ },
70
+ "frame": "asset"
71
+ }
72
+ }
73
+ ]
74
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "id": "2",
3
+ "tasks": [
4
+ {
5
+ "type": "take_image",
6
+ "robot_pose": {
7
+ "position": {
8
+ "x": -3.6,
9
+ "y": 4,
10
+ "z": 0,
11
+ "frame": "asset"
12
+ },
13
+ "orientation": {
14
+ "x": 0,
15
+ "y": 0,
16
+ "z": -0.7286672256879113,
17
+ "w": -0.6848660759820616,
18
+ "frame": "asset"
19
+ },
20
+ "frame": "asset"
21
+ },
22
+ "target": {
23
+ "x": -4.7,
24
+ "y": 4.9,
25
+ "z": 0,
26
+ "frame": "robot"
27
+ }
28
+ },
29
+
30
+ {
31
+ "type": "take_image",
32
+ "robot_pose": {
33
+ "position": {
34
+ "x": 4.7,
35
+ "y": 3,
36
+ "z": 0,
37
+ "frame": "asset"
38
+ },
39
+ "orientation": {
40
+ "x": 0,
41
+ "y": 0,
42
+ "z": 0.5769585,
43
+ "w": 0.8167734,
44
+ "frame": "asset"
45
+ },
46
+ "frame": "asset"
47
+ },
48
+ "target": {
49
+ "x": 5.6,
50
+ "y": 5.2,
51
+ "z": 0,
52
+ "frame": "robot"
53
+ }
54
+ },
55
+ {
56
+ "type": "take_thermal_image",
57
+ "robot_pose": {
58
+ "position": {
59
+ "x": 4.7,
60
+ "y": 3,
61
+ "z": 0,
62
+ "frame": "asset"
63
+ },
64
+ "orientation": {
65
+ "x": 0,
66
+ "y": 0,
67
+ "z": 0.5769585,
68
+ "w": 0.8167734,
69
+ "frame": "asset"
70
+ },
71
+ "frame": "asset"
72
+ },
73
+ "target": {
74
+ "x": 3.1,
75
+ "y": 5.2,
76
+ "z": 0,
77
+ "frame": "robot"
78
+ }
79
+ },
80
+ {
81
+ "type": "take_thermal_image",
82
+ "robot_pose": {
83
+ "position": {
84
+ "x": 0.95,
85
+ "y": 2.6,
86
+ "z": 0,
87
+ "frame": "asset"
88
+ },
89
+ "orientation": {
90
+ "x": 0,
91
+ "y": 0,
92
+ "z": -0.6992469,
93
+ "w": 0.7148802,
94
+ "frame": "asset"
95
+ },
96
+ "frame": "asset"
97
+ },
98
+ "target": {
99
+ "x": 1.9,
100
+ "y": 1.9,
101
+ "z": 0,
102
+ "frame": "robot"
103
+ }
104
+ }
105
+ ]
106
+ }
@@ -1,6 +1,6 @@
1
1
  ISAR_ROBOT_PACKAGE = isar_robot
2
2
 
3
- ISAR_RUN_MISSION_STEPWISE = true
3
+ ISAR_RUN_MISSION_BY_TASK = true
4
4
 
5
5
  ISAR_STORAGE_LOCAL_ENABLED = true
6
6
  ISAR_STORAGE_BLOB_ENABLED = false
@@ -26,7 +26,7 @@ class Settings(BaseSettings):
26
26
  ROBOT_PACKAGE: str = Field(default="isar_robot")
27
27
 
28
28
  # The run mode of the robot (stepwise or full mission)
29
- RUN_MISSION_STEPWISE: bool = Field(default=True)
29
+ RUN_MISSION_BY_TASK: bool = Field(default=True)
30
30
 
31
31
  # Determines the local path in which results from missions are stored
32
32
  LOCAL_STORAGE_PATH: str = Field(default="./results")
@@ -327,7 +327,7 @@ class RobotSettings(BaseSettings):
327
327
 
328
328
  # ISAR steps the robot is capable of performing
329
329
  # This should be set in the robot package settings.env file
330
- CAPABILITIES: List[str] = Field(default=["drive_to_pose", "take_image"])
330
+ CAPABILITIES: List[str] = Field(default=["return_to_home", "take_image"])
331
331
 
332
332
  # Model of the robot which ISAR is connected to
333
333
  # This should be set in the robot package settings.env file
@@ -345,6 +345,6 @@ class RobotSettings(BaseSettings):
345
345
 
346
346
  robot_settings = RobotSettings()
347
347
 
348
- if not settings.RUN_MISSION_STEPWISE: # If mission-wise, do not run localize missions
348
+ if not settings.RUN_MISSION_BY_TASK: # If mission-wise, do not run localize missions
349
349
  if "localize" in robot_settings.CAPABILITIES:
350
350
  robot_settings.CAPABILITIES.remove("localize")
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from pathlib import Path
3
+ from typing import List, Optional
3
4
 
4
5
  from alitra import Frame
5
6
  from injector import inject
@@ -13,6 +14,7 @@ from isar.mission_planner.mission_planner_interface import (
13
14
  from isar.services.readers.base_reader import BaseReader, BaseReaderError
14
15
  from robot_interface.models.mission.mission import Mission
15
16
 
17
+
16
18
  logger = logging.getLogger("api")
17
19
 
18
20
 
@@ -38,6 +40,7 @@ class LocalPlanner(MissionPlannerInterface):
38
40
  @staticmethod
39
41
  def read_mission_from_file(mission_path: Path) -> Mission:
40
42
  mission_dict: dict = BaseReader.read_json(location=mission_path)
43
+
41
44
  mission: Mission = BaseReader.dict_to_dataclass(
42
45
  dataclass_dict=mission_dict,
43
46
  target_dataclass=Mission,
@@ -4,7 +4,7 @@ from isar.mission_planner.task_selector_interface import (
4
4
  TaskSelectorInterface,
5
5
  TaskSelectorStop,
6
6
  )
7
- from robot_interface.models.mission.task import Task
7
+ from robot_interface.models.mission.task import TASKS, Task
8
8
 
9
9
 
10
10
  class SequentialTaskSelector(TaskSelectorInterface):
@@ -12,11 +12,11 @@ class SequentialTaskSelector(TaskSelectorInterface):
12
12
  super().__init__()
13
13
  self._iterator: Iterator = None
14
14
 
15
- def initialize(self, tasks: List[Task]) -> None:
15
+ def initialize(self, tasks: List[TASKS]) -> None:
16
16
  super().initialize(tasks=tasks)
17
17
  self._iterator = iter(self.tasks)
18
18
 
19
- def next_task(self) -> Task:
19
+ def next_task(self) -> TASKS:
20
20
  try:
21
21
  return next(self._iterator)
22
22
  except StopIteration:
@@ -1,18 +1,18 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
  from typing import List
3
3
 
4
- from robot_interface.models.mission.task import Task
4
+ from robot_interface.models.mission.task import TASKS, Task
5
5
 
6
6
 
7
7
  class TaskSelectorInterface(metaclass=ABCMeta):
8
8
  def __init__(self) -> None:
9
- self.tasks: List[Task] = None
9
+ self.tasks: List[TASKS] = None
10
10
 
11
- def initialize(self, tasks: List[Task]) -> None:
11
+ def initialize(self, tasks: List[TASKS]) -> None:
12
12
  self.tasks = tasks
13
13
 
14
14
  @abstractmethod
15
- def next_task(self) -> Task:
15
+ def next_task(self) -> TASKS:
16
16
  """
17
17
  Returns
18
18
  -------
@@ -63,7 +63,7 @@ def print_startup_info():
63
63
  print_setting(fillchar="-")
64
64
  print_setting("Robot package", settings.ROBOT_PACKAGE)
65
65
  print_setting("Robot name", settings.ROBOT_NAME)
66
- print_setting("Run mission stepwise", settings.RUN_MISSION_STEPWISE)
66
+ print_setting("Run mission stepwise", settings.RUN_MISSION_BY_TASK)
67
67
  print_setting("Running on port", settings.API_PORT)
68
68
  print_setting("Mission planner", settings.MISSION_PLANNER)
69
69
  print_setting("Using local storage", settings.STORAGE_LOCAL_ENABLED)
@@ -99,7 +99,7 @@ class MqttClient(MqttClientInterface):
99
99
  )
100
100
  def connect(self, host: str, port: int) -> None:
101
101
  self.logger.info("Attempting to connect to MQTT Broker")
102
- self.logger.debug(f"Host: {host}, Port: {port}")
102
+ self.logger.info(f"Host: {host}, Port: {port}")
103
103
  self.client.connect(host=host, port=port)
104
104
 
105
105
  def publish(self, topic: str, payload: str, qos: int = 0, retain: bool = False):
@@ -101,10 +101,9 @@ class SchedulingUtilities:
101
101
  is_capable: bool = True
102
102
  missing_capabilities: Set[str] = set()
103
103
  for task in mission.tasks:
104
- for step in task.steps:
105
- if not step.type in robot_capabilities:
106
- is_capable = False
107
- missing_capabilities.add(step.type)
104
+ if not task.type in robot_capabilities:
105
+ is_capable = False
106
+ missing_capabilities.add(task.type)
108
107
 
109
108
  if not is_capable:
110
109
  error_message = (