isar 1.24.6__tar.gz → 1.25.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 (206) hide show
  1. {isar-1.24.6 → isar-1.25.0}/PKG-INFO +1 -1
  2. {isar-1.24.6 → isar-1.25.0}/requirements.txt +12 -13
  3. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/models/models.py +1 -0
  4. isar-1.25.0/src/isar/apis/models/start_mission_definition.py +181 -0
  5. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/schedule/scheduling_controller.py +27 -9
  6. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/default.json +12 -11
  7. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/default_turtlebot.json +17 -16
  8. {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/local_planner.py +6 -20
  9. {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/mission_planner_interface.py +1 -1
  10. {isar-1.24.6 → isar-1.25.0}/src/isar/script.py +1 -1
  11. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/state_machine.py +2 -2
  12. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/monitor.py +11 -3
  13. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/slimm_storage.py +4 -1
  14. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/utilities.py +3 -4
  15. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/PKG-INFO +1 -1
  16. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/SOURCES.txt +3 -5
  17. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/inspection/inspection.py +4 -11
  18. isar-1.25.0/src/robot_interface/models/mission/mission.py +20 -0
  19. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/mission/task.py +28 -40
  20. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/robot_interface.py +7 -5
  21. {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/test_successful_mission.py +3 -2
  22. isar-1.25.0/tests/isar/apis/models/test_start_mission_definition.py +81 -0
  23. {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -60
  24. {isar-1.24.6 → isar-1.25.0}/tests/isar/mission/test_mission.py +5 -7
  25. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/readers/test_mission_reader.py +20 -20
  26. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/test_queue_utilities.py +4 -4
  27. {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/states/test_monitor.py +1 -2
  28. {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/test_state_machine.py +7 -7
  29. {isar-1.24.6 → isar-1.25.0}/tests/isar/storage/test_uploader.py +11 -4
  30. {isar-1.24.6 → isar-1.25.0}/tests/mocks/mission_definition.py +2 -37
  31. {isar-1.24.6 → isar-1.25.0}/tests/mocks/robot_interface.py +7 -7
  32. {isar-1.24.6 → isar-1.25.0}/tests/mocks/task.py +6 -2
  33. {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_working.json +15 -14
  34. {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_working_no_tasks.json +1 -0
  35. {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_thermal_image_mission.json +5 -4
  36. isar-1.24.6/src/isar/apis/models/start_mission_definition.py +0 -231
  37. isar-1.24.6/src/isar/services/readers/base_reader.py +0 -37
  38. isar-1.24.6/src/robot_interface/models/mission/mission.py +0 -28
  39. isar-1.24.6/tests/isar/models/test_start_mission_definition.py +0 -63
  40. isar-1.24.6/tests/isar/services/readers/test_base_reader.py +0 -23
  41. {isar-1.24.6 → isar-1.25.0}/.dockerignore +0 -0
  42. {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  43. {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  44. {isar-1.24.6 → isar-1.25.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  45. {isar-1.24.6 → isar-1.25.0}/.github/release.yml +0 -0
  46. {isar-1.24.6 → isar-1.25.0}/.github/workflows/compile_requirements.yml +0 -0
  47. {isar-1.24.6 → isar-1.25.0}/.github/workflows/project_automations.yml +0 -0
  48. {isar-1.24.6 → isar-1.25.0}/.github/workflows/publish_isar_base_image.yml +0 -0
  49. {isar-1.24.6 → isar-1.25.0}/.github/workflows/pythonpackage.yml +0 -0
  50. {isar-1.24.6 → isar-1.25.0}/.github/workflows/pythonpublish.yml +0 -0
  51. {isar-1.24.6 → isar-1.25.0}/.github/workflows/stale.yml +0 -0
  52. {isar-1.24.6 → isar-1.25.0}/.gitignore +0 -0
  53. {isar-1.24.6 → isar-1.25.0}/.pre-commit-config.yaml +0 -0
  54. {isar-1.24.6 → isar-1.25.0}/Dockerfile +0 -0
  55. {isar-1.24.6 → isar-1.25.0}/LICENSE +0 -0
  56. {isar-1.24.6 → isar-1.25.0}/README.md +0 -0
  57. {isar-1.24.6 → isar-1.25.0}/SECURITY.md +0 -0
  58. {isar-1.24.6 → isar-1.25.0}/docker-compose-turtlebot.yml +0 -0
  59. {isar-1.24.6 → isar-1.25.0}/docker-compose.yml +0 -0
  60. {isar-1.24.6 → isar-1.25.0}/docs/Makefile +0 -0
  61. {isar-1.24.6 → isar-1.25.0}/docs/make.bat +0 -0
  62. {isar-1.24.6 → isar-1.25.0}/docs/rst_processing.py +0 -0
  63. {isar-1.24.6 → isar-1.25.0}/docs/source/conf.py +0 -0
  64. {isar-1.24.6 → isar-1.25.0}/docs/source/index.rst +0 -0
  65. {isar-1.24.6 → isar-1.25.0}/docs/source/readme_link.md +0 -0
  66. {isar-1.24.6 → isar-1.25.0}/docs/state_machine_diagram.png +0 -0
  67. {isar-1.24.6 → isar-1.25.0}/main.py +0 -0
  68. {isar-1.24.6 → isar-1.25.0}/pyproject.toml +0 -0
  69. {isar-1.24.6 → isar-1.25.0}/radixconfig.yml +0 -0
  70. {isar-1.24.6 → isar-1.25.0}/setup.cfg +0 -0
  71. {isar-1.24.6 → isar-1.25.0}/src/isar/__init__.py +0 -0
  72. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/__init__.py +0 -0
  73. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/api.py +0 -0
  74. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/models/__init__.py +0 -0
  75. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/robot_control/robot_controller.py +0 -0
  76. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/schedule/__init__.py +0 -0
  77. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/security/__init__.py +0 -0
  78. {isar-1.24.6 → isar-1.25.0}/src/isar/apis/security/authentication.py +0 -0
  79. {isar-1.24.6 → isar-1.25.0}/src/isar/config/__init__.py +0 -0
  80. {isar-1.24.6 → isar-1.25.0}/src/isar/config/certs/ca-cert.pem +0 -0
  81. {isar-1.24.6 → isar-1.25.0}/src/isar/config/configuration_error.py +0 -0
  82. {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/__init__.py +0 -0
  83. {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
  84. {isar-1.24.6 → isar-1.25.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
  85. {isar-1.24.6 → isar-1.25.0}/src/isar/config/log.py +0 -0
  86. {isar-1.24.6 → isar-1.25.0}/src/isar/config/logging.conf +0 -0
  87. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  88. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  89. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/default_map.json +0 -0
  90. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_b.json +0 -0
  91. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_compressor.json +0 -0
  92. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
  93. {isar-1.24.6 → isar-1.25.0}/src/isar/config/maps/turtleworld.json +0 -0
  94. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  95. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  96. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  97. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  98. {isar-1.24.6 → isar-1.25.0}/src/isar/config/predefined_missions/__init__.py +0 -0
  99. {isar-1.24.6 → isar-1.25.0}/src/isar/config/settings.env +0 -0
  100. {isar-1.24.6 → isar-1.25.0}/src/isar/config/settings.py +0 -0
  101. {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/__init__.py +0 -0
  102. {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  103. {isar-1.24.6 → isar-1.25.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
  104. {isar-1.24.6 → isar-1.25.0}/src/isar/models/__init__.py +0 -0
  105. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/__init__.py +0 -0
  106. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/message.py +0 -0
  107. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/__init__.py +0 -0
  108. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queue_io.py +0 -0
  109. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  110. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/queues.py +0 -0
  111. {isar-1.24.6 → isar-1.25.0}/src/isar/models/communication/queues/status_queue.py +0 -0
  112. {isar-1.24.6 → isar-1.25.0}/src/isar/models/mission_metadata/__init__.py +0 -0
  113. {isar-1.24.6 → isar-1.25.0}/src/isar/modules.py +0 -0
  114. {isar-1.24.6 → isar-1.25.0}/src/isar/services/__init__.py +0 -0
  115. {isar-1.24.6 → isar-1.25.0}/src/isar/services/auth/__init__.py +0 -0
  116. {isar-1.24.6 → isar-1.25.0}/src/isar/services/auth/azure_credentials.py +0 -0
  117. {isar-1.24.6/src/isar/services/readers → isar-1.25.0/src/isar/services/service_connections}/__init__.py +0 -0
  118. {isar-1.24.6/src/isar/services/service_connections → isar-1.25.0/src/isar/services/service_connections/mqtt}/__init__.py +0 -0
  119. {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  120. {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  121. {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  122. {isar-1.24.6 → isar-1.25.0}/src/isar/services/service_connections/request_handler.py +0 -0
  123. {isar-1.24.6/src/isar/services/service_connections/mqtt → isar-1.25.0/src/isar/services/service_connections/stid}/__init__.py +0 -0
  124. {isar-1.24.6/src/isar/services/service_connections/stid → isar-1.25.0/src/isar/services/utilities}/__init__.py +0 -0
  125. {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/queue_utilities.py +0 -0
  126. {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/robot_utilities.py +0 -0
  127. {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  128. {isar-1.24.6 → isar-1.25.0}/src/isar/services/utilities/threaded_request.py +0 -0
  129. {isar-1.24.6/src/isar/services/utilities → isar-1.25.0/src/isar/state_machine}/__init__.py +0 -0
  130. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/__init__.py +0 -0
  131. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/idle.py +0 -0
  132. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/initialize.py +0 -0
  133. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/initiate.py +0 -0
  134. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/off.py +0 -0
  135. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/offline.py +0 -0
  136. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/paused.py +0 -0
  137. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states/stop.py +0 -0
  138. {isar-1.24.6 → isar-1.25.0}/src/isar/state_machine/states_enum.py +0 -0
  139. {isar-1.24.6/src/isar/state_machine → isar-1.25.0/src/isar/storage}/__init__.py +0 -0
  140. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/blob_storage.py +0 -0
  141. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/local_storage.py +0 -0
  142. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/storage_interface.py +0 -0
  143. {isar-1.24.6 → isar-1.25.0}/src/isar/storage/uploader.py +0 -0
  144. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/dependency_links.txt +0 -0
  145. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/entry_points.txt +0 -0
  146. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/requires.txt +0 -0
  147. {isar-1.24.6 → isar-1.25.0}/src/isar.egg-info/top_level.txt +0 -0
  148. {isar-1.24.6/src/isar/storage → isar-1.25.0/src/robot_interface}/__init__.py +0 -0
  149. {isar-1.24.6/src/robot_interface → isar-1.25.0/src/robot_interface/models}/__init__.py +0 -0
  150. {isar-1.24.6/src/robot_interface/models → isar-1.25.0/src/robot_interface/models/exceptions}/__init__.py +0 -0
  151. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  152. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/initialize/__init__.py +0 -0
  153. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  154. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/inspection/__init__.py +0 -0
  155. {isar-1.24.6/src/robot_interface/models/exceptions → isar-1.25.0/src/robot_interface/models/mission}/__init__.py +0 -0
  156. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/mission/status.py +0 -0
  157. {isar-1.24.6/src/robot_interface/models/mission → isar-1.25.0/src/robot_interface/models/robots}/__init__.py +0 -0
  158. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/robots/media.py +0 -0
  159. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/models/robots/robot_model.py +0 -0
  160. {isar-1.24.6/src/robot_interface/models/robots → isar-1.25.0/src/robot_interface/telemetry}/__init__.py +0 -0
  161. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  162. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/telemetry/payloads.py +0 -0
  163. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/test_robot_interface.py +0 -0
  164. {isar-1.24.6/src/robot_interface/telemetry → isar-1.25.0/src/robot_interface/utilities}/__init__.py +0 -0
  165. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/utilities/json_service.py +0 -0
  166. {isar-1.24.6 → isar-1.25.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  167. {isar-1.24.6/src/robot_interface/utilities → isar-1.25.0/tests}/__init__.py +0 -0
  168. {isar-1.24.6 → isar-1.25.0}/tests/conftest.py +0 -0
  169. {isar-1.24.6/tests → isar-1.25.0/tests/integration}/__init__.py +0 -0
  170. {isar-1.24.6/tests/integration → isar-1.25.0/tests/integration/turtlebot}/__init__.py +0 -0
  171. {isar-1.24.6/tests/integration/turtlebot → isar-1.25.0/tests/integration/turtlebot/config}/__init__.py +0 -0
  172. {isar-1.24.6/tests/integration/turtlebot/config → isar-1.25.0/tests/integration/turtlebot/config/maps}/__init__.py +0 -0
  173. {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  174. {isar-1.24.6/tests/integration/turtlebot/config/maps → isar-1.25.0/tests/integration/turtlebot/config/missions}/__init__.py +0 -0
  175. {isar-1.24.6 → isar-1.25.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
  176. {isar-1.24.6/tests/integration/turtlebot/config/missions → isar-1.25.0/tests/isar}/__init__.py +0 -0
  177. {isar-1.24.6/tests/isar → isar-1.25.0/tests/isar/apis}/__init__.py +0 -0
  178. {isar-1.24.6/tests/isar/apis → isar-1.25.0/tests/isar/apis/models}/__init__.py +0 -0
  179. {isar-1.24.6/tests/isar → isar-1.25.0/tests/isar/apis}/models/example_mission_definition.json +0 -0
  180. {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/scheduler/__init__.py +0 -0
  181. {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/security/__init__.py +0 -0
  182. {isar-1.24.6 → isar-1.25.0}/tests/isar/apis/security/test_authentication.py +0 -0
  183. {isar-1.24.6 → isar-1.25.0}/tests/isar/mission/__init__.py +0 -0
  184. {isar-1.24.6 → isar-1.25.0}/tests/isar/models/__init__.py +0 -0
  185. {isar-1.24.6 → isar-1.25.0}/tests/isar/models/communication/__init__.py +0 -0
  186. {isar-1.24.6 → isar-1.25.0}/tests/isar/models/communication/test_queues.py +0 -0
  187. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/__init__.py +0 -0
  188. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/readers/__init__.py +0 -0
  189. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/__init__.py +0 -0
  190. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  191. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  192. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/__init__.py +0 -0
  193. {isar-1.24.6 → isar-1.25.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  194. {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/__init__.py +0 -0
  195. {isar-1.24.6 → isar-1.25.0}/tests/isar/state_machine/states/__init__.py +0 -0
  196. {isar-1.24.6 → isar-1.25.0}/tests/isar/storage/test_blob_storage.py +0 -0
  197. {isar-1.24.6 → isar-1.25.0}/tests/mocks/__init__.py +0 -0
  198. {isar-1.24.6 → isar-1.25.0}/tests/mocks/blob_storage.py +0 -0
  199. {isar-1.24.6 → isar-1.25.0}/tests/mocks/mqtt_client.py +0 -0
  200. {isar-1.24.6 → isar-1.25.0}/tests/mocks/pose.py +0 -0
  201. {isar-1.24.6 → isar-1.25.0}/tests/mocks/request.py +0 -0
  202. {isar-1.24.6 → isar-1.25.0}/tests/mocks/status.py +0 -0
  203. {isar-1.24.6 → isar-1.25.0}/tests/mocks/token.py +0 -0
  204. {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
  205. {isar-1.24.6 → isar-1.25.0}/tests/test_data/test_mission_not_working.json +0 -0
  206. {isar-1.24.6 → isar-1.25.0}/tests/test_modules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.24.6
3
+ Version: 1.25.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
@@ -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.2.post1
11
+ anyio==4.7.0
12
12
  # via
13
13
  # httpx
14
14
  # starlette
@@ -43,7 +43,7 @@ click==8.1.7
43
43
  # via
44
44
  # isar (pyproject.toml)
45
45
  # uvicorn
46
- cryptography==43.0.3
46
+ cryptography==44.0.0
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.5
57
+ fastapi==0.115.6
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.23.0
63
+ google-api-core==2.24.0
64
64
  # via opencensus
65
65
  google-auth==2.36.0
66
66
  # via google-api-core
@@ -72,7 +72,7 @@ h11==0.14.0
72
72
  # uvicorn
73
73
  httpcore==1.0.7
74
74
  # via httpx
75
- httpx==0.27.2
75
+ httpx==0.28.1
76
76
  # via fastapi-azure-auth
77
77
  idna==3.10
78
78
  # 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.1.3
94
+ numpy==2.2.0
95
95
  # via
96
96
  # alitra
97
97
  # isar (pyproject.toml)
@@ -115,7 +115,7 @@ portalocker==2.10.1
115
115
  # via msal-extensions
116
116
  proto-plus==1.25.0
117
117
  # via google-api-core
118
- protobuf==5.28.3
118
+ protobuf==5.29.1
119
119
  # via
120
120
  # google-api-core
121
121
  # googleapis-common-protos
@@ -130,7 +130,7 @@ pyasn1-modules==0.4.1
130
130
  # via google-auth
131
131
  pycparser==2.22
132
132
  # via cffi
133
- pydantic==2.10.1
133
+ pydantic==2.10.3
134
134
  # via
135
135
  # fastapi
136
136
  # isar (pyproject.toml)
@@ -139,7 +139,7 @@ pydantic-core==2.27.1
139
139
  # via pydantic
140
140
  pydantic-settings==2.6.1
141
141
  # via isar (pyproject.toml)
142
- pyjwt[crypto]==2.10.0
142
+ pyjwt[crypto]==2.10.1
143
143
  # via
144
144
  # fastapi-azure-auth
145
145
  # isar (pyproject.toml)
@@ -165,21 +165,20 @@ rsa==4.9
165
165
  # via google-auth
166
166
  scipy==1.14.1
167
167
  # via alitra
168
- six==1.16.0
168
+ six==1.17.0
169
169
  # via
170
170
  # azure-core
171
171
  # opencensus
172
172
  # transitions
173
173
  sniffio==1.3.1
174
- # via
175
- # anyio
176
- # httpx
174
+ # via anyio
177
175
  starlette==0.41.3
178
176
  # via fastapi
179
177
  transitions==0.9.2
180
178
  # via isar (pyproject.toml)
181
179
  typing-extensions==4.12.2
182
180
  # via
181
+ # anyio
183
182
  # azure-core
184
183
  # azure-identity
185
184
  # azure-keyvault-secrets
@@ -9,6 +9,7 @@ from robot_interface.models.mission.task import TaskTypes
9
9
  class TaskResponse(BaseModel):
10
10
  id: str
11
11
  tag_id: Optional[str] = None
12
+ inspection_id: Optional[str] = None
12
13
  type: TaskTypes
13
14
 
14
15
 
@@ -0,0 +1,181 @@
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
+ DockingProcedure,
14
+ Localize,
15
+ RecordAudio,
16
+ ReturnToHome,
17
+ TakeImage,
18
+ TakeThermalImage,
19
+ TakeThermalVideo,
20
+ TakeVideo,
21
+ ZoomDescription,
22
+ )
23
+
24
+
25
+ class InspectionTypes(str, Enum):
26
+ image: str = "Image"
27
+ thermal_image: str = "ThermalImage"
28
+ video: str = "Video"
29
+ thermal_video: str = "ThermalVideo"
30
+ audio: str = "Audio"
31
+
32
+
33
+ class TaskType(str, Enum):
34
+ Inspection: str = "inspection"
35
+ Localization: str = "localization"
36
+ ReturnToHome: str = "return_to_home"
37
+ Dock: str = "dock"
38
+
39
+
40
+ class StartMissionInspectionDefinition(BaseModel):
41
+ type: InspectionTypes = Field(default=InspectionTypes.image)
42
+ inspection_target: InputPosition
43
+ analysis_type: Optional[str] = None
44
+ duration: Optional[float] = None
45
+ metadata: Optional[dict] = None
46
+
47
+
48
+ class StartMissionTaskDefinition(BaseModel):
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
+ dock: Optional[bool] = Field(default=False)
61
+ undock: Optional[bool] = Field(default=False)
62
+
63
+
64
+ def to_isar_mission(
65
+ start_mission_definition: StartMissionDefinition,
66
+ return_pose: Optional[InputPose] = None,
67
+ ) -> Mission:
68
+ isar_tasks: List[TASKS] = []
69
+
70
+ for task_definition in start_mission_definition.tasks:
71
+ task: TASKS = to_isar_task(task_definition)
72
+ isar_tasks.append(task)
73
+
74
+ if return_pose:
75
+ isar_tasks.append(ReturnToHome(pose=return_pose.to_alitra_pose()))
76
+
77
+ if not isar_tasks:
78
+ raise MissionPlannerError("Mission does not contain any valid tasks")
79
+
80
+ isar_mission_name: str
81
+ if start_mission_definition.name:
82
+ isar_mission_name = start_mission_definition.name
83
+ else:
84
+ isar_mission_name = _build_mission_name()
85
+
86
+ start_pose = None
87
+ if start_mission_definition.start_pose:
88
+ start_pose = start_mission_definition.start_pose.to_alitra_pose()
89
+
90
+ return Mission(
91
+ tasks=isar_tasks,
92
+ name=isar_mission_name,
93
+ start_pose=start_pose,
94
+ dock=start_mission_definition.dock,
95
+ undock=start_mission_definition.undock,
96
+ )
97
+
98
+
99
+ def to_isar_task(task_definition: StartMissionTaskDefinition) -> TASKS:
100
+ if task_definition.type == TaskType.Inspection:
101
+ return to_inspection_task(task_definition)
102
+ elif task_definition.type == TaskType.Localization:
103
+ return to_localization_task(task_definition)
104
+ elif task_definition.type == TaskType.ReturnToHome:
105
+ return create_return_to_home_task(task_definition)
106
+ elif task_definition.type == TaskType.Dock:
107
+ return create_dock_task()
108
+ else:
109
+ raise MissionPlannerError(
110
+ f"Failed to create task: '{task_definition.type}' is not a valid"
111
+ )
112
+
113
+
114
+ def to_inspection_task(task_definition: StartMissionTaskDefinition) -> TASKS:
115
+ inspection_definition = task_definition.inspection
116
+
117
+ if inspection_definition.type == InspectionTypes.image:
118
+ return TakeImage(
119
+ robot_pose=task_definition.pose.to_alitra_pose(),
120
+ tag_id=task_definition.tag,
121
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
122
+ metadata=task_definition.inspection.metadata,
123
+ zoom=task_definition.zoom,
124
+ )
125
+ elif inspection_definition.type == InspectionTypes.video:
126
+ return TakeVideo(
127
+ robot_pose=task_definition.pose.to_alitra_pose(),
128
+ tag_id=task_definition.tag,
129
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
130
+ duration=inspection_definition.duration,
131
+ metadata=task_definition.inspection.metadata,
132
+ zoom=task_definition.zoom,
133
+ )
134
+ elif inspection_definition.type == InspectionTypes.thermal_image:
135
+ return TakeThermalImage(
136
+ robot_pose=task_definition.pose.to_alitra_pose(),
137
+ tag_id=task_definition.tag,
138
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
139
+ metadata=task_definition.inspection.metadata,
140
+ zoom=task_definition.zoom,
141
+ )
142
+ elif inspection_definition.type == InspectionTypes.thermal_video:
143
+ return TakeThermalVideo(
144
+ robot_pose=task_definition.pose.to_alitra_pose(),
145
+ tag_id=task_definition.tag,
146
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
147
+ duration=inspection_definition.duration,
148
+ metadata=task_definition.inspection.metadata,
149
+ zoom=task_definition.zoom,
150
+ )
151
+ elif inspection_definition.type == InspectionTypes.audio:
152
+ return RecordAudio(
153
+ robot_pose=task_definition.pose.to_alitra_pose(),
154
+ tag_id=task_definition.tag,
155
+ target=task_definition.inspection.inspection_target.to_alitra_position(),
156
+ duration=inspection_definition.duration,
157
+ metadata=task_definition.inspection.metadata,
158
+ zoom=task_definition.zoom,
159
+ )
160
+ else:
161
+ raise ValueError(
162
+ f"Inspection type '{inspection_definition.type}' not supported"
163
+ )
164
+
165
+
166
+ def to_localization_task(task_definition: StartMissionTaskDefinition) -> Localize:
167
+ return Localize(localization_pose=task_definition.pose.to_alitra_pose())
168
+
169
+
170
+ def create_return_to_home_task(
171
+ task_definition: StartMissionTaskDefinition,
172
+ ) -> ReturnToHome:
173
+ return ReturnToHome(pose=task_definition.pose.to_alitra_pose())
174
+
175
+
176
+ def create_dock_task() -> DockingProcedure:
177
+ return DockingProcedure(behavior="dock")
178
+
179
+
180
+ def _build_mission_name() -> str:
181
+ return f"{settings.PLANT_SHORT_NAME}{settings.ROBOT_NAME}{int(time.time())}"
@@ -21,7 +21,13 @@ 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.task import TASKS, Localize, MoveArm, ReturnToHome
24
+ from robot_interface.models.mission.task import (
25
+ TASKS,
26
+ InspectionTask,
27
+ Localize,
28
+ MoveArm,
29
+ ReturnToHome,
30
+ )
25
31
 
26
32
 
27
33
  class SchedulingController:
@@ -115,7 +121,9 @@ class SchedulingController:
115
121
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
116
122
 
117
123
  try:
118
- mission: Mission = to_isar_mission(mission_definition)
124
+ mission: Mission = to_isar_mission(
125
+ start_mission_definition=mission_definition, return_pose=return_pose
126
+ )
119
127
  except MissionPlannerError as e:
120
128
  error_message = f"Bad Request - Cannot create ISAR mission: {e}"
121
129
  self.logger.warning(error_message)
@@ -127,9 +135,6 @@ class SchedulingController:
127
135
  self.scheduling_utilities.verify_robot_capable_of_mission(
128
136
  mission=mission, robot_capabilities=robot_settings.CAPABILITIES
129
137
  )
130
- if return_pose:
131
- pose: Pose = return_pose.to_alitra_pose()
132
- mission.tasks.append(ReturnToHome(pose=pose))
133
138
 
134
139
  initial_pose_alitra: Optional[Pose] = (
135
140
  initial_pose.to_alitra_pose() if initial_pose else None
@@ -213,7 +218,9 @@ class SchedulingController:
213
218
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
214
219
 
215
220
  pose: Pose = target_pose.to_alitra_pose()
216
- mission: Mission = Mission(tasks=[ReturnToHome(pose=pose)])
221
+ mission: Mission = Mission(
222
+ name="Drive to pose", tasks=[ReturnToHome(pose=pose)]
223
+ )
217
224
 
218
225
  self.logger.info(
219
226
  f"Starting drive to mission with ISAR Mission ID: '{mission.id}'"
@@ -237,7 +244,9 @@ class SchedulingController:
237
244
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
238
245
 
239
246
  pose: Pose = localization_pose.to_alitra_pose()
240
- mission: Mission = Mission(tasks=[Localize(localization_pose=pose)])
247
+ mission: Mission = Mission(
248
+ name="Localization mission", tasks=[Localize(localization_pose=pose)]
249
+ )
241
250
 
242
251
  self.logger.info(
243
252
  f"Starting localization mission with ISAR Mission ID: '{mission.id}'"
@@ -284,7 +293,9 @@ class SchedulingController:
284
293
 
285
294
  self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
286
295
 
287
- mission: Mission = Mission(tasks=[MoveArm(arm_pose=arm_pose_literal)])
296
+ mission: Mission = Mission(
297
+ name="Move arm mission", tasks=[MoveArm(arm_pose=arm_pose_literal)]
298
+ )
288
299
 
289
300
  self.logger.info(
290
301
  f"Starting move arm mission with ISAR Mission ID: '{mission.id}'"
@@ -302,4 +313,11 @@ class SchedulingController:
302
313
  )
303
314
 
304
315
  def _task_api_response(self, task: TASKS) -> TaskResponse:
305
- return TaskResponse(id=task.id, tag_id=task.tag_id, type=task.type)
316
+ if isinstance(task, InspectionTask):
317
+ inspection_id = task.inspection_id
318
+ else:
319
+ inspection_id = None
320
+
321
+ return TaskResponse(
322
+ id=task.id, tag_id=task.tag_id, inspection_id=inspection_id, type=task.type
323
+ )
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "id": "1",
3
+ "name": "Default mission",
3
4
  "tasks": [
4
5
  {
5
6
  "type": "take_image",
@@ -8,22 +9,22 @@
8
9
  "x": -2,
9
10
  "y": -2,
10
11
  "z": 0,
11
- "frame": "asset"
12
+ "frame": {"name": "asset"}
12
13
  },
13
14
  "orientation": {
14
15
  "x": 0,
15
16
  "y": 0,
16
17
  "z": 0.4794255,
17
18
  "w": 0.8775826,
18
- "frame": "asset"
19
+ "frame": {"name": "asset"}
19
20
  },
20
- "frame": "asset"
21
+ "frame": {"name": "asset"}
21
22
  },
22
23
  "target": {
23
24
  "x": 2,
24
25
  "y": 2,
25
26
  "z": 0,
26
- "frame": "robot"
27
+ "frame": {"name": "asset"}
27
28
  }
28
29
  },
29
30
  {
@@ -33,22 +34,22 @@
33
34
  "x": -2,
34
35
  "y": 2,
35
36
  "z": 0,
36
- "frame": "asset"
37
+ "frame": {"name": "asset"}
37
38
  },
38
39
  "orientation": {
39
40
  "x": 0,
40
41
  "y": 0,
41
42
  "z": 0.4794255,
42
43
  "w": 0.8775826,
43
- "frame": "asset"
44
+ "frame": {"name": "asset"}
44
45
  },
45
- "frame": "asset"
46
+ "frame": {"name": "asset"}
46
47
  },
47
48
  "target": {
48
49
  "x": 2,
49
50
  "y": 2,
50
51
  "z": 0,
51
- "frame": "robot"
52
+ "frame": {"name": "asset"}
52
53
  }
53
54
  },
54
55
  {
@@ -58,16 +59,16 @@
58
59
  "x": 2,
59
60
  "y": 2,
60
61
  "z": 0,
61
- "frame": "asset"
62
+ "frame": {"name": "asset"}
62
63
  },
63
64
  "orientation": {
64
65
  "x": 0,
65
66
  "y": 0,
66
67
  "z": 0.4794255,
67
68
  "w": 0.8775826,
68
- "frame": "asset"
69
+ "frame": {"name": "asset"}
69
70
  },
70
- "frame": "asset"
71
+ "frame": {"name": "asset"}
71
72
  }
72
73
  }
73
74
  ]
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "id": "2",
3
+ "name": "Default mission Turtlebot",
3
4
  "tasks": [
4
5
  {
5
6
  "type": "take_image",
@@ -8,22 +9,22 @@
8
9
  "x": -3.6,
9
10
  "y": 4,
10
11
  "z": 0,
11
- "frame": "asset"
12
+ "frame": {"name": "asset"}
12
13
  },
13
14
  "orientation": {
14
15
  "x": 0,
15
16
  "y": 0,
16
17
  "z": -0.7286672256879113,
17
18
  "w": -0.6848660759820616,
18
- "frame": "asset"
19
+ "frame": {"name": "asset"}
19
20
  },
20
- "frame": "asset"
21
+ "frame": {"name": "asset"}
21
22
  },
22
23
  "target": {
23
24
  "x": -4.7,
24
25
  "y": 4.9,
25
26
  "z": 0,
26
- "frame": "robot"
27
+ "frame": {"name": "asset"}
27
28
  }
28
29
  },
29
30
 
@@ -34,22 +35,22 @@
34
35
  "x": 4.7,
35
36
  "y": 3,
36
37
  "z": 0,
37
- "frame": "asset"
38
+ "frame": {"name": "asset"}
38
39
  },
39
40
  "orientation": {
40
41
  "x": 0,
41
42
  "y": 0,
42
43
  "z": 0.5769585,
43
44
  "w": 0.8167734,
44
- "frame": "asset"
45
+ "frame": {"name": "asset"}
45
46
  },
46
- "frame": "asset"
47
+ "frame": {"name": "asset"}
47
48
  },
48
49
  "target": {
49
50
  "x": 5.6,
50
51
  "y": 5.2,
51
52
  "z": 0,
52
- "frame": "robot"
53
+ "frame": {"name": "asset"}
53
54
  }
54
55
  },
55
56
  {
@@ -59,22 +60,22 @@
59
60
  "x": 4.7,
60
61
  "y": 3,
61
62
  "z": 0,
62
- "frame": "asset"
63
+ "frame": {"name": "asset"}
63
64
  },
64
65
  "orientation": {
65
66
  "x": 0,
66
67
  "y": 0,
67
68
  "z": 0.5769585,
68
69
  "w": 0.8167734,
69
- "frame": "asset"
70
+ "frame": {"name": "asset"}
70
71
  },
71
- "frame": "asset"
72
+ "frame": {"name": "asset"}
72
73
  },
73
74
  "target": {
74
75
  "x": 3.1,
75
76
  "y": 5.2,
76
77
  "z": 0,
77
- "frame": "robot"
78
+ "frame": {"name": "asset"}
78
79
  }
79
80
  },
80
81
  {
@@ -84,22 +85,22 @@
84
85
  "x": 0.95,
85
86
  "y": 2.6,
86
87
  "z": 0,
87
- "frame": "asset"
88
+ "frame": {"name": "asset"}
88
89
  },
89
90
  "orientation": {
90
91
  "x": 0,
91
92
  "y": 0,
92
93
  "z": -0.6992469,
93
94
  "w": 0.7148802,
94
- "frame": "asset"
95
+ "frame": {"name": "asset"}
95
96
  },
96
- "frame": "asset"
97
+ "frame": {"name": "asset"}
97
98
  },
98
99
  "target": {
99
100
  "x": 1.9,
100
101
  "y": 1.9,
101
102
  "z": 0,
102
- "frame": "robot"
103
+ "frame": {"name": "asset"}
103
104
  }
104
105
  }
105
106
  ]
@@ -1,8 +1,7 @@
1
+ import json
1
2
  import logging
2
3
  from pathlib import Path
3
- from typing import List, Optional
4
4
 
5
- from alitra import Frame
6
5
  from injector import inject
7
6
 
8
7
  from isar.config.settings import settings
@@ -11,10 +10,8 @@ from isar.mission_planner.mission_planner_interface import (
11
10
  MissionPlannerError,
12
11
  MissionPlannerInterface,
13
12
  )
14
- from isar.services.readers.base_reader import BaseReader, BaseReaderError
15
13
  from robot_interface.models.mission.mission import Mission
16
14
 
17
-
18
15
  logger = logging.getLogger("api")
19
16
 
20
17
 
@@ -39,16 +36,10 @@ class LocalPlanner(MissionPlannerInterface):
39
36
 
40
37
  @staticmethod
41
38
  def read_mission_from_file(mission_path: Path) -> Mission:
42
- mission_dict: dict = BaseReader.read_json(location=mission_path)
43
-
44
- mission: Mission = BaseReader.dict_to_dataclass(
45
- dataclass_dict=mission_dict,
46
- target_dataclass=Mission,
47
- cast_config=[Frame],
48
- strict_config=True,
49
- )
39
+ with open(mission_path) as json_file:
40
+ mission_dict = json.load(json_file)
50
41
 
51
- return mission
42
+ return Mission(**mission_dict)
52
43
 
53
44
  def get_predefined_missions(self) -> dict:
54
45
  missions: dict = {}
@@ -57,13 +48,8 @@ class LocalPlanner(MissionPlannerInterface):
57
48
  for file in json_files:
58
49
  mission_name = file.stem
59
50
  path_to_file = self.predefined_mission_folder.joinpath(file.name)
60
- try:
61
- mission: Mission = self.read_mission_from_file(path_to_file)
62
- except BaseReaderError as e:
63
- logger.warning(
64
- f"Failed to read predefined mission {path_to_file} \n {e}"
65
- )
66
- continue
51
+
52
+ mission: Mission = self.read_mission_from_file(path_to_file)
67
53
  if mission.id in invalid_mission_ids:
68
54
  logger.warning(
69
55
  f"Duplicate mission id {mission.id} : {path_to_file.as_posix()}"
@@ -9,7 +9,7 @@ class MissionPlannerInterface(metaclass=ABCMeta):
9
9
  """
10
10
  Parameters
11
11
  ----------
12
- mission_id : int
12
+ mission_id : str
13
13
 
14
14
  Returns
15
15
  -------
@@ -82,7 +82,7 @@ def print_startup_info():
82
82
  print()
83
83
 
84
84
 
85
- def start():
85
+ def start() -> None:
86
86
  injector: Injector = get_injector()
87
87
 
88
88
  keyvault_client = injector.get(Keyvault)
@@ -412,7 +412,7 @@ class StateMachine(object):
412
412
  Transitions into idle state.
413
413
 
414
414
  """
415
- self.to_idle()
415
+ self.to_idle() # type: ignore
416
416
 
417
417
  def iterate_current_task(self):
418
418
  if self.current_task.is_finished():
@@ -426,7 +426,7 @@ class StateMachine(object):
426
426
 
427
427
  def update_state(self):
428
428
  """Updates the current state of the state machine."""
429
- self.current_state = States(self.state)
429
+ self.current_state = States(self.state) # type: ignore
430
430
  self.send_state_status()
431
431
  self._log_state_transition(self.current_state)
432
432
  self.logger.info(f"State: {self.current_state}")